From f33f4b6394357f909b80838f32ece6365ef9a3f2 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Thu, 9 Nov 2023 07:36:49 +0100 Subject: [PATCH 1/9] mainsnak["datavalue"]["value"] can be a dict --- depicts/wikibase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depicts/wikibase.py b/depicts/wikibase.py index c7c1a52..cc81d05 100644 --- a/depicts/wikibase.py +++ b/depicts/wikibase.py @@ -13,7 +13,7 @@ def first_datavalue( mainsnak = entity["claims"][pid][0]["mainsnak"] if "datavalue" in mainsnak: v = mainsnak["datavalue"]["value"] - assert isinstance(v, str | int) + assert isinstance(v, (str, int, dict)) return v return None From ae0b2e5a51d2099ecce345595057c701f145ba3e Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Thu, 9 Nov 2023 07:37:28 +0100 Subject: [PATCH 2/9] CatalogDict: institution and URL can be None --- depicts/type.py | 4 ++-- depicts/wd_catalog.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/depicts/type.py b/depicts/type.py index 3418f47..0ce71b2 100644 --- a/depicts/type.py +++ b/depicts/type.py @@ -28,8 +28,8 @@ class Entity(TypedDict, total=False): class CatalogDict(TypedDict, total=False): """Catalog record from institution web site.""" - institution: str - url: str + institution: str | None + url: str | None ids: set[str] detail: list[dict[str, str]] description: str diff --git a/depicts/wd_catalog.py b/depicts/wd_catalog.py index 22bfa8a..ca5b781 100644 --- a/depicts/wd_catalog.py +++ b/depicts/wd_catalog.py @@ -399,7 +399,6 @@ def get_catalog_from_artwork(entity: Entity) -> CatalogDict: catalog_detail.append(detail) url = wikibase.first_datavalue(entity, "P973") - assert isinstance(url, str) catalog: CatalogDict = { "url": url, "detail": catalog_detail, From 00773cd5f9e937ed263fabad017b2538ecdbf092 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Thu, 9 Nov 2023 07:39:02 +0100 Subject: [PATCH 3/9] Handle missing value for P571 property --- depicts/model.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/depicts/model.py b/depicts/model.py index 01912b6..835412b 100644 --- a/depicts/model.py +++ b/depicts/model.py @@ -112,8 +112,10 @@ class Item(Base): @property def date(self) -> str | None: v = wikibase.first_datavalue(typing.cast(Entity, self.entity), "P571") + if not v: + return None assert isinstance(v, dict) - return utils.format_time(v["time"], v["precision"]) if v else None + return utils.format_time(v["time"], v["precision"]) class Triple(Base): From e7004a08f40bc10bf4d14589de685d4beb05a6f9 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Thu, 9 Nov 2023 07:39:16 +0100 Subject: [PATCH 4/9] Remove unused code --- depicts/mediawiki.py | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/depicts/mediawiki.py b/depicts/mediawiki.py index d6fc761..4331bc7 100644 --- a/depicts/mediawiki.py +++ b/depicts/mediawiki.py @@ -8,7 +8,6 @@ import typing import requests from . import utils -from .category import Category from .type import CallParams, Entity wikidata_url = "https://www.wikidata.org/w/api.php" @@ -200,30 +199,6 @@ def host_from_site(site: str) -> str: return hosts[site] -def process_cats(cats: list[dict[str, str]], site: str) -> list[Category]: - """Process categories.""" - return [Category(cat["title"], site) for cat in cats] - - -def get_categories(titles: list[str], site: str) -> list[tuple[str, list[Category]]]: - """Get categories for pages with given titles.""" - params: CallParams = { - "prop": "categories", - "clshow": "!hidden", - "cllimit": "max", - } - from_wiki = mediawiki_query(titles, params, site) - title_and_cats = [] - for i in from_wiki: - if "categories" not in i: - continue - cats = process_cats(i["categories"], site) - if not cats: - continue - title_and_cats.append((i["title"], cats)) - return title_and_cats - - def get_history(title: str, site: str) -> list[Page]: """Get history of a page.""" params: CallParams = { From d814ecf3a480e38b23ca8a22e2c7122af8c1c16f Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Thu, 9 Nov 2023 07:39:39 +0100 Subject: [PATCH 5/9] Adjust import style --- depicts/artwork.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/depicts/artwork.py b/depicts/artwork.py index 88ee450..8a629ba 100644 --- a/depicts/artwork.py +++ b/depicts/artwork.py @@ -1,6 +1,6 @@ """Class to represent artwork.""" -from . import mediawiki +from .mediawiki import get_entity, get_entity_with_cache from .type import Claims, Entity, Sitelinks @@ -12,7 +12,7 @@ class Artwork: def __init__(self, qid: str) -> None: """Init.""" - entity = mediawiki.get_entity_with_cache(qid) + entity = get_entity_with_cache(qid) assert entity self.entity = entity self.item_id = int(qid[1:]) @@ -48,7 +48,7 @@ class Artwork: self.artist_entities = [] for artist in self.artists_claim: - artist_entity = mediawiki.get_entity(artist["id"]) + artist_entity = get_entity(artist["id"]) assert artist_entity self.artist_entities.append(artist_entity) From 441839e83229440ca20a77a12e574ed47ed2e414 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Thu, 9 Nov 2023 07:40:12 +0100 Subject: [PATCH 6/9] Not all artworks have an institution --- app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app.py b/app.py index 25245a6..70f374d 100755 --- a/app.py +++ b/app.py @@ -528,7 +528,6 @@ def item_page(item_id: int) -> str | Response: catalog = wd_catalog.get_catalog_from_artwork(entity) if not catalog.get("institution"): institution = get_institution(entity, other) - assert institution catalog["institution"] = institution return render_template( From e1d5f33d2ef1a4507bdec86fa4276869385f8b71 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Thu, 9 Nov 2023 07:40:37 +0100 Subject: [PATCH 7/9] Type hint fixes --- app.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app.py b/app.py index 70f374d..2f43c50 100755 --- a/app.py +++ b/app.py @@ -23,7 +23,7 @@ from flask import ( session, url_for, ) -from requests_oauthlib import OAuth1Session +from requests_oauthlib import OAuth1Session # type: ignore from sqlalchemy import distinct, func from sqlalchemy.orm import aliased from sqlalchemy.sql.expression import desc @@ -119,7 +119,7 @@ def shutdown_session(exception: Exception | None = None) -> None: def set_url_args(endpoint: str | None = None, **new_args: str) -> str: if endpoint is None: endpoint = request.endpoint - assert endpoint and request.view_args + assert endpoint and request.view_args is not None args = request.view_args.copy() args.update(request.args) args.update(new_args) @@ -496,7 +496,7 @@ def item_page(item_id: int) -> str | Response: label_languages = label_and_language["languages"] if label_and_language else [] show_translation_links = all(lang.code != "en" for lang in label_languages) - artwork_item = Item.query.get(item_id) # type: ignore + artwork_item = Item.query.get(item_id) if artwork_item is None: if not wdqs.is_artificial_physical_object(qid): return render_template( From 2d7c8797560b20d6ad84c356aaa9a0c82dc89f27 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Thu, 9 Nov 2023 07:40:54 +0100 Subject: [PATCH 8/9] Use higher resolution images from Cmmons --- app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.py b/app.py index 2f43c50..81c2eef 100755 --- a/app.py +++ b/app.py @@ -475,7 +475,7 @@ def item_page(item_id: int) -> str | Response: existing_depicts = existing_depicts_from_entity(entity) - width = 800 + width = 1200 image_filename = item.image_filename if image_filename: image = image_with_cache(qid, image_filename, width) From 3b69855c25db4751588b8a64ddcef0b9904646a8 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Thu, 9 Nov 2023 07:53:33 +0100 Subject: [PATCH 9/9] Bootstrap 5 change: 'sr-only' is now 'visually-hidden' --- templates/macro.html | 5 ++++- templates/navbar.html | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/templates/macro.html b/templates/macro.html index faf8686..9e2e2d1 100644 --- a/templates/macro.html +++ b/templates/macro.html @@ -1,3 +1,6 @@ +{# vim: set ft=htmljinja +#} + {% macro render_pagination(pagination) %} {% if pagination.pages > 1 %}