from django import forms from django.contrib.auth.forms import AuthenticationForm, UserCreationForm from django.contrib.auth.models import User from .models import ClientProfile class SignUpForm(UserCreationForm): first_name = forms.CharField(max_length=150, required=True) last_name = forms.CharField(max_length=150, required=True) email = forms.EmailField(required=True) company = forms.CharField(max_length=200, required=False) phone = forms.CharField(max_length=50, required=False) timezone = forms.ChoiceField(choices=ClientProfile.TIMEZONE_CHOICES, required=True) class Meta: model = User fields = ("username", "first_name", "last_name", "email", "password1", "password2") def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field_name in ("username", "first_name", "last_name", "email", "company", "phone", "timezone"): if field_name in self.fields: self.fields[field_name].widget.attrs.setdefault("class", "form-control") for field_name in ("password1", "password2"): self.fields[field_name].widget.attrs.setdefault("class", "form-control") def clean_email(self): email = self.cleaned_data["email"].strip().lower() if User.objects.filter(email__iexact=email).exists(): raise forms.ValidationError("An account with this email already exists.") return email def save(self, commit=True): user = super().save(commit=False) user.email = self.cleaned_data["email"] user.first_name = self.cleaned_data["first_name"] user.last_name = self.cleaned_data["last_name"] if commit: user.save() ClientProfile.objects.create( user=user, company=self.cleaned_data.get("company", ""), phone=self.cleaned_data.get("phone", ""), timezone=self.cleaned_data.get("timezone", "UTC"), ) return user class ClientLoginForm(AuthenticationForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["username"].widget.attrs.update( {"placeholder": "Username or email", "class": "form-control"} ) self.fields["password"].widget.attrs.update( {"placeholder": "Password", "class": "form-control"} ) class ClientProfileForm(forms.ModelForm): first_name = forms.CharField(max_length=150, required=True) last_name = forms.CharField(max_length=150, required=True) email = forms.EmailField(required=True) class Meta: model = ClientProfile fields = ("company", "phone", "timezone") widgets = { "company": forms.TextInput(attrs={"class": "form-control"}), "phone": forms.TextInput(attrs={"class": "form-control"}), "timezone": forms.Select(attrs={"class": "form-control"}), } def __init__(self, *args, **kwargs): self.user = kwargs.pop("user") super().__init__(*args, **kwargs) self.fields["first_name"].initial = self.user.first_name self.fields["last_name"].initial = self.user.last_name self.fields["email"].initial = self.user.email for name in ("first_name", "last_name", "email"): self.fields[name].widget.attrs.setdefault("class", "form-control") def clean_email(self): email = self.cleaned_data["email"].strip().lower() if ( User.objects.filter(email__iexact=email) .exclude(pk=self.user.pk) .exists() ): raise forms.ValidationError("An account with this email already exists.") return email def save(self, commit=True): profile = super().save(commit=False) self.user.first_name = self.cleaned_data["first_name"] self.user.last_name = self.cleaned_data["last_name"] self.user.email = self.cleaned_data["email"] if commit: self.user.save() profile.save() return profile