fixes #854: republish a book with parent correctly
[wolnelektury.git] / apps / catalogue / models.py
index d3b24d3..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]
 
@@ -446,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():
@@ -478,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
@@ -496,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