Saving to Wikidata is working.

This commit is contained in:
Edward Betts 2019-09-27 16:53:17 +01:00
parent e1ee9b047b
commit 7a233021fd
3 changed files with 96 additions and 25 deletions

59
app.py
View file

@ -4,7 +4,7 @@ from flask import Flask, render_template, url_for, redirect, request, g, jsonify
from depicts import (utils, wdqs, commons, mediawiki, painting, saam, database, 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.model import DepictsItem, DepictsItemAltLabel from depicts.model import DepictsItem, DepictsItemAltLabel, Edit
from requests_oauthlib import OAuth1Session from requests_oauthlib import OAuth1Session
from urllib.parse import urlencode from urllib.parse import urlencode
import requests.exceptions import requests.exceptions
@ -122,7 +122,25 @@ def init_profile():
@app.route('/save/Q<int:item_id>', methods=['POST']) @app.route('/save/Q<int:item_id>', methods=['POST'])
def save(item_id): def save(item_id):
depicts = request.form.getlist('depicts') depicts = request.form.getlist('depicts')
return repr(depicts) username = get_username()
assert username
token = get_token()
for depicts_qid in depicts:
depicts_id = int(depicts_qid[1:])
r = create_claim(item_id, depicts_id, token)
reply = r.json()
if 'error' in reply:
return 'error:' + r.text
print(r.text)
edit = Edit(username=username,
painting_id=item_id,
depicts_id=depicts_id)
database.session.add(edit)
database.session.commit()
return redirect(url_for('next_page', item_id=item_id))
@app.route("/property/P<int:property_id>") @app.route("/property/P<int:property_id>")
def property_query_page(property_id): def property_query_page(property_id):
@ -252,6 +270,43 @@ def oauth_api_request(params):
return reply return reply
def create_claim(painting_id, depicts_id, token):
painting_qid = f'Q{painting_id}'
value = json.dumps({'entity-type': 'item',
'numeric-id': depicts_id})
params = {
'action': 'wbcreateclaim',
'entity': painting_qid,
'property': 'P180',
'snaktype': 'value',
'value': value,
'token': token,
'format': 'json',
'formatversion': 2,
}
return oauth_api_post_request(params)
def get_token():
params = {
'action': 'query',
'meta': 'tokens',
'format': 'json',
'formatversion': 2,
}
reply = oauth_api_request(params)
token = reply['query']['tokens']['csrftoken']
return token
def oauth_api_post_request(params):
url = 'https://www.wikidata.org/w/api.php'
client_key = app.config['CLIENT_KEY']
client_secret = app.config['CLIENT_SECRET']
oauth = OAuth1Session(client_key,
client_secret=client_secret,
resource_owner_key=session['owner_key'],
resource_owner_secret=session['owner_secret'])
return oauth.post(url, data=params)
def image_with_cache(qid, image_filename, width): def image_with_cache(qid, image_filename, width):
filename = f'cache/{qid}_{width}_image.json' filename = f'cache/{qid}_{width}_image.json'

View file

@ -1,7 +1,7 @@
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from .database import session from .database import session, now_utc
from sqlalchemy.schema import Column, ForeignKey from sqlalchemy.schema import Column, ForeignKey
from sqlalchemy.types import Integer, String from sqlalchemy.types import Integer, String, DateTime
from sqlalchemy.orm import column_property, relationship from sqlalchemy.orm import column_property, relationship
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
@ -33,3 +33,10 @@ class DepictsItemAltLabel(Base):
def __init__(self, alt_label): def __init__(self, alt_label):
self.alt_label = alt_label self.alt_label = alt_label
class Edit(Base):
__tablename__ = 'edit'
username = Column(String, primary_key=True)
painting_id = Column(Integer, primary_key=True)
depicts_id = Column(Integer, primary_key=True)
timestamp = Column(DateTime, default=now_utc())

View file

@ -3,30 +3,39 @@
{% block title %}{{ label }} ({{qid }}){% endblock %} {% block title %}{{ label }} ({{qid }}){% endblock %}
{% block content %} {% block content %}
<div class="m-3"> <div class="d-flex">
<h1>{{ self.title() }}</h1> <div class="p-2 flex-fill">
{# <pre>{{ other | pprint }}</pre> #} <h1>{{ self.title() }}</h1>
{# <img src="{{ image.thumburl }}" height="{{ image.thumbheight }}" width="{{ image.thumbwidth }}"> #} <div class="alert alert-primary" role="alert">
<div class="row"> Thanks for contributing. Your edits have been saved to the painting on Wikidata. Use the links below to find other similar paintings to catalog.
<div class="col"> </div>
<img src="{{ image.thumburl }}">
</div> <p>
<a href="https://www.wikidata.org/wiki/{{ qid }}">view this painting on Wikidata</a>
|
<a href="{{ url_for('random_painting') }}">switch to another painting</a>
|
<a href="{{ url_for('browse_page') }}">browse paintings</a>
</p>
{% for key, prop_label in labels.items() %}
{% set claims = entity['claims'][key] %}
{% if claims %}
<h3>{{ prop_label }} ({{ key }})</h3>
{% for claim in claims %}
{% set claim_qid = claim.mainsnak.datavalue.value.id %}
<a href="{{ url_for('find_more_page', property_id=key[1:], item_id=claim_qid[1:]) }}">{{ other[claim_qid] or '[ label missing ]' }}</a> ({{ claim_qid }})
{% endfor %}
{% endif %}
{% endfor %}
<div class="col">
<p><a href="https://www.wikidata.org/wiki/{{ qid }}">view on Wikidata</a></p>
{% for key, prop_label in labels.items() %}
{% set claims = entity['claims'][key] %}
{% if claims %}
<h3>{{ prop_label }} ({{ key }})</h3>
{% for claim in claims %}
{% set claim_qid = claim.mainsnak.datavalue.value.id %}
<a href="{{ url_for('find_more_page', property_id=key[1:], item_id=claim_qid[1:]) }}">{{ other[claim_qid] or '[ label missing ]' }}</a> ({{ claim_qid }})
{% endfor %}
{% endif %}
{% endfor %}
</div>
</div> </div>
<div class="flex-shrink-1 vh-100">
<img src="{{ image.thumburl }}">
</div>
</div> </div>
{% endblock %} {% endblock %}