From e8e150c85414f67e9f15dfdcd04bcbe2369ac44f Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 28 Oct 2020 10:01:31 +0000 Subject: Create permalink and some output --- bh20simplewebuploader/api.py | 6 +- bh20simplewebuploader/main.py | 69 ++++++++++++++----- bh20simplewebuploader/static/main.css | 8 +++ bh20simplewebuploader/templates/permalink.html | 91 ++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 19 deletions(-) create mode 100644 bh20simplewebuploader/templates/permalink.html diff --git a/bh20simplewebuploader/api.py b/bh20simplewebuploader/api.py index 2a5529f..b1b505f 100644 --- a/bh20simplewebuploader/api.py +++ b/bh20simplewebuploader/api.py @@ -5,7 +5,7 @@ import requests import sys from flask import Flask, request, redirect, send_file, send_from_directory, render_template, jsonify -from bh20simplewebuploader.main import app, baseURL +from bh20simplewebuploader.main import app, sparqlURL # Helper functions @@ -31,7 +31,7 @@ def fetch_sample_metadata(id): } limit 5 """ % id payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) return r.json()['results']['bindings'] # Main API routes @@ -83,7 +83,7 @@ def search(): } limit 100 """ % s payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] # metadata = file.name(seq)+"/metadata.yaml" print(result) diff --git a/bh20simplewebuploader/main.py b/bh20simplewebuploader/main.py index d3542c3..37f4590 100644 --- a/bh20simplewebuploader/main.py +++ b/bh20simplewebuploader/main.py @@ -663,11 +663,48 @@ def contact_page(): buf = get_html_body('doc/web/contact.html','https://github.com/arvados/bh20-seq-resource/blob/master/doc/web/contact.org') return render_template('about.html',menu='CONTACT',embed=buf) +## +## Linked data permanent links/resources +## +sparqlURL='http://sparql.genenetwork.org/sparql/' + +## +# Example http://host/resource/MT326090.1 +@app.route('/resource/') +def resource(id): + """Get a COVID19 resource using identifier""" + query=""" +PREFIX pubseq: +PREFIX sio: +select distinct ?sample ?geoname ?date ?source ?geo ?sampletype +{ + ?sample sio:SIO_000115 "MT326090.1" . + ?sample ?geo . + ?geo rdfs:label ?geoname . + ?sample ?date . + OPTIONAL {?sample ?source } + OPTIONAL {?sample ?sampletype } +} + """ + payload = {'query': query, 'format': 'json'} + r = requests.get(sparqlURL, params=payload) + result = r.json()['results']['bindings'] + # for now we just take the first one + sample = result[0] + logging.info(sample) + logging.info("^^^^^^^^^^^^^^^^^^^^^^^^^^^^") + # return jsonify({'sequences': int(result[0]["num"]["value"])}) + locationuri=sample['geo']['value'] + location=sample['geoname']['value'] + date=sample['date']['value'] + source=sample['source']['value'] + sampletype=sample['sampletype']['value'] + return render_template('permalink.html',id=id,menu='',uri=f"http://covid19.genenetwork.org/resource/{id}",locationuri=locationuri,location=location,date=date,source=source,sampletype=sampletype) + ## Dynamic API functions starting here ## This is quick and dirty for now, just to get something out and demonstrate the queries ## Feel free to rename the functions/endpoints, feel free to process result so we get nicer JSON ## but most likely you don't want to touch the queries, Cheers. -baseURL='http://sparql.genenetwork.org/sparql/' @app.route('/api/getCount', methods=['GET']) def getCount(): @@ -693,7 +730,7 @@ def getCountDB(): } """ payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] # [{'num': {'type': 'typed-literal', 'datatype': 'http://www.w3.org/2001/XMLSchema#integer', 'value': '1352'}}] # print(result, file=sys.stderr) @@ -703,7 +740,7 @@ def getCountDB(): def getAllaccessions(): query="""SELECT DISTINCT ?fasta ?value WHERE {?fasta ?x[ ?value ]}""" payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return jsonify([{'uri': x['fasta']['value'], 'value': x['value']['value']} for x in result]) @@ -720,7 +757,7 @@ def getDetailsForSeq(): BIND(IF(BOUND(?key_tmp_label),?key_tmp_label, ?key) as ?key_label)}""" query=query.replace("placeholder", seq_id) payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return jsonify([{'uri': x['key']['value'], 'key_label': x['key_label']['value'], 'value': x['value']['value']} for x in result]) @@ -737,7 +774,7 @@ def getCountByGPS(): GROUP BY ?location ?location_label ?GPS """ payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return jsonify([{'count': x['fastaCount']['value'], 'Location': x['location']['value'], @@ -754,7 +791,7 @@ def getSEQCountbytech(): GROUP BY ?tech ?tech_label ORDER BY DESC (?fastaCount) """ payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return jsonify([{'count': x['fastaCount']['value'], 'key': x['tech']['value'], @@ -770,7 +807,7 @@ def getSEQbytech(): tech = request.args.get('tech') query=query.replace("placeholder", tech) payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return str(result) @@ -783,7 +820,7 @@ def getSEQbyLocation(): query=query.replace("placeholder", location) print(query) payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return str(result) @@ -797,7 +834,7 @@ def getSEQCountbyLocation(): GROUP BY ?geoLocation ?geoLocation_label ORDER BY DESC (?fastaCount) """ payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return jsonify([{'count': x['fastaCount']['value'], 'key': x['geoLocation']['value'], @@ -816,7 +853,7 @@ def getSEQCountbyContinent(): GROUP BY ?continent ?continent_label """ payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return jsonify([{'count': x['fastaCount']['value'], 'key': x['continent']['value'], @@ -837,7 +874,7 @@ def getSEQCountbyCountryContinent(): continent = request.args.get('continent') query = query.replace("placeholder", continent) payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return jsonify([{'count': x['fastaCount']['value'], 'key': x['location']['value'], @@ -855,7 +892,7 @@ def getSEQCountbySpecimenSource(): ORDER BY DESC (?fastaCount) """ payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return jsonify([{'count': x['fastaCount']['value'], 'key': x['specimen_source']['value'], @@ -871,7 +908,7 @@ def getSEQBySpecimenSource(): specimen=request.args.get('specimen') query = query.replace("placeholder", specimen) payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return str(result) @@ -885,7 +922,7 @@ def getSEQCountbyHostHealthStatus(): ORDER BY DESC (?fastaCount) """ payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return str(result) @@ -899,7 +936,7 @@ def getSEQbyLocationAndTech(): query = query.replace("placeholderTech", tech) print(query) payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return str(result) @@ -917,6 +954,6 @@ def getSEQbyLocationAndSpecimenSource(): query = query.replace("placeholderSpecimen", specimen) print(query) payload = {'query': query, 'format': 'json'} - r = requests.get(baseURL, params=payload) + r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] return str(result) diff --git a/bh20simplewebuploader/static/main.css b/bh20simplewebuploader/static/main.css index 2773afb..bc4f705 100644 --- a/bh20simplewebuploader/static/main.css +++ b/bh20simplewebuploader/static/main.css @@ -140,6 +140,14 @@ form h4 { border-radius: 20px; } +.content { + background-color: #B2F8F8; + margin: 30px auto; + padding: 20px; + width: 95%; + border-radius: 20px; +} + .button { border-radius: 5px; background: #B2F8F8; diff --git a/bh20simplewebuploader/templates/permalink.html b/bh20simplewebuploader/templates/permalink.html new file mode 100644 index 0000000..f75c21e --- /dev/null +++ b/bh20simplewebuploader/templates/permalink.html @@ -0,0 +1,91 @@ + + + {% include 'header.html' %} + + {% include 'banner.html' %} + {% include 'menu.html' %} + +
+ +

{{id}}

+ +

+ This is page represents a permanent COVID-19 PubSeq SARS-CoV-2 sequence resource +

+ +
+
+
+
+
+
+ Identifier +
+
+ {{id}} +
+
+
+
+
+
+ Permanent link +
+
+ {{uri}} +
+
+
+
+
+
+ Location +
+ +
+
+
+
+
+ Sampling date +
+
+ {{ date }} +
+
+
+
+
+
+ Sample type +
+ +
+
+
+
+
+ Source +
+ +
+
+
+
+ +
+ + {% include 'footer.html' %} + + + + + -- cgit v1.2.3