about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJohn Nduli2024-09-11 15:22:16 +0300
committerBonfaceKilz2024-09-11 16:56:35 +0300
commit82140bbb3384845ec71ad0f77c7b73c736baf767 (patch)
tree777ebcfb4e7e8f454e7d6221f35ef9efc79164c6
parent61c4b9a2cebe94db400c41c4a7bef4ab7f1b3a40 (diff)
downloadgenenetwork2-82140bbb3384845ec71ad0f77c7b73c736baf767.tar.gz
feat: async js loading for fahamu results
-rw-r--r--gn2/wqflask/templates/gsearch_gene.html19
-rw-r--r--gn2/wqflask/views.py112
2 files changed, 85 insertions, 46 deletions
diff --git a/gn2/wqflask/templates/gsearch_gene.html b/gn2/wqflask/templates/gsearch_gene.html
index ecb8de8f..091cc435 100644
--- a/gn2/wqflask/templates/gsearch_gene.html
+++ b/gn2/wqflask/templates/gsearch_gene.html
@@ -272,8 +272,9 @@
         });
         
     </script>
+    {% if do_ai_search %}
     <script type='text/javascript'>
-      function ai_content_div(search_term, search_result) {
+      function ai_content_div(search_term, search_result, search_uri) {
         return `
           <div class="col-sm-6">
             <div class="panel panel-info">
@@ -287,7 +288,7 @@
               <div id="ai_results" class="panel-collapse collapse" role="tabpanel" aria-labelledby="ai_heading">
                   <div class="panel-body">
                     <p>${ search_result }</p>
-                    <p><a class="btn btn-default" href="${search_term}" role="button">See References</a></p>
+                    <p><a class="btn btn-default" href="${ search_uri }" role="button">See References</a></p>
                   </div>
               </div>
             </div>
@@ -296,9 +297,19 @@
       }
 
       $(document).ready( function () {
-        let ai_div = ai_content_div("this is a test", "test contains some text");
-        $("#ai_result").append(ai_div);
+        $.ajax({url: "gnqna",
+          contentType: "application/json",
+          data: {
+            query: "{{ terms }}",
+            type: "xapian",
+          },
+          success: function(result) {
+            let ai_div = ai_content_div(result.search_term, result.search_result, result.search_url)
+            $("#ai_result").append(ai_div);
+          }
+        })
       })
 
     </script>
+    {% endif %}
 {% endblock %}
diff --git a/gn2/wqflask/views.py b/gn2/wqflask/views.py
index 6cc4f2a7..7e63f165 100644
--- a/gn2/wqflask/views.py
+++ b/gn2/wqflask/views.py
@@ -18,6 +18,7 @@ import sys
 import traceback
 import math
 import uuid
+import urllib.parse
 import xlsxwriter
 
 from functools import reduce
@@ -33,6 +34,7 @@ from gn2.wqflask import app
 
 from gn3.computations.gemma import generate_hash_of_string
 from flask import current_app
+from flask import jsonify
 from flask import g
 from flask import Response
 from flask import request
@@ -239,20 +241,17 @@ def search_page_table():
     return flask.jsonify(current_page)
 
 
-@app.route("/gsearch", methods=('GET',))
+@app.route("/gsearch", methods=("GET",))
 def gsearchact():
     result = GSearch(request.args).__dict__
-    search_type = request.args['type']
-    ai_result = None
-    if current_app.config.get("AI_SEARCH_ENABLED"):
-        ai_result = {
-               "search_term": "glioma human gtex_v8",
-               "search_result": "The Bama miniature pig has the same number of chromosomes as humans",
-               # we need to modify the search to use url params so that we can easily link
-               "search_url": "https://qa.genenetwork.org/gnqna"
-               }
+    search_type = request.args["type"]
+    is_user_logged_in = session_info().get("user", {}).get("logged_in", False)
+
+    do_ai_search = False
+    if current_app.config.get("AI_SEARCH_ENABLED") and is_user_logged_in:
+        do_ai_search = True
     if search_type == "gene":
-        return render_template("gsearch_gene.html", **result, ai_result=ai_result)
+        return render_template("gsearch_gene.html", **result, do_ai_search=do_ai_search, result=result)
     elif search_type == "phenotype":
         return render_template("gsearch_pheno.html", **result)
 
@@ -269,32 +268,57 @@ def gsearchtable():
 
     return flask.jsonify(current_page)
 
+def clean_xapian_query(query: str) -> str:
+    """ Remove filler words in xapian query
+    TODO: FIXME
+    """
+    return query
+
 
 @app.route("/gnqna", methods=["POST", "GET"])
 @require_oauth2
 def gnqna():
-    """ Main endpoint to call gn3 gnqna Api endpoint"""
+    """Main endpoint to call gn3 gnqna Api endpoint"""
+
     def _error_(resp):
-        return render_template("gnqa_errors.html",
-                               **{"status_code": resp.status_code,
-                                  **resp.json()})
+        return render_template(
+            "gnqa_errors.html", **{"status_code": resp.status_code, **resp.json()}
+        )
 
     def _success_(resp):
-        return render_template("gnqa_answer.html",
-                               **resp.json())
+        return render_template("gnqa_answer.html", **resp.json())
+
+    content_type = request.headers.get("Content-Type")
+    token = session_info()["user"]["token"].either(
+        lambda err: err, lambda tok: tok["access_token"]
+    )
+    if request.method == "GET":
+        query = request.args.get("query")
+        query_type = request.args.get("type")
+        if query_type == "xapian":
+            query = clean_xapian_query(query)
+        safe_query = urllib.parse.urlencode({"query": query})
+        search_result = requests.put(
+            urljoin(GN3_LOCAL_URL, f"/api/llm/search?{safe_query}"),
+            headers={"Authorization": f"Bearer {token}"},
+        )
+        search_result.raise_for_status()
+        search_result = search_result.json()
+        if content_type == "application/json":
+            ai_result = {
+                "search_term": query,
+                "search_result": search_result["answer"],
+                "search_url": f"/gnqna?{safe_query}",
+            }
+            return jsonify(ai_result)
+        return render_template("gnqa_answer.html", **search_result)
+
     if request.method == "POST":
-        token = session_info()["user"]["token"].either(
-            lambda err: err, lambda tok: tok["access_token"])
+        safe_query = urlib.parse.urlencode({"query": request.form.get("querygnqa")})
         return monad_requests.put(
-            urljoin(GN3_LOCAL_URL,
-                    f"/api/llm/search?query={request.form.get('querygnqa')}"),
-            headers={
-                "Authorization": f"Bearer {token}"
-            }
-        ).then(
-            lambda resp: resp
-        ).either(
-            _error_, _success_)
+            urljoin(GN3_LOCAL_URL, f"/api/llm/search?{safe_query}"),
+            headers={"Authorization": f"Bearer {token}"},
+        ).either(_error_, _success_)
     return render_template("gnqa.html")
 
 
@@ -1302,19 +1326,13 @@ def display_wiki_history(comment_id: str):
     entries = []
     try:
         entries = requests.get(
-            urljoin(
-                GN3_LOCAL_URL,
-                f"/api/metadata/wiki/{comment_id}/history"
-            )
+            urljoin(GN3_LOCAL_URL, f"/api/metadata/wiki/{comment_id}/history")
         )
         entries.raise_for_status()
         entries = entries.json()
     except requests.RequestException as excp:
         flash(excp, "alert-warning")
-    return render_template(
-        "wiki/history.html",
-        entries=entries
-    )
+    return render_template("wiki/history.html", entries=entries)
 
 
 @app.route("/datasets/<name>", methods=('GET',))
@@ -1580,18 +1598,26 @@ def edit_wiki(comment_id: int):
     """fetch generif metadata from gn3 and display it"""
     # FIXME: better error handling
     if request.method == "GET":
-        last_wiki_resp = requests.get(urljoin(GN3_LOCAL_URL, f"/api/metadata/wiki/{comment_id}"))
+        last_wiki_resp = requests.get(
+            urljoin(GN3_LOCAL_URL, f"/api/metadata/wiki/{comment_id}")
+        )
         last_wiki_resp.raise_for_status()
         last_wiki_content = last_wiki_resp.json()
 
-        species_dict_resp = requests.get(urljoin(GN3_LOCAL_URL, "/api/metadata/wiki/species"))
+        species_dict_resp = requests.get(
+            urljoin(GN3_LOCAL_URL, "/api/metadata/wiki/species")
+        )
         species_dict_resp.raise_for_status()
         species_dict = species_dict_resp.json()
 
-        categories_resp = requests.get(urljoin(GN3_LOCAL_URL, "/api/metadata/wiki/categories"))
+        categories_resp = requests.get(
+            urljoin(GN3_LOCAL_URL, "/api/metadata/wiki/categories")
+        )
         categories_resp.raise_for_status()
         categories = list(categories_resp.json().keys())
-        grouped_categories = [categories[i : i + 3] for i in range(0, len(categories), 3)]
+        grouped_categories = [
+            categories[i : i + 3] for i in range(0, len(categories), 3)
+        ]
 
         return render_template(
             "wiki/edit_wiki.html",
@@ -1611,8 +1637,10 @@ def edit_wiki(comment_id: int):
             "initial": post_data["initial"],
             "categories": post_data.getlist("genecategory"),
             "reason": post_data["reason"],
-            }
-        post_response = requests.post(urljoin(GN3_LOCAL_URL, f"api/metadata/wiki/{comment_id}/edit"), json=payload)
+        }
+        post_response = requests.post(
+            urljoin(GN3_LOCAL_URL, f"api/metadata/wiki/{comment_id}/edit"), json=payload
+        )
         post_response.raise_for_status()
         post_res = post_response.json()