Add language information to label on item page.
This commit is contained in:
parent
6eb79ccfd5
commit
514c55cd6e
41
app.py
41
app.py
|
@ -5,13 +5,15 @@ from depicts import (utils, wdqs, commons, mediawiki, painting, saam, database,
|
||||||
dia, rijksmuseum, npg, museodelprado, barnesfoundation,
|
dia, rijksmuseum, npg, museodelprado, barnesfoundation,
|
||||||
wd_catalog)
|
wd_catalog)
|
||||||
from depicts.pager import Pagination, init_pager
|
from depicts.pager import Pagination, init_pager
|
||||||
from depicts.model import DepictsItem, DepictsItemAltLabel, Edit, PaintingItem
|
from depicts.model import (DepictsItem, DepictsItemAltLabel, Edit, PaintingItem,
|
||||||
|
Language)
|
||||||
from depicts.error_mail import setup_error_mail
|
from depicts.error_mail import setup_error_mail
|
||||||
from requests_oauthlib import OAuth1Session
|
from requests_oauthlib import OAuth1Session
|
||||||
from urllib.parse import urlencode
|
from urllib.parse import urlencode
|
||||||
from werkzeug.exceptions import InternalServerError
|
from werkzeug.exceptions import InternalServerError
|
||||||
from werkzeug.debug.tbtools import get_current_traceback
|
from werkzeug.debug.tbtools import get_current_traceback
|
||||||
from sqlalchemy import func, distinct
|
from sqlalchemy import func, distinct
|
||||||
|
from collections import defaultdict
|
||||||
import requests.exceptions
|
import requests.exceptions
|
||||||
import requests
|
import requests
|
||||||
import lxml.html
|
import lxml.html
|
||||||
|
@ -124,6 +126,10 @@ select distinct ?item where {
|
||||||
}
|
}
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
@app.teardown_appcontext
|
||||||
|
def shutdown_session(exception=None):
|
||||||
|
database.session.remove()
|
||||||
|
|
||||||
@app.errorhandler(InternalServerError)
|
@app.errorhandler(InternalServerError)
|
||||||
def exception_handler(e):
|
def exception_handler(e):
|
||||||
tb = get_current_traceback()
|
tb = get_current_traceback()
|
||||||
|
@ -411,7 +417,8 @@ def item_page(item_id):
|
||||||
image = image_with_cache(qid, image_filename, width)
|
image = image_with_cache(qid, image_filename, width)
|
||||||
|
|
||||||
# hits = item.run_query()
|
# hits = item.run_query()
|
||||||
label = get_entity_label(entity)
|
label_and_language = get_entity_label_and_language(entity)
|
||||||
|
label = label_and_language['label']
|
||||||
other = get_other(item.entity)
|
other = get_other(item.entity)
|
||||||
|
|
||||||
painting_item = PaintingItem.query.get(item_id)
|
painting_item = PaintingItem.query.get(item_id)
|
||||||
|
@ -465,6 +472,8 @@ def item_page(item_id):
|
||||||
except requests.exceptions.ReadTimeout:
|
except requests.exceptions.ReadTimeout:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
label_languages = label_and_language['languages']
|
||||||
|
show_translation_links = all(lang.code != 'en' for lang in label_languages)
|
||||||
return render_template('item.html',
|
return render_template('item.html',
|
||||||
qid=qid,
|
qid=qid,
|
||||||
item_id=item_id,
|
item_id=item_id,
|
||||||
|
@ -476,6 +485,8 @@ def item_page(item_id):
|
||||||
entity=item.entity,
|
entity=item.entity,
|
||||||
username=get_username(),
|
username=get_username(),
|
||||||
label=label,
|
label=label,
|
||||||
|
label_languages=label_languages,
|
||||||
|
show_translation_links=show_translation_links,
|
||||||
image=image,
|
image=image,
|
||||||
other=other,
|
other=other,
|
||||||
# hits=hits,
|
# hits=hits,
|
||||||
|
@ -489,6 +500,32 @@ def get_entity_label(entity):
|
||||||
if len(label_values) == 1:
|
if len(label_values) == 1:
|
||||||
return list(label_values)[0]
|
return list(label_values)[0]
|
||||||
|
|
||||||
|
def get_languages(codes):
|
||||||
|
return Language.query.filter(Language.wikimedia_language_code.in_(codes))
|
||||||
|
|
||||||
|
def get_entity_label_and_language(entity):
|
||||||
|
'''
|
||||||
|
Look for a useful label and return it with a list of languages that have that label.
|
||||||
|
|
||||||
|
If the entity has a label in English return it.
|
||||||
|
|
||||||
|
Otherwise check if all languages have the same label, if so then return it.
|
||||||
|
'''
|
||||||
|
|
||||||
|
group_by_label = defaultdict(set)
|
||||||
|
for language, l in entity['labels'].items():
|
||||||
|
group_by_label[l['value']].add(language)
|
||||||
|
|
||||||
|
if 'en' in entity['labels']:
|
||||||
|
label = entity['labels']['en']['value']
|
||||||
|
return {'label': label,
|
||||||
|
'languages': get_languages(group_by_label[label])}
|
||||||
|
|
||||||
|
if len(group_by_label) == 1:
|
||||||
|
label, languages = list(group_by_label.items())[0]
|
||||||
|
return {'label': label,
|
||||||
|
'languages': get_languages(languages)}
|
||||||
|
|
||||||
def get_labels(keys, name=None):
|
def get_labels(keys, name=None):
|
||||||
keys = sorted(keys, key=lambda i: int(i[1:]))
|
keys = sorted(keys, key=lambda i: int(i[1:]))
|
||||||
if name is None:
|
if name is None:
|
||||||
|
|
|
@ -2,7 +2,7 @@ from sqlalchemy.ext.declarative import declarative_base
|
||||||
from .database import session, now_utc
|
from .database import session, now_utc
|
||||||
from sqlalchemy.schema import Column, ForeignKey
|
from sqlalchemy.schema import Column, ForeignKey
|
||||||
from sqlalchemy.types import Integer, String, DateTime
|
from sqlalchemy.types import Integer, String, DateTime
|
||||||
from sqlalchemy.orm import column_property, relationship
|
from sqlalchemy.orm import column_property, relationship, synonym
|
||||||
from sqlalchemy.ext.associationproxy import association_proxy
|
from sqlalchemy.ext.associationproxy import association_proxy
|
||||||
from sqlalchemy.sql.expression import cast
|
from sqlalchemy.sql.expression import cast
|
||||||
from sqlalchemy.dialects import postgresql
|
from sqlalchemy.dialects import postgresql
|
||||||
|
@ -43,6 +43,20 @@ class PaintingItem(Base):
|
||||||
entity = Column(postgresql.JSON)
|
entity = Column(postgresql.JSON)
|
||||||
qid = column_property('Q' + cast(item_id, String))
|
qid = column_property('Q' + cast(item_id, String))
|
||||||
|
|
||||||
|
class Language(Base):
|
||||||
|
__tablename__ = 'language'
|
||||||
|
item_id = Column(Integer, primary_key=True, autoincrement=False)
|
||||||
|
wikimedia_language_code = Column(String, index=True, unique=True)
|
||||||
|
en_label = Column(String, nullable=False)
|
||||||
|
|
||||||
|
code = synonym('wikimedia_language_code')
|
||||||
|
label = synonym('en_label')
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_by_code(cls, code):
|
||||||
|
return cls.query.filter_by(wikimedia_language_code=code).one()
|
||||||
|
|
||||||
|
|
||||||
class Edit(Base):
|
class Edit(Base):
|
||||||
__tablename__ = 'edit'
|
__tablename__ = 'edit'
|
||||||
username = Column(String, primary_key=True)
|
username = Column(String, primary_key=True)
|
||||||
|
|
|
@ -13,6 +13,14 @@
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
<div class="p-2 flex-fill">
|
<div class="p-2 flex-fill">
|
||||||
<h1>{{ self.title() }}</h1>
|
<h1>{{ self.title() }}</h1>
|
||||||
|
<p>Label from:
|
||||||
|
{% for lang in label_languages %}
|
||||||
|
{{ lang.label }} ({{ lang.code }})
|
||||||
|
{% if show_translation_links %}
|
||||||
|
<a href="https://translate.google.com/#view=home&op=translate&sl={{lang.code}}&tl=en&text={{label}}" target="translation">[translate]</a>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<a href="https://www.wikidata.org/wiki/{{ qid }}">view this painting on Wikidata</a>
|
<a href="https://www.wikidata.org/wiki/{{ qid }}">view this painting on Wikidata</a>
|
||||||
|
|
Loading…
Reference in a new issue