about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2024-07-25 16:54:48 -0500
committerFrederick Muriuki Muriithi2024-07-26 16:45:32 -0500
commit729703972f67cd8a61460d275313ad7c55b019b3 (patch)
tree17c93a98ad30d762876cd3c25a4b58f690924e36
parent365f360f0e79c761bd6fb9c26009b4f782f752eb (diff)
downloadgn-uploader-729703972f67cd8a61460d275313ad7c55b019b3.tar.gz
Provide UI for enabling login to the application.
-rw-r--r--uploader/__init__.py5
-rw-r--r--uploader/default_settings.py2
-rw-r--r--uploader/entry.py3
-rw-r--r--uploader/oauth2/client.py20
-rw-r--r--uploader/templates/login.html29
5 files changed, 56 insertions, 3 deletions
diff --git a/uploader/__init__.py b/uploader/__init__.py
index a3b36e7..e4b5b32 100644
--- a/uploader/__init__.py
+++ b/uploader/__init__.py
@@ -6,6 +6,8 @@ from pathlib import Path
 from flask import Flask, request
 from flask_session import Session
 
+from uploader.oauth2.client import authserver_authorise_uri
+
 from .entry import entrybp
 from .upload import upload
 from .parse import parsebp
@@ -41,6 +43,9 @@ def create_app():
 
     # setup jinja2 symbols
     app.add_template_global(lambda : request.url, name="request_url")
+    app.add_template_global(authserver_authorise_uri)
+    app.add_template_global(lambda: app.config["GN2_SERVER_URL"],
+                            name="gn2server_uri")
 
     Session(app)
 
diff --git a/uploader/default_settings.py b/uploader/default_settings.py
index 3add7ef..f7ca48c 100644
--- a/uploader/default_settings.py
+++ b/uploader/default_settings.py
@@ -13,6 +13,8 @@ JOBS_TTL_SECONDS = 1209600 # 14 days
 GNQC_REDIS_PREFIX="GNQC"
 SQL_URI = ""
 
+GN2_SERVER_URL = "https://genenetwork.org/"
+
 SESSION_TYPE = "redis"
 SESSION_PERMANENT = True
 SESSION_USE_SIGNER = True
diff --git a/uploader/entry.py b/uploader/entry.py
index 4a02f1e..941200a 100644
--- a/uploader/entry.py
+++ b/uploader/entry.py
@@ -17,6 +17,7 @@ from flask import (
 
 from uploader.db import species
 from uploader.db_utils import with_db_connection
+from uploader.oauth2.client import user_logged_in
 
 entrybp = Blueprint("entry", __name__)
 
@@ -87,7 +88,7 @@ def zip_file_errors(filepath, upload_dir) -> Tuple[str, ...]:
 @entrybp.route("/", methods=["GET"])
 def index():
     """Load the landing page"""
-    return render_template("index.html")
+    return render_template("index.html" if user_logged_in() else "login.html")
 
 @entrybp.route("/upload", methods=["GET", "POST"])
 def upload_file():
diff --git a/uploader/oauth2/client.py b/uploader/oauth2/client.py
index 6e101ae..f20af4a 100644
--- a/uploader/oauth2/client.py
+++ b/uploader/oauth2/client.py
@@ -1,9 +1,9 @@
 """OAuth2 client utilities."""
-from urllib.parse import urljoin
 from datetime import datetime, timedelta
+from urllib.parse import urljoin, urlparse
 
 import requests
-from flask import current_app as app
+from flask import request, current_app as app
 
 from pymonad.either import Left, Right
 
@@ -99,3 +99,19 @@ def oauth2_client():
     return session.user_token().either(
         lambda _notok: __client__(None),
         __client__)
+
+
+def user_logged_in():
+    """Check whether the user has logged in."""
+    suser = session.session_info()["user"]
+    # return suser["logged_in"] and suser["token"].is_right()
+    return False
+
+def authserver_authorise_uri():
+    req_baseurl = urlparse(request.base_url, scheme=request.scheme)
+    host_uri = f"{req_baseurl.scheme}://{req_baseurl.netloc}/"
+    return urljoin(
+        authserver_uri(),
+        "auth/authorise?response_type=code"
+        f"&client_id={oauth2_clientid()}"
+        f"&redirect_uri={urljoin(host_uri, 'oauth2/code')}")
diff --git a/uploader/templates/login.html b/uploader/templates/login.html
new file mode 100644
index 0000000..68510aa
--- /dev/null
+++ b/uploader/templates/login.html
@@ -0,0 +1,29 @@
+{%extends "base.html"%}
+
+{%block title%}Data Upload{%endblock%}
+
+{%block contents%}
+<div class="row">
+  <h1 class="heading">log in</h1>
+
+  <div class="explainer">
+    <p>
+      This system enables you to upload data onto GeneNetwork. In order to do
+      that correctly, we need to know who you are.</p>
+    <p>
+      If you already have an account with GeneNetwork, you can simply click the
+      login button below, after which you can upload your data.<br />
+    </p>
+    <a href="{{authserver_authorise_uri()}}" class="btn btn-primary"
+       style="display:block;width:15em;align:center;margin:1em 3em;">
+          log in</a>
+    <p>
+      If you do not have an account with GeneNetwork, go to
+      <a href="{{gn2server_uri()}}"
+         title="GeneNetwork Service."
+         target="_blank">GeneNetwork</a>
+      and register for an account, then come back here to login and upload.</a>
+  </div>
+</div>
+
+{%endblock%}