X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/46705d393ae76a1d8e0eb2dc8bf121269f6adb67..35ccafef8a83575ac0bf5901b58630033aa95d1e:/apps/catalogue/models.py diff --git a/apps/catalogue/models.py b/apps/catalogue/models.py index 930f98d14..e4d359500 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 @@ -220,6 +220,9 @@ class BookMedia(models.Model): if slughifi(self.name) != slughifi(old.name): self.file.save(None, ExistingFile(self.file.path), save=False, leave=True) + # remove the zip package for book with modified media + remove_zip(self.book.slug) + super(BookMedia, self).save(*args, **kwargs) extra_info = self.get_extra_info_value() extra_info.update(self.read_meta()) @@ -283,7 +286,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 +517,24 @@ class Book(models.Model): """ (Re)builds the pdf file. """ - from librarian import pdf, ParseError + from librarian import pdf from tempfile import NamedTemporaryFile import os - 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, - ) + # remove zip with all pdf files + remove_zip(settings.ALL_PDF_ZIP) - self.pdf_file.save('%s.pdf' % self.slug, File(open(pdf_file.name))) - finally: - unlink(pdf_file.name) + 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, + ) - 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. @@ -552,6 +549,9 @@ class Book(models.Model): # don't need an epub return + # remove zip package with all epub files + remove_zip(settings.ALL_EPUB_ZIP) + epub_file = StringIO() try: epub.transform(BookImportDocProvider(self), self.slug, output_file=epub_file) @@ -634,6 +634,42 @@ 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)) + if settings.USE_CELERY: + result = create_zip_task.delay(paths, settings.ALL_EPUB_ZIP) + return result.wait() + else: + result = create_zip_task(paths, settings.ALL_EPUB_ZIP) + return result + + @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)) + if settings.USE_CELERY: + result = create_zip_task.delay(paths, settings.ALL_PDF_ZIP) + return result.wait() + else: + result = create_zip_task(paths, settings.ALL_PDF_ZIP) + return result + + def zip_audiobooks(self): + bm = BookMedia.objects.filter(book=self) + paths = map(lambda bm: bm.file.path, bm) + if settings.USE_CELERY: + result = create_zip_task.delay(paths, self.slug) + return result.wait() + else: + result = create_zip_task(paths, self.slug) + return result + @classmethod def from_xml_file(cls, xml_file, **kwargs):