258 lines
11 KiB
Python
258 lines
11 KiB
Python
from django import forms
|
|
from django.contrib.auth.models import User
|
|
from .models import Student, Subject, Classroom, City, Governorate, Teacher, Resource, Task, Message
|
|
|
|
class StudentRegistrationForm(forms.ModelForm):
|
|
full_name = forms.CharField(max_length=150, required=True, label="الاسم الكامل")
|
|
username = forms.CharField(max_length=150, required=True, label="اسم المستخدم")
|
|
email = forms.EmailField(required=True, label="البريد الإلكتروني")
|
|
password = forms.CharField(widget=forms.PasswordInput, required=True, label="كلمة المرور")
|
|
password_confirm = forms.CharField(widget=forms.PasswordInput, required=True, label="تأكيد كلمة المرور")
|
|
|
|
classroom = forms.ModelChoiceField(queryset=Classroom.objects.all(), required=True, empty_label="اختر الصف", label="الصف الدراسي")
|
|
subjects = forms.ModelMultipleChoiceField(
|
|
queryset=Subject.objects.all(),
|
|
required=False,
|
|
widget=forms.CheckboxSelectMultiple,
|
|
label="اختر المواد"
|
|
)
|
|
|
|
class Meta:
|
|
model = Student
|
|
fields = ['mobile_number', 'governorate', 'city', 'avatar']
|
|
labels = {
|
|
'mobile_number': 'رقم الهاتف',
|
|
'governorate': 'المحافظة',
|
|
'city': 'المدينة',
|
|
'avatar': 'الصورة الشخصية'
|
|
}
|
|
widgets = {
|
|
'avatar': forms.FileInput(attrs={'accept': 'image/*', 'capture': 'camera'}),
|
|
}
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
|
|
# Add Bootstrap classes
|
|
for field_name, field in self.fields.items():
|
|
if field.widget.__class__.__name__ == 'CheckboxInput':
|
|
field.widget.attrs['class'] = 'form-check-input'
|
|
elif field.widget.__class__.__name__ != 'CheckboxSelectMultiple':
|
|
field.widget.attrs['class'] = 'form-control'
|
|
field.widget.attrs['placeholder'] = field.label # Important for Floating Labels!
|
|
|
|
# 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)
|
|
|
|
# optimize city loading
|
|
self.fields['city'].queryset = City.objects.none()
|
|
|
|
if 'governorate' in self.data:
|
|
try:
|
|
governorate_id = int(self.data.get('governorate'))
|
|
self.fields['city'].queryset = City.objects.filter(governorate_id=governorate_id)
|
|
except (ValueError, TypeError):
|
|
pass
|
|
elif self.instance.pk and self.instance.governorate:
|
|
self.fields['city'].queryset = City.objects.filter(governorate=self.instance.governorate)
|
|
|
|
def clean(self):
|
|
cleaned_data = super().clean()
|
|
password = cleaned_data.get("password")
|
|
password_confirm = cleaned_data.get("password_confirm")
|
|
|
|
if password and password_confirm and password != password_confirm:
|
|
self.add_error('password_confirm', "كلمات المرور غير متطابقة")
|
|
|
|
return cleaned_data
|
|
|
|
def save(self, commit=True):
|
|
full_name = self.cleaned_data['full_name']
|
|
if " " in full_name:
|
|
first_name, last_name = full_name.split(" ", 1)
|
|
else:
|
|
first_name = full_name
|
|
last_name = ""
|
|
|
|
user = User.objects.create_user(
|
|
username=self.cleaned_data['username'],
|
|
email=self.cleaned_data['email'],
|
|
password=self.cleaned_data['password'],
|
|
first_name=first_name,
|
|
last_name=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
|
|
|
|
class StudentProfileForm(forms.ModelForm):
|
|
first_name = forms.CharField(max_length=30, required=True, label="الاسم الأول")
|
|
last_name = forms.CharField(max_length=150, required=True, label="الاسم الأخير")
|
|
email = forms.EmailField(required=True, label="البريد الإلكتروني")
|
|
|
|
class Meta:
|
|
model = Student
|
|
fields = ['mobile_number', 'governorate', 'city', 'classroom', 'avatar']
|
|
labels = {
|
|
'mobile_number': 'رقم الهاتف',
|
|
'governorate': 'المحافظة',
|
|
'city': 'المدينة',
|
|
'classroom': 'الصف الدراسي',
|
|
'avatar': 'الصورة الشخصية'
|
|
}
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
if self.instance and self.instance.user:
|
|
self.fields['first_name'].initial = self.instance.user.first_name
|
|
self.fields['last_name'].initial = self.instance.user.last_name
|
|
self.fields['email'].initial = self.instance.user.email
|
|
|
|
for field_name, field in self.fields.items():
|
|
field.widget.attrs['class'] = 'form-control'
|
|
|
|
# Optimize city loading (dependent dropdown logic)
|
|
self.fields['city'].queryset = City.objects.none()
|
|
if 'governorate' in self.data:
|
|
try:
|
|
governorate_id = int(self.data.get('governorate'))
|
|
self.fields['city'].queryset = City.objects.filter(governorate_id=governorate_id)
|
|
except (ValueError, TypeError):
|
|
pass
|
|
elif self.instance.pk and self.instance.governorate:
|
|
self.fields['city'].queryset = City.objects.filter(governorate=self.instance.governorate)
|
|
|
|
def save(self, commit=True):
|
|
student = super().save(commit=False)
|
|
if commit:
|
|
user = student.user
|
|
user.first_name = self.cleaned_data['first_name']
|
|
user.last_name = self.cleaned_data['last_name']
|
|
user.email = self.cleaned_data['email']
|
|
user.save()
|
|
student.save()
|
|
return student
|
|
|
|
class TeacherProfileForm(forms.ModelForm):
|
|
first_name = forms.CharField(max_length=30, required=True, label="الاسم الأول")
|
|
last_name = forms.CharField(max_length=150, required=True, label="الاسم الأخير")
|
|
email = forms.EmailField(required=True, label="البريد الإلكتروني")
|
|
|
|
class Meta:
|
|
model = Teacher
|
|
fields = ['bio', 'specialization', 'avatar']
|
|
labels = {
|
|
'bio': 'نبذة عني',
|
|
'specialization': 'التخصص',
|
|
'avatar': 'الصورة الشخصية'
|
|
}
|
|
widgets = {
|
|
'bio': forms.Textarea(attrs={'rows': 4}),
|
|
}
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
if self.instance and self.instance.user:
|
|
self.fields['first_name'].initial = self.instance.user.first_name
|
|
self.fields['last_name'].initial = self.instance.user.last_name
|
|
self.fields['email'].initial = self.instance.user.email
|
|
|
|
for field_name, field in self.fields.items():
|
|
field.widget.attrs['class'] = 'form-control'
|
|
|
|
def save(self, commit=True):
|
|
teacher = super().save(commit=False)
|
|
if commit:
|
|
user = teacher.user
|
|
user.first_name = self.cleaned_data['first_name']
|
|
user.last_name = self.cleaned_data['last_name']
|
|
user.email = self.cleaned_data['email']
|
|
user.save()
|
|
teacher.save()
|
|
return teacher
|
|
|
|
class ResourceForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Resource
|
|
fields = ['title_ar', 'title_en', 'resource_type', 'file', 'link']
|
|
labels = {
|
|
'title_ar': 'العنوان (عربي)',
|
|
'title_en': 'العنوان (إنجليزي)',
|
|
'resource_type': 'نوع المصدر',
|
|
'file': 'الملف',
|
|
'link': 'الرابط'
|
|
}
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
for field_name, field in self.fields.items():
|
|
field.widget.attrs['class'] = 'form-control'
|
|
|
|
class TaskForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Task
|
|
fields = ['title', 'description', 'subject', 'file', 'due_date']
|
|
widgets = {
|
|
'due_date': forms.DateTimeInput(attrs={'type': 'datetime-local'}),
|
|
'description': forms.Textarea(attrs={'rows': 4}),
|
|
}
|
|
labels = {
|
|
'title': 'عنوان الواجب',
|
|
'description': 'التفاصيل',
|
|
'subject': 'المادة',
|
|
'file': 'ملف مرفق (اختياري)',
|
|
'due_date': 'آخر موعد للتسليم'
|
|
}
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
teacher = kwargs.pop('teacher', None)
|
|
super().__init__(*args, **kwargs)
|
|
for field in self.fields.values():
|
|
field.widget.attrs['class'] = 'form-control'
|
|
|
|
if teacher:
|
|
self.fields['subject'].queryset = teacher.subjects.all()
|
|
|
|
class MessageForm(forms.Form):
|
|
recipient_id = forms.ChoiceField(label="إلى", widget=forms.Select(attrs={'class': 'form-control'}))
|
|
subject = forms.CharField(label="الموضوع", max_length=255, widget=forms.TextInput(attrs={'class': 'form-control'}))
|
|
body = forms.CharField(label="نص الرسالة", widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 5}))
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
user = kwargs.pop('user', None)
|
|
super().__init__(*args, **kwargs)
|
|
|
|
choices = []
|
|
if user:
|
|
if hasattr(user, 'teacher_profile'):
|
|
choices.append(('all', '📢 جميع طلابي'))
|
|
students = Student.objects.filter(
|
|
subscribed_subjects__teachers=user.teacher_profile
|
|
).distinct()
|
|
for student in students:
|
|
name = student.user.get_full_name() or student.user.username
|
|
choices.append((str(student.user.id), f"👤 {name}"))
|
|
|
|
elif hasattr(user, 'student_profile'):
|
|
teachers = Teacher.objects.filter(
|
|
subjects__subscribers=user.student_profile
|
|
).distinct()
|
|
for teacher in teachers:
|
|
name = teacher.user.get_full_name() or teacher.user.username
|
|
choices.append((str(teacher.user.id), f"👨🏫 {name}"))
|
|
|
|
self.fields['recipient_id'].choices = choices |