diff options
author | Frederick Muriuki Muriithi | 2024-09-06 16:38:04 -0500 |
---|---|---|
committer | Frederick Muriuki Muriithi | 2024-09-06 16:38:04 -0500 |
commit | b74911f15a9f9a9ff3cca0e25fcd761bf41652b5 (patch) | |
tree | 9f17ca43a8da7e7bcaf7a2990f32e5e792d629be | |
parent | e13a694540ee65f401652d9ebdb5f845c15fb97e (diff) | |
download | gn-uploader-b74911f15a9f9a9ff3cca0e25fcd761bf41652b5.tar.gz |
Add more fields when creating a population
Add more of the missing fields when creating a population, to ensure
that the created population works as expected.
-rw-r--r-- | uploader/population/models.py | 26 | ||||
-rw-r--r-- | uploader/population/views.py | 17 | ||||
-rw-r--r-- | uploader/templates/populations/create-population.html | 89 | ||||
-rw-r--r-- | uploader/templates/populations/view-population.html | 13 |
4 files changed, 137 insertions, 8 deletions
diff --git a/uploader/population/models.py b/uploader/population/models.py index 4485e52..782bc9f 100644 --- a/uploader/population/models.py +++ b/uploader/population/models.py @@ -26,21 +26,43 @@ def populations_by_species(conn: mdb.Connection, speciesid) -> tuple: return tuple() + +def population_families(conn) -> tuple: + """Fetch the families under which populations are grouped.""" + with conn.cursor(cursorclass=DictCursor) as cursor: + cursor.execute( + "SELECT DISTINCT(Family) FROM InbredSet WHERE Family IS NOT NULL") + return tuple(row["Family"] for row in cursor.fetchall()) + + +def population_genetic_types(conn) -> tuple: + """Fetch the families under which populations are grouped.""" + with conn.cursor(cursorclass=DictCursor) as cursor: + cursor.execute( + "SELECT DISTINCT(GeneticType) FROM InbredSet WHERE GeneticType IS " + "NOT NULL") + return tuple(row["GeneticType"] for row in cursor.fetchall()) + + def save_population(conn: mdb.Connection, population_details: dict) -> dict: """Save the population details to the db.""" with conn.cursor(cursorclass=DictCursor) as cursor: + #TODO: Handle FamilyOrder here cursor.execute( "INSERT INTO InbredSet(" "InbredSetId, InbredSetName, Name, SpeciesId, FullName, " - "MenuOrderId, Description" + "public, MappingMethodId, GeneticType, Family, MenuOrderId, " + "InbredSetCode, Description" ") " "VALUES (" "%(InbredSetId)s, %(InbredSetName)s, %(Name)s, %(SpeciesId)s, " - "%(FullName)s, %(MenuOrderId)s, %(Description)s" + "%(FullName)s, %(public)s, %(MappingMethodId)s, %(GeneticType)s, " + "%(Family)s, %(MenuOrderId)s, %(InbredSetCode)s, %(Description)s" ")", { "MenuOrderId": 0, "InbredSetId": 0, + "public": 2, **population_details }) new_id = cursor.lastrowid diff --git a/uploader/population/views.py b/uploader/population/views.py index 84dffdb..5be19ae 100644 --- a/uploader/population/views.py +++ b/uploader/population/views.py @@ -18,7 +18,9 @@ from uploader.species.models import (all_species, order_species_by_family) from .models import (save_population, + population_families, populations_by_species, + population_genetic_types, population_by_species_and_id) __active_link__ = "populations" @@ -100,6 +102,14 @@ def create_population(species_id: int): return render_template( "populations/create-population.html", species=species, + families = population_families(conn), + genetic_types = population_genetic_types(conn), + mapping_methods=( + {"id": "0", "value": "No mapping support"}, + {"id": "1", "value": "GEMMA, QTLReaper, R/qtl"}, + {"id": "2", "value": "GEMMA"}, + {"id": "3", "value": "R/qtl"}, + {"id": "4", "value": "GEMMA, PLINK"}), activelink="create-population", **error_values) @@ -142,8 +152,11 @@ def create_population(species_id: int): "Name": population_name, "InbredSetName": population_fullname, "FullName": population_fullname, - "Family": request.form.get("inbredset_family") or None, - "Description": request.form.get("population_description") or None + "InbredSetCode": request.form.get("population_code") or None, + "Description": request.form.get("population_description") or None, + "Family": request.form.get("population_family") or None, + "MappingMethodId": request.form.get("population_mapping_method_id"), + "GeneticType": request.form.get("population_genetic_type") or None }) return redirect(url_for("species.populations.view_population", diff --git a/uploader/templates/populations/create-population.html b/uploader/templates/populations/create-population.html index 6a96148..12811fd 100644 --- a/uploader/templates/populations/create-population.html +++ b/uploader/templates/populations/create-population.html @@ -88,8 +88,7 @@ <p> This is a short representative, but constrained name for your population. - </p> - <p> + <br /> The field will only accept letters ('A-Za-z'), numbers (0-9), hyphens and underscores. Any other character will cause the name to be rejected. @@ -97,6 +96,20 @@ </small> </div> + <div class="form-group"> + <label for="txt-population-code" class="form-label">Population Code</label> + <input type="text" + id="txt-population-code" + name="population_code" + maxLength="5" + minLength="3" + value="{{error_values.population_code or ''}}" + class="form-control" /> + <small class="form-text text-muted"> + … document what this field is for … + </small> + </div> + <div {%if errors.population_description%} class="form-group has-error" {%else%} @@ -119,14 +132,82 @@ This is a more detailed description for your population. This is useful to communicate with other researchers some details regarding your population, and what its about. - </p> - <p> + <br /> Put, here, anything that describes your population but does not go cleanly under metadata. </p> </small> </div> + <div {%if errors.population_family%} + class="form-group has-error" + {%else%} + class="form-group" + {%endif%}> + <label for="select-population-family" class="form-label">Family</label> + <select id="select-population-family" + name="population_family" + class="form-control" + required="required"> + <option value="">Please select a family</option> + {%for family in families%} + <option value="{{family}}" + {%if error_values.population_family == family%} + selected="selected" + {%endif%}>{{family}}</option> + {%endfor%} + </select> + <small class="form-text text-muted"> + <p>… provide some documentation on what this field does …</p> + </small> + </div> + + <div {%if errors.population_mapping_method_id%} + class="form-group has-error" + {%else%} + class="form-group" + {%endif%}> + <label for="select-population-mapping-methods" + class="form-label">Mapping Methods</label> + + <select id="select-population-mapping-methods" + name="population_mapping_method_id" + class="form-control" + required="required"> + <option value="">Select appropriate mapping methods</option> + {%for mmethod in mapping_methods%} + <option value="{{mmethod.id}}" + {%if error_values.population_mapping_method_id == mmethod.id%} + selected="selected" + {%endif%}>{{mmethod.value}}</option> + {%endfor%} + </select> + + <small class="form-text text-muted"> + <p>Select the mapping methods that your population will support.</p> + </small> + </div> + + <div {%if errors.population_genetic_type%} + class="form-group has-error" + {%else%} + class="form-group" + {%endif%}> + <label for="select-population-genetic-type" + class="form-label">Genetic Type</label> + <select id="select-population-genetic-type" + name="population_genetic_type" + class="form-control"> + <option value="">Select proper genetic type</option> + {%for gtype in genetic_types%} + <option value="{{gtype}}" + {%if error_values.population_genetic_type == gtype%} + selected="selected" + {%endif%}>{{gtype}}</option> + {%endfor%} + </select> + </div> + <div class="form-group"> <input type="submit" value="create population" diff --git a/uploader/templates/populations/view-population.html b/uploader/templates/populations/view-population.html index 7eb1362..3ae76ab 100644 --- a/uploader/templates/populations/view-population.html +++ b/uploader/templates/populations/view-population.html @@ -29,12 +29,25 @@ <dt>FullName</dt> <dd>{{population.FullName}}</dd> + <dt>Code</dt> + <dd>{{population.InbredSetCode}}</dd> + + <dt>Genetic Type</dt> + <dd>{{population.GeneticType}}</dd> + + <dt>Family</dt> + <dd>{{population.Family}}</dd> + <dt>Description</dt> <dd><pre>{{population.Description or "-"}}</pre></dd> </dl> </div> <div class="row"> + … maybe provide a way to organise populations in the same family here … +</div> + +<div class="row"> <h3>Actions</h3> <p> |