about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2023-05-15 13:57:45 +0300
committerFrederick Muriuki Muriithi2023-05-15 13:57:45 +0300
commitd5763a88090f57febb58fdae0cbfb24c76ffed6c (patch)
treefaa5e501f2f6425632252afb3cced368c7328911
parent3d773719255109f3bdcc4adc6314bdafae18ad14 (diff)
downloadgenenetwork2-d5763a88090f57febb58fdae0cbfb24c76ffed6c.tar.gz
Create new collection via GN3 API
* wqflask/wqflask/collect.py: Send data to the GN3 API to create the
  new collections.
* wqflask/wqflask/oauth2/client.py: Ensure request is sent as a json
  request.
* wqflask/wqflask/static/new/javascript/search_results.js: use "POST"
  rather than "GET" and send the traits also, in addition to the hash
-rw-r--r--wqflask/wqflask/collect.py59
-rw-r--r--wqflask/wqflask/oauth2/client.py14
-rw-r--r--wqflask/wqflask/static/new/javascript/search_results.js6
3 files changed, 59 insertions, 20 deletions
diff --git a/wqflask/wqflask/collect.py b/wqflask/wqflask/collect.py
index 5ff114b2..b6ca6015 100644
--- a/wqflask/wqflask/collect.py
+++ b/wqflask/wqflask/collect.py
@@ -26,7 +26,7 @@ from base.data_set import create_dataset
 from wqflask.oauth2 import session
 from wqflask.oauth2.checks import user_logged_in
 from wqflask.oauth2.request_utils import process_error
-from wqflask.oauth2.client import oauth2_get, no_token_get
+from wqflask.oauth2.client import oauth2_get, no_token_get, no_token_post
 
 
 Redis = get_redis_conn()
@@ -45,7 +45,7 @@ def process_traits(unprocessed_traits):
             assert the_hmac == hmac.hmac_creation(data), "Data tampering?"
         traits.add(str(data))
 
-    return traits
+    return tuple(traits)
 
 
 def report_change(len_before, len_now):
@@ -67,28 +67,32 @@ def store_traits_list():
     return hash
 
 
-@app.route("/collections/add")
+@app.route("/collections/add", methods=["POST"])
 def collections_add():
-
+    traits = request.args.get("traits", request.form.get("traits"))
+    the_hash = request.args.get("hash", request.form.get("hash"))
     collections = g.user_session.user_collections
     if len(collections) < 1:
         collection_name = "Your Default Collection"
         uc_id = g.user_session.add_collection(collection_name, set())
         collections = g.user_session.user_collections
 
-    if 'traits' in request.args:
-        traits = request.args['traits']
+    if bool(traits):
         return render_template("collections/add.html",
                                traits=traits,
-                               collections=collections,
-                               )
+                               collections=collections)
     else:
-        hash = request.args['hash']
         return render_template("collections/add.html",
-                               hash=hash,
-                               collections=collections,
-                               )
+                               hash=the_hash,
+                               collections=collections)
 
+def __compute_traits__(params):
+    if "hash" in params:
+        unprocessed_traits = Redis.get(params['hash']) or ""
+        Redis.delete(params['hash'])
+    else:
+        unprocessed_traits = params['traits']
+    return process_traits(unprocessed_traits)
 
 @app.route("/collections/new")
 def collections_new():
@@ -97,10 +101,31 @@ def collections_new():
     if "sign_in" in params:
         return redirect(url_for('login'))
     if "create_new" in params:
-        collection_name = params['new_collection']
-        if collection_name.strip() == "":
-            collection_name = datetime.datetime.utcnow().strftime('Collection_%b_%d_%H:%M')
-        return create_new(collection_name)
+        collection_name = (
+            params.get("new_collection", "").strip() or
+            datetime.datetime.utcnow().strftime('Collection_%b_%d_%H:%M'))
+        from wqflask.oauth2.session import session_info
+        request_data = {
+            "uri_path": "oauth2/user/collections/new",
+            "json": {
+                "name": collection_name,
+                "anon_id": str(session_info()["anon_id"]),
+                "traits": __compute_traits__(params),
+                "hash": params.get("hash", False)
+            }}
+        if user_logged_in():
+            resp =  oauth2_post(**request_data)
+        else:
+            resp = no_token_post(**request_data)
+        #return create_new(collection_name)
+        def __error__(err):
+            error = process_error(err)
+            flash(f"{error['error']}: {error['error_description']}",
+                  "alert-danger")
+            return redirect("/")
+        def __view_collection__(collection):
+            return redirect(url_for("view_collection", uc_id=collection["id"]))
+        return resp.either(__error__, __view_collection__)
     elif "add_to_existing" in params:
         if 'existing_collection' not in params:
             collections = g.user_session.user_collections
@@ -147,7 +172,7 @@ def list_collections():
     params = request.args
     anon_id = session.session_info()["anon_id"]
     anon_collections = no_token_get(
-        f"oauth2/user/{anon_id}/collections/list").either(
+        f"oauth2/user/collections/{anon_id}/list").either(
             lambda err: {"anon_collections_error": process_error(err)},
             lambda colls: {"anon_collections": colls})
 
diff --git a/wqflask/wqflask/oauth2/client.py b/wqflask/wqflask/oauth2/client.py
index b070e0bc..664387a9 100644
--- a/wqflask/wqflask/oauth2/client.py
+++ b/wqflask/wqflask/oauth2/client.py
@@ -76,15 +76,25 @@ def no_token_get(uri_path: str, **kwargs) -> Either:
         return Right(resp.json())
     return Left(resp)
 
-def no_token_post(uri_path: str, data: dict[str, Any]) -> Either:
+def no_token_post(uri_path: str, **kwargs) -> Either:
     config = app.config
+    data = kwargs.get("data", {})
+    the_json = kwargs.get("json", {})
     request_data = {
         **data,
+        **the_json,
         "client_id": config["OAUTH2_CLIENT_ID"],
         "client_secret": config["OAUTH2_CLIENT_SECRET"]
     }
+    new_kwargs = {
+        **{
+            key: value for key, value in kwargs.items()
+            if key not in ("data", "json")
+        },
+        ("data" if bool(data) else "json"): request_data
+    }
     resp = requests.post(urljoin(config["GN_SERVER_URL"], uri_path),
-                         data=request_data, json=request_data)
+                         **new_kwargs)
     if resp.status_code == 200:
         return Right(resp.json())
     return Left(resp)
diff --git a/wqflask/wqflask/static/new/javascript/search_results.js b/wqflask/wqflask/static/new/javascript/search_results.js
index 921c6862..c263ef49 100644
--- a/wqflask/wqflask/static/new/javascript/search_results.js
+++ b/wqflask/wqflask/static/new/javascript/search_results.js
@@ -190,7 +190,11 @@ $(function() {
     });
 
     return $.colorbox({
-      href: "/collections/add?hash=" + traits_hash
+	href: "/collections/add",
+	data: {
+	    "traits": traits.toString(),
+	    "hash": traits_hash
+	}
     });
 
   };