X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/f4a7254db57835252ea0cf23ab45d0baea71dc38..8658102277980ea8e8e53a953e7c2f5fedf8de16:/apps/catalogue/models.py diff --git a/apps/catalogue/models.py b/apps/catalogue/models.py index bb0067f35..1a2e8f86f 100644 --- a/apps/catalogue/models.py +++ b/apps/catalogue/models.py @@ -31,6 +31,8 @@ from slughifi import slughifi from sortify import sortify from os import unlink +import search + TAG_CATEGORIES = ( ('author', _('author')), ('epoch', _('epoch')), @@ -220,10 +222,11 @@ class BookMedia(models.Model): if slughifi(self.name) != slughifi(old.name): self.file.save(None, ExistingFile(self.file.path), save=False, leave=True) + super(BookMedia, self).save(*args, **kwargs) + # 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()) self.set_extra_info_value(extra_info) @@ -466,9 +469,6 @@ class Book(models.Model): from tempfile import NamedTemporaryFile import os - # remove zip with all pdf files - remove_zip(settings.ALL_PDF_ZIP) - try: pdf_file = NamedTemporaryFile(delete=False) pdf.transform(ORMDocProvider(self), @@ -480,6 +480,9 @@ class Book(models.Model): finally: unlink(pdf_file.name) + # remove zip with all pdf files + remove_zip(settings.ALL_PDF_ZIP) + def build_mobi(self): """ (Re)builds the MOBI file. @@ -488,9 +491,6 @@ class Book(models.Model): from tempfile import NamedTemporaryFile import os - # remove zip with all pdf files - remove_zip(settings.ALL_MOBI_ZIP) - try: mobi_file = NamedTemporaryFile(suffix='.mobi', delete=False) mobi.transform(ORMDocProvider(self), verbose=1, @@ -502,6 +502,9 @@ class Book(models.Model): finally: unlink(mobi_file.name) + # remove zip with all mobi files + remove_zip(settings.ALL_MOBI_ZIP) + def build_epub(self, remove_descendants=True): """ (Re)builds the epub file. If book has a parent, does nothing. @@ -515,9 +518,6 @@ 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(ORMDocProvider(self), self.slug, output_file=epub_file) @@ -535,6 +535,9 @@ class Book(models.Model): child_book.save() book_descendants += list(child_book.children.all()) + # remove zip package with all epub files + remove_zip(settings.ALL_EPUB_ZIP) + def build_txt(self): from StringIO import StringIO from django.core.files.base import ContentFile @@ -601,38 +604,42 @@ class Book(models.Model): 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) + def zip_format(format_): + def pretty_file_name(book): + return "%s/%s.%s" % ( + b.get_extra_info_value()['author'], + b.slug, + format_) + + field_name = "%s_file" % format_ + books = Book.objects.filter(parent=None).exclude(**{field_name: ""}) + paths = [(pretty_file_name(b), getattr(b, field_name).path) + for b in books] + result = create_zip.delay(paths, + getattr(settings, "ALL_%s_ZIP" % format_.upper())) return 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 result.wait() - - @staticmethod - def zip_mobi(): - books = Book.objects.all() - - paths = filter(lambda x: x is not None, - map(lambda b: b.mobi_file and b.mobi_file.path or None, books)) - result = create_zip_task.delay(paths, settings.ALL_MOBI_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) + bm = BookMedia.objects.filter(book=self, type='mp3') + paths = map(lambda bm: (None, bm.file.path), bm) + result = create_zip.delay(paths, self.slug) return result.wait() + def search_index(self): + if settings.SEARCH_INDEX_PARALLEL: + if instance(settings.SEARCH_INDEX_PARALLEL, int): + idx = search.ReusableIndex(threads=4) + else: + idx = search.ReusableIndex() + else: + idx = search.Index() + + idx.open() + try: + idx.index_book(self) + finally: + idx.close() + @classmethod def from_xml_file(cls, xml_file, **kwargs): # use librarian to parse meta-data @@ -648,7 +655,8 @@ class Book(models.Model): @classmethod def from_text_and_meta(cls, raw_file, book_info, overwrite=False, - build_epub=True, build_txt=True, build_pdf=True, build_mobi=True): + build_epub=True, build_txt=True, build_pdf=True, build_mobi=True, + search_index=True): import re # check for parts before we do anything @@ -727,6 +735,9 @@ class Book(models.Model): if not settings.NO_BUILD_MOBI and build_mobi: book.build_mobi() + if not settings.NO_SEARCH_INDEX and search_index: + book.search_index() + book_descendants = list(book.children.all()) # add l-tag to descendants and their fragments # delete unnecessary EPUB files