importbooks: no-build-epub and wait-until options
[wolnelektury.git] / apps / catalogue / models.py
index d3b24d3..5f7eb17 100644 (file)
@@ -11,7 +11,6 @@ from django.template.loader import render_to_string
 from django.utils.safestring import mark_safe
 from django.utils.translation import get_language
 from django.core.urlresolvers import reverse
-from datetime import datetime
 
 from newtagging.models import TagBase, tags_updated
 from newtagging import managers
@@ -52,7 +51,6 @@ class Tag(TagBase):
 
     user = models.ForeignKey(User, blank=True, null=True)
     book_count = models.IntegerField(_('book count'), blank=False, null=True)
-    death = models.IntegerField(_(u'year of death'), blank=True, null=True)
     gazeta_link = models.CharField(blank=True, max_length=240)
     wiki_link = models.CharField(blank=True, max_length=240)
 
@@ -87,17 +85,6 @@ class Tag(TagBase):
     has_description.short_description = _('description')
     has_description.boolean = True
 
-    def alive(self):
-        return self.death is None
-
-    def in_pd(self):
-        """ tests whether an author is in public domain """
-        return self.death is not None and self.goes_to_pd() <= datetime.now().year
-
-    def goes_to_pd(self):
-        """ calculates the year of public domain entry for an author """
-        return self.death + 71 if self.death is not None else None
-
     def get_count(self):
         """ returns global book count for book tags, fragment count for themes """
 
@@ -186,6 +173,7 @@ class Book(models.Model):
     txt_file = models.FileField(_('TXT file'), upload_to=book_upload_path('txt'), blank=True)
     mp3_file = models.FileField(_('MP3 file'), upload_to=book_upload_path('mp3'), blank=True)
     ogg_file = models.FileField(_('OGG file'), upload_to=book_upload_path('ogg'), blank=True)
+    daisy_file = models.FileField(_('DAISY file'), upload_to=book_upload_path('daisy.zip'), blank=True)
 
     parent = models.ForeignKey('self', blank=True, null=True, related_name='children')
 
@@ -273,6 +261,8 @@ class Book(models.Model):
                 formats.append(u'<a href="%s">MP3</a>' % self.mp3_file.url)
             if self.ogg_file:
                 formats.append(u'<a href="%s">OGG</a>' % self.ogg_file.url)
+            if self.daisy_file:
+                formats.append(u'<a href="%s">DAISY</a>' % self.daisy_file.url)
 
             formats = [mark_safe(format) for format in formats]
 
@@ -355,7 +345,7 @@ class Book(models.Model):
 
         epub_file = StringIO()
         try:
-            epub.transform(BookImportDocProvider(self), self.slug, epub_file)
+            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()
             FileRecord(slug=self.slug, type='epub', sha1=sha1(epub_file.getvalue()).hexdigest()).save()
@@ -373,7 +363,7 @@ class Book(models.Model):
 
 
     @classmethod
-    def from_xml_file(cls, xml_file, overwrite=False):
+    def from_xml_file(cls, xml_file, overwrite=False, build_epub=True):
         # use librarian to parse meta-data
         book_info = dcparser.parse(xml_file)
 
@@ -381,12 +371,12 @@ class Book(models.Model):
             xml_file = File(open(xml_file))
 
         try:
-            return cls.from_text_and_meta(xml_file, book_info, overwrite)
+            return cls.from_text_and_meta(xml_file, book_info, overwrite, build_epub=build_epub)
         finally:
             xml_file.close()
 
     @classmethod
-    def from_text_and_meta(cls, raw_file, book_info, overwrite=False):
+    def from_text_and_meta(cls, raw_file, book_info, overwrite=False, build_epub=True):
         from tempfile import NamedTemporaryFile
         from slughifi import slughifi
         from markupstring import MarkupString
@@ -446,10 +436,20 @@ class Book(models.Model):
         # Save XML and HTML files
         book.xml_file.save('%s.xml' % book.slug, raw_file, save=False)
 
+        # delete old fragments when overwriting
+        book.fragments.all().delete()
+
         html_file = NamedTemporaryFile()
         if html.transform(book.xml_file.path, html_file, parse_dublincore=False):
             book.html_file.save('%s.html' % book.slug, File(html_file), save=False)
 
+            # get ancestor l-tags for adding to new fragments
+            ancestor_tags = []
+            p = book.parent
+            while p:
+                ancestor_tags.append(p.book_tag())
+                p = p.parent
+
             # Extract fragments
             closed_fragments, open_fragments = html.extract_fragments(book.html_file.path)
             for fragment in closed_fragments.values():
@@ -478,9 +478,11 @@ class Book(models.Model):
                     defaults={'text': text, 'short_text': short_text})
 
                 new_fragment.save()
-                new_fragment.tags = set(book_tags + themes + [book_tag])
+                new_fragment.tags = set(book_tags + themes + [book_tag] + ancestor_tags)
 
-        book.build_epub(remove_descendants=False)
+        if build_epub and not book.parent:
+            print 'epub'
+            book.build_epub(remove_descendants=False)
 
         book_descendants = list(book.children.all())
         # add l-tag to descendants and their fragments
@@ -496,8 +498,8 @@ class Book(models.Model):
             book_descendants += list(child_book.children.all())
 
         # refresh cache
-        book.tag_counter
-        book.theme_counter
+        book.reset_tag_counter()
+        book.reset_theme_counter()
 
         book.save()
         return book
@@ -547,6 +549,22 @@ class Book(models.Model):
             return self.refresh_theme_counter()
         return dict((int(k), v) for k, v in self.get__theme_counter_value().iteritems())
 
+    def pretty_title(self, html_links=False):
+        book = self
+        names = list(book.tags.filter(category='author'))
+
+        books = []
+        while book:
+            books.append(book)
+            book = book.parent
+        names.extend(reversed(books))
+
+        if html_links:
+            names = ['<a href="%s">%s</a>' % (tag.get_absolute_url(), tag.name) for tag in names]
+        else:
+            names = [tag.name for tag in names]
+
+        return ', '.join(names)
 
 
 class Fragment(models.Model):
@@ -580,34 +598,6 @@ class Fragment(models.Model):
             return mark_safe(getattr(self, key))
 
 
-class BookStub(models.Model):
-    title = models.CharField(_('title'), max_length=120)
-    author = models.CharField(_('author'), max_length=120)
-    pd = models.IntegerField(_('goes to public domain'), null=True, blank=True)
-    slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True)
-    translator = models.TextField(_('translator'), blank=True)
-    translator_death = models.TextField(_('year of translator\'s death'), blank=True)
-
-    class Meta:
-        ordering = ('title',)
-        verbose_name = _('book stub')
-        verbose_name_plural = _('book stubs')
-
-    def __unicode__(self):
-        return self.title
-
-    @permalink
-    def get_absolute_url(self):
-        return ('catalogue.views.book_detail', [self.slug])
-
-    def in_pd(self):
-        return self.pd is not None and self.pd <= datetime.now().year
-
-    @property
-    def name(self):
-        return self.title
-
-
 class FileRecord(models.Model):
     slug = models.SlugField(_('slug'), max_length=120, db_index=True)
     type = models.CharField(_('type'), max_length=20, db_index=True)