from django.db import models from django.utils.translation import gettext_lazy as _ from django.core.exceptions import ValidationError from filer.fields.image import FilerImageField class HadisTag(models.Model): title = models.CharField(max_length=355, verbose_name=_('title')) status = models.BooleanField(default=True, verbose_name=_('status')) def __str__(self): return f"{self.title}" class Hadis(models.Model): number = models.PositiveIntegerField(verbose_name=_('number'), unique=True) title = models.CharField(max_length=355, verbose_name=_('title')) text = models.TextField(verbose_name=_('text')) translation = models.TextField(verbose_name=_('translation'), blank=True, default='') category = models.ForeignKey("hadis.HadisCategory", null=True, on_delete=models.SET_NULL, verbose_name=_('category'), ) status = models.BooleanField(default=True, verbose_name=_('visibility')) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) updated_at = models.DateTimeField(auto_now=True, verbose_name=_('updated at')) def __str__(self): return f"<{self.number}> {self.title[:32]}" @property def get_tags(self): return self.tags.all().order_by('hadistagrelation__priority') class Meta: verbose_name = _('hadis') verbose_name_plural = _('hadises') class HadisOverview(models.Model): hadis = models.OneToOneField(Hadis, on_delete=models.CASCADE, primary_key=True) status = models.CharField(max_length=50, verbose_name=_('status')) status_color = models.CharField(max_length=25, verbose_name=_('Display Status Color')) status_text = models.TextField(verbose_name=_('Status Text'), null=True, blank=True) address = models.TextField(verbose_name=_('address'), null=True, blank=True) links = models.JSONField(verbose_name=_('title'), null=True, blank=True, default=dict) tags = models.ManyToManyField("HadisTag", related_name="hadises", verbose_name=_('tags'), blank=True) share_link = models.CharField(max_length=255, verbose_name=_('share link'), null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) class HadisReference(models.Model): hadis = models.ForeignKey( Hadis, on_delete=models.CASCADE, verbose_name=_('hadis'), related_name='references' ) book = models.ForeignKey("library.Book", on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_('book'), related_name='hadis_references') description = models.TextField(verbose_name=_('description'), blank=True, null=True) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) class Meta: verbose_name = _('Hadis Reference') verbose_name_plural = _('Hadis References') def __str__(self): return f'{self.hadis.number}-{self.book.title}' class ReferenceImage(models.Model): reference = models.ForeignKey(HadisReference, verbose_name="Hadis Reference", on_delete=models.CASCADE) thumbnail = FilerImageField( related_name='+', on_delete=models.PROTECT, null=True, blank=True, verbose_name=_('thumbnail') ) priority = models.IntegerField( default=0, verbose_name=_("Priority"), help_text=_("Priority of the image, lower values mean higher priority.") ) class Meta: verbose_name = _('Reference Image') verbose_name_plural = _('Reference Images') def __str__(self): return f'{self.reference.title}-{self.id}' def save(self, *args, **kwargs): if ReferenceImage.objects.filter(reference=self.reference, priority=self.priority).exists(): ReferenceImage.objects.filter( reference=self.reference, priority__gte=self.priority ).update(priority=F('priority') + 1) super().save(*args, **kwargs)