about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2023-01-26 09:35:59 +0300
committerFrederick Muriuki Muriithi2023-01-26 09:35:59 +0300
commita21cd4c10bbbd2267f33a4acb968ccc8eee0cc7c (patch)
tree4c768d7a819ec4e7b0ab81a6d89869f4cc6c5bb7
parentf9fcbc26c5588f62f5c674d9d424197b9c8b1fc4 (diff)
downloadgenenetwork2-a21cd4c10bbbd2267f33a4acb968ccc8eee0cc7c.tar.gz
oauth2: UI: Rework user dashboard UI
Separate the roles, resources and group information from the overview
page.
-rw-r--r--wqflask/wqflask/oauth2/routes.py36
-rw-r--r--wqflask/wqflask/templates/oauth2/profile_nav.html35
-rw-r--r--wqflask/wqflask/templates/oauth2/request_error.html31
-rw-r--r--wqflask/wqflask/templates/oauth2/resources.html31
-rw-r--r--wqflask/wqflask/templates/oauth2/roles.html26
-rw-r--r--wqflask/wqflask/templates/oauth2/view-user.html90
6 files changed, 176 insertions, 73 deletions
diff --git a/wqflask/wqflask/oauth2/routes.py b/wqflask/wqflask/oauth2/routes.py
index 33282dc1..ad0c080e 100644
--- a/wqflask/wqflask/oauth2/routes.py
+++ b/wqflask/wqflask/oauth2/routes.py
@@ -55,7 +55,7 @@ def oauth2_get(uri_path: str) -> Either:
     if resp.status_code == 200:
         return Right(resp.json())
 
-    return Left(resp.json())
+    return Left(resp)
 
 def oauth2_post(uri_path: str, data: dict) -> Either:
     token = session.get("oauth2_token")
@@ -67,7 +67,11 @@ def oauth2_post(uri_path: str, data: dict) -> Either:
     if resp.status_code == 200:
         return Right(resp.json())
 
-    return Left(resp.json())
+    return Left(resp)
+
+def __request_error__(response):
+    app.logger.error(f"{response}: {response.url} [{response.status_code}]")
+    return render_template("oauth2/request_error.html", response=response)
 
 @oauth2.route("/login", methods=["GET", "POST"])
 def login():
@@ -166,10 +170,8 @@ def user_profile():
         scope = SCOPE, token=session.get("oauth2_token"))
 
     roles = oauth2_get("oauth2/user-roles").either(lambda x: "Error", lambda x: x)
-    resources = []
     return render_template(
-        "oauth2/view-user.html", user_details=user_details,
-        roles=roles, resources=resources)
+        "oauth2/view-user.html", user_details=user_details, roles=roles)
 
 @oauth2.route("/request-add-to-group", methods=["POST"])
 @require_oauth2
@@ -225,3 +227,27 @@ def group_join_or_create():
     groups = oauth2_get("oauth2/groups").either(
         lambda x: __raise_unimplemented__(), lambda x: x)
     return render_template("oauth2/group_join_or_create.html", groups=groups)
