From 79a85f846671d575eae6f83d96659c0e1be06011 Mon Sep 17 00:00:00 2001 From: Peter Amstutz Date: Thu, 14 May 2020 21:30:19 -0400 Subject: Switch fasta identifiers to use a real working URL Arvados-DCO-1.1-Signed-off-by: Peter Amstutz --- bh20seqanalyzer/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bh20seqanalyzer/main.py b/bh20seqanalyzer/main.py index 07e5f69..28b5e31 100644 --- a/bh20seqanalyzer/main.py +++ b/bh20seqanalyzer/main.py @@ -146,7 +146,7 @@ def start_pangenome_analysis(api, "class": "File", "location": "keep:%s/metadata.yaml" % v["portable_data_hash"] }) - inputobj["subjects"].append("http://arvados.org/keep:%s/sequence.fasta" % v["portable_data_hash"]) + inputobj["subjects"].append("http://collections.lugli.arvadosapi.com/c=%s/sequence.fasta" % v["portable_data_hash"]) run_workflow(api, analysis_project, pangenome_workflow_uuid, "Pangenome analysis", inputobj) -- cgit v1.2.3 From 4e1081c916b6c319ee27dac9e624586f4cb516dd Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Fri, 15 May 2020 08:29:15 -0500 Subject: Template: fix URL for example and added comment for using semweb URIs --- bh20simplewebuploader/templates/form.html | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/bh20simplewebuploader/templates/form.html b/bh20simplewebuploader/templates/form.html index 1bbf515..5e6aa3e 100644 --- a/bh20simplewebuploader/templates/form.html +++ b/bh20simplewebuploader/templates/form.html @@ -2,7 +2,7 @@ - + Web uploader for Public SARS-CoV-2 Sequence Resource @@ -66,7 +66,9 @@ A free command line version of the uploader can be installed from source.

- +

+ Note that form fields contain web onthology URI's for disambiguation and machine readable metadata. For examples of use, see the BLOG. +

@@ -75,7 +77,7 @@ Upload SARS-CoV-2 Sequence - +
@@ -97,7 +99,7 @@

- +

@@ -105,6 +107,7 @@
+
{% for record in fields %} -- cgit v1.2.3 From 16f2febb3a2efdeb7a8313d5ed83761fb9b5e9fd Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Fri, 15 May 2020 08:41:02 -0500 Subject: Template: amended FASTQ/BAM info --- bh20simplewebuploader/templates/form.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bh20simplewebuploader/templates/form.html b/bh20simplewebuploader/templates/form.html index 5e6aa3e..50947c2 100644 --- a/bh20simplewebuploader/templates/form.html +++ b/bh20simplewebuploader/templates/form.html @@ -78,7 +78,7 @@ Upload SARS-CoV-2 Sequence - +

-- cgit v1.2.3 From d457e1ae9da7330aa0d7a1ad265ca6886691309e Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Fri, 15 May 2020 08:49:00 -0500 Subject: Template: spelling --- bh20simplewebuploader/templates/form.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bh20simplewebuploader/templates/form.html b/bh20simplewebuploader/templates/form.html index 50947c2..cdb7cf7 100644 --- a/bh20simplewebuploader/templates/form.html +++ b/bh20simplewebuploader/templates/form.html @@ -24,7 +24,7 @@ - +
-- cgit v1.2.3 From ab1285303f1867d9e2e9481dbd3311921a4daad2 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Fri, 15 May 2020 09:01:53 -0500 Subject: Template: a little indentation helps --- bh20simplewebuploader/templates/form.html | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/bh20simplewebuploader/templates/form.html b/bh20simplewebuploader/templates/form.html index cdb7cf7..06c5efb 100644 --- a/bh20simplewebuploader/templates/form.html +++ b/bh20simplewebuploader/templates/form.html @@ -21,9 +21,9 @@

[Demo] Display content sequences by:

- + - +
@@ -116,35 +116,35 @@ {% if loop.index > 1 and 2 < 3 %}
{% endif %} -
+

{{ record['heading'] }}

