librarian fix
[wolnelektury.git] / apps / catalogue / models.py
index ce92614..e692ad8 100644 (file)
@@ -186,6 +186,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 +274,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]
 
@@ -357,17 +360,19 @@ class Book(models.Model):
         try:
             epub.transform(BookImportDocProvider(self), self.slug, 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()
         except NoDublinCore:
             pass
 
-        if remove_descendants:
-            book_descendants = list(self.children.all())
-            while len(book_descendants) > 0:
-                child_book = book_descendants.pop(0)
-                if child_book.has_epub_file():
-                    child_book.epub_file.delete()
-                book_descendants += list(child_book.children.all())
+        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())
 
 
     @classmethod
@@ -444,10 +449,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():
@@ -476,9 +491,10 @@ 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 not book.parent:
+            book.build_epub(remove_descendants=False)
 
         book_descendants = list(book.children.all())
         # add l-tag to descendants and their fragments
@@ -494,8 +510,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