103 lines
4.0 KiB
Python
103 lines
4.0 KiB
Python
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
|