- {% else %} + {% else %}
{% if record['type'] == 'select' %} - + {% for option in record['options'] %} - + {% endfor %} - - {% else %} - + + {% else %} + {% endif %}
{% if record['list'] %} - - + + {% endif %}
{% endif %} -- cgit v1.2.3 From 2c5d48abae99f1114ce4b4f3ed7e81b594394886 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Fri, 15 May 2020 09:04:17 -0500 Subject: Template: comment --- bh20simplewebuploader/templates/form.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bh20simplewebuploader/templates/form.html b/bh20simplewebuploader/templates/form.html index 06c5efb..6196624 100644 --- a/bh20simplewebuploader/templates/form.html +++ b/bh20simplewebuploader/templates/form.html @@ -138,7 +138,7 @@ {% endfor %} - {% else %} + {% else %} {% endif %}
-- cgit v1.2.3 From b2d1de098117944531896297c16cc9365204fb54 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Fri, 15 May 2020 09:26:34 -0500 Subject: Template: prefill some form fields --- bh20simplewebuploader/templates/form.html | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/bh20simplewebuploader/templates/form.html b/bh20simplewebuploader/templates/form.html index 6196624..f9b1ecf 100644 --- a/bh20simplewebuploader/templates/form.html +++ b/bh20simplewebuploader/templates/form.html @@ -139,7 +139,16 @@ {% endfor %} {% else %} - + {% endif %}
{% if record['list'] %} -- cgit v1.2.3 From dee0caa3162420a67b39db92f81f762048cb7ad0 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Fri, 15 May 2020 10:00:26 -0500 Subject: Change submit button on click --- bh20simplewebuploader/main.py | 43 ++++++++++++++++--------------- bh20simplewebuploader/static/main.js | 31 +++++++++++++--------- bh20simplewebuploader/templates/form.html | 2 +- 3 files changed, 42 insertions(+), 34 deletions(-) diff --git a/bh20simplewebuploader/main.py b/bh20simplewebuploader/main.py index e80713f..f4eabe6 100644 --- a/bh20simplewebuploader/main.py +++ b/bh20simplewebuploader/main.py @@ -48,10 +48,10 @@ def name_to_label(field_name): """ Turn a filed name like "host_health_status" from the metadata schema into a human-readable label. """ - + # May end in a number, which should be set off by a space set_off_number = re.sub('([0-9]+)$', r' \1', field_name) - + return string.capwords(set_off_number.replace('_', ' ')) def is_iri(string): @@ -72,13 +72,13 @@ def generate_form(schema, options): Each dict either has a 'heading' (in which case we put a heading for a form section in the template) or an 'id', 'label', 'type', and 'required' (in which case we make a form field in the template). - + Non-heading dicts with type 'select' will have an 'options' field, with a list of (name, value) tuples, and represent a form dropdown element. - + Non-heading dicts with type 'number' may have a 'step', which, if <1 or 'any', allows the number to be a float. - + Non-heading dicts may have a human-readable 'docstring' field describing them. @@ -125,7 +125,7 @@ def generate_form(schema, options): docstring = None if not isinstance(field_type, str): # If the type isn't a string - + # It may have documentation docstring = field_type.get('doc', None) @@ -159,7 +159,7 @@ def generate_form(schema, options): optional = True # Drop the ? field_type = field_type[:-1] - + # Decide if the field is a list (type ends in []) is_list = False if field_type.endswith('[]'): @@ -280,6 +280,7 @@ def receive_files(): Receive the uploaded files. """ + return 0 # We're going to work in one directory per request dest_dir = tempfile.mkdtemp() # The uploader will happily accept a FASTQ with this name @@ -310,7 +311,7 @@ def receive_files(): elif request.form.get('metadata_type', None) == 'fill': # Build a metadata dict metadata = {} - + # When we have metadata for an item, use this to set it. # If it is an item in a list, set is_list=True def set_metadata(item_id, value, is_list=False): @@ -324,7 +325,7 @@ def receive_files(): if parent not in dest_dict: dest_dict[parent] = {} dest_dict = dest_dict[parent] - + if not is_list: dest_dict[key] = value else: @@ -336,22 +337,22 @@ def receive_files(): # Pull all the field values we wanted from the form if 'heading' in item: continue - + if item['list']: # This is a list, serialized into form fields - + # We count how many values we got value_count = 0 - + for index in itertools.count(): # Get [0] through [n], until something isn't there. entry_id = '{}[{}]'.format(item['id'], index) - + if index == 1000: # Don't let them provide too much stuff. return (render_template('error.html', error_message="You provided an extremely large number of values for the metadata item {}".format(item['id'])), 403) - + if entry_id in request.form: if len(request.form[entry_id]) > 0: # Put an entry in the list @@ -371,7 +372,7 @@ def receive_files(): else: # We have run out of form fields for this list. break - + if item['required'] and value_count == 0: # They forgot a required item. Maybe all entries were empty. return (render_template('error.html', @@ -450,7 +451,7 @@ def getDetailsForSeq(): @app.route('/api/getSEQCountbytech', methods=['GET']) def getSEQCountbytech(): - query="""SELECT ?tech ?tech_label (count(?fasta) as ?fastaCount) WHERE + query="""SELECT ?tech ?tech_label (count(?fasta) as ?fastaCount) WHERE {?fasta ?x [ ?tech] . OPTIONAL {?tech ?tech_tmp_label } . BIND(IF(BOUND(?tech_tmp_label), ?tech_tmp_label,?tech) as ?tech_label)} @@ -466,8 +467,8 @@ def getSEQCountbytech(): ## Is this one really necessary or should we just use getSEQCountbytech instead? @app.route('/api/getAvailableTech', methods=['GET']) def getAvailableTech(): - query="""SELECT distinct ?tech ?tech_label WHERE - {?fasta ?x [ ?tech] + query="""SELECT distinct ?tech ?tech_label WHERE + {?fasta ?x [ ?tech] BIND (concat(?tech,"_label") as ?tech_label) } """ payload = {'query': query, 'format': 'json'} @@ -479,7 +480,7 @@ def getAvailableTech(): ## Has to be encoded again so should be --> http%3A%2F%2Fpurl.obolibrary.org%2Fobo%2FOBI_0000759 @app.route('/api/getSEQbytech', methods=['GET']) def getSEQbytech(): - query="""SELECT ?fasta WHERE + query="""SELECT ?fasta WHERE {?fasta ?x [ ] } """ tech = request.args.get('tech') @@ -565,7 +566,7 @@ def getSEQCountbyHostHealthStatus(): @app.route('/api/getSEQbyLocationAndTech', methods=['GET']) def getSEQbyLocationAndTech(): - query="""SELECT ?fasta WHERE { ?fasta ?x [ + query="""SELECT ?fasta WHERE { ?fasta ?x [ ; ]}""" location=request.args.get('location') tech=request.args.get('tech') @@ -582,7 +583,7 @@ def getSEQbyLocationAndTech(): # Example specimen http%3A%2F%2Fpurl.obolibrary.org%2Fobo%2FNCIT_C155831 @app.route('/api/getSEQbyLocationAndSpecimenSource', methods=['GET']) def getSEQbyLocationAndSpecimenSource(): - query="""SELECT ?fasta WHERE { ?fasta ?x [ + query="""SELECT ?fasta WHERE { ?fasta ?x [ ; ]} """ location = request.args.get('location') diff --git a/bh20simplewebuploader/static/main.js b/bh20simplewebuploader/static/main.js index 56213fa..7084e1f 100644 --- a/bh20simplewebuploader/static/main.js +++ b/bh20simplewebuploader/static/main.js @@ -49,7 +49,7 @@ let fetchAllaccessions = () => { let uploadForm = document.getElementById('metadata_upload_form') let uploadFormSpot = document.getElementById('metadata_upload_form_spot') let fillForm = document.getElementById('metadata_fill_form') -let fillFormSpot = document.getElementById('metadata_fill_form_spot') +let fillFormSpot = document.getElementById('metadata_fill_form_spot') function setUploadMode() { // Make the upload form the one in use. @@ -91,20 +91,20 @@ setMode() function addField(e) { // Find our parent field-group div let fieldGroup = this.parentElement - + // Get its keypath let keypath = fieldGroup.dataset.keypath - + // Find its last field child let existingFields = fieldGroup.getElementsByClassName('field') let templateField = existingFields[existingFields.length - 1] - + // Get its number let fieldNumber = templateField.dataset.number - + // Duplicate it let newField = templateField.cloneNode(true) - + // Increment the number and use the keypath and number to set IDs and cross // references. // TODO: Heavily dependent on the form field HTML. Maybe we want custom @@ -117,13 +117,13 @@ function addField(e) { newControl.setAttribute('name', newID) let newLabel = newField.getElementsByTagName('label')[0] newLabel.setAttribute('for', newID) - + // Find the minus button let minusButton = fieldGroup.getElementsByClassName('remove-field')[0] - + // Put new field as a child before the minus button fieldGroup.insertBefore(newField, minusButton) - + // Enable the minus button minusButton.classList.remove('invisible') } @@ -134,16 +134,16 @@ function addField(e) { function removeField(e) { // Find our parent field-group div let fieldGroup = this.parentElement - + // Find its field children let existingFields = fieldGroup.getElementsByClassName('field') - + if (existingFields.length > 1) { // There is a last field we can safely remove. let lastField = existingFields[existingFields.length - 1] fieldGroup.removeChild(lastField) } - + if (existingFields.length <= 1) { // Collection auto-updates. Now there's only one element. Don't let the // user remove it. If they don't want it, they can leave it empty. @@ -159,3 +159,10 @@ for (let button of document.getElementsByClassName('remove-field')) { button.addEventListener('click', removeField) } +// Change the submit button after hitting + +function on_submit_button() { + var elem = document.getElementById("submit"); + elem.value = "Submitting..."; + elem.disabled = true; +} diff --git a/bh20simplewebuploader/templates/form.html b/bh20simplewebuploader/templates/form.html index f9b1ecf..37a7b72 100644 --- a/bh20simplewebuploader/templates/form.html +++ b/bh20simplewebuploader/templates/form.html @@ -165,7 +165,7 @@ - +
-- cgit v1.2.3