SORT_KEY_SEP = '$'
+ is_book = True
+
class AlreadyExists(Exception):
pass
def isbn_mobi(self):
return self.get_extra_info_json().get('isbn_mobi')
+ def is_accessible_to(self, user):
+ if not self.preview:
+ return True
+ if not user.is_authenticated:
+ return False
+ Membership = apps.get_model('club', 'Membership')
+ if Membership.is_active_for(user):
+ return True
+ Funding = apps.get_model('funding', 'Funding')
+ if Funding.objects.filter(user=user, offer__book=self):
+ return True
+ return False
def save(self, force_insert=False, force_update=False, **kwargs):
from sortify import sortify
return self.parent.get_prev_text()
- def get_next_text(self):
- child = self.children.order_by('parent_number').first()
- if child is not None:
- return child.get_first_text()
+ def get_next_text(self, inside=True):
+ if inside:
+ child = self.children.order_by('parent_number').first()
+ if child is not None:
+ return child.get_first_text()
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()
+ return self.parent.get_next_text(inside=False)
def get_child_audiobook(self):
BookMedia = apps.get_model('catalogue', 'BookMedia')
if not BookMedia.objects.filter(book__ancestor=self).exists():
return None
- for child in self.children.all():
+ for child in self.children.order_by('parent_number').all():
if child.has_mp3_file():
return child
child_sub = child.get_child_audiobook()
# will make problems in conjunction with paid previews
def download_pictures(self, remote_gallery_url):
+ # This is only needed for legacy relative image paths.
gallery_path = self.gallery_path()
# delete previous files, so we don't include old files in ebooks
if os.path.isdir(gallery_path):
makedirs(gallery_path)
for ilustr in ilustr_elements:
ilustr_src = ilustr.get('src')
+ if '/' in ilustr_src:
+ continue
ilustr_path = os.path.join(gallery_path, ilustr_src)
urlretrieve('%s/%s' % (remote_gallery_url, ilustr_src), ilustr_path)
def related_themes(self):
return Tag.objects.usage_for_queryset(
Fragment.objects.filter(models.Q(book=self) | models.Q(book__ancestor=self)),
- counts=True).filter(category='theme')
+ counts=True).filter(category='theme').order_by('-count')
def parent_cover_changed(self):
"""Called when parent book's cover image is changed."""