X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/6e3e08e5354baaf82f7d46cbd88883e4c7426dce..b6acaa277803adf1f39dd61b362ca499b1bb6064:/src/catalogue/models/book.py diff --git a/src/catalogue/models/book.py b/src/catalogue/models/book.py index 696b4afb0..8c53d9c1a 100644 --- a/src/catalogue/models/book.py +++ b/src/catalogue/models/book.py @@ -3,7 +3,7 @@ # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # from collections import OrderedDict -from datetime import date +from datetime import date, timedelta from random import randint import os.path import re @@ -72,6 +72,7 @@ class Book(models.Model): wiki_link = models.CharField(blank=True, max_length=240) print_on_demand = models.BooleanField(_('print on demand'), default=False) recommended = models.BooleanField(_('recommended'), default=False) + audio_length = models.CharField(_('audio length'), blank=True, max_length=8) preview = models.BooleanField(_('preview'), default=False) preview_until = models.DateField(_('preview until'), blank=True, null=True) @@ -114,8 +115,6 @@ class Book(models.Model): html_built = django.dispatch.Signal() published = django.dispatch.Signal() - short_html_url_name = 'catalogue_book_short' - class AlreadyExists(Exception): pass @@ -211,6 +210,32 @@ class Book(models.Model): def is_foreign(self): return self.language_code() != settings.LANGUAGE_CODE + def set_audio_length(self): + length = self.get_audio_length() + if length > 0: + self.audio_length = self.format_audio_length(length) + self.save() + + @staticmethod + def format_audio_length(seconds): + if seconds < 60*60: + minutes = seconds // 60 + seconds = seconds % 60 + return '%d:%02d' % (minutes, seconds) + else: + hours = seconds // 3600 + minutes = seconds % 3600 // 60 + seconds = seconds % 60 + return '%d:%02d:%02d' % (hours, minutes, seconds) + + def get_audio_length(self): + from mutagen.mp3 import MP3 + total = 0 + for media in self.get_mp3() or (): + audio = MP3(media.file.path) + total += audio.info.length + return int(total) + def has_media(self, type_): if type_ in Book.formats: return bool(getattr(self, "%s_file" % type_)) @@ -277,19 +302,18 @@ class Book(models.Model): has_description.short_description = _('description') has_description.boolean = True - # ugly ugly ugly def has_mp3_file(self): - return bool(self.has_media("mp3")) + return self.has_media("mp3") has_mp3_file.short_description = 'MP3' has_mp3_file.boolean = True def has_ogg_file(self): - return bool(self.has_media("ogg")) + return self.has_media("ogg") has_ogg_file.short_description = 'OGG' has_ogg_file.boolean = True def has_daisy_file(self): - return bool(self.has_media("daisy")) + return self.has_media("daisy") has_daisy_file.short_description = 'DAISY' has_daisy_file.boolean = True @@ -433,7 +457,7 @@ class Book(models.Model): old_cover = None book.preview = bool(days) if book.preview: - book.preview_until = date.today() + book.preview_until = date.today() + timedelta(days) else: if not overwrite: raise Book.AlreadyExists(_('Book %s already exists') % book_slug) @@ -728,7 +752,10 @@ class Book(models.Model): def fragment_data(self): fragment = self.choose_fragment() if fragment: - return {'title': fragment.book.pretty_title(), 'html': fragment.get_short_text()} + return { + 'title': fragment.book.pretty_title(), + 'html': re.sub(']*>', '', fragment.get_short_text()), + } else: return None @@ -744,6 +771,17 @@ 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 unlike(self, user): + from social.utils import likes, set_sets + if likes(user, self): + set_sets(user, self, []) + def add_file_fields(): for format_ in Book.formats: @@ -762,6 +800,7 @@ def add_file_fields(): default='' ).contribute_to_class(Book, field_name) + add_file_fields()