57 lines
2.4 KiB
Python
57 lines
2.4 KiB
Python
from django import forms
|
|
from django.contrib.auth.models import User
|
|
from .models import Student, Subject, Classroom
|
|
|
|
class StudentRegistrationForm(forms.ModelForm):
|
|
first_name = forms.CharField(max_length=30, required=True, label="Full Name (First)")
|
|
last_name = forms.CharField(max_length=30, required=True, label="Full Name (Last)")
|
|
username = forms.CharField(max_length=150, required=True)
|
|
email = forms.EmailField(required=True)
|
|
password = forms.CharField(widget=forms.PasswordInput, required=True)
|
|
|
|
classroom = forms.ModelChoiceField(queryset=Classroom.objects.all(), required=True, empty_label="Select Classroom")
|
|
subjects = forms.ModelMultipleChoiceField(
|
|
queryset=Subject.objects.all(),
|
|
required=False,
|
|
widget=forms.CheckboxSelectMultiple,
|
|
label="Select Subjects"
|
|
)
|
|
|
|
class Meta:
|
|
model = Student
|
|
fields = ['mobile_number', 'moderate', 'city', 'avatar']
|
|
widgets = {
|
|
'avatar': forms.FileInput(attrs={'accept': 'image/*', 'capture': 'camera'}), # generic hint, but we'll use custom JS
|
|
}
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
# optimize subjects loading
|
|
self.fields['subjects'].queryset = Subject.objects.none()
|
|
|
|
if 'classroom' in self.data:
|
|
try:
|
|
classroom_id = int(self.data.get('classroom'))
|
|
self.fields['subjects'].queryset = Subject.objects.filter(classroom_id=classroom_id)
|
|
except (ValueError, TypeError):
|
|
pass
|
|
elif self.instance.pk and self.instance.classroom:
|
|
self.fields['subjects'].queryset = Subject.objects.filter(classroom=self.instance.classroom)
|
|
|
|
def save(self, commit=True):
|
|
# We need to save the User first, then the Student
|
|
user = User.objects.create_user(
|
|
username=self.cleaned_data['username'],
|
|
email=self.cleaned_data['email'],
|
|
password=self.cleaned_data['password'],
|
|
first_name=self.cleaned_data['first_name'],
|
|
last_name=self.cleaned_data['last_name']
|
|
)
|
|
student = super().save(commit=False)
|
|
student.user = user
|
|
student.classroom = self.cleaned_data['classroom']
|
|
|
|
if commit:
|
|
student.save()
|
|
student.subscribed_subjects.set(self.cleaned_data['subjects'])
|
|
return student |