X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/d08ac1730868531e81bf918e0362935e988428ca..818d7c89881b8a864b7465323dfcfa2abaaafb38:/src/catalogue/models/book.py diff --git a/src/catalogue/models/book.py b/src/catalogue/models/book.py index ee3aecb02..8597eac75 100644 --- a/src/catalogue/models/book.py +++ b/src/catalogue/models/book.py @@ -38,9 +38,9 @@ bofh_storage = BofhFileSystemStorage() 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) @@ -61,6 +61,7 @@ class Book(models.Model): 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) # files generated during publication xml_file = fields.XmlField(storage=bofh_storage, with_etag=False) @@ -98,7 +99,9 @@ class Book(models.Model): translators = models.ManyToManyField(Tag, blank=True) narrators = models.ManyToManyField(Tag, blank=True, related_name='narrated') has_audio = models.BooleanField(default=False) - + read_time = models.IntegerField(blank=True, null=True) + pages = models.IntegerField(blank=True, null=True) + html_built = django.dispatch.Signal() published = django.dispatch.Signal() @@ -187,6 +190,10 @@ class Book(models.Model): def isbn_mobi(self): return self.get_extra_info_json().get('isbn_mobi') + @property + def redakcja(self): + return self.get_extra_info_json().get('about') + def is_accessible_to(self, user): if not self.preview: return True @@ -677,7 +684,7 @@ class Book(models.Model): @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): from catalogue import tasks if dont_build is None: @@ -732,11 +739,15 @@ class Book(models.Model): extra['logo_mono'] = logo_mono if logo_alt: extra['logo_alt'] = logo_alt + if can_sell is not None: + book.can_sell = can_sell book.extra_info = json.dumps(extra) book.load_abstract() book.load_toc() book.save() + book.update_stats() + meta_tags = Tag.tags_from_info(book_info) just_tags = [t for (t, rel) in meta_tags if not rel] @@ -804,6 +815,16 @@ class Book(models.Model): cls.published.send(sender=cls, instance=book) return book + def update_stats(self): + stats = self.wldocument2().get_statistics()['total'] + self.pages = round( + 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: + self.parent.update_stats() + def update_references(self): Entity = apps.get_model('references', 'Entity') doc = self.wldocument2() @@ -1001,6 +1022,12 @@ class Book(models.Model): elif isinstance(publisher, list): return ', '.join(publisher) + def get_recommended(self, limit=4): + books_qs = type(self).objects.filter(findable=True) + books_qs = books_qs.exclude(common_slug=self.common_slug).exclude(ancestor=self) + books = type(self).tagged.related_to(self, books_qs)[:limit] + return books + @classmethod def tagged_top_level(cls, tags): """ Returns top-level books tagged with `tags`.