Commit 980f4d8b authored by Mickaël Desfrênes's avatar Mickaël Desfrênes
Browse files

add roles form

parent 1b3717b7
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -19,6 +19,21 @@ from . import views

urlpatterns = [
    path(settings.JAMA_URL_BASE_PATH + "", views.homepage),
    path(
        settings.JAMA_URL_BASE_PATH + "jamadmin/",
        views.projects_management,
        name="management-projects",
    ),
    path(
        settings.JAMA_URL_BASE_PATH + "jamadmin/project/<int:project_id>/",
        views.project,
        name="management-project",
    ),
    path(
        settings.JAMA_URL_BASE_PATH
        + "jamadmin/accessrights/<int:project_id>/<int:user_id>",
        views.project_rights,
    ),
    path(settings.JAMA_URL_BASE_PATH + "rpc/", include("rpc.urls")),
    path(settings.JAMA_URL_BASE_PATH + "oai/", include("oai.urls")),
    path(settings.JAMA_URL_BASE_PATH + "resources/", include("resources.urls")),
+60 −2
Original line number Diff line number Diff line
from django.http import HttpResponse, HttpRequest
from django.shortcuts import render
import json

from django.http import HttpResponse, HttpRequest, JsonResponse, HttpResponseForbidden
from django.shortcuts import render, get_object_or_404, redirect
from jama import settings
from django.contrib.auth.models import User
from resources.models import Project, ProjectAccess, Role
from rpc import serializers
from django.views.decorators.csrf import csrf_exempt

BASE_PATH = "/" + settings.JAMA_URL_BASE_PATH

@@ -17,3 +22,56 @@ def status(request: HttpRequest) -> HttpResponse:
    except:
        return HttpResponse("ko")
    return HttpResponse("ok")


def projects_management(request: HttpRequest) -> HttpResponse:
    if request.user.is_superuser:
        return render(
            request,
            "management/projects.html",
            {
                "projects": Project.objects.all(),
                "users": User.objects.all(),
                "base_path": settings.JAMA_URL_BASE_PATH,
            },
        )
    return HttpResponseForbidden()


@csrf_exempt
def project_rights(request: HttpRequest, project_id: int, user_id: int) -> HttpResponse:
    if request.user.is_superuser:
        project_instance = get_object_or_404(Project, pk=project_id)
        user_instance = get_object_or_404(User, pk=user_id)
        access_rights = []
        if request.method == "POST":
            roles_ids = json.loads(request.body)
            roles = []
            for role_id in roles_ids:
                role = get_object_or_404(Role, pk=role_id)
                roles.append(role)
            ProjectAccess.objects.filter(
                user=user_instance, project=project_instance
            ).delete()
            for role in roles:
                ProjectAccess.objects.get_or_create(
                    user=user_instance, project=project_instance, role=role
                )
        for access in ProjectAccess.objects.filter(
            project_id=project_instance.pk, user_id=user_instance.pk
        ):
            access_rights.append(serializers.project_access(access))
        available_roles = []
        for role_instance in Role.objects.filter(project_id=project_instance.pk):
            available_roles.append(serializers.role(role_instance))
        return JsonResponse(
            {"access_rights": access_rights, "available_roles": available_roles}
        )
    return HttpResponseForbidden()


def project(request: HttpRequest, project_id: int) -> HttpResponse:
    if request.user.is_superuser:
        project_instance = get_object_or_404(Project, pk=project_id)
        return render(request, "management/roles.html", {"project": project_instance})
    return HttpResponseForbidden()
+35 −154

File changed.

Preview size limit exceeded, changes collapsed.

+174 −0
Original line number Diff line number Diff line
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Attribution de rôles Jama</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css"
          rel="stylesheet"
          integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx"
          crossorigin="anonymous">
</head>
<body>
<div class="container" style="padding-top: 1em;">
    <ul class="nav nav-tabs">
        <li class="nav-item">
            <a class="nav-link active" aria-current="page" href="{{ base_path }}/jamadmin/">Rôles Jama</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="{{ base_path }}/admin/">Admin Django</a>
        </li>
    </ul>
    <div class="row">
        <h1>Attribution des rôles Jama</h1>
        <div class="col-2"><!-- Listes des projets -->
            <p class="lead">Projets</p>
            <div class="list-group list-group-flush">
                {% for project in projects %}
                    <a href="" class="list-group-item list-group-item-action jama-item-project"
                       data-pk="{{ project.pk }}">{{ project.label }}</a>
                {% endfor %}
            </div>
        </div>
        <div class="col"><!-- liste des users -->
            <p class="lead">Utilisateurs</p>
            <div class="list-group list-group-flush">
                {% for user in users %}
                    <a href="" class="list-group-item list-group-item-action jama-item-user"
                       data-pk="{{ user.pk }}">{{ user.username }}</a>
                {% endfor %}
            </div>
        </div>
        <div class="col"><!-- liste des rôles -->
            <p class="lead">Rôles</p>
            <div class="list-group list-group-flush" id="list-roles">
                <p>Choisissez un projet et un utilisateur.</p>
            </div>
        </div>
    </div>
</div>
<template id="template-jama-item-role">
    <div class="list-group-item form-check">
        <input class="form-check-input roleCheckbox" type="checkbox" value="" id="flexCheckDefault3" data-pk="">
        <label class="form-check-label" for="flexCheckDefault3">
            label...
        </label>
    </div>
</template>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-A3rJD856KowSb7dwlZdYEkO39Gagi7vIsF0jrRAoQmDKKtQBHUuLZ9AsSv4jD4Xa"
        crossorigin="anonymous"></script>
<script>
    function deactivateProjectsItems() {
        Array.from(document.getElementsByClassName("jama-item-project")).forEach(function (element) {
            element.classList.remove("active");
        });
    }

    function deactivateUsersItems() {
        Array.from(document.getElementsByClassName("jama-item-user")).forEach(function (element) {
            element.classList.remove("active");
        });
    }

    function getSelectedProjectId(){
        let project_pk = null;
        Array.from(document.getElementsByClassName("jama-item-project")).forEach(function (element) {
            if (element.classList.contains("active")) {
                project_pk = element.getAttribute("data-pk");
            }
        });
        return project_pk;
    }

    function getSelectedUserId(){
        let user_pk = null;
        Array.from(document.getElementsByClassName("jama-item-user")).forEach(function (element) {
            if (element.classList.contains("active")) {
                user_pk = element.getAttribute("data-pk");
            }
        });
        return user_pk;
    }

    async function setAccessRights(evt) {
        let project_pk = getSelectedProjectId();
        let user_pk = getSelectedUserId();
        let roles = [];
        Array.from(document.querySelectorAll(".roleCheckbox:checked")).forEach(function (element) {
            roles.push(element.getAttribute("data-pk"))
        });
        if (project_pk && user_pk) {
            let response = await fetch("{{ base_path }}/jamadmin/accessrights/" + project_pk + "/" + user_pk,
                {
                    method: "POST",
                    body: JSON.stringify(roles),
                    headers: {
                        'Content-Type': 'application/json'
                    }
                });
            if (response.ok){
                // rien à faire
            }else{
                alert("Impossible d'appliquer les droits, contactez votre technicien.");
            }
        }
    }

    async function getAccessRights() {
        let project_pk = getSelectedProjectId();
        let user_pk = getSelectedUserId();
        let role_list = document.getElementById("list-roles");

        if(user_pk && project_pk) {
            while(role_list.lastChild){
                role_list.removeChild(role_list.lastChild);
            }
            let tpl = document.getElementById("template-jama-item-role");
            let response = await fetch("{{ base_path }}/jamadmin/accessrights/" + project_pk + "/" + user_pk);
            if (response.ok) {
                let json = await response.json();
                let user_access_roles = [];
                Array.from(json.access_rights).forEach(function(access){
                    user_access_roles.push(access.role.label)
                })
                Array.from(json.available_roles).forEach(function (role) {
                    let clone = tpl.content.cloneNode(true);
                    let label = clone.querySelector("label");
                    let checkbox = clone.querySelector("input");
                    checkbox.setAttribute("data-pk", role["id"]);
                    checkbox.setAttribute("id", "check-"+role["id"]);
                    if(user_access_roles.includes(role["label"])){
                        checkbox.setAttribute("checked", "checked");
                    }
                    checkbox.addEventListener("change", setAccessRights)
                    label.innerText = role["label"];
                    label.setAttribute("for", "check-"+role["id"]);
                    role_list.appendChild(clone);
                });
            }else{
                alert("Impossible de récupérer la liste des droits.");
            }
        }
    }

    Array.from(document.getElementsByClassName("jama-item-project")).forEach(function (element) {
        element.addEventListener("click", function (evt) {
            evt.preventDefault();
            deactivateProjectsItems();
            evt.target.classList.add("active");
            getAccessRights();
        });
    });

    Array.from(document.getElementsByClassName("jama-item-user")).forEach(function (element) {
        element.addEventListener("click", function (evt) {
            evt.preventDefault();
            deactivateUsersItems();
            evt.target.classList.add("active");
            getAccessRights();
        })
    });
</script>
</body>
</html>
 No newline at end of file