# 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
# # # # # # # # # # # # # # # # # # # # # # # #
# 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 ( ' browsethearchive.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 ( )
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 ( ) :
return render_template ( ' about.html ' )
######################### 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
# ALL NAME
# https://daap.bannerrepeater.org/w/api.php?action=query&meta=siteinfo&siprop=namespaces|namespacealiases