about summary refs log tree commit diff
path: root/gn_auth/auth/authorisation/data/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'gn_auth/auth/authorisation/data/views.py')
-rw-r--r--gn_auth/auth/authorisation/data/views.py62
1 files changed, 40 insertions, 22 deletions
diff --git a/gn_auth/auth/authorisation/data/views.py b/gn_auth/auth/authorisation/data/views.py
index 83f4e4b..4bf6746 100644
--- a/gn_auth/auth/authorisation/data/views.py
+++ b/gn_auth/auth/authorisation/data/views.py
@@ -11,14 +11,17 @@ from MySQLdb.cursors import DictCursor
 from authlib.integrations.flask_oauth2.errors import _HTTPException
 from flask import request, jsonify, Response, Blueprint, current_app as app
 
+
+from gn_libs import mysqldb as gn3db
+
 from gn_auth import jobs
 from gn_auth.commands import run_async_cmd
 
+from gn_auth.auth.requests import request_json
 from gn_auth.auth.errors import InvalidData, NotFoundError
 from gn_auth.auth.authorisation.resources.groups.models import group_by_id
 
 from ...db import sqlite3 as db
-from ...db import mariadb as gn3db
 from ...db.sqlite3 import with_db_connection
 
 from ..checks import require_json
@@ -32,11 +35,12 @@ from ..resources.models import (
 from ...authentication.users import User
 from ...authentication.oauth2.resource_server import require_oauth
 
-from ..data.phenotypes import link_phenotype_data
-from ..data.mrna import link_mrna_data, ungrouped_mrna_data
-from ..data.genotypes import link_genotype_data, ungrouped_genotype_data
+from .mrna import link_mrna_data, ungrouped_mrna_data
+from .genotypes import link_genotype_data, ungrouped_genotype_data
+from .phenotypes import phenosbp, link_phenotype_data, pheno_traits_from_db
 
 data = Blueprint("data", __name__)
+data.register_blueprint(phenosbp, url_prefix="/phenotypes")
 
 def build_trait_name(trait_fullname):
     """
@@ -184,18 +188,18 @@ def __search_mrna__():
         return jsonify(with_db_connection(__ungrouped__))
 
 def __request_key__(key: str, default: Any = ""):
-    if bool(request.json):
-        return request.json.get(#type: ignore[union-attr]
-            key, request.args.get(key, request.form.get(key, default)))
-    return request.args.get(key, request.form.get(key, default))
+    if bool(request_json()):
+        return request_json().get(#type: ignore[union-attr]
+            key, request.args.get(key, default))
+    return request.args.get(key, request_json().get(key, default))
 
 def __request_key_list__(key: str, default: tuple[Any, ...] = tuple()):
-    if bool(request.json):
-        return (request.json.get(key,[])#type: ignore[union-attr]
-                or request.args.getlist(key) or request.form.getlist(key)
+    if bool(request_json()):
+        return (request_json().get(key,[])#type: ignore[union-attr]
+                or request.args.getlist(key) or request_json().get(key)
                 or list(default))
     return (request.args.getlist(key)
-            or request.form.getlist(key) or list(default))
+            or request_json().get(key) or list(default))
 
 def __search_genotypes__():
     query = __request_key__("query", "")
@@ -240,7 +244,7 @@ def __search_phenotypes__():
 @require_oauth("profile group resource")
 def search_unlinked_data():
     """Search for various unlinked data."""
-    dataset_type = request.json["dataset_type"]
+    dataset_type = request_json()["dataset_type"]
     search_fns = {
         "mrna": __search_mrna__,
         "genotype": __search_genotypes__,
@@ -281,7 +285,7 @@ def link_genotypes() -> Response:
         return link_genotype_data(conn, group_by_id(conn, group_id), datasets)
 
     return jsonify(with_db_connection(
-        partial(__link__, **__values__(request.json))))
+        partial(__link__, **__values__(request_json()))))
 
 @data.route("/link/mrna", methods=["POST"])
 def link_mrna() -> Response:
@@ -306,9 +310,10 @@ def link_mrna() -> Response:
         return link_mrna_data(conn, group_by_id(conn, group_id), datasets)
 
     return jsonify(with_db_connection(
-        partial(__link__, **__values__(request.json))))
+        partial(__link__, **__values__(request_json()))))
 
 @data.route("/link/phenotype", methods=["POST"])
+@require_oauth("profile group resource")
 def link_phenotype() -> Response:
     """Link phenotype data to group."""
     def __values__(form):
@@ -324,14 +329,27 @@ def link_phenotype() -> Response:
             raise InvalidData("Expected at least one dataset to be provided.")
         return {
             "group_id": uuid.UUID(form["group_id"]),
-            "traits": form["selected"]
+            "traits": form["selected"],
+            "using_raw_ids": bool(form.get("using-raw-ids") == "on")
         }
 
-    with gn3db.database_connection(app.config["SQL_URI"]) as gn3conn:
-        def __link__(conn: db.DbConnection, group_id: uuid.UUID,
-                     traits: tuple[dict, ...]) -> dict:
-            return link_phenotype_data(
-                conn, gn3conn, group_by_id(conn, group_id), traits)
+    with (require_oauth.acquire("profile group resource") as token,
+          gn3db.database_connection(app.config["SQL_URI"]) as gn3conn):
+        def __link__(
+                conn: db.DbConnection,
+                group_id: uuid.UUID,
+                traits: tuple[dict, ...],
+                using_raw_ids: bool = False
+        ) -> dict:
+            if using_raw_ids:
+                return link_phenotype_data(conn,
+                                           token.user,
+                                           group_by_id(conn, group_id),
+                                           traits)
+            return link_phenotype_data(conn,
+                                       token.user,
+                                       group_by_id(conn, group_id),
+                                       pheno_traits_from_db(gn3conn, traits))
 
         return jsonify(with_db_connection(
-            partial(__link__, **__values__(request.json))))
+            partial(__link__, **__values__(request_json()))))