from django.db import models from django.contrib.auth.models import User from django.utils.translation import gettext_lazy as _ class SingletonModel(models.Model): class Meta: abstract = True def save(self, *args, **kwargs): self.pk = 1 super(SingletonModel, self).save(*args, **kwargs) @classmethod def load(cls): obj, created = cls.objects.get_or_create(pk=1) return obj class Teacher(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='teacher_profile') bio = models.TextField(_("Bio"), blank=True) avatar = models.ImageField(_("Avatar"), upload_to='teachers/', blank=True, null=True) specialization = models.CharField(_("Specialization"), max_length=255, blank=True) def __str__(self): return self.user.get_full_name() or self.user.username class Classroom(models.Model): name_en = models.CharField(_("Name (English)"), max_length=100) name_ar = models.CharField(_("Name (Arabic)"), max_length=100) description = models.TextField(_("Description"), blank=True) class Meta: verbose_name = _("Classroom") verbose_name_plural = _("Classrooms") def __str__(self): return self.name_en class Subject(models.Model): classroom = models.ForeignKey(Classroom, on_delete=models.CASCADE, related_name='subjects') teacher = models.ForeignKey(Teacher, on_delete=models.SET_NULL, null=True, blank=True, related_name='subjects') name_en = models.CharField(_("Name (English)"), max_length=200) name_ar = models.CharField(_("Name (Arabic)"), max_length=200) description_en = models.TextField(_("Description (English)"), blank=True) description_ar = models.TextField(_("Description (Arabic)"), blank=True) price = models.DecimalField(_("Price"), max_digits=10, decimal_places=2, default=0.00) image = models.ImageField(_("Image"), upload_to='subjects/', blank=True, null=True) google_drive_link = models.URLField(_("Google Drive Link"), blank=True) google_meet_link = models.URLField(_("Google Meet Link"), blank=True) def __str__(self): return self.name_en class Resource(models.Model): subject = models.ForeignKey(Subject, on_delete=models.CASCADE, related_name='resources') title_en = models.CharField(_("Title (English)"), max_length=200) title_ar = models.CharField(_("Title (Arabic)"), max_length=200) file = models.FileField(_("File"), upload_to='resources/', blank=True, null=True) link = models.URLField(_("External Link"), blank=True) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title_en class Governorate(models.Model): name_en = models.CharField(_("Name (English)"), max_length=100, default="") name_ar = models.CharField(_("Name (Arabic)"), max_length=100, default="") class Meta: verbose_name = _("Governorate") verbose_name_plural = _("Governorates") def __str__(self): return f"{self.name_en}" class City(models.Model): governorate = models.ForeignKey(Governorate, on_delete=models.CASCADE, related_name='cities', verbose_name=_("Governorate"), null=True, blank=True) name_en = models.CharField(_("Name (English)"), max_length=100, default="") name_ar = models.CharField(_("Name (Arabic)"), max_length=100, default="") class Meta: verbose_name = _("City") verbose_name_plural = _("Cities") def __str__(self): return f"{self.name_en}" class Student(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='student_profile') classroom = models.ForeignKey(Classroom, on_delete=models.SET_NULL, null=True, blank=True, related_name='students') phone_number = models.CharField(_("Phone Number"), max_length=20, blank=True) mobile_number = models.CharField(_("Mobile Number"), max_length=20, blank=True) subscribed_subjects = models.ManyToManyField(Subject, blank=True, related_name='subscribers') governorate = models.ForeignKey(Governorate, on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_("Governorate")) city = models.ForeignKey(City, on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_("City")) avatar = models.ImageField(_("Picture"), upload_to='students/', blank=True, null=True) # Email Verification email_otp_code = models.CharField(max_length=6, blank=True, null=True) is_email_verified = models.BooleanField(default=False) def __str__(self): return self.user.get_full_name() or self.user.username # --- Configuration Models --- class WablasConfiguration(SingletonModel): api_url = models.URLField(default="https://texas.wablas.com") api_token = models.CharField(max_length=255) secret_key = models.CharField(max_length=255, blank=True, null=True) class Meta: verbose_name = "Wablas Configuration" verbose_name_plural = "Wablas Configuration" def __str__(self): return "Wablas Configuration" class ThawaniConfiguration(SingletonModel): api_key = models.CharField(max_length=255, help_text="Thawani Secret Key") publishable_key = models.CharField(max_length=255, help_text="Thawani Publishable Key") is_sandbox = models.BooleanField(default=True, help_text="Check to use Sandbox environment") class Meta: verbose_name = "Thawani Configuration" verbose_name_plural = "Thawani Configuration" def __str__(self): return "Thawani Configuration" class PlatformSettings(SingletonModel): name = models.CharField(max_length=100, default="My School Platform") logo = models.ImageField(upload_to='platform/', blank=True, null=True) description = models.TextField(blank=True, null=True) contact_email = models.EmailField(blank=True, null=True) contact_phone = models.CharField(max_length=20, blank=True, null=True) address = models.TextField(blank=True, null=True) # Social Media facebook_link = models.URLField(blank=True, null=True) twitter_link = models.URLField(blank=True, null=True) instagram_link = models.URLField(blank=True, null=True) class Meta: verbose_name = "Platform Profile" verbose_name_plural = "Platform Profile" def __str__(self): return "Platform Profile"