def build_epub(self, remove_descendants=True): """ (Re)builds the epub file. If book has a parent, does nothing. Unless remove_descendants is False, descendants' epubs are removed. """ from StringIO import StringIO from hashlib import sha1 from django.core.files.base import ContentFile from librarian import DocProvider class BookImportDocProvider(DocProvider): """ used for joined EPUBs """ def __init__(self, book): self.book = book def by_slug(self, slug): if slug == self.book.slug: return self.book.xml_file else: return Book.objects.get(slug=slug).xml_file if self.parent: # don't need an epub return 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())) FileRecord(slug=self.slug, type='epub', sha1=sha1(epub_file.getvalue()).hexdigest()).save() except NoDublinCore: pass book_descendants = list(self.children.all()) while len(book_descendants) > 0: child_book = book_descendants.pop(0) if remove_descendants and child_book.has_epub_file(): child_book.epub_file.delete() # save anyway, to refresh short_html child_book.save() book_descendants += list(child_book.children.all())
def as_epub(self, *args, **kwargs): from librarian import epub return epub.transform(self, *args, **kwargs)