from django.db import models from django.utils.translation import gettext_lazy as _ from django.utils.text import slugify class BookReference(models.Model): """ Model for hadis book references with detailed information This is different from library books - these are reference books for hadis """ title = models.CharField(max_length=500, verbose_name=_('title')) description = models.TextField(verbose_name=_('description'), blank=True, null=True) language = models.CharField(max_length=100, verbose_name=_('language'), blank=True, null=True) isbn = models.CharField(max_length=100, verbose_name=_('ISBN'), blank=True, null=True) volume = models.CharField(max_length=100, verbose_name=_('volume'), blank=True, null=True) year_of_publication = models.CharField(max_length=50, verbose_name=_('year of publication'), blank=True, null=True) number_page = models.PositiveIntegerField(verbose_name=_('number of pages'), blank=True, null=True) slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique=True) publisher = models.TextField(verbose_name=_('publisher'),blank=True,null=True) rate = models.DecimalField( max_digits=3, decimal_places=2, verbose_name=_('rate'), blank=True, null=True, help_text=_('Rating from 0 to 5') ) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) updated_at = models.DateTimeField(auto_now=True, verbose_name=_('updated at')) class Meta: verbose_name = _('Book Reference') verbose_name_plural = _('Book References') ordering = ('-created_at',) def __str__(self): return self.title def save(self, *args, **kwargs): if not self.slug: base_slug = slugify(self.title, allow_unicode=True) slug = base_slug counter = 1 while BookReference.objects.filter(slug=slug).exclude(pk=self.pk).exists(): slug = f"{base_slug}-{counter}" counter += 1 self.slug = slug super().save(*args, **kwargs) class BookReferenceImage(models.Model): """ Model for book reference images - multiple images per book reference """ book_reference = models.ForeignKey( BookReference, on_delete=models.CASCADE, related_name='images', verbose_name=_('book reference') ) image = models.ImageField(upload_to='hadis/book_reference_images/', verbose_name=_('image')) order = models.PositiveIntegerField(default=0, verbose_name=_('order')) description = models.CharField(max_length=255, verbose_name=_('description'), blank=True, null=True) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) class Meta: verbose_name = _('Book Reference Image') verbose_name_plural = _('Book Reference Images') ordering = ['order', '-created_at'] def __str__(self): return f"{self.book_reference.title} - Image {self.order}" class BookAuthor(models.Model): """ Model for book reference authors """ name = models.CharField(max_length=255, verbose_name=_('name')) book_references = models.ManyToManyField( BookReference, related_name='authors', verbose_name=_('book references'), blank=True ) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) updated_at = models.DateTimeField(auto_now=True, verbose_name=_('updated at')) class Meta: verbose_name = _('Book Author') verbose_name_plural = _('Book Authors') ordering = ['name'] def __str__(self): return self.name class BookAttribute(models.Model): """ Model for book reference attributes - custom key-value pairs """ title = models.CharField(max_length=255, verbose_name=_('title')) value = models.CharField(max_length=500, verbose_name=_('value')) book_reference = models.ForeignKey( BookReference, on_delete=models.CASCADE, related_name='attributes', verbose_name=_('book attribute'), default = None, null = True ) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) updated_at = models.DateTimeField(auto_now=True, verbose_name=_('updated at')) class Meta: verbose_name = _('Book Attribute') verbose_name_plural = _('Book Attributes') ordering = ['title'] def __str__(self): return f"{self.title}: {self.value}"