from django import forms from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.forms import AuthenticationForm from django import forms from django import forms from django.contrib.auth import get_user_model User = get_user_model() class UserForm(forms.ModelForm): full_name = forms.CharField( max_length=150, required=True, label="Full Name" ) password = forms.CharField( widget=forms.PasswordInput, label="Password" ) confirm_password = forms.CharField( widget=forms.PasswordInput, label="Confirm Password" ) phone_number = forms.CharField( max_length=15, required=True, label="Phone Number" ) ROLE_CHOICES = [ ('admin', 'Admin'), ('manager', 'Manager'), ('staff', 'Staff'), ] role = forms.ChoiceField( choices=ROLE_CHOICES, required=True, label="Role" ) class Meta: model = User fields = ["username","full_name", "email", "phone_number", "role", "password", "confirm_password"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields.values(): field.widget.attrs.update({"class": "form-control"}) def clean(self): cleaned_data = super().clean() password = cleaned_data.get("password") confirm_password = cleaned_data.get("confirm_password") if password and confirm_password and password != confirm_password: self.add_error("confirm_password", "Passwords do not match!") return cleaned_data def save(self, commit=True): user = super().save(commit=False) user.set_password(self.cleaned_data['password']) # Hash the password # Save phone_number and role to the User model (if your User model has these fields) user.phone_number = self.cleaned_data.get("phone_number") user.role = self.cleaned_data.get("role") if commit: user.save() return user class LoginForm(AuthenticationForm): username = forms.CharField( widget=forms.TextInput(attrs={ "class": "form-control", "placeholder": "Enter username" }) ) password = forms.CharField( widget=forms.PasswordInput(attrs={ "class": "form-control", "placeholder": "Enter password" }) ) class PartnerUserForm(forms.ModelForm): full_name = forms.CharField( max_length=150, required=True, label="Full Name" ) password = forms.CharField( widget=forms.PasswordInput, label="Password", required=True, help_text="Required for new users. Leave blank if you don't want to change the password when editing." ) confirm_password = forms.CharField( widget=forms.PasswordInput, label="Confirm Password", required=True ) phone_number = forms.CharField( max_length=15, required=False, label="Phone Number" ) ROLE_CHOICES = [ ('partner', 'Partner'), ('partner_manager', 'Partner Manager'), ('partner_staff', 'Partner Staff'), ('partner_customer', 'Partner Customer'), ] role = forms.ChoiceField( choices=ROLE_CHOICES, required=True, label="Role" ) class Meta: model = User fields = ["username", "email", "phone_number", "role"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields.values(): field.widget.attrs.update({"class": "form-control"}) # Make password fields optional for updates, required for new users if self.instance and self.instance.pk: self.fields['password'].required = False self.fields['confirm_password'].required = False # Pre-populate full_name from first_name and last_name if self.instance.first_name or self.instance.last_name: self.fields['full_name'].initial = f"{self.instance.first_name} {self.instance.last_name}".strip() else: # For new users, password is required self.fields['password'].required = True self.fields['confirm_password'].required = True def clean(self): cleaned_data = super().clean() password = cleaned_data.get("password") confirm_password = cleaned_data.get("confirm_password") # For new users, password is required if not self.instance or not self.instance.pk: if not password: self.add_error("password", "Password is required for new users.") if not confirm_password: self.add_error("confirm_password", "Please confirm your password.") # Validate password match if password is provided if password or confirm_password: if password != confirm_password: self.add_error("confirm_password", "Passwords do not match!") return cleaned_data def save(self, commit=True): user = super().save(commit=False) # Set password - required for new users, optional for updates password = self.cleaned_data.get('password') if password: user.set_password(password) elif not user.pk: # New user must have a password raise ValueError("Password is required for new users.") # Save phone_number and role to the User model user.phone_number = self.cleaned_data.get("phone_number") user.role = self.cleaned_data.get("role") # Handle full_name - split into first_name and last_name full_name = self.cleaned_data.get("full_name", "").strip() if full_name: parts = full_name.split(None, 1) user.first_name = parts[0] if len(parts) > 1: user.last_name = parts[1] else: user.last_name = "" if commit: user.save() return user