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