update model to link editions
This commit is contained in:
parent
9481bd4b89
commit
fec56d1e1b
4 changed files with 92 additions and 41 deletions
|
@ -110,8 +110,8 @@ env = environ.FileAwareEnv(
|
||||||
SECRET_KEY = env("NEODB_SECRET_KEY")
|
SECRET_KEY = env("NEODB_SECRET_KEY")
|
||||||
DEBUG = env("NEODB_DEBUG")
|
DEBUG = env("NEODB_DEBUG")
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
"default": env.db_url("NEODB_DB_URL"),
|
|
||||||
"takahe": env.db_url("TAKAHE_DB_URL"),
|
"takahe": env.db_url("TAKAHE_DB_URL"),
|
||||||
|
"default": env.db_url("NEODB_DB_URL"),
|
||||||
}
|
}
|
||||||
DATABASES["default"]["OPTIONS"] = {"client_encoding": "UTF8"}
|
DATABASES["default"]["OPTIONS"] = {"client_encoding": "UTF8"}
|
||||||
DATABASES["default"]["TEST"] = {"DEPENDENCIES": ["takahe"]}
|
DATABASES["default"]["TEST"] = {"DEPENDENCIES": ["takahe"]}
|
||||||
|
|
|
@ -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.core.validators import MaxValueValidator, MinValueValidator
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
@ -186,6 +188,31 @@ class Edition(Item):
|
||||||
.order_by("title")
|
.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):
|
class Work(Item):
|
||||||
category = ItemCategory.Book
|
category = ItemCategory.Book
|
||||||
|
|
|
@ -6,6 +6,8 @@ from catalog.common import *
|
||||||
|
|
||||||
|
|
||||||
class BookTestCase(TestCase):
|
class BookTestCase(TestCase):
|
||||||
|
databases = "__all__"
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
hyperion = Edition.objects.create(title="Hyperion")
|
hyperion = Edition.objects.create(title="Hyperion")
|
||||||
hyperion.pages = 500
|
hyperion.pages = 500
|
||||||
|
@ -55,20 +57,64 @@ class BookTestCase(TestCase):
|
||||||
self.assertEqual(hyperion.isbn, "9780575099432")
|
self.assertEqual(hyperion.isbn, "9780575099432")
|
||||||
self.assertEqual(hyperion.isbn10, "0575099437")
|
self.assertEqual(hyperion.isbn10, "0575099437")
|
||||||
|
|
||||||
def test_work(self):
|
|
||||||
hyperion_print = Edition.objects.get(title="Hyperion")
|
class WorkTestCase(TestCase):
|
||||||
hyperion_ebook = Edition(title="Hyperion")
|
databases = "__all__"
|
||||||
hyperion_ebook.save()
|
|
||||||
hyperion_ebook.asin = "B0043M6780"
|
def setUp(self):
|
||||||
hyperion = Work(title="Hyperion")
|
self.hyperion_hardcover = Edition.objects.create(title="Hyperion")
|
||||||
hyperion.save()
|
self.hyperion_hardcover.pages = 481
|
||||||
hyperion.editions.add(hyperion_print)
|
self.hyperion_hardcover.isbn = "9780385249492"
|
||||||
hyperion.editions.add(hyperion_ebook)
|
self.hyperion_hardcover.save()
|
||||||
# andymion = Edition(title="Andymion", pages=42)
|
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")
|
# 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):
|
class GoodreadsTestCase(TestCase):
|
||||||
|
databases = "__all__"
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -148,6 +194,8 @@ class GoodreadsTestCase(TestCase):
|
||||||
|
|
||||||
|
|
||||||
class GoogleBooksTestCase(TestCase):
|
class GoogleBooksTestCase(TestCase):
|
||||||
|
databases = "__all__"
|
||||||
|
|
||||||
def test_parse(self):
|
def test_parse(self):
|
||||||
t_type = IdType.GoogleBooks
|
t_type = IdType.GoogleBooks
|
||||||
t_id = "hV--zQEACAAJ"
|
t_id = "hV--zQEACAAJ"
|
||||||
|
@ -179,6 +227,8 @@ class GoogleBooksTestCase(TestCase):
|
||||||
|
|
||||||
|
|
||||||
class BooksTWTestCase(TestCase):
|
class BooksTWTestCase(TestCase):
|
||||||
|
databases = "__all__"
|
||||||
|
|
||||||
def test_parse(self):
|
def test_parse(self):
|
||||||
t_type = IdType.BooksTW
|
t_type = IdType.BooksTW
|
||||||
t_id = "0010947886"
|
t_id = "0010947886"
|
||||||
|
@ -227,6 +277,8 @@ class BooksTWTestCase(TestCase):
|
||||||
|
|
||||||
|
|
||||||
class DoubanBookTestCase(TestCase):
|
class DoubanBookTestCase(TestCase):
|
||||||
|
databases = "__all__"
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -289,6 +341,8 @@ class DoubanBookTestCase(TestCase):
|
||||||
|
|
||||||
|
|
||||||
class MultiBookSitesTestCase(TestCase):
|
class MultiBookSitesTestCase(TestCase):
|
||||||
|
databases = "__all__"
|
||||||
|
|
||||||
@use_local_response
|
@use_local_response
|
||||||
def test_editions(self):
|
def test_editions(self):
|
||||||
# isbn = '9781847498571'
|
# isbn = '9781847498571'
|
||||||
|
|
|
@ -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()
|
|
Loading…
Add table
Reference in a new issue