+
+@oauth2.route("/user-resources", methods=["GET"])
+def user_resources():
+    def __success__(resources):
+        return render_template("oauth2/resources.html", resources=resources)
+
+    return oauth2_get("oauth2/user-resources").either(
+        __request_error__, __success__)
+
+@oauth2.route("/user-roles", methods=["GET"])
+def user_roles():
+    def __success__(roles):
+        return render_template("oauth2/roles.html", roles=roles)
+
+    return oauth2_get("oauth2/user-roles").either(
+        __request_error__, __success__)
+
+@oauth2.route("/user-group", methods=["GET"])
+def user_group():
+    def __success__(group):
+        return render_template("oauth2/group.html", group=group)
+
+    return oauth2_get("oauth2/user-group").either(
+        __request_error__, __success__)
diff --git a/wqflask/wqflask/templates/oauth2/profile_nav.html b/wqflask/wqflask/templates/oauth2/profile_nav.html
new file mode 100644
index 00000000..7ec7691b
--- /dev/null
+++ b/wqflask/wqflask/templates/oauth2/profile_nav.html
@@ -0,0 +1,35 @@
+{%macro profile_nav(calling_page)%}
+
+<ul class="nav nav-pills">
+
+  <li role="presentation"
+      {%if calling_page == "dashboard"%}
+      class="active"
+      {%endif%}>
+    <a href="{{url_for('oauth2.user_profile')}}">Dashboard</a>
+  </li>
+
+  <li role="presentation"
+      {%if calling_page == "group"%}
+      class="active"
+      {%endif%}>
+    <a href="{{url_for('oauth2.user_group')}}">Group</a>
+  </li>
+
+  <li role="presentation"
+      {%if calling_page == "roles"%}
+      class="active"
+      {%endif%}>
+    <a href="{{url_for('oauth2.user_roles')}}">Roles</a>
+  </li>
+
+  <li role="presentation"
+      {%if calling_page == "resources"%}
+      class="active"
+      {%endif%}>
+    <a href="{{url_for('oauth2.user_resources')}}">Resources</a>
+  </li>
+
+</ul>
+
+{%endmacro%}
diff --git a/wqflask/wqflask/templates/oauth2/request_error.html b/wqflask/wqflask/templates/oauth2/request_error.html
new file mode 100644
index 00000000..35842e68
--- /dev/null
+++ b/wqflask/wqflask/templates/oauth2/request_error.html
@@ -0,0 +1,31 @@
+{%extends "base.html"%}
+{%from "oauth2/profile_nav.html" import profile_nav%}
+{%block title%}View User{%endblock%}
+{%block content%}
+<div class="container" style="min-width: 1250px;">
+  {{profile_nav()}}
+  <h3>ERROR</h3>
+
+  {{flash_me()}}
+
+  {{response}}
+
+  <div class="container-fluid">
+
+    <div class="row">
+      <dl>
+	<dt>Error code</dt>
+	<dd>{{response.status}}[{{response.status_code}}]</dd>
+
+	<dt>URI</dt>
+	<dd>{{response.url}}</dd>
+
+	<dt>Content Type</dt>
+	<dd>{{response.content_type}}</dd>
+      </dl>
+    </div>
+
+  </div>
+
+</div>
+{%endblock%}
diff --git a/wqflask/wqflask/templates/oauth2/resources.html b/wqflask/wqflask/templates/oauth2/resources.html
new file mode 100644
index 00000000..38f851e6
--- /dev/null
+++ b/wqflask/wqflask/templates/oauth2/resources.html
@@ -0,0 +1,31 @@
+{%extends "base.html"%}
+{%from "oauth2/profile_nav.html" import profile_nav%}
+{%block title%}View User{%endblock%}
+{%block content%}
+<div class="container" style="min-width: 1250px;">
+  {{profile_nav("dashboard")}}
+  <h3>Resources</h3>
+
+  {{flash_me()}}
+
+  {{resources}}
+
+  <div class="container-fluid">
+
+    <div class="row">
+      {%for resource in resources %}
+      {{role}}
+      {%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%}
+    </div>
+
+  </div>
+
+</div>
+{%endblock%}
diff --git a/wqflask/wqflask/templates/oauth2/roles.html b/wqflask/wqflask/templates/oauth2/roles.html
new file mode 100644
index 00000000..5086ed39
--- /dev/null
+++ b/wqflask/wqflask/templates/oauth2/roles.html
@@ -0,0 +1,26 @@
+{%extends "base.html"%}
+{%from "oauth2/profile_nav.html" import profile_nav%}
+{%block title%}View User{%endblock%}
+{%block content%}
+<div class="container" style="min-width: 1250px;">
+  {{profile_nav("roles")}}
+  <h3>Roles</h3>
+
+  {{flash_me()}}
+
+  <div class="container-fluid">
+    <div class="row">
+      {%for role in roles %}
+      {{role}}
+      {%else%}
+      <p>
+	<span class="glyphicon glyphicon-warning-sign"></span>&nbsp;
+	<span class="text-warning">No roles attached to this user</span>
+      </p>
+      {%endfor%}
+    </div>
+
+  </div>
+
+</div>
+{%endblock%}
diff --git a/wqflask/wqflask/templates/oauth2/view-user.html b/wqflask/wqflask/templates/oauth2/view-user.html
index a617c66e..7365b35b 100644
--- a/wqflask/wqflask/templates/oauth2/view-user.html
+++ b/wqflask/wqflask/templates/oauth2/view-user.html
@@ -1,84 +1,38 @@
 {%extends "base.html"%}
+{%from "oauth2/profile_nav.html" import profile_nav%}
 {%block title%}View User{%endblock%}
 {%block content%}
 <div class="container" style="min-width: 1250px;">
+  {{profile_nav("dashboard")}}
   <h3>View User</h3>
 
   {{flash_me()}}
 
   <div class="container-fluid">
     <div class="row">
-      <div class="panel panel-primary col-md-3">
-	<div class="panel-heading"><h3>User Details</h3></div>
-	<div class="panel-body">
-	  {%if user_details%}
-	  <p><strong>Name</strong>: {{user_details.name}}</p>
-	  <p><strong>E-Mail</strong>: {{user_details.email}}</p>
-	  {%if user_details.group%}
-	  <p><strong>Group</strong>:{{user_details.group.group_name}}</p>
-	  {%else%}
-	  <p>
-	    <span class="glyphicon glyphicon-warning-sign text-warning"></span>
-	    &nbsp;
-	    <span class="text-warning">User is not a member of a group.</span>
-	  </p>
+      {%if user_details%}
+      <p><strong>Name</strong>: {{user_details.name}}</p>
+      <p><strong>E-Mail</strong>: {{user_details.email}}</p>
+      {%if user_details.group%}
+      <p><strong>Group</strong>:{{user_details.group.group_name}}</p>
+      {%else%}
+      <p>
+	<span class="glyphicon glyphicon-warning-sign text-warning"></span>
+	&nbsp;
+	<span class="text-warning">User is not a member of a group.</span>
+      </p>
 
-	  <p><a href="{{url_for('oauth2.group_join_or_create')}}"
-		class="btn btn-primary"
-		title="Join an existing group, or create your own group">
-	      Join or Create group
-	  </a></p>
-	  {%endif%}
-	  {%else%}
-	  <p class="text-warning">No details found.</p>
-	  {%endif%}
-	</div>
-	<div class="panel-footer"></div>
-      </div>
+      <p><a href="{{url_for('oauth2.group_join_or_create')}}"
+	    class="btn btn-primary"
+	    title="Join an existing group, or create your own group">
+	  Join or Create group
+      </a></p>
+      {%endif%}
+      {%else%}
+      <p class="text-warning">No details found.</p>
+      {%endif%}
     </div>
-  </div>
 
-  <div class="container-fluid">
-    <div class="row">
-      <div class="panel panel-primary col-md-3">
-	<div class="panel-heading"><h3>Resources</h3></div>
-	<div class="panel-body">
-	  <p>The user has access to the following resources:</p>
-	  {%for resource in resources %}
-	  {{role}}
-	  {%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%}
-	</div>
-	<div class="panel-footer"></div>
-      </div>
-    </div>
-  </div>
-
-  <div class="container-fluid">
-    <div class="row">
-      <div class="panel panel-primary col-md-3">
-	<div class="panel-heading">
-	  <h3>Other Roles</h3>
-	</div>
-	<div class="panel-body">
-	  {%for role in roles %}
-	  {{role}}
-	  {%else%}
-	  <p>
-	    <span class="glyphicon glyphicon-warning-sign"></span>&nbsp;
-	    <span class="text-warning">No roles attached to this user</span>
-	  </p>
-	  {%endfor%}
-	</div>
-	<div class="panel-footer"></div>
-      </div>
-    </div>
   </div>
 
 </div>