from django.utils.safestring import mark_safe
from django.utils.translation import get_language
from django.core.urlresolvers import reverse
+from django.db.models.signals import post_save, m2m_changed, pre_delete
from django.conf import settings
main_page = models.BooleanField(_('main page'), default=False, db_index=True, help_text=_('Show tag on main page'))
user = models.ForeignKey(User, blank=True, null=True)
- book_count = models.IntegerField(_('book count'), blank=False, null=True)
+ book_count = models.IntegerField(_('book count'), blank=True, null=True)
gazeta_link = models.CharField(blank=True, max_length=240)
wiki_link = models.CharField(blank=True, max_length=240)
elif type == "html":
return self.html_file
elif type == "epub":
- return self.html_file
+ return self.epub_file
elif type == "txt":
return self.txt_file
elif type == "pdf":
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
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)
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):
from tempfile import NamedTemporaryFile
from slughifi import slughifi
from markupstring import MarkupString
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()
def __unicode__(self):
return "%s %s.%s" % (self.sha1, self.slug, self.type)
+###########
+#
+# SIGNALS
+#
+###########
+
def _tags_updated_handler(sender, affected_tags, **kwargs):
# reset tag global counter
sender.book.reset_theme_counter()
tags_updated.connect(_tags_updated_handler)
+
+def _m2m_changed_handler(sender, instance, action, reverse, pk_set, **kwargs):
+ """ refresh all the short_html stuff on BookMedia delete """
+ if sender == Book.medias.through and reverse and action == 'pre_clear':
+ for book in instance.book_set.all():
+ book.save()
+m2m_changed.connect(_m2m_changed_handler)
+
+def _pre_delete_handler(sender, instance, **kwargs):
+ """ explicitly clear m2m, so that Books can be refreshed """
+ if sender == BookMedia:
+ instance.book_set.clear()
+pre_delete.connect(_pre_delete_handler)
+
+def _post_save_handler(sender, instance, **kwargs):
+ """ refresh all the short_html stuff on BookMedia update """
+ if sender == BookMedia:
+ for book in instance.book_set.all():
+ book.save()
+post_save.connect(_post_save_handler)
+