X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/9aa0db6d60b6b517f0efdff4e0f7e585e1d35de1..b15410e8b6dc970a92d0716dd54f154090ff6946:/apps/catalogue/models.py diff --git a/apps/catalogue/models.py b/apps/catalogue/models.py index 7e3ccfecb..cb1eff841 100644 --- a/apps/catalogue/models.py +++ b/apps/catalogue/models.py @@ -453,8 +453,7 @@ class Book(models.Model): epub_file = StringIO() try: epub.transform(BookImportDocProvider(self), self.slug, output_file=epub_file) - self.epub_file.save('%s.epub' % self.slug, ContentFile(epub_file.getvalue()), save=False) - self.save() + self.epub_file.save('%s.epub' % self.slug, ContentFile(epub_file.getvalue())) FileRecord(slug=self.slug, type='epub', sha1=sha1(epub_file.getvalue()).hexdigest()).save() except NoDublinCore: pass @@ -468,9 +467,19 @@ class Book(models.Model): child_book.save() book_descendants += list(child_book.children.all()) + def build_txt(self): + from StringIO import StringIO + from django.core.files.base import ContentFile + from librarian import text + + out = StringIO() + text.transform(open(self.xml_file.path), out) + self.txt_file.save('%s.txt' % self.slug, ContentFile(out.getvalue())) + self.save() + @classmethod - def from_xml_file(cls, xml_file, overwrite=False, build_epub=True): + def from_xml_file(cls, xml_file, **kwargs): # use librarian to parse meta-data book_info = dcparser.parse(xml_file) @@ -478,12 +487,13 @@ class Book(models.Model): xml_file = File(open(xml_file)) try: - return cls.from_text_and_meta(xml_file, book_info, overwrite, build_epub=build_epub) + return cls.from_text_and_meta(xml_file, book_info, **kwargs) finally: xml_file.close() @classmethod - def from_text_and_meta(cls, raw_file, book_info, overwrite=False, build_epub=True): + def from_text_and_meta(cls, raw_file, book_info, overwrite=False, build_epub=True, build_txt=True): + import re from tempfile import NamedTemporaryFile from slughifi import slughifi from markupstring import MarkupString @@ -502,6 +512,8 @@ class Book(models.Model): # Read book metadata book_base, book_slug = book_info.url.rsplit('/', 1) + if re.search(r'[^a-zA-Z0-9-]', book_slug): + raise ValueError('Invalid characters in slug') book, created = Book.objects.get_or_create(slug=book_slug) if created: @@ -592,6 +604,9 @@ class Book(models.Model): new_fragment.save() new_fragment.tags = set(book_tags + themes + [book_tag] + ancestor_tags) + if not settings.NO_BUILD_TXT and build_txt: + book.build_txt() + if not settings.NO_BUILD_EPUB and build_epub: book.root_ancestor.build_epub()