# 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