X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/3d8d1e8e463efe111ed2e2a99861ada52759a1d9..3a536ae0c5aad3f82eb0d344c5f24111532b41ac:/src/catalogue/models/book.py diff --git a/src/catalogue/models/book.py b/src/catalogue/models/book.py index 0400656e2..d7c6f019c 100644 --- a/src/catalogue/models/book.py +++ b/src/catalogue/models/book.py @@ -94,11 +94,13 @@ class Book(models.Model): objects = models.Manager() tagged = managers.ModelTaggedItemManager(Tag) tags = managers.TagDescriptor(Tag) - tag_relations = GenericRelation(Tag.intermediary_table_model) + tag_relations = GenericRelation(Tag.intermediary_table_model, related_query_name='tagged_book') 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 +189,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 @@ -471,8 +477,9 @@ class Book(models.Model): None, ContentFile(sync) ) - def get_sync(self): + if not self.has_sync_file(): + return [] with self.get_media('sync').first().file.open('r') as f: sync = f.read().split('\n') offset = float(sync[0]) @@ -482,8 +489,22 @@ class Book(models.Model): continue start, end, elid = line.split() items.append([elid, float(start) + offset]) - return json.dumps(items) - + return items + + def sync_ts(self, ts): + elid = None + for cur_id, t in self.get_sync(): + if ts >= t: + elid = cur_id + else: + break + return elid + + def sync_elid(self, elid): + for cur_id, t in self.get_sync(): + if cur_id == elid: + return t + def has_audio_epub_file(self): return self.has_media("audio.epub") @@ -722,6 +743,8 @@ class Book(models.Model): 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] @@ -789,6 +812,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['verses_with_fn'] / 30 + + stats['chars_out_verse_with_fn'] / 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() @@ -986,6 +1019,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`. @@ -1094,7 +1133,7 @@ class Book(models.Model): return None def update_popularity(self): - count = self.tags.filter(category='set').values('user').order_by('user').distinct().count() + count = self.userlistitem_set.values('list__user').order_by('list__user').distinct().count() try: pop = self.popularity pop.count = count @@ -1105,16 +1144,23 @@ class Book(models.Model): def ridero_link(self): return 'https://ridero.eu/%s/books/wl_%s/' % (get_language(), self.slug.replace('-', '_')) - def like(self, user): - from social.utils import likes, get_set, set_sets - if not likes(user, self): - tag = get_set(user, '') - set_sets(user, self, [tag]) + def elevenreader_link(self): + first_text = self.get_first_text() + if first_text is None: + return None + return 'https://elevenreader.io/audiobooks/wolnelektury:' + first_text.slug - def unlike(self, user): - from social.utils import likes, set_sets - if likes(user, self): - set_sets(user, self, []) + def content_warnings(self): + warnings_def = { + 'wulgaryzmy': _('wulgaryzmy'), + } + warnings = self.get_extra_info_json().get('content_warnings', []) + warnings = [ + warnings_def.get(w, w) + for w in warnings + ] + warnings.sort() + return warnings def full_sort_key(self): return self.SORT_KEY_SEP.join((self.sort_key_author, self.sort_key, str(self.id)))