Flask application repository for Banner Repeater's DAAP (Digital Archive of Artists Publishing). SPARQL queries by Lozana Rossenova, CSS and JS by Joana Chicau, python and Jinja by Julie Boschat-Thorez. See https://daap.network
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

403 lines
13 KiB

# encoding=utf8
# # # # # # # # # # # # # # # # # # # # # # # #
# REQUIREMENTS
# # # # # # # # # # # # # # # # # # # # # # # #
from flask import send_file, Flask, Response, url_for, render_template, Markup, jsonify, redirect, request, flash, session, make_response
import requests
from SPARQLWrapper import SPARQLWrapper, JSON
import json
# import pandas as pd
# ##### IMPORTS FOR TEST WIKIPAGE
from lxml import html
from bs4 import BeautifulSoup
# # # # # # # # # # # # # # # # # # # # # # # #
# GETTING STARTED
# # # # # # # # # # # # # # # # # # # # # # # #
app = Flask(__name__, static_url_path='', static_folder="static", template_folder="templates")
app.jinja_env.add_extension('jinja2.ext.loopcontrols')
# # # # # # # # # # # # # # # # # # # # # # # #
# GETTING WIKIBASE DATA
# # # # # # # # # # # # # # # # # # # # # # # #
sparql = SPARQLWrapper("https://query.daap.bannerrepeater.org/proxy/wdqs/bigdata/namespace/wdq/sparql")
sparql2 = SPARQLWrapper("https://query.daap.bannerrepeater.org/proxy/wdqs/bigdata/namespace/wdq/sparql")
sparql3 = SPARQLWrapper("https://query.daap.bannerrepeater.org/proxy/wdqs/bigdata/namespace/wdq/sparql")
# # # # # # # # # # # # # # # # # # # # # # # #
# PAGES
# # # # # # # # # # # # # # # # # # # # # # # #
@app.route("/")
def home():
# this doesn't show any results yet because I just added the data and I guess the query builder needs to be reloaded again, but the query code should work correctly.
# sparql.setQuery('''
# SELECT ?work ?workLabel ?image ?date ?dateadded
# WHERE {
# SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
# ?work wdt:P1 wd:Q1;
# wdt:P87 ?dateadded.
# OPTIONAL { ?work wdt:P30 ?image. }
# OPTIONAL { ?work wdt:P13 ?date. }
# FILTER(?work != wd:Q57)
# }
# ORDER BY (?dateadded)
# LIMIT 24
# ''')
# sparql.setReturnFormat(JSON)
# results = sparql.query().convert()
# return render_template('home.html', results=results)
sparql.setQuery('''
SELECT ?work ?workLabel ?image ?date WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
?work wdt:P1 wd:Q1.
OPTIONAL { ?work p:P30 ?statement.
?statement ps:P30 ?image;
pq:P54 wd:Q90.}
OPTIONAL { ?work wdt:P13 ?date. }
FILTER(?work != wd:Q57)
}
ORDER BY (?workLabel)
''')
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
# print(results)
for publication in results["results"]["bindings"]:
publication_title = publication["workLabel"]["value"]
publication_uri = publication["work"]["value"]
#if key exists
if "date" in publication:
publication_date = publication["date"]["value"]
if "image" in publication:
publication_image = publication["image"]["value"]
return render_template('home.html', results=results)
@app.route("/browsethearchive")
def browsethearchive():
sparql.setQuery('''
SELECT ?work ?workLabel ?image ?date WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
?work wdt:P1 wd:Q1.
OPTIONAL { ?work p:P30 ?statement.
?statement ps:P30 ?image;
pq:P54 wd:Q90.}
OPTIONAL { ?work wdt:P13 ?date. }
FILTER(?work != wd:Q57)
}
ORDER BY (?workLabel)
''')
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
# print(results)
for publication in results["results"]["bindings"]:
publication_title = publication["workLabel"]["value"]
publication_uri = publication["work"]["value"]
#if key exists
if "date" in publication:
publication_date = publication["date"]["value"]
if "image" in publication:
publication_image = publication["image"]["value"]
return render_template('browsethearchive.html', results=results)
@app.route("/browsebycategory")
def browsebycategory():
return render_template('browsebycategory.html')
##########################
# CATEGORIES TO BE BROWSED
#########################
######################### ARTIST INDEX
@app.route("/artistsindex")
def artistsindex():
sparql.setQuery('''
SELECT ?creators ?creatorsLabel ?creatorsAltLabel ?creatorsDescription
WHERE {
{
SELECT ?creators (COUNT(DISTINCT ?a) AS ?count) WHERE {
?a ?prop ?creators .
?a wdt:P1 ?work .
BIND (wdt:P9 AS ?prop) .
BIND (wd:Q1 AS ?work) .
} GROUP BY ?creators
} .
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
}
FILTER (?creators !=wd:Q82)
}
ORDER BY DESC(?count) ?creatorsLabel
''')
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
print(results)
return render_template('artistsindex.html', results=results)
######################### PUBLISHERS INDEX
@app.route("/publishersindex")
def publishersindex():
sparql.setQuery('''
SELECT ?publishers ?publishersLabel ?publishersAltLabel ?publishersDescription WHERE {
{
SELECT ?publishers (COUNT(DISTINCT ?a) AS ?count) WHERE {
?a ?prop ?publishers .
?a wdt:P1 ?work .
BIND (wdt:P10 AS ?prop) .
BIND (wd:Q1 AS ?work) .
} GROUP BY ?publishers
} .
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
}
FILTER(?publishers != wd:Q83)
FILTER(?publishers != wd:Q71)
}
ORDER BY DESC(?count) ?publishersLabel
''')
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
return render_template('publishersindex.html', results=results)
######################### SELF PUBLISHED INDEX
@app.route("/selfpublishedindex")
def selfpublishedindex():
sparql.setQuery('''
SELECT ?work ?workLabel ?workAltLabel ?workDescription
WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
?work wdt:P1 wd:Q1;
wdt:P10 wd:Q71.
FILTER(?work != wd:Q57)
}
''')
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
return render_template('selfpublishedindex.html', results=results)
######################### ZINES INDEX
@app.route("/zinesindex")
def zinesindex():
sparql.setQuery('''
SELECT ?work ?workLabel ?workAltLabel ?workDescription
WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
?work wdt:P1 wd:Q1;
wdt:P16 wd:Q152.
FILTER(?work != wd:Q57)
}
''')
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
return render_template('zinesindex.html', results=results)
##########################
# DETAILED INDIVIDUAL PAGES
#########################
######################### ARTWORK
@app.route("/artwork", methods=['GET'])
def artwork():
artwork_id = request.args.get('id')
sparql.setQuery('''
SELECT ?workLabel ?workDescription
?creators ?creatorsLabel ?creatorRoles ?creatorRolesLabel
?publishers ?publishersLabel ?publisherRoles ?publisherRolesLabel
?date ?dateType ?dateTypeLabel ?dateSource
?image ?depics ?depicsLabel ?annotation ?license ?licenseLabel
?descriptionQID ?accessURLdescrip ?authordescrip ?authordescripLabel ?datedescrip
?exhibitionHistoryQID ?accessURLexhibitionHis ?authorexhibitionHis ?authorexhibitionHisLabel ?dateexhibitionHis
?digitalFacsimile ?digitalFacsimileExternal
?digitalArtefact ?format ?formatLabel
?distributorLinks
?copiesCollections ?collections ?collectionsLabel ?imageCollections
?relatedWorks ?relatedWorksLabel ?dateRelatedWorks
WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
VALUES ?work {wd:'''+artwork_id+'''}
OPTIONAL { ?work wdt:P9 ?creators. }
OPTIONAL { ?work p:P9 ?statement0.
?statement0 ps:P9 ?creators;
pq:P49 ?creatorRoles. }
OPTIONAL { ?work wdt:P13 ?date. }
OPTIONAL { ?work p:P13 ?statement1.
?statement1 ps:P13 ?date;
pq:P51 ?dateType;
pq:P50 ?dateSource. }
OPTIONAL { ?work wdt:P10 ?publishers. }
OPTIONAL { ?work p:P10 ?statement2.
?statement2 ps:P10 ?publishers;
pq:P49 ?publisherRoles. }
OPTIONAL { ?work wdt:P30 ?image. }
OPTIONAL { ?work p:P30 ?statement3.
?statement3 ps:P30 ?image;
pq:P54 ?depics;
pq:P55 ?annotation;
pq:P56 ?license.}
OPTIONAL { ?work wdt:P65 ?descriptionQID. }
OPTIONAL { ?descriptionQID wdt:P4 ?accessURLdescrip;
wdt:P9 ?authordescrip;
wdt:P13 ?datedescrip;
wdt:P50 ?sourcedescrip. }
OPTIONAL { ?work wdt:P66 ?exhibitionHistoryQID. }
OPTIONAL { ?exhibitionHistoryQID wdt:P4 ?accessURLexhibitionHis;
wdt:P9 ?authorexhibitionHis;
wdt:P13 ?dateexhibitionHis;
wdt:P50 ?sourceexhibitionHis. }
OPTIONAL { ?work wdt:P32 ?digitalFacsimile. }
OPTIONAL { ?work wdt:P34 ?digitalFacsimileExternal. }
OPTIONAL { ?work wdt:P35 ?digitalArtefact. }
OPTIONAL { ?work p:P35 ?statement4.
?statement4 ps:P35 ?digitalArtefact;
pq:P16 ?format.}
OPTIONAL { ?work wdt:P37 ?distributorLinks. }
OPTIONAL { ?work wdt:P43 ?copiesCollections. }
OPTIONAL { ?copies_collections wdt:P47 ?collections;
wdt:P30 ?imageCollections. }
OPTIONAL { ?work wdt:P44 ?relatedWorks. }
OPTIONAL { ?relatedWorks wdt:P13 ?dateRelatedWorks. }
}
''')
sparql.setReturnFormat(JSON)
artwork = sparql.query().convert()
# print(artwork)
artwork_url = "https://daap.bannerrepeater.org/wiki/Item:Q92"
artwork_title = "the human printer"
artwork_description = "short description"
return render_template('artwork.html', artwork_title=artwork_title, artwork_description=artwork_description, artwork=artwork, artwork_id=artwork_id)
######################### PERSON
@app.route("/person", methods=['GET'])
def person():
person_id = request.args.get('id')
sparql.setQuery('''
SELECT ?person ?personLabel ?personDescription ?a ?aLabel ?propLabel ?b ?bLabel
WHERE {
VALUES ?person {wd:'''+person_id+'''}
?person ?a ?b.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
?prop wikibase:directClaim ?a .
}
''')
sparql.setReturnFormat(JSON)
person_details = sparql.query().convert()
print(person_details)
sparql2.setQuery('''
SELECT ?work ?workLabel ?image ?date
WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
?work wdt:P1 wd:Q1.
?work wdt:P9 wd:'''+person_id+'''.
OPTIONAL { ?work wdt:P30 ?image. }
OPTIONAL { ?work wdt:P13 ?date. }
FILTER(?work != wd:Q57)
}
ORDER BY (?workLabel)
''')
sparql2.setReturnFormat(JSON)
person_creatorof = sparql2.query().convert()
sparql3.setQuery('''
SELECT ?work ?workLabel ?image ?date
WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
?work wdt:P1 wd:Q1.
?work wdt:P10 wd:'''+person_id+'''.
OPTIONAL { ?work wdt:P30 ?image. }
OPTIONAL { ?work wdt:P13 ?date. }
FILTER(?work != wd:Q57)
}
ORDER BY (?workLabel)
''')
sparql3.setReturnFormat(JSON)
person_publisherof = sparql2.query().convert()
person_url = ""
person_name = "the name"
person_description = "short bio"
return render_template("person.html", person_id=person_id, person_creatorof=person_creatorof, person_publisherof=person_publisherof, person_details=person_details)
#########################
# PAGES FROM WIKI
#########################
######################### SEARCH TOOLS
@app.route("/searchtools")
def searchtools():
return render_template('searchtools.html')
######################### ABOUT
@app.route("/about")
def about():
url="https://daap.bannerrepeater.org/w/index.php?title=Project:About&action=render"
# Make a GET request to fetch the raw HTML content
html_content = requests.get(url).text
# Parse the html content
soup = BeautifulSoup(html_content, "lxml")
print(soup.prettify()) # print the parsed data of html
text=soup.find("p")
return render_template('about-wiki.html', text=text)
######################### TUTORIAL
@app.route("/tutorials")
def tutorials():
return render_template('tutorials.html')
######################### UPLOAD
@app.route("/upload")
def upload():
return render_template('upload.html')
######################### LOGIN
#Goes to wikibase page
# ###################
# TEST
response = requests.get(
'https://daap.bannerrepeater.org/w/api.php',
params={
'action': 'parse',
'page': 'Test',
'format': 'json',
}).json()
raw_html = response['parse']['text']['*']
document = html.document_fromstring(raw_html)
first_p = document.xpath('//p')[0]
intro_text = first_p.text_content()
print(intro_text)
# ALL NAME
# https://daap.bannerrepeater.org/w/api.php?action=query&meta=siteinfo&siprop=namespaces|namespacealiases