from random import randint
import os.path
import re
+import requests
from slugify import slugify
from sortify import sortify
from urllib.request import urlretrieve
class Book(models.Model):
"""Represents a book imported from WL-XML."""
title = models.CharField('tytuł', max_length=32767)
- sort_key = models.CharField('klucz sortowania', max_length=120, db_index=True, editable=False)
+ sort_key = models.CharField('klucz sortowania', max_length=120, db_index=True, db_collation='C', editable=False)
sort_key_author = models.CharField(
- 'klucz sortowania wg autora', max_length=120, db_index=True, editable=False, default='')
+ 'klucz sortowania wg autora', max_length=120, db_index=True, db_collation='C', editable=False, default='')
slug = models.SlugField('slug', max_length=120, db_index=True, unique=True)
common_slug = models.SlugField('wspólny slug', max_length=120, db_index=True)
language = models.CharField('kod języka', max_length=3, db_index=True, default=app_settings.DEFAULT_LANGUAGE)
preview_until = models.DateField('prapremiera do', blank=True, null=True)
preview_key = models.CharField(max_length=32, blank=True, null=True)
findable = models.BooleanField('wyszukiwalna', default=True, db_index=True)
+ can_sell = models.BooleanField('do sprzedaży', default=True)
+ can_sell_mp3 = models.BooleanField('do sprzedaży mp3', default=False)
+ isbn_mp3 = models.CharField('ISBN audiobooka', max_length=32, blank=True)
# files generated during publication
xml_file = fields.XmlField(storage=bofh_storage, with_etag=False)
@classmethod
def from_text_and_meta(cls, raw_file, book_info, overwrite=False, dont_build=None, search_index=True,
- remote_gallery_url=None, days=0, findable=True, logo=None, logo_mono=None, logo_alt=None):
+ remote_gallery_url=None, days=0, findable=True, logo=None, logo_mono=None, logo_alt=None, can_sell=None, isbn_mp3=None):
from catalogue import tasks
if dont_build is None:
extra['logo_mono'] = logo_mono
if logo_alt:
extra['logo_alt'] = logo_alt
+ if can_sell is not None:
+ book.can_sell = can_sell
+ if isbn_mp3 is not None:
+ book.isbn_mp3 = isbn_mp3
book.extra_info = json.dumps(extra)
book.load_abstract()
book.load_toc()
def update_stats(self):
stats = self.wldocument2().get_statistics()['total']
self.pages = round(
- stats['verses_with_fn'] / 30 +
- stats['chars_out_verse_with_fn'] / 1800)
+ stats.get('verses_with_fn', 0) / 30 +
+ stats.get('chars_out_verse_with_fn', 0) / 1800)
self.read_time = round(self.get_time())
self.save(update_fields=['pages', 'read_time'])
if self.parent is not None:
narrators.append(t)
self.narrators.set(narrators)
+ def update_can_sell_mp3(self):
+ ret = True
+ for child in self.get_children():
+ child.update_can_sell_mp3()
+ if not child.can_sell_mp3:
+ ret = False
+ if self.has_mp3_file():
+ audio_items = requests.get(f'https://audio.wolnelektury.pl/archive/book/{self.slug}.json').json()['items']
+ if not all(x['project']['can_sell'] for x in audio_items):
+ ret = False
+ self.can_sell_mp3 = ret
+ self.save(update_fields=['can_sell_mp3'])
+
@classmethod
@transaction.atomic
def repopulate_ancestors(cls):