from django import forms from django.db import transaction from django.contrib.auth.forms import UserCreationForm, UserChangeForm, PasswordChangeForm # from django.contrib.auth.models import User from django.contrib.auth.forms import PasswordResetForm from course.models import Program # from .models import User, Student, LEVEL from .models import * class StaffAddForm(UserCreationForm): username = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'text', 'class': 'form-control', }), label="Username", ) first_name = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'text', 'class': 'form-control', }), label="First Name", ) last_name = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'text', 'class': 'form-control', }), label="Last Name", ) address = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'text', 'class': 'form-control', }), label="Address", ) phone = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'text', 'class': 'form-control', }), label="Mobile No.", ) email = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'text', 'class': 'form-control', }), label="Email", ) password1 = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'password', 'class': 'form-control', }), label="Password", ) password2 = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'password', 'class': 'form-control', }), label="Password Confirmation", ) class Meta(UserCreationForm.Meta): model = User @transaction.atomic() def save(self, commit=True): user = super().save(commit=False) user.is_lecturer = True user.first_name = self.cleaned_data.get('first_name') user.last_name = self.cleaned_data.get('last_name') user.phone = self.cleaned_data.get('phone') user.address = self.cleaned_data.get('address') user.email = self.cleaned_data.get('email') if commit: user.save() return user class StudentAddForm(UserCreationForm): username = forms.CharField( max_length=30, widget=forms.TextInput( attrs={ 'type': 'text', 'class': 'form-control', } ), label="Username", ) address = forms.CharField( max_length=30, widget=forms.TextInput( attrs={ 'type': 'text', 'class': 'form-control', } ), label="Address", ) phone = forms.CharField( max_length=30, widget=forms.TextInput( attrs={ 'type': 'text', 'class': 'form-control', } ), label="Mobile No.", ) first_name = forms.CharField( max_length=30, widget=forms.TextInput( attrs={ 'type': 'text', 'class': 'form-control', } ), label="First name", ) last_name = forms.CharField( max_length=30, widget=forms.TextInput( attrs={ 'type': 'text', 'class': 'form-control', } ), label="Last name", ) level = forms.CharField( widget=forms.Select( choices=LEVEL, attrs={ 'class': 'browser-default custom-select form-control', } ), ) department = forms.ModelChoiceField( queryset=Program.objects.all(), widget=forms.Select(attrs={'class': 'browser-default custom-select form-control'}), label="Department", ) email = forms.EmailField( widget=forms.TextInput( attrs={ 'type': 'email', 'class': 'form-control', } ), label="Email Address", ) password1 = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'password', 'class': 'form-control', }), label="Password", ) password2 = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'password', 'class': 'form-control', }), label="Password Confirmation", ) # def validate_email(self): # email = self.cleaned_data['email'] # if User.objects.filter(email__iexact=email, is_active=True).exists(): # raise forms.ValidationError("Email has taken, try another email address. ") class Meta(UserCreationForm.Meta): model = User @transaction.atomic() def save(self): user = super().save(commit=False) user.is_student = True user.first_name = self.cleaned_data.get('first_name') user.last_name = self.cleaned_data.get('last_name') user.address = self.cleaned_data.get('address') user.phone = self.cleaned_data.get('phone') user.email = self.cleaned_data.get('email') user.save() student = Student.objects.create( student=user, level=self.cleaned_data.get('level'), department=self.cleaned_data.get('department') ) student.save() return user class ProfileUpdateForm(UserChangeForm): email = forms.EmailField( widget=forms.TextInput(attrs={'type': 'email', 'class': 'form-control', }), label="Email Address", ) first_name = forms.CharField( widget=forms.TextInput(attrs={'type': 'text', 'class': 'form-control', }), label="First Name", ) last_name = forms.CharField( widget=forms.TextInput(attrs={'type': 'text', 'class': 'form-control', }), label="Last Name", ) phone = forms.CharField( widget=forms.TextInput(attrs={'type': 'text', 'class': 'form-control', }), label="Phone No.", ) address = forms.CharField( widget=forms.TextInput(attrs={'type': 'text', 'class': 'form-control', }), label="Address / city", ) class Meta: model = User fields = ['email', 'phone', 'address', 'picture', 'first_name', 'last_name'] class EmailValidationOnForgotPassword(PasswordResetForm): def clean_email(self): email = self.cleaned_data['email'] if not User.objects.filter(email__iexact=email, is_active=True).exists(): msg = "There is no user registered with the specified E-mail address. " self.add_error('email', msg) return email class ParentAddForm(UserCreationForm): username = forms.CharField( max_length=30, widget=forms.TextInput( attrs={ 'type': 'text', 'class': 'form-control', } ), label="Username", ) address = forms.CharField( max_length=30, widget=forms.TextInput( attrs={ 'type': 'text', 'class': 'form-control', } ), label="Address", ) phone = forms.CharField( max_length=30, widget=forms.TextInput( attrs={ 'type': 'text', 'class': 'form-control', } ), label="Mobile No.", ) first_name = forms.CharField( max_length=30, widget=forms.TextInput( attrs={ 'type': 'text', 'class': 'form-control', } ), label="First name", ) last_name = forms.CharField( max_length=30, widget=forms.TextInput( attrs={ 'type': 'text', 'class': 'form-control', } ), label="Last name", ) email = forms.EmailField( widget=forms.TextInput( attrs={ 'type': 'email', 'class': 'form-control', } ), label="Email Address", ) student = forms.ModelChoiceField( queryset=Student.objects.all(), widget=forms.Select(attrs={'class': 'browser-default custom-select form-control'}), label="Student", ) relation_ship = forms.CharField( widget=forms.Select( choices=RELATION_SHIP, attrs={'class': 'browser-default custom-select form-control',} ), ) password1 = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'password', 'class': 'form-control', }), label="Password", ) password2 = forms.CharField( max_length=30, widget=forms.TextInput(attrs={'type': 'password', 'class': 'form-control', }), label="Password Confirmation", ) # def validate_email(self): # email = self.cleaned_data['email'] # if User.objects.filter(email__iexact=email, is_active=True).exists(): # raise forms.ValidationError("Email has taken, try another email address. ") class Meta(UserCreationForm.Meta): model = User @transaction.atomic() def save(self): user = super().save(commit=False) user.is_parent = True user.first_name = self.cleaned_data.get('first_name') user.last_name = self.cleaned_data.get('last_name') user.address = self.cleaned_data.get('address') user.phone = self.cleaned_data.get('phone') user.email = self.cleaned_data.get('email') user.save() parent = Parent.objects.create( user=user, student=self.cleaned_data.get('student'), relation_ship=self.cleaned_data.get('relation_ship') ) parent.save() return user