+ # ugly ugly ugly
+ def has_mp3_file(self):
+ return bool(self.has_media("mp3"))
+ has_mp3_file.short_description = 'MP3'
+ has_mp3_file.boolean = True
+
+ def has_ogg_file(self):
+ return bool(self.has_media("ogg"))
+ has_ogg_file.short_description = 'OGG'
+ has_ogg_file.boolean = True
+
+ def has_daisy_file(self):
+ return bool(self.has_media("daisy"))
+ has_daisy_file.short_description = 'DAISY'
+ has_daisy_file.boolean = True
+
+ def wldocument(self, parse_dublincore=True):
+ from catalogue.import_utils import ORMDocProvider
+ from librarian.parser import WLDocument
+
+ return WLDocument.from_file(self.xml_file.path,
+ provider=ORMDocProvider(self),
+ parse_dublincore=parse_dublincore)
+
+ def build_cover(self, book_info=None):
+ """(Re)builds the cover image."""
+ from StringIO import StringIO
+ from django.core.files.base import ContentFile
+ from librarian.cover import WLCover
+
+ if book_info is None:
+ book_info = self.wldocument().book_info
+
+ cover = WLCover(book_info).image()
+ imgstr = StringIO()
+ cover.save(imgstr, 'png')
+ self.cover.save(None, ContentFile(imgstr.getvalue()))
+
+ def build_pdf(self, customizations=None, file_name=None):
+ """ (Re)builds the pdf file.
+ customizations - customizations which are passed to LaTeX class file.
+ file_name - save the pdf file under a different name and DO NOT save it in db.
+ """
+ from os import unlink
+ from django.core.files import File
+ from catalogue.utils import remove_zip
+
+ pdf = self.wldocument().as_pdf(customizations=customizations)
+
+ if file_name is None:
+ # we'd like to be sure not to overwrite changes happening while
+ # (timely) pdf generation is taking place (async celery scenario)
+ current_self = Book.objects.get(id=self.id)
+ current_self.pdf_file.save('%s.pdf' % self.slug,
+ File(open(pdf.get_filename())))
+ self.pdf_file = current_self.pdf_file
+
+ # remove cached downloadables
+ remove_zip(settings.ALL_PDF_ZIP)
+
+ for customized_pdf in get_existing_customized_pdf(self):
+ unlink(customized_pdf)
+ else:
+ print "saving %s" % file_name
+ print "to: %s" % DefaultStorage().path(file_name)
+ DefaultStorage().save(file_name, File(open(pdf.get_filename())))
+
+ def build_mobi(self):
+ """ (Re)builds the MOBI file.
+
+ """
+ from django.core.files import File
+ from catalogue.utils import remove_zip
+
+ mobi = self.wldocument().as_mobi()
+
+ self.mobi_file.save('%s.mobi' % self.slug, File(open(mobi.get_filename())))
+
+ # remove zip with all mobi files
+ remove_zip(settings.ALL_MOBI_ZIP)
+
+ def build_epub(self):
+ """(Re)builds the epub file."""
+ from django.core.files import File
+ from catalogue.utils import remove_zip
+
+ epub = self.wldocument().as_epub()
+
+ self.epub_file.save('%s.epub' % self.slug,
+ File(open(epub.get_filename())))
+
+ # remove zip package with all epub files
+ remove_zip(settings.ALL_EPUB_ZIP)
+
+ def build_txt(self):
+ from django.core.files.base import ContentFile
+
+ text = self.wldocument().as_text()
+ self.txt_file.save('%s.txt' % self.slug, ContentFile(text.get_string()))
+
+
+ def build_html(self):
+ from markupstring import MarkupString
+ from django.core.files.base import ContentFile
+ from slughifi import slughifi
+ from librarian import html
+
+ meta_tags = list(self.tags.filter(
+ category__in=('author', 'epoch', 'genre', 'kind')))
+ book_tag = self.book_tag()
+
+ html_output = self.wldocument(parse_dublincore=False).as_html()
+ if html_output:
+ self.html_file.save('%s.html' % self.slug,
+ ContentFile(html_output.get_string()))
+
+ # get ancestor l-tags for adding to new fragments
+ ancestor_tags = []
+ p = self.parent
+ while p:
+ ancestor_tags.append(p.book_tag())
+ p = p.parent
+
+ # Delete old fragments and create them from scratch
+ self.fragments.all().delete()
+ # Extract fragments
+ closed_fragments, open_fragments = html.extract_fragments(self.html_file.path)
+ for fragment in closed_fragments.values():
+ try:
+ theme_names = [s.strip() for s in fragment.themes.split(',')]
+ except AttributeError:
+ continue
+ themes = []
+ for theme_name in theme_names:
+ if not theme_name:
+ continue
+ tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name), category='theme')
+ if created:
+ tag.name = theme_name
+ tag.sort_key = theme_name.lower()
+ tag.save()
+ themes.append(tag)
+ if not themes:
+ continue