add book format enum to edition
This commit is contained in:
parent
9fb44f66fd
commit
3a26132431
7 changed files with 51 additions and 1 deletions
|
@ -112,6 +112,16 @@ EDITION_LOCALIZED_SUBTITLE_SCHEMA = {
|
||||||
class Edition(Item):
|
class Edition(Item):
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
works: "models.ManyToManyField[Work, Edition]"
|
works: "models.ManyToManyField[Work, Edition]"
|
||||||
|
|
||||||
|
class BookFormat(models.TextChoices):
|
||||||
|
PAPERBACK = "paperback", _("Paperback")
|
||||||
|
HARDCOVER = "hardcover", _("Hardcover")
|
||||||
|
EBOOK = "ebook", _("eBook")
|
||||||
|
AUDIOBOOK = "audiobook", _("Audiobook")
|
||||||
|
GRAPHICNOVEL = "graphicnovel", _("GraphicNovel")
|
||||||
|
WEB = "web", _("Web Fiction")
|
||||||
|
OTHER = "other", _("Other")
|
||||||
|
|
||||||
category = ItemCategory.Book
|
category = ItemCategory.Book
|
||||||
url_path = "book"
|
url_path = "book"
|
||||||
|
|
||||||
|
@ -127,6 +137,7 @@ class Edition(Item):
|
||||||
# "title",
|
# "title",
|
||||||
# "subtitle",
|
# "subtitle",
|
||||||
"author",
|
"author",
|
||||||
|
"format",
|
||||||
"pub_house",
|
"pub_house",
|
||||||
"pub_year",
|
"pub_year",
|
||||||
"pub_month",
|
"pub_month",
|
||||||
|
@ -171,6 +182,12 @@ class Edition(Item):
|
||||||
blank=True,
|
blank=True,
|
||||||
default=list,
|
default=list,
|
||||||
)
|
)
|
||||||
|
format = jsondata.CharField(
|
||||||
|
_("book format"),
|
||||||
|
blank=True,
|
||||||
|
max_length=100,
|
||||||
|
choices=BookFormat.choices,
|
||||||
|
)
|
||||||
language = LanguageListField()
|
language = LanguageListField()
|
||||||
pub_house = jsondata.CharField(
|
pub_house = jsondata.CharField(
|
||||||
_("publishing house"), null=True, blank=True, max_length=500
|
_("publishing house"), null=True, blank=True, max_length=500
|
||||||
|
|
|
@ -167,6 +167,7 @@ class GoodreadsTestCase(TestCase):
|
||||||
self.assertEqual(resource.id_value, "77566")
|
self.assertEqual(resource.id_value, "77566")
|
||||||
self.assertNotEqual(resource.cover, "/media/item/default.svg")
|
self.assertNotEqual(resource.cover, "/media/item/default.svg")
|
||||||
self.assertEqual(edition.isbn, "9780553283686")
|
self.assertEqual(edition.isbn, "9780553283686")
|
||||||
|
self.assertEqual(edition.format, "papberback")
|
||||||
self.assertEqual(edition.display_title, "Hyperion")
|
self.assertEqual(edition.display_title, "Hyperion")
|
||||||
|
|
||||||
edition.delete()
|
edition.delete()
|
||||||
|
@ -290,6 +291,7 @@ class BooksTWTestCase(TestCase):
|
||||||
self.assertEqual(site.resource.id_type, IdType.BooksTW)
|
self.assertEqual(site.resource.id_type, IdType.BooksTW)
|
||||||
self.assertEqual(site.resource.id_value, "0010947886")
|
self.assertEqual(site.resource.id_value, "0010947886")
|
||||||
self.assertEqual(site.resource.item.isbn, "9786263152236")
|
self.assertEqual(site.resource.item.isbn, "9786263152236")
|
||||||
|
self.assertEqual(site.resource.item.format, "paperback")
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
site.resource.item.display_title,
|
site.resource.item.display_title,
|
||||||
"阿拉伯人三千年:從民族、部落、語言、文化、宗教到帝國,綜覽阿拉伯世界的崛起、衰落與再興",
|
"阿拉伯人三千年:從民族、部落、語言、文化、宗教到帝國,綜覽阿拉伯世界的崛起、衰落與再興",
|
||||||
|
@ -329,6 +331,7 @@ class DoubanBookTestCase(TestCase):
|
||||||
self.assertEqual(site.resource.id_type, IdType.DoubanBook)
|
self.assertEqual(site.resource.id_type, IdType.DoubanBook)
|
||||||
self.assertEqual(site.resource.id_value, "35902899")
|
self.assertEqual(site.resource.id_value, "35902899")
|
||||||
self.assertEqual(site.resource.item.isbn, "9781847498571")
|
self.assertEqual(site.resource.item.isbn, "9781847498571")
|
||||||
|
self.assertEqual(site.resource.item.format, "paperback")
|
||||||
self.assertEqual(site.resource.item.display_title, "1984 Nineteen Eighty-Four")
|
self.assertEqual(site.resource.item.display_title, "1984 Nineteen Eighty-Four")
|
||||||
|
|
||||||
@use_local_response
|
@use_local_response
|
||||||
|
|
|
@ -62,3 +62,23 @@ def detect_isbn_asin(s: str) -> tuple[IdType, str] | tuple[None, None]:
|
||||||
if is_asin(n):
|
if is_asin(n):
|
||||||
return IdType.ASIN, n
|
return IdType.ASIN, n
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
|
|
||||||
|
def binding_to_format(binding: str | None):
|
||||||
|
from .models import Edition
|
||||||
|
|
||||||
|
if not binding:
|
||||||
|
return None
|
||||||
|
if re.search(r"(Audio|Audible|音频)", binding, flags=re.IGNORECASE):
|
||||||
|
return Edition.BookFormat.AUDIOBOOK
|
||||||
|
if re.search(
|
||||||
|
r"(pub|ebook|e-book|kindle|electronic|电子)", binding, flags=re.IGNORECASE
|
||||||
|
):
|
||||||
|
return Edition.BookFormat.HARDCOVER
|
||||||
|
if re.search(r"(web|网)", binding, flags=re.IGNORECASE):
|
||||||
|
return Edition.BookFormat.WEB
|
||||||
|
if re.search(r"(精|Hard)", binding, flags=re.IGNORECASE):
|
||||||
|
return Edition.BookFormat.HARDCOVER
|
||||||
|
if re.search(r"(平|Paper|Soft)", binding, flags=re.IGNORECASE):
|
||||||
|
return Edition.BookFormat.PAPERBACK
|
||||||
|
return None
|
||||||
|
|
|
@ -131,6 +131,7 @@ class BooksTW(AbstractSite):
|
||||||
"pub_year": pub_year,
|
"pub_year": pub_year,
|
||||||
"pub_month": pub_month,
|
"pub_month": pub_month,
|
||||||
"binding": binding,
|
"binding": binding,
|
||||||
|
"format": binding_to_format(str(binding)) if binding else None,
|
||||||
"price": price,
|
"price": price,
|
||||||
"pages": pages,
|
"pages": pages,
|
||||||
"isbn": isbn,
|
"isbn": isbn,
|
||||||
|
|
|
@ -199,6 +199,7 @@ class DoubanBook(AbstractSite):
|
||||||
"pub_year": pub_year,
|
"pub_year": pub_year,
|
||||||
"pub_month": pub_month,
|
"pub_month": pub_month,
|
||||||
"binding": binding,
|
"binding": binding,
|
||||||
|
"format": binding_to_format(binding),
|
||||||
"price": price,
|
"price": price,
|
||||||
"pages": pages,
|
"pages": pages,
|
||||||
"isbn": isbn,
|
"isbn": isbn,
|
||||||
|
|
|
@ -7,7 +7,7 @@ from django.utils.timezone import make_aware
|
||||||
from lxml import html
|
from lxml import html
|
||||||
|
|
||||||
from catalog.book.models import Edition, Work
|
from catalog.book.models import Edition, Work
|
||||||
from catalog.book.utils import detect_isbn_asin
|
from catalog.book.utils import binding_to_format, detect_isbn_asin
|
||||||
from catalog.common import *
|
from catalog.common import *
|
||||||
from common.models.lang import detect_language
|
from common.models.lang import detect_language
|
||||||
from journal.models.renderers import html_to_text
|
from journal.models.renderers import html_to_text
|
||||||
|
@ -95,6 +95,7 @@ class Goodreads(AbstractSite):
|
||||||
ids[t] = n
|
ids[t] = n
|
||||||
data["pages"] = b["details"].get("numPages")
|
data["pages"] = b["details"].get("numPages")
|
||||||
data["binding"] = b["details"].get("format")
|
data["binding"] = b["details"].get("format")
|
||||||
|
data["format"] = binding_to_format(b["details"].get("format"))
|
||||||
data["pub_house"] = b["details"].get("publisher")
|
data["pub_house"] = b["details"].get("publisher")
|
||||||
if b["details"].get("publicationTime"):
|
if b["details"].get("publicationTime"):
|
||||||
dt = make_aware(
|
dt = make_aware(
|
||||||
|
|
|
@ -21,6 +21,13 @@
|
||||||
</div>
|
</div>
|
||||||
<div>{% include '_people.html' with people=item.author role='author' max=5 %}</div>
|
<div>{% include '_people.html' with people=item.author role='author' max=5 %}</div>
|
||||||
<div>{% include '_people.html' with people=item.translator role='translator' max=5 %}</div>
|
<div>{% include '_people.html' with people=item.translator role='translator' max=5 %}</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
{% if item.format %}
|
||||||
|
{% trans 'book format' %}: {{ item.get_format_display }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{% if item.pub_house %}
|
{% if item.pub_house %}
|
||||||
{% trans 'publishing house' %}: {{ item.pub_house }}
|
{% trans 'publishing house' %}: {{ item.pub_house }}
|
||||||
|
|
Loading…
Add table
Reference in a new issue