83 lines
3.5 KiB
Python
83 lines
3.5 KiB
Python
![]() |
import django.contrib.postgres.fields as postgres
|
||
|
from django.utils.translation import ugettext_lazy as _
|
||
|
from django.db import models
|
||
|
from django.core.serializers.json import DjangoJSONEncoder
|
||
|
from common.models import Resource, Mark, Review
|
||
|
from boofilsic.settings import BOOK_MEDIA_PATH_ROOT, DEFAULT_BOOK_IMAGE
|
||
|
from datetime import datetime
|
||
|
|
||
|
|
||
|
def book_cover_path(instance, filename):
|
||
|
raise NotImplementedError("UUID!!!!!!!!!!!")
|
||
|
root = ''
|
||
|
if BOOK_MEDIA_PATH_ROOT.endswith('/'):
|
||
|
root = BOOK_MEDIA_PATH_ROOT
|
||
|
else:
|
||
|
root = BOOK_MEDIA_PATH_ROOT + '/'
|
||
|
return root + datetime.now().strftime('%Y/%m/%d') + f'{filename}'
|
||
|
|
||
|
|
||
|
class Book(Resource):
|
||
|
# widely recognized name, usually in Chinese
|
||
|
title = models.CharField(_("title"), max_length=200)
|
||
|
subtitle = models.CharField(_("subtitle"), blank=True, default='', max_length=200)
|
||
|
# original name, for books in foreign language
|
||
|
orig_title = models.CharField(_("original title"), blank=True, default='', max_length=200)
|
||
|
|
||
|
author = postgres.ArrayField(
|
||
|
models.CharField(_("author"), blank=True, default='', max_length=100),
|
||
|
null=True,
|
||
|
blank=True,
|
||
|
default=list,
|
||
|
)
|
||
|
translator = postgres.ArrayField(
|
||
|
models.CharField(_("translator"), blank=True, default='', max_length=100),
|
||
|
null=True,
|
||
|
blank=True,
|
||
|
default=list,
|
||
|
)
|
||
|
language = models.CharField(_("language"), blank=True, default='', max_length=10)
|
||
|
pub_house = models.CharField(_("publishing house"), blank=True, default='', max_length=200)
|
||
|
pub_year = models.IntegerField(_("published year"), null=True, blank=True)
|
||
|
pub_month = models.IntegerField(_("published month"), null=True, blank=True)
|
||
|
binding = models.CharField(_("binding"), blank=True, default='', max_length=50)
|
||
|
# since data origin is not formatted and might be CNY USD or other currency, use char instead
|
||
|
price = models.CharField(_("pricing"), blank=True, default='', max_length=50)
|
||
|
pages = models.PositiveIntegerField(_("pages"), null=True, blank=True)
|
||
|
isbn = models.CharField(_("ISBN"), blank=True, max_length=20, unique=True, db_index=True)
|
||
|
# to store previously scrapped data
|
||
|
img_url = models.URLField(max_length=300)
|
||
|
cover = models.ImageField(_("cover picture"), upload_to=book_cover_path, default=DEFAULT_BOOK_IMAGE, blank=True)
|
||
|
|
||
|
class Meta:
|
||
|
# more info: https://docs.djangoproject.com/en/2.2/ref/models/options/
|
||
|
# set managed=False if the model represents an existing table or
|
||
|
# a database view that has been created by some other means.
|
||
|
# check the link above for further info
|
||
|
# managed = True
|
||
|
# db_table = 'book'
|
||
|
constraints = [
|
||
|
models.CheckConstraint(check=models.Q(pub_year__gte=0), name='pub_year_lowerbound'),
|
||
|
models.CheckConstraint(check=models.Q(pub_month__lte=12), name='pub_month_upperbound'),
|
||
|
models.CheckConstraint(check=models.Q(pub_month__gte=1), name='pub_month_lowerbound'),
|
||
|
]
|
||
|
|
||
|
def __str__(self):
|
||
|
return self.title
|
||
|
|
||
|
|
||
|
class BookMark(Mark):
|
||
|
book = models.ForeignKey(Book, on_delete=models.SET_NULL, related_name='book_marks', null=True)
|
||
|
class Meta:
|
||
|
constraints = [
|
||
|
models.UniqueConstraint(fields=['owner', 'book'], name="unique_book_mark")
|
||
|
]
|
||
|
|
||
|
|
||
|
class BookReview(Review):
|
||
|
book = models.ForeignKey(Book, on_delete=models.SET_NULL, related_name='book_reviews', null=True)
|
||
|
class Meta:
|
||
|
constraints = [
|
||
|
models.UniqueConstraint(fields=['owner', 'book'], name="unique_book_review")
|
||
|
]
|