Files
tecvico-website/apps/accounts/forms.py
T
2026-08-01 16:30:24 +03:30

107 lines
4.2 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)
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"):
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", ""),
)
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 = ("avatar", "company", "job_title", "phone", "bio")
widgets = {
"avatar": forms.ClearableFileInput(
attrs={"class": "profile-avatar-input", "accept": "image/jpeg,image/png,image/webp"}
),
"company": forms.TextInput(attrs={"class": "form-control"}),
"job_title": forms.TextInput(attrs={"class": "form-control"}),
"phone": forms.TextInput(attrs={"class": "form-control"}),
"bio": forms.Textarea(
attrs={"class": "form-control", "rows": 4, "placeholder": "A short introduction to your work and research interests"}
),
}
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