2025-12-17 22:05:13 +05:30
|
|
|
# accounts/forms.py
|
|
|
|
|
from django import forms
|
|
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
|
from django.contrib.auth import authenticate
|
|
|
|
|
|
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RegisterForm(forms.ModelForm):
|
|
|
|
|
password = forms.CharField(widget=forms.PasswordInput)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
model = User
|
|
|
|
|
fields = ['email', 'phone_number', 'password']
|
|
|
|
|
|
|
|
|
|
def clean_email(self):
|
|
|
|
|
email = self.cleaned_data.get('email')
|
2025-12-19 19:35:38 +05:30
|
|
|
# Ensure both email and username do not clash, since we set username = email
|
|
|
|
|
if User.objects.filter(email=email).exists() or User.objects.filter(username=email).exists():
|
2025-12-17 22:05:13 +05:30
|
|
|
raise forms.ValidationError("Email is already registered.")
|
|
|
|
|
return email
|
|
|
|
|
|
|
|
|
|
def clean_phone_number(self):
|
|
|
|
|
phone_number = self.cleaned_data.get('phone_number')
|
|
|
|
|
if User.objects.filter(phone_number=phone_number).exists():
|
|
|
|
|
raise forms.ValidationError("Phone number is already registered.")
|
|
|
|
|
return phone_number
|
|
|
|
|
|
|
|
|
|
def save(self, commit=True):
|
|
|
|
|
user = super().save(commit=False)
|
2025-12-19 19:35:38 +05:30
|
|
|
# Set username equal to email to avoid separate username errors
|
|
|
|
|
user.username = self.cleaned_data['email']
|
2025-12-17 22:05:13 +05:30
|
|
|
user.set_password(self.cleaned_data['password'])
|
2026-03-25 11:10:29 +05:30
|
|
|
# Mark as a customer / end-user
|
|
|
|
|
user.is_customer = True
|
|
|
|
|
user.role = 'customer'
|
2025-12-17 22:05:13 +05:30
|
|
|
if commit:
|
|
|
|
|
user.save()
|
|
|
|
|
return user
|
|
|
|
|
|
|
|
|
|
|
2025-12-19 19:35:38 +05:30
|
|
|
class WebRegisterForm(forms.ModelForm):
|
|
|
|
|
password = forms.CharField(widget=forms.PasswordInput)
|
|
|
|
|
confirm_password = forms.CharField(widget=forms.PasswordInput)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
model = User
|
2026-04-04 10:42:44 +05:30
|
|
|
fields = ['first_name', 'last_name', 'email', 'phone_number', 'password', 'confirm_password', 'district']
|
2025-12-19 19:35:38 +05:30
|
|
|
|
|
|
|
|
def clean_email(self):
|
|
|
|
|
email = self.cleaned_data.get('email')
|
|
|
|
|
# Ensure both email and username do not clash, since we set username = email
|
|
|
|
|
if User.objects.filter(email=email).exists() or User.objects.filter(username=email).exists():
|
|
|
|
|
raise forms.ValidationError("Email is already registered.")
|
|
|
|
|
return email
|
|
|
|
|
|
|
|
|
|
def clean_phone_number(self):
|
|
|
|
|
phone_number = self.cleaned_data.get('phone_number')
|
|
|
|
|
if User.objects.filter(phone_number=phone_number).exists():
|
|
|
|
|
raise forms.ValidationError("Phone number is already registered.")
|
|
|
|
|
return phone_number
|
|
|
|
|
|
|
|
|
|
def clean(self):
|
|
|
|
|
cleaned_data = super().clean()
|
|
|
|
|
password = cleaned_data.get('password')
|
|
|
|
|
confirm_password = cleaned_data.get('confirm_password')
|
|
|
|
|
if password != confirm_password:
|
|
|
|
|
raise forms.ValidationError("Passwords do not match.")
|
|
|
|
|
return cleaned_data
|
|
|
|
|
|
|
|
|
|
def save(self, commit=True):
|
|
|
|
|
user = super().save(commit=False)
|
|
|
|
|
# Set username equal to email to avoid separate username errors
|
|
|
|
|
user.username = self.cleaned_data['email']
|
|
|
|
|
user.set_password(self.cleaned_data['password'])
|
2026-03-25 11:10:29 +05:30
|
|
|
# Mark as a customer / end-user
|
|
|
|
|
user.is_customer = True
|
|
|
|
|
user.role = 'customer'
|
2026-04-04 10:42:44 +05:30
|
|
|
from django.utils import timezone
|
|
|
|
|
from accounts.models import VALID_DISTRICTS
|
|
|
|
|
if user.district and user.district in VALID_DISTRICTS:
|
|
|
|
|
user.district_changed_at = timezone.now()
|
|
|
|
|
elif user.district:
|
|
|
|
|
user.district = None # reject invalid district silently
|
2025-12-19 19:35:38 +05:30
|
|
|
if commit:
|
|
|
|
|
user.save()
|
|
|
|
|
return user
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-12-17 22:05:13 +05:30
|
|
|
class LoginForm(forms.Form):
|
|
|
|
|
username = forms.CharField()
|
|
|
|
|
password = forms.CharField(widget=forms.PasswordInput)
|
|
|
|
|
|
|
|
|
|
def clean(self):
|
|
|
|
|
cleaned_data = super().clean()
|
|
|
|
|
username = cleaned_data.get('username')
|
|
|
|
|
password = cleaned_data.get('password')
|
|
|
|
|
|
|
|
|
|
print('*' * 100)
|
|
|
|
|
print(username, password)
|
|
|
|
|
print('*' * 100)
|
|
|
|
|
|
|
|
|
|
if not username or not password:
|
|
|
|
|
raise forms.ValidationError("Username and password are required.")
|
|
|
|
|
|
|
|
|
|
# Check if username contains '@' (email) or is a regular username
|
|
|
|
|
try:
|
|
|
|
|
if '@' in username:
|
|
|
|
|
print('1 **********************')
|
|
|
|
|
# Try to find user by email
|
|
|
|
|
user = User.objects.get(email=username)
|
|
|
|
|
print(user)
|
|
|
|
|
print('2 **********************')
|
|
|
|
|
username = user.username
|
|
|
|
|
print('3 **********************')
|
|
|
|
|
else:
|
|
|
|
|
print('4 **********************')# Use username as-is
|
|
|
|
|
user = User.objects.get(username=username)
|
|
|
|
|
except User.DoesNotExist:
|
|
|
|
|
print('5 **********************')
|
|
|
|
|
raise forms.ValidationError("Invalid credentials.")
|
|
|
|
|
|
|
|
|
|
# Authenticate with the resolved username
|
|
|
|
|
user = authenticate(username=username, password=password)
|
|
|
|
|
if not user:
|
|
|
|
|
raise forms.ValidationError("Invalid credentials.")
|
|
|
|
|
|
|
|
|
|
cleaned_data['user'] = user
|
|
|
|
|
return cleaned_data
|