aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2023-02-03 15:20:20 +0300
committerFrederick Muriuki Muriithi2023-02-03 15:22:05 +0300
commit19fb26a1021bb5f213de109258a389559d1bc0e1 (patch)
tree959e9523dc3f82cab375732b24164b0a3bb844a8
parentc7d242233403594d7a5422344a49a16c2c738222 (diff)
downloadgenenetwork2-19fb26a1021bb5f213de109258a389559d1bc0e1.tar.gz
oauth2: resource: implement incomplete resource creation flow
-rw-r--r--wqflask/wqflask/oauth2/groups.py12
-rw-r--r--wqflask/wqflask/oauth2/request_utils.py14
-rw-r--r--wqflask/wqflask/oauth2/resources.py31
-rw-r--r--wqflask/wqflask/templates/oauth2/create-resource.html62
-rw-r--r--wqflask/wqflask/templates/oauth2/group.html2
-rw-r--r--wqflask/wqflask/templates/oauth2/resources.html45
6 files changed, 138 insertions, 28 deletions
diff --git a/wqflask/wqflask/oauth2/groups.py b/wqflask/wqflask/oauth2/groups.py
index 4d0bc4f5..f91a872b 100644
--- a/wqflask/wqflask/oauth2/groups.py
+++ b/wqflask/wqflask/oauth2/groups.py
@@ -4,7 +4,7 @@ from flask import (
from .checks import require_oauth2
from .client import oauth2_get, oauth2_post
from .request_utils import (
- user_details, handle_error, request_error, handle_success,
+ user_details, handle_error, request_error, process_error, handle_success,
raise_unimplemented)
groups = Blueprint("group", __name__)
@@ -12,20 +12,12 @@ groups = Blueprint("group", __name__)
@groups.route("/", methods=["GET"])
def user_group():
"""Get the user's group."""
- def __process_error__(error):
- if error.status_code == 404:
- return {
- "error": "NotFoundError",
- "error_message": ("Requested endpoint was not found on the "
- "API server.")
- }
- return error.json()
def __success__(group):
return oauth2_get(f"oauth2/group/members/{group['group_id']}").either(
lambda error: render_template(
"oauth2/group.html", group=group,
- user_error=__process_error__(error)),
+ user_error=process_error(error)),
lambda users: render_template(
"oauth2/group.html", group=group, users=users))
diff --git a/wqflask/wqflask/oauth2/request_utils.py b/wqflask/wqflask/oauth2/request_utils.py
index f471d133..aa073266 100644
--- a/wqflask/wqflask/oauth2/request_utils.py
+++ b/wqflask/wqflask/oauth2/request_utils.py
@@ -2,7 +2,8 @@
from typing import Optional
from flask import (
- flash, session, url_for, redirect, render_template, current_app as app)
+ flash, session, url_for, redirect, Response, render_template,
+ current_app as app)
from .client import oauth2_get
@@ -14,6 +15,17 @@ def user_details():
handle_error("oauth2.login"),
lambda usr_dets: usr_dets)
+def process_error(error: Response,
+ message: str=("Requested endpoint was not found on the API "
+ "server.")
+ ) -> dict:
+ if error.status_code == 404:
+ return {
+ "error": "NotFoundError",
+ "error_message": message
+ }
+ return error.json()
+
def request_error(response):
app.logger.error(f"{response}: {response.url} [{response.status_code}]")
return render_template("oauth2/request_error.html", response=response)
diff --git a/wqflask/wqflask/oauth2/resources.py b/wqflask/wqflask/oauth2/resources.py
index be3e1622..28a5a362 100644
--- a/wqflask/wqflask/oauth2/resources.py
+++ b/wqflask/wqflask/oauth2/resources.py
@@ -1,10 +1,10 @@
import uuid
-from flask import Blueprint, render_template
+from flask import request, Blueprint, render_template
-from .client import oauth2_get
from .checks import require_oauth2
-from .request_utils import request_error
+from .client import oauth2_get, oauth2_post
+from .request_utils import request_error, process_error
resources = Blueprint("resource", __name__)
@@ -18,11 +18,32 @@ def user_resources():
return oauth2_get("oauth2/user/resources").either(
request_error, __success__)
-@resources.route("/create", methods=["GET"])
+@resources.route("/create", methods=["GET", "POST"])
@require_oauth2
def create_resource():
"""Create a new resource."""
- return "WOULD CREATE A NEW RESOURCE."
+ def __render_template__(categories=[], error=None):
+ return render_template(
+ "oauth2/create-resource.html",
+ resource_categories=categories,
+ resource_category_error=error)
+
+ if request.method == "GET":
+ return oauth2_get("oauth2/resource/categories").either(
+ lambda error: __render_template__(error=process_error(
+ error, "Could not retrieve resource categories")),
+ lambda cats: __render_template__(categories=cats))
+
+ from flask import jsonify
+ def __perr__(error):
+ print(f"ERROR: {process_error(error)}")
+ return jsonify(process_error(error))
+ def __psuc__(succ):
+ print(f"SUCCESS: {succ.json()}")
+ return jsonify(succ.json())
+ return oauth2_post(
+ "oauth2/resource/create", data=request.form).either(
+ __perr__, __psuc__)
@resources.route("/view/<uuid:resource_id>", methods=["GET"])
@require_oauth2
diff --git a/wqflask/wqflask/templates/oauth2/create-resource.html b/wqflask/wqflask/templates/oauth2/create-resource.html
new file mode 100644
index 00000000..9d9a8cd3
--- /dev/null
+++ b/wqflask/wqflask/templates/oauth2/create-resource.html
@@ -0,0 +1,62 @@
+{%extends "base.html"%}
+{%from "oauth2/profile_nav.html" import profile_nav%}
+
+{%block title%}Create Resource{%endblock%}
+{%block css%}
+<link rel="stylesheet" type="text/css" href="/static/new/css/mytooltip.css" />
+{%endblock%}
+
+{%block content%}
+<div class="container" style="min-width: 1250px;">
+ {{profile_nav("resources")}}
+
+ {{flash_me()}}
+
+ <div class="container-fluid">
+ <div class="row">
+ {%if resource_category_error%}
+ <p>
+ <span class="glyphicon glyphicon-exclamation-sign text-danger"></span>
+ &nbsp;
+ <span class="text-danger">{{resource_category_error.error}}</span>:
+ {{resource_category_error.error_message}}
+ </p>
+ {%else%}
+ <form method="POST"
+ action="{{url_for('oauth2.resource.create_resource')}}">
+
+ <div class="form-group mytooltip">
+ <label for="resource_name" class="form-label">Name</label>
+ <input type="text" name="resource_name" class="form-control"
+ required="required" />
+ <span class="mytooltiptext">
+ The resource name, e.g. the experiment name.
+ </span>
+ </div>
+
+
+ <div class="form-group">
+ {%for category in resource_categories%}
+ <div class="radio mytooltip">
+ <label for="resource_name" class="form-label"
+ style="text-transform: capitalize;">
+ <input type="radio" name="resource_category" required="required"
+ value="{{category.resource_category_id}}" />
+ {{category.resource_category_key}}
+ </label>
+ <span class="mytooltiptext">
+ {{category.resource_category_description}}
+ </span>
+ </div>
+ {%endfor%}
+ </div>
+
+ <input class="btn btn-primary" type="submit" value="Create" />
+
+ </form>
+ {%endif%}
+ </div>
+ </div>
+
+</div>
+{%endblock%}
diff --git a/wqflask/wqflask/templates/oauth2/group.html b/wqflask/wqflask/templates/oauth2/group.html
index 8db5b0d9..e7a79933 100644
--- a/wqflask/wqflask/templates/oauth2/group.html
+++ b/wqflask/wqflask/templates/oauth2/group.html
@@ -81,7 +81,7 @@
</span>
&nbsp;
<strong class="text-danger">{{user_error.error}}</strong>
- {{user_error.error_message}}
+ {{user_error.error_description}}
{%else%}
No users found for this group
{%endif%}
diff --git a/wqflask/wqflask/templates/oauth2/resources.html b/wqflask/wqflask/templates/oauth2/resources.html
index 44774fda..19730f6b 100644
--- a/wqflask/wqflask/templates/oauth2/resources.html
+++ b/wqflask/wqflask/templates/oauth2/resources.html
@@ -3,7 +3,7 @@
{%block title%}View User{%endblock%}
{%block content%}
<div class="container" style="min-width: 1250px;">
- {{profile_nav("dashboard")}}
+ {{profile_nav("resources")}}
<h3>Resources</h3>
{{flash_me()}}
@@ -17,16 +17,39 @@
</div>
<div class="row">
- {%for resource in resources %}
- {{resource.resource_name}} - {{resource.resource_category}} - {{resource.group}}
- {%else%}
- <p>
- <span class="glyphicon glyphicon-warning-sign"></span>&nbsp;
- <span class="text-warning">
- The user has no access to any resource.
- </span>
- </p>
- {%endfor%}
+ <table class="table">
+ <caption>Resources</caption>
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Category</th>
+ <th>Group</th>
+ </tr>
+ </thead>
+ <tbody>
+ {%for resource in resources %}
+ <tr>
+ <td>
+ <a href="url_for('oauth2.resources.view', resource_id=resource.resource_id)"
+ title="View resource {{resource.resource_name}}">
+ {{resource.resource_name}}
+ </a>
+ </td>
+ <td>{{resource.resource_category.resource_category_key}}</td>
+ <td>{{resource.group.group_name}}</td>
+ </tr>
+ {%else%}
+ <tr>
+ <td colspan="3">
+ <span class="glyphicon glyphicon-warning-sign"></span>&nbsp;
+ <span class="text-warning">
+ The user has no access to any resource.
+ </span>
+ </td>
+ </tr>
+ {%endfor%}
+ </tbody>
+ </table>
</div>
</div>