You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

111 lines
4.0 KiB

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)
# 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
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_references = models.ManyToManyField(
BookReference,
related_name='attributes',
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 Attribute')
verbose_name_plural = _('Book Attributes')
ordering = ['title']
def __str__(self):
return f"{self.title}: {self.value}"