# 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
import re
# # # # # # # # # # # # # # # # # # # # # # # #
# 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 ( ) :
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 ( )
ImagesBanner = [ ]
# 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 " ]
ImagesBanner . append ( publication_image )
ImagesBanner = ImagesBanner [ - 12 : ]
return render_template ( ' home.html ' , results = results , ImagesBanner = ImagesBanner )
@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 ? work ? workLabel ? workDescription ? propLabel ? b ? bLabel ? creators ? creatorsLabel ? creatorRoles ? creatorRolesLabel ? image ? depicts ? depictsLabel ? license ? licenseLabel
WHERE
{
VALUES ? work { wd : ''' +artwork_id+ ''' }
? work ? a ? b .
OPTIONAL { ? work wdt : P9 ? creators . }
OPTIONAL { ? work p : P9 ? statement1 .
? statement1 ps : P9 ? creators ;
pq : P49 ? creatorRoles . }
OPTIONAL { ? work wdt : P30 ? image . }
OPTIONAL { ? work p : P30 ? statement2 .
? statement2 ps : P30 ? image ;
pq : P54 ? depicts ;
pq : P56 ? license . }
SERVICE wikibase : label { bd : serviceParam wikibase : language " en " . }
? prop wikibase : directClaim ? a .
} ''' )
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 ? item ? itemLabel ? itemDescription ? propLabel ? b ? bLabel
WHERE
{
VALUES ? item { wd : ''' +person_id+ ''' }
? item ? 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=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 ( " html " )
# adapt the path to img with regex
# replaceString = "wiki/Special:Redirect/file/"
# cleanSoup = BeautifulSoup(str(text).replace("wiki/File:", replaceString))
# for a in soup.find_all('a', href=True):
# if a.text:
# print(a['href'])
# replace src from img zith href from a href and remove the a
text = Markup ( text )
return render_template ( ' about.html ' , text = text )
######################### TUTORIAL
@app . route ( " /tutorials " )
def tutorials ( ) :
return render_template ( ' tutorials.html ' )
######################### UPLOAD
@app . route ( " /upload " )
def upload ( ) :
url = " https://daap.bannerrepeater.org/w/index.php?title=Upload&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 ( " html " )
text = Markup ( text )
return render_template ( ' upload.html ' , text = text )
# #################### CASE STUDY
@app . route ( " /casestudy " )
def casestudy ( ) :
url = " https://daap.bannerrepeater.org/w/index.php?title=Carolee_Schneemann_case_study&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 ( " html " )
text = Markup ( text )
return render_template ( ' casestudy.html ' , text = text )
# #################### CODE OF CONDUCT
@app . route ( " /codeofconduct " )
def codeofconduct ( ) :
url = " https://daap.bannerrepeater.org/w/index.php?title=Code_of_Conduct&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 ( " html " )
text = Markup ( text )
return render_template ( ' codeofconduct.html ' , text = text )
######################### 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
# replace or insert tags
# https://stackoverflow.com/questions/2073541/search-and-replace-in-html-with-beautifulsoup