From fec56d1e1bece5df7f5853d4369054c396d579c0 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 8 Apr 2024 20:25:14 -0400 Subject: [PATCH] update model to link editions --- boofilsic/settings.py | 2 +- catalog/book/models.py | 27 +++++++++++++++ catalog/book/tests.py | 74 ++++++++++++++++++++++++++++++++++++------ common/tests.py | 30 ----------------- 4 files changed, 92 insertions(+), 41 deletions(-) delete mode 100644 common/tests.py diff --git a/boofilsic/settings.py b/boofilsic/settings.py index 553fb3aa..c7d4ad9f 100644 --- a/boofilsic/settings.py +++ b/boofilsic/settings.py @@ -110,8 +110,8 @@ env = environ.FileAwareEnv( SECRET_KEY = env("NEODB_SECRET_KEY") DEBUG = env("NEODB_DEBUG") DATABASES = { - "default": env.db_url("NEODB_DB_URL"), "takahe": env.db_url("TAKAHE_DB_URL"), + "default": env.db_url("NEODB_DB_URL"), } DATABASES["default"]["OPTIONS"] = {"client_encoding": "UTF8"} DATABASES["default"]["TEST"] = {"DEPENDENCIES": ["takahe"]} diff --git a/catalog/book/models.py b/catalog/book/models.py index ba410487..0e7dfc29 100644 --- a/catalog/book/models.py +++ b/catalog/book/models.py @@ -17,6 +17,8 @@ work data seems asymmetric (a book links to a work, but may not listed in that w """ +from os.path import exists + from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.utils.translation import gettext_lazy as _ @@ -186,6 +188,31 @@ class Edition(Item): .order_by("title") ) + def has_related_books(self): + works = list(self.works.all()) + if not works: + return False + return Edition.objects.filter(works__in=works).exclude(pk=self.pk).exists() + + def link_to_related_book(self, target: "Edition") -> bool: + if target == self or target.is_deleted or target.merged_to_item: + return False + if target.works.all().exists(): + for work in target.works.all(): + self.works.add(work) + elif self.works.all().exists(): + for work in self.works.all(): + target.works.add(work) + else: + Work.objects.create(title=self.title).editions.add(self, target) + return True + + def unlink_from_all_works(self): + self.works.clear() + + def has_works(self): + return self.works.all().exists() + class Work(Item): category = ItemCategory.Book diff --git a/catalog/book/tests.py b/catalog/book/tests.py index 505e5dd4..b87f59c3 100644 --- a/catalog/book/tests.py +++ b/catalog/book/tests.py @@ -6,6 +6,8 @@ from catalog.common import * class BookTestCase(TestCase): + databases = "__all__" + def setUp(self): hyperion = Edition.objects.create(title="Hyperion") hyperion.pages = 500 @@ -55,20 +57,64 @@ class BookTestCase(TestCase): self.assertEqual(hyperion.isbn, "9780575099432") self.assertEqual(hyperion.isbn10, "0575099437") - def test_work(self): - hyperion_print = Edition.objects.get(title="Hyperion") - hyperion_ebook = Edition(title="Hyperion") - hyperion_ebook.save() - hyperion_ebook.asin = "B0043M6780" - hyperion = Work(title="Hyperion") - hyperion.save() - hyperion.editions.add(hyperion_print) - hyperion.editions.add(hyperion_ebook) - # andymion = Edition(title="Andymion", pages=42) + +class WorkTestCase(TestCase): + databases = "__all__" + + def setUp(self): + self.hyperion_hardcover = Edition.objects.create(title="Hyperion") + self.hyperion_hardcover.pages = 481 + self.hyperion_hardcover.isbn = "9780385249492" + self.hyperion_hardcover.save() + self.hyperion_print = Edition.objects.create(title="Hyperion") + self.hyperion_print.pages = 500 + self.hyperion_print.isbn = "9780553283686" + self.hyperion_print.save() + self.hyperion_ebook = Edition(title="Hyperion") + self.hyperion_ebook.asin = "B0043M6780" + self.hyperion_ebook.save() + self.andymion_print = Edition.objects.create(title="Andymion", pages=42) # serie = Serie(title="Hyperion Cantos") + self.hyperion = Work(title="Hyperion") + self.hyperion.save() + + def test_work(self): + self.assertFalse(self.hyperion_print.has_related_books()) + self.hyperion.editions.add(self.hyperion_print) + self.assertFalse(self.hyperion_print.has_related_books()) + + def test_link(self): + self.hyperion_print.link_to_related_book(self.hyperion_ebook) + self.assertTrue(self.hyperion_print.has_related_books()) + self.assertTrue(self.hyperion_ebook.has_related_books()) + self.assertTrue(self.hyperion_print.has_works()) + self.assertEqual( + self.hyperion_print.works.first().title, self.hyperion_print.title + ) + self.hyperion_print.unlink_from_all_works() + self.assertFalse(self.hyperion_print.has_related_books()) + self.assertFalse(self.hyperion_ebook.has_related_books()) + self.hyperion_print.link_to_related_book(self.hyperion_ebook) + self.assertTrue(self.hyperion_print.has_related_books()) + self.assertTrue(self.hyperion_ebook.has_related_books()) + self.hyperion_ebook.unlink_from_all_works() + self.assertFalse(self.hyperion_print.has_related_books()) + self.assertFalse(self.hyperion_ebook.has_related_books()) + + def test_link3(self): + self.hyperion_print.link_to_related_book(self.hyperion_ebook) + self.hyperion_ebook.link_to_related_book(self.hyperion_hardcover) + self.hyperion_print.link_to_related_book(self.hyperion_hardcover) + self.assertTrue(self.hyperion_print.has_works()) + self.assertEqual(self.hyperion_print.works.all().count(), 1) + self.assertEqual( + self.hyperion_ebook.works.all().first().editions.all().count(), 3 + ) class GoodreadsTestCase(TestCase): + databases = "__all__" + def setUp(self): pass @@ -148,6 +194,8 @@ class GoodreadsTestCase(TestCase): class GoogleBooksTestCase(TestCase): + databases = "__all__" + def test_parse(self): t_type = IdType.GoogleBooks t_id = "hV--zQEACAAJ" @@ -179,6 +227,8 @@ class GoogleBooksTestCase(TestCase): class BooksTWTestCase(TestCase): + databases = "__all__" + def test_parse(self): t_type = IdType.BooksTW t_id = "0010947886" @@ -227,6 +277,8 @@ class BooksTWTestCase(TestCase): class DoubanBookTestCase(TestCase): + databases = "__all__" + def setUp(self): pass @@ -289,6 +341,8 @@ class DoubanBookTestCase(TestCase): class MultiBookSitesTestCase(TestCase): + databases = "__all__" + @use_local_response def test_editions(self): # isbn = '9781847498571' diff --git a/common/tests.py b/common/tests.py deleted file mode 100644 index 0f382a86..00000000 --- a/common/tests.py +++ /dev/null @@ -1,30 +0,0 @@ -# from django.test import TestCase - -# from django.contrib.staticfiles.testing import StaticLiveServerTestCase -# from selenium.webdriver.common.by import By -# from selenium import webdriver -# from selenium.webdriver.firefox.service import Service as FirefoxService -# from webdriver_manager.firefox import GeckoDriverManager - - -# class MySeleniumTests(StaticLiveServerTestCase): -# @classmethod -# def setUpClass(cls): -# super().setUpClass() -# cls.selenium = webdriver.Firefox( -# service=FirefoxService(GeckoDriverManager().install()) -# ) -# cls.selenium.implicitly_wait(10) - -# @classmethod -# def tearDownClass(cls): -# cls.selenium.quit() -# super().tearDownClass() - -# def test_login(self): -# self.selenium.get("%s%s" % (self.live_server_url, "/404/")) -# username_input = self.selenium.find_element(By.NAME, "username") -# username_input.send_keys("myuser") -# password_input = self.selenium.find_element(By.NAME, "password") -# password_input.send_keys("secret") -# self.selenium.find_element(By.XPATH, '//input[@value="Log in"]').click()