null=True, blank=True,
upload_to=_cover_upload_to,
storage=bofh_storage, max_length=255)
+ cover_etag = models.CharField(max_length=255, editable=False, default='', db_index=True)
# Cleaner version of cover for thumbs
cover_thumb = EbookField(
'cover_thumb', _('cover thumbnail'),
null=True, blank=True,
upload_to=_cover_thumb_upload_to,
max_length=255)
+ cover_thumb_etag = models.CharField(max_length=255, editable=False, default='', db_index=True)
cover_api_thumb = EbookField(
'cover_api_thumb', _('cover thumbnail for mobile app'),
null=True, blank=True,
upload_to=_cover_api_thumb_upload_to,
max_length=255)
+ cover_api_thumb_etag = models.CharField(max_length=255, editable=False, default='', db_index=True)
simple_cover = EbookField(
'simple_cover', _('cover for mobile app'),
null=True, blank=True,
upload_to=_simple_cover_upload_to,
max_length=255)
+ simple_cover_etag = models.CharField(max_length=255, editable=False, default='', db_index=True)
cover_ebookpoint = EbookField(
'cover_ebookpoint', _('cover for Ebookpoint'),
null=True, blank=True,
upload_to=_cover_ebookpoint_upload_to,
max_length=255)
+ cover_ebookpoint_etag = models.CharField(max_length=255, editable=False, default='', db_index=True)
ebook_formats = constants.EBOOK_FORMATS
formats = ebook_formats + ['html', 'xml']
def cover_source(self):
return self.get_extra_info_json().get('cover_source', self.parent.cover_source() if self.parent else '')
+ @property
+ def isbn_pdf(self):
+ return self.get_extra_info_json().get('isbn_pdf')
+
+ @property
+ def isbn_epub(self):
+ return self.get_extra_info_json().get('isbn_epub')
+
+ @property
+ def isbn_mobi(self):
+ return self.get_extra_info_json().get('isbn_mobi')
+
+
def save(self, force_insert=False, force_update=False, **kwargs):
from sortify import sortify
def gallery_url(self):
return gallery_url(self.slug)
+ def get_first_text(self):
+ if self.html_file:
+ return self
+ child = self.children.all().order_by('parent_number').first()
+ if child is not None:
+ return child.get_first_text()
+
+ def get_last_text(self):
+ if self.html_file:
+ return self
+ child = self.children.all().order_by('parent_number').last()
+ if child is not None:
+ return child.get_last_text()
+
+ def get_prev_text(self):
+ if not self.parent:
+ return None
+ sibling = self.parent.children.filter(parent_number__lt=self.parent_number).order_by('-parent_number').first()
+ if sibling is not None:
+ return sibling.get_last_text()
+ return self.parent.get_prev_text()
+
+ def get_next_text(self):
+ if not self.parent:
+ return None
+ sibling = self.parent.children.filter(parent_number__gt=self.parent_number).order_by('parent_number').first()
+ if sibling is not None:
+ return sibling.get_first_text()
+ return self.parent.get_next_text()
+
+ def get_siblings(self):
+ if not self.parent:
+ return []
+ return self.parent.children.all().order_by('parent_number')
+
@property
def name(self):
return self.title
blank=True,
default=''
).contribute_to_class(Book, field_name)
+ if format_ != 'xml':
+ models.CharField(max_length=255, editable=False, default='', db_index=True).contribute_to_class(Book, f'{field_name}_etag')
add_file_fields()