about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--bh20sequploader/bh20seq-options.yml1
-rw-r--r--bh20simplewebuploader/main.py33
-rw-r--r--bh20simplewebuploader/templates/form.html2
3 files changed, 28 insertions, 8 deletions
diff --git a/bh20sequploader/bh20seq-options.yml b/bh20sequploader/bh20seq-options.yml
index 68f6e79..4c1d15c 100644
--- a/bh20sequploader/bh20seq-options.yml
+++ b/bh20sequploader/bh20seq-options.yml
@@ -13,6 +13,7 @@ host_age_unit:
 host_sex:
   Male: http://purl.obolibrary.org/obo/PATO_0000384
   Female: http://purl.obolibrary.org/obo/PATO_0000383
+  Intersex: http://purl.obolibrary.org/obo/PATO_0001340
 
 host_health_status:
   healthy: http://purl.obolibrary.org/obo/NCIT_C115935
diff --git a/bh20simplewebuploader/main.py b/bh20simplewebuploader/main.py
index 8c5c18c..ceab8a6 100644
--- a/bh20simplewebuploader/main.py
+++ b/bh20simplewebuploader/main.py
@@ -46,8 +46,11 @@ def name_to_label(field_name):
     """
     Turn a filed name like "host_health_status" from the metadata schema into a human-readable label.
     """
-
-    return string.capwords(field_name.replace('_', ' '))
+    
+    # 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):
     """
@@ -66,10 +69,16 @@ 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 may
-    have a human-readable 'docstring' field describing them.
+    (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.
 
     Takes the deserialized metadata schema YAML, and also a deserialized YAML
     of option values. The option values are keyed on (unscoped) field name in
@@ -174,9 +183,19 @@ def generate_form(schema, options):
                         # Make a tuple for each one
                         record['options'].append((name, value))
                 elif field_type == 'string':
-                    record['type'] = 'text' # HTML input type
+                    if field_name.endswith('date'):
+                        # Use a date picker to generate a good string.
+                        # Comes back YYYY-MM-DD.
+                        record['type'] = 'date'
+                    else:
+                        # Normal text string
+                        record['type'] = 'text'
                 elif field_type == 'int':
                     record['type'] = 'number'
+                elif field_type == 'float':
+                    record['type'] = 'number'
+                    # Choose a reasonable precision for the control
+                    record['step'] = '0.0001'
                 else:
                     raise NotImplementedError('Unimplemented field type {} in {} in metadata schema'.format(field_type, type_name))
                 yield record
diff --git a/bh20simplewebuploader/templates/form.html b/bh20simplewebuploader/templates/form.html
index 6993cf5..02ae84d 100644
--- a/bh20simplewebuploader/templates/form.html
+++ b/bh20simplewebuploader/templates/form.html
@@ -238,7 +238,7 @@
                             {% endfor %}
                         </select>
                         {% else %}
-                        <input type="{{ record['type'] }}" id="{{ record['id'] }}" name="{{ record['id'] }}" {{ "required" if record['required'] else "" }}>
+                        <input type="{{ record['type'] }}" id="{{ record['id'] }}" name="{{ record['id'] }}" {{ "required" if record['required'] else "" }} {{ ("step=" + record['step']) if 'step' in record else ""}}>
                         {% endif %}
                         {% endif %}
                         {% if loop.index == loop.length %}