about summary refs log tree commit diff
path: root/gn2/wqflask/oauth2/groups.py
diff options
context:
space:
mode:
authorArun Isaac2023-12-29 18:55:37 +0000
committerArun Isaac2023-12-29 19:01:46 +0000
commit204a308be0f741726b9a620d88fbc22b22124c81 (patch)
treeb3cf66906674020b530c844c2bb4982c8a0e2d39 /gn2/wqflask/oauth2/groups.py
parent83062c75442160427b50420161bfcae2c5c34c84 (diff)
downloadgenenetwork2-204a308be0f741726b9a620d88fbc22b22124c81.tar.gz
Namespace all modules under gn2.
We move all modules under a gn2 directory. This is important for
"correct" packaging and deployment as a Guix service.
Diffstat (limited to 'gn2/wqflask/oauth2/groups.py')
-rw-r--r--gn2/wqflask/oauth2/groups.py210
1 files changed, 210 insertions, 0 deletions
diff --git a/gn2/wqflask/oauth2/groups.py b/gn2/wqflask/oauth2/groups.py
new file mode 100644
index 00000000..fd5ab7eb
--- /dev/null
+++ b/gn2/wqflask/oauth2/groups.py
@@ -0,0 +1,210 @@
+import uuid
+import datetime
+from functools import partial
+
+from flask import (
+    flash, session, request, url_for, redirect, Response, Blueprint)
+
+from .ui import render_ui
+from .checks import require_oauth2
+from .client import oauth2_get, oauth2_post
+from .request_utils import (
+    user_details, handle_error, process_error, handle_success,
+    raise_unimplemented)
+
+groups = Blueprint("group", __name__)
+
+@groups.route("/", methods=["GET"])
+def user_group():
+    """Get the user's group."""
+    def __get_join_requests__(group, users):
+        return oauth2_get("auth/group/requests/join/list").either(
+            lambda error: render_ui(
+                "oauth2/group.html", group=group, users=users,
+                group_join_requests_error=process_error(error)),
+            lambda gjr: render_ui(
+                "oauth2/group.html", group=group, users=users,
+                group_join_requests=gjr))
+    def __success__(group):
+        return oauth2_get(f"auth/group/members/{group['group_id']}").either(
+            lambda error: render_ui(
+                "oauth2/group.html", group=group,
+                user_error=process_error(error)),
+            partial(__get_join_requests__, group))
+
+    def __group_error__(err):
+        return render_ui(
+            "oauth2/group.html", group_error=process_error(err))
+
+    return oauth2_get("auth/user/group").either(
+        __group_error__, __success__)
+
+@groups.route("/create", methods=["POST"])
+@require_oauth2
+def create_group():
+    def __setup_group__(response):
+        session["user_details"]["group"] = response
+
+    resp = oauth2_post("auth/group/create", data=dict(request.form))
+    return resp.either(
+        handle_error("oauth2.group.join_or_create"),
+        handle_success(
+            "Created group", "oauth2.user.user_profile",
+            response_handlers=[__setup_group__]))
+
+@groups.route("/join-or-create", methods=["GET"])
+@require_oauth2
+def join_or_create():
+    usr_dets = user_details()
+    if bool(usr_dets["group"]):
+        flash("You are already a member of a group.", "alert-info")
+        return redirect(url_for("oauth2.user.user_profile"))
+    def __group_error__(err):
+        return render_ui(
+            "oauth2/group_join_or_create.html", groups=[],
+            groups_error=process_error(err))
+    def __group_success__(groups):
+        return oauth2_get("auth/user/group/join-request").either(
+            __gjr_error__, partial(__gjr_success__, groups=groups))
+    def __gjr_error__(err):
+        return render_ui(
+            "oauth2/group_join_or_create.html", groups=[],
+            gjr_error=process_error(err))
+    def __gjr_success__(gjr, groups):
+        return render_ui(
+            "oauth2/group_join_or_create.html", groups=groups,
+            group_join_request=gjr)
+    return oauth2_get("auth/group/list").either(
+        __group_error__, __group_success__)
+
+@groups.route("/delete/<uuid:group_id>", methods=["GET", "POST"])
+@require_oauth2
+def delete_group(group_id):
+    """Delete the user's group."""
+    return "WOULD DELETE GROUP."
+
+@groups.route("/edit/<uuid:group_id>", methods=["GET", "POST"])
+@require_oauth2
+def edit_group(group_id):
+    """Edit the user's group."""
+    return "WOULD EDIT GROUP."
+
+@groups.route("/list-join-requests", methods=["GET"])
+@require_oauth2
+def list_join_requests() -> Response:
+    def __ts_to_dt_str__(timestamp):
+        return datetime.datetime.fromtimestamp(timestamp).isoformat()
+    def __fail__(error):
+        return render_ui(
+            "oauth2/join-requests.html", error=process_error(error),
+            requests=[])
+    def __success__(requests):
+        return render_ui(
+            "oauth2/join-requests.html", error=False, requests=requests,
+            datetime_string=__ts_to_dt_str__)
+    return oauth2_get("auth/group/requests/join/list").either(
+        __fail__, __success__)
+
+@groups.route("/accept-join-requests", methods=["POST"])
+@require_oauth2
+def accept_join_request():
+    def __fail__(error):
+        err=process_error()
+        flash("{}", "alert-danger")
+        return redirect(url_for("oauth2.group.list_join_requests"))
+    def __success__(requests):
+        flash("Request was accepted successfully.", "alert-success")
+        return redirect(url_for("oauth2.group.list_join_requests"))
+    return oauth2_post(
+        "auth/group/requests/join/accept",
+        data=request.form).either(
+            handle_error("oauth2.group.list_join_requests"),
+            __success__)
+
+@groups.route("/reject-join-requests", methods=["POST"])
+@require_oauth2
+def reject_join_request():
+    def __fail__(error):
+        err=process_error()
+        flash(f"{err['error']}: {err['error_description']}", "alert-danger")
+        return redirect(url_for("oauth2.group.list_join_requests"))
+    def __success__(requests):
+        flash("Request was rejected successfully.", "alert-success")
+        return redirect(url_for("oauth2.group.list_join_requests"))
+    return oauth2_post(
+        "auth/group/requests/join/reject",
+        data=request.form).either(
+            handle_error("oauth2.group.list_join_requests"),
+            __success__)
+
+@groups.route("/role/<uuid:group_role_id>", methods=["GET"])
+@require_oauth2
+def group_role(group_role_id: uuid.UUID):
+    """View the details of a particular role."""
+    def __render_error(**kwargs):
+        return render_ui("oauth2/view-group-role.html", **kwargs)
+
+    def __gprivs_success__(role, group_privileges):
+        return render_ui(
+            "oauth2/view-group-role.html", group_role=role,
+            group_privileges=tuple(
+                priv for priv in group_privileges
+                if priv not in role["role"]["privileges"]))
+
+    def __role_success__(role):
+        return oauth2_get("auth/group/privileges").either(
+            lambda err: __render_error__(
+                group_role=group_role,
+                group_privileges_error=process_error(err)),
+            lambda privileges: __gprivs_success__(role, privileges))
+
+    return oauth2_get(f"auth/group/role/{group_role_id}").either(
+        lambda err: __render_error__(group_role_error=process_error(err)),
+        __role_success__)
+
+def add_delete_privilege_to_role(
+        group_role_id: uuid.UUID, direction: str) -> Response:
+    """Add/delete a privilege to/from a role depending on `direction`."""
+    assert direction in ("ADD", "DELETE")
+    def __render__():
+        return redirect(url_for(
+            "oauth2.group.group_role", group_role_id=group_role_id))
+
+    def __error__(error):
+        err = process_error(error)
+        flash(f"{err['error']}: {err['error_description']}", "alert-danger")
+        return __render__()
+
+    def __success__(success):
+        flash(success["description"], "alert-success")
+        return __render__()
+    try:
+        form = request.form
+        privilege_id = form.get("privilege_id")
+        assert bool(privilege_id), "Privilege to add must be provided"
+        uris = {
+            "ADD": f"auth/group/role/{group_role_id}/privilege/add",
+            "DELETE": f"auth/group/role/{group_role_id}/privilege/delete"
+        }
+        return oauth2_post(
+            uris[direction],
+            data={
+                "group_role_id": group_role_id,
+                "privilege_id": privilege_id
+            }).either(__error__, __success__)
+    except AssertionError as aerr:
+        flash(aerr.args[0], "alert-danger")
+        return redirect(url_for(
+            "oauth2.group.group_role", group_role_id=group_role_id))
+
+@groups.route("/role/<uuid:group_role_id>/privilege/add", methods=["POST"])
+@require_oauth2
+def add_privilege_to_role(group_role_id: uuid.UUID):
+    """Add a privilege to a group role."""
+    return add_delete_privilege_to_role(group_role_id, "ADD")
+
+@groups.route("/role/<uuid:group_role_id>/privilege/delete", methods=["POST"])
+@require_oauth2
+def delete_privilege_from_role(group_role_id: uuid.UUID):
+    """Delete a privilege from a group role."""
+    return add_delete_privilege_to_role(group_role_id, "DELETE")