X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/46705d393ae76a1d8e0eb2dc8bf121269f6adb67..0c613164e94ea79fce559b2b1632691986a84f25:/apps/catalogue/models.py diff --git a/apps/catalogue/models.py b/apps/catalogue/models.py index 930f98d14..a9445a24f 100644 --- a/apps/catalogue/models.py +++ b/apps/catalogue/models.py @@ -22,7 +22,7 @@ from django.conf import settings from newtagging.models import TagBase, tags_updated from newtagging import managers from catalogue.fields import JSONField, OverwritingFileField -from catalogue.utils import ExistingFile, BookImportDocProvider +from catalogue.utils import ExistingFile, BookImportDocProvider, create_zip_task, remove_zip from librarian import dcparser, html, epub, NoDublinCore import mutagen @@ -283,7 +283,7 @@ class BookMedia(models.Model): class Book(models.Model): title = models.CharField(_('title'), max_length=120) - sort_key = models.CharField(_('sort_key'), max_length=120, db_index=True, editable=False) + sort_key = models.CharField(_('sort key'), max_length=120, db_index=True, editable=False) slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True) description = models.TextField(_('description'), blank=True) created_at = models.DateTimeField(_('creation date'), auto_now_add=True, db_index=True) @@ -514,30 +514,21 @@ class Book(models.Model): """ (Re)builds the pdf file. """ - from librarian import pdf, ParseError + from librarian import pdf from tempfile import NamedTemporaryFile import os + path, fname = os.path.realpath(self.xml_file.path).rsplit('/', 1) try: - path, fname = os.path.realpath(self.xml_file.path).rsplit('/', 1) - try: - pdf_file = NamedTemporaryFile(delete=False) - - pdf.transform(BookImportDocProvider(self), - file_path=str(self.xml_file.path), - output_file=pdf_file, - ) - - self.pdf_file.save('%s.pdf' % self.slug, File(open(pdf_file.name))) - finally: - unlink(pdf_file.name) + pdf_file = NamedTemporaryFile(delete=False) + pdf.transform(BookImportDocProvider(self), + file_path=str(self.xml_file.path), + output_file=pdf_file, + ) - except ParseError, e: - print '%(file)s:%(name)s:%(message)s; use -v to see more output' % { - 'file': self.xml_file.path, - 'name': e.__class__.__name__, - 'message': e - } + self.pdf_file.save('%s.pdf' % self.slug, File(open(pdf_file.name))) + finally: + unlink(pdf_file.name) def build_epub(self, remove_descendants=True): """ (Re)builds the epub file. @@ -634,6 +625,35 @@ class Book(models.Model): return True return False + @staticmethod + def zip_epub(): + books = Book.objects.all() + + paths = filter(lambda x: x is not None, + map(lambda b: b.epub_file and b.epub_file.path or None, books)) + result = create_zip_task.delay(paths, settings.ALL_EPUB_ZIP) + return settings.MEDIA_URL + result.wait() + + @staticmethod + def zip_pdf(): + books = Book.objects.all() + + paths = filter(lambda x: x is not None, + map(lambda b: b.pdf_file and b.pdf_file.path or None, books)) + result = create_zip_task.delay(paths, settings.ALL_PDF_ZIP) + return settings.MEDIA_URL + result.wait() + + def zip_audiobooks(self): + bm = BookMedia.objects.filter(book=self) + paths = map(lambda bm: bm.file.path, bm) + result = create_zip_task.delay(paths, self.slug) + + return settings.MEDIA_URL + result.wait() + + def clean_zip_files(self): + remove_zip(self.slug) + remove_zip(settings.ALL_EPUB_ZIP) + remove_zip(settings.ALL_PDF_ZIP) @classmethod def from_xml_file(cls, xml_file, **kwargs):