fixes #854: republish a book with parent correctly
authorRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Wed, 13 Oct 2010 11:25:34 +0000 (13:25 +0200)
committerRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Wed, 20 Oct 2010 09:17:08 +0000 (11:17 +0200)
apps/catalogue/models.py
apps/catalogue/tests/book_import.py

index 6863b2a..e692ad8 100644 (file)
@@ -449,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():
@@ -481,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
@@ -499,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
index cb63fc0..f22be32 100644 (file)
@@ -153,3 +153,46 @@ class BookImportLogicTests(WLTestCase):
         tags.sort()
 
         self.assertEqual(tags, self.expected_tags)
+
+
+class ChildImportTests(WLTestCase):
+
+    def setUp(self):
+        WLTestCase.setUp(self)
+        self.child_info = BookInfoStub(
+            genre='X-Genre',
+            epoch='X-Epoch',
+            kind='X-Kind',
+            author=PersonStub(("Joe",), "Doe"),
+            **info_args("Child")
+        )
+
+        self.parent_info = BookInfoStub(
+            genre='X-Genre',
+            epoch='X-Epoch',
+            kind='X-Kind',
+            author=PersonStub(("Jim",), "Lazy"),
+            parts=[self.child_info.url],
+            **info_args("Parent")
+        )
+
+    def test_child_replace(self):
+        PARENT_TEXT = """<utwor />"""
+        CHILD_TEXT = """<utwor>
+        <opowiadanie>
+            <akap><begin id="m01" /><motyw id="m01">Pies</motyw>Ala ma kota<end id="m01" /></akap>
+        </opowiadanie></utwor>
+        """
+        child = models.Book.from_text_and_meta(ContentFile(CHILD_TEXT), self.child_info)
+        parent = models.Book.from_text_and_meta(ContentFile(PARENT_TEXT), self.parent_info)
+        CHILD_TEXT = """<utwor>
+        <opowiadanie>
+            <akap><begin id="m01" /><motyw id="m01">Kot</motyw>Ala ma kota<end id="m01" /></akap>
+        </opowiadanie></utwor>
+        """
+        child = models.Book.from_text_and_meta(ContentFile(CHILD_TEXT), self.child_info, overwrite=True)
+
+        themes = self.client.get(parent.get_absolute_url()).context['book_themes']
+
+        self.assertEqual(['Kot'], [tag.name for tag in themes],
+                        'wrong related theme list')