diff --git a/comic/models.py b/comic/models.py index 5c2f516..a18b51b 100644 --- a/comic/models.py +++ b/comic/models.py @@ -111,7 +111,12 @@ class ComicBook(models.Model): archive = zipfile.ZipFile(archive_path) except zipfile.BadZipfile: return False - page_obj = ComicPage.objects.get(Comic=self, index=page) + try: + page_obj = ComicPage.objects.get(Comic=self, index=page) + except ComicPage.MultipleObjectsReturned: + ComicPage.objects.filter(Comic=self).delete() + self.process_comic_pages(archive, self) + page_obj = ComicPage.objects.get(Comic=self, index=page) try: out = (archive.open(page_obj.page_file_name), page_obj.content_type) except rarfile.NoRarEntry: diff --git a/comic/tests/test_models.py b/comic/tests/test_models.py index b2465cd..03abbc8 100644 --- a/comic/tests/test_models.py +++ b/comic/tests/test_models.py @@ -292,3 +292,16 @@ class ComicBookTests(TestCase): c.login(username="test", password="test") response = c.get(f"/comic/read/{urlsafe_base64_encode(book.selector.bytes)}/0/img") self.assertEqual(response.status_code, 200) + + def test_duplicate_pages(self): + c = Client() + user = User.objects.get(username="test") + generate_directory(user) + book = ComicBook.objects.get(file_name='test1.rar') + page = ComicPage.objects.get(Comic=book, index=0) + dup_page = ComicPage(Comic=book, index=0, page_file_name=page.page_file_name, content_type=page.content_type) + dup_page.save() + + c.login(username="test", password="test") + response = c.get(f"/comic/read/{urlsafe_base64_encode(book.selector.bytes)}/0/img") + self.assertEqual(response.status_code, 200) \ No newline at end of file