diff --git a/app.py b/app.py index df173d7..0bc6d80 100755 --- a/app.py +++ b/app.py @@ -3,7 +3,7 @@ from flask import Flask, render_template, url_for, redirect, request, g, jsonify, session from depicts import (utils, wdqs, commons, mediawiki, painting, saam, database, dia, rijksmuseum, npg, museodelprado, barnesfoundation, - wd_catalog, relaxed_ssl, human) + wd_catalog, relaxed_ssl, human, wikibase) from depicts.pager import Pagination, init_pager from depicts.model import (DepictsItem, DepictsItemAltLabel, Edit, PaintingItem, Language) @@ -134,7 +134,7 @@ def save(item_id): painting_item = PaintingItem.query.get(item_id) if painting_item is None: painting_entity = mediawiki.get_entity_with_cache(f'Q{item_id}') - label = mediawiki.get_entity_label(painting_entity) + label = wikibase.get_entity_label(painting_entity) painting_item = PaintingItem(item_id=item_id, label=label, entity=painting_entity) database.session.add(painting_item) database.session.commit() @@ -367,10 +367,6 @@ def image_with_cache(qid, image_filename, width): return detail[image_filename] -def first_datavalue(entity, pid): - if pid in entity['claims']: - return entity['claims'][pid][0]['mainsnak']['datavalue']['value'] - def get_catalog_page(property_id, value): detail = wd_catalog.lookup(property_id, value) url = detail['url'] @@ -481,10 +477,10 @@ def item_page(item_id): people = human.from_name(label) if label else None if 'P276' in entity['claims']: - location = first_datavalue(entity, 'P276')['id'] + location = wikibase.first_datavalue(entity, 'P276')['id'] institution = other[location] elif 'P195' in entity['claims']: - collection = first_datavalue(entity, 'P195')['id'] + collection = wikibase.first_datavalue(entity, 'P195')['id'] institution = other[collection] else: institution = '???' @@ -497,19 +493,19 @@ def item_page(item_id): catalog_ids = wd_catalog.find_catalog_id(entity) catalog_detail = [] for property_id in sorted(catalog_ids): - value = first_datavalue(entity, property_id) + value = wikibase.first_datavalue(entity, property_id) detail = wd_catalog.lookup(property_id, value) catalog_detail.append(detail) - catalog_url = first_datavalue(entity, 'P973') + catalog_url = wikibase.first_datavalue(entity, 'P973') catalog = None try: if 'P4704' in entity['claims']: - saam_id = first_datavalue(entity, 'P4704') + saam_id = wikibase.first_datavalue(entity, 'P4704') catalog = saam.get_catalog(saam_id) elif 'P4709' in entity['claims']: - catalog_id = first_datavalue(entity, 'P4709') + catalog_id = wikibase.first_datavalue(entity, 'P4709') catalog = barnesfoundation.get_catalog(catalog_id) elif catalog_url and 'www.dia.org' in catalog_url: catalog = dia.get_catalog(catalog_url) @@ -533,7 +529,7 @@ def item_page(item_id): for property_id in sorted(catalog_ids): if property_id == 'P350': continue # RKDimages ID - value = first_datavalue(entity, property_id) + value = wikibase.first_datavalue(entity, property_id) detail = wd_catalog.lookup(property_id, value) try: html = get_catalog_page(property_id, value) @@ -614,7 +610,7 @@ def get_labels(keys, name=None): json.dump({'keys': keys, 'labels': labels}, open(filename, 'w'), indent=2) - return {entity['id']: mediawiki.get_entity_label(entity) for entity in labels} + return {entity['id']: wikibase.get_entity_label(entity) for entity in labels} def get_other(entity): other_items = set() @@ -668,10 +664,10 @@ def next_page(item_id): entity = mediawiki.get_entity_with_cache(qid) width = 800 - image_filename = first_datavalue(entity, 'P18') + image_filename = wikibase.first_datavalue(entity, 'P18') image = image_with_cache(qid, image_filename, width) - label = mediawiki.get_entity_label(entity) + label = wikibase.get_entity_label(entity) other = get_other(entity) other_list = [] diff --git a/depicts/human.py b/depicts/human.py index 85f7dfe..5826bc6 100644 --- a/depicts/human.py +++ b/depicts/human.py @@ -1,5 +1,5 @@ from .model import HumanItem -from . import mediawiki, utils +from . import mediawiki, utils, wikibase import re re_four_digits = re.compile(r'\b\d{4}\b') @@ -47,7 +47,7 @@ def from_name(name): 'year_of_birth': item.year_of_birth, 'year_of_death': item.year_of_death, } - label = mediawiki.get_entity_label(entity) + label = wikibase.get_entity_label(entity) if label: i['label'] = label if 'en' in entity['descriptions']: diff --git a/depicts/mediawiki.py b/depicts/mediawiki.py index 9a05c63..ada56f3 100644 --- a/depicts/mediawiki.py +++ b/depicts/mediawiki.py @@ -145,11 +145,3 @@ def get_categories(titles, site): continue title_and_cats.append((i['title'], cats)) return title_and_cats - -def get_entity_label(entity): - if 'en' in entity['labels']: - return entity['labels']['en']['value'] - - label_values = {l['value'] for l in entity['labels'].values()} - if len(label_values) == 1: - return list(label_values)[0] diff --git a/depicts/wikibase.py b/depicts/wikibase.py new file mode 100644 index 0000000..9690e91 --- /dev/null +++ b/depicts/wikibase.py @@ -0,0 +1,11 @@ +def first_datavalue(entity, pid): + if pid in entity['claims']: + return entity['claims'][pid][0]['mainsnak']['datavalue']['value'] + +def get_entity_label(entity): + if 'en' in entity['labels']: + return entity['labels']['en']['value'] + + label_values = {l['value'] for l in entity['labels'].values()} + if len(label_values) == 1: + return list(label_values)[0]