"Handle inserting data into the database" import os import json from functools import reduce import requests from redis import Redis from flask import request, Blueprint, render_template, current_app as app from . import jobs dbinsertbp = Blueprint("dbinsert", __name__) def render_error(error_msg): "Render the generic error page" return render_template("dbupdate_error.html", error_message=error_msg), 400 def make_menu_items_grouper(grouping_fn=lambda item: item): "Build function to be used to group menu items." def __grouper__(acc, row): grouping = grouping_fn(row[2]) row_values = (row[0].strip(), row[1].strip()) if acc.get(grouping) is None: return {**acc, grouping: (row_values,)} return {**acc, grouping: (acc[grouping] + (row_values,))} return __grouper__ @dbinsertbp.route("/select-dataset", methods=["POST"]) def select_dataset(): "Select the dataset to add the file contents against" job_id = request.form["job_id"] with Redis.from_url(app.config["REDIS_URL"], decode_responses=True) as rconn: job = jobs.job(rconn, job_id) if job: filename = job["filename"] filepath = f"{app.config['UPLOAD_FOLDER']}/{filename}" if os.path.exists(filepath): req = requests.get( "https://genenetwork.org/api3/api/menu/generate/json") menu_contents = req.json() default_species = "mouse" mouse_groups = reduce( make_menu_items_grouper( lambda item: item.strip()[7:].strip()), menu_contents["groups"][default_species], {}) default_group = "BXD" group_types = reduce( make_menu_items_grouper(), menu_contents["types"][default_species][default_group], {}) default_type = group_types[tuple(group_types)[0]][0][0] datasets = menu_contents[ "datasets"][default_species][default_group][ default_type] return render_template( "select_dataset.html", job_id=job_id, job_name=filename, species=menu_contents["species"], default_species=default_species, groups=mouse_groups, types=group_types, datasets=datasets, menu_contents=json.dumps(menu_contents)) return render_error(f"File '{filename}' no longer exists.") return render_error(f"Job '{job_id}' no longer exists.") return render_error("Unknown error")