aboutsummaryrefslogtreecommitdiff
path: root/qc_app/dbinsert.py
blob: 0733e5f2430cb655f3ddb4b1bd32519db744cbde (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"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")