# 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(): 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[-3:] 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 ?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