diff --git a/src/dashboard/page_views/__init__.py b/src/dashboard/page_views/__init__.py index 7621458..43bcee1 100644 --- a/src/dashboard/page_views/__init__.py +++ b/src/dashboard/page_views/__init__.py @@ -1,3 +1,4 @@ +from .board_permission_views import * from .epic_views import * from .external_views import * from .notification_views import * diff --git a/src/dashboard/page_views/board_permission_views.py b/src/dashboard/page_views/board_permission_views.py new file mode 100644 index 0000000..78f1e16 --- /dev/null +++ b/src/dashboard/page_views/board_permission_views.py @@ -0,0 +1,57 @@ +from django.contrib import messages +from django.db import IntegrityError +from django.shortcuts import get_object_or_404, redirect +from django.views.decorators.http import require_http_methods + +from src.projects.models import BoardRolePermission, Project + + +@require_http_methods(["GET", "POST"]) +def board_permissions(request, project_id): + project = get_object_or_404(Project, pk=project_id) + + if not request.user.is_admin: + messages.error( + request, "You do not have permission to manage board permissions." + ) + return redirect("project-board-project", project_id=project_id) + + if request.method == "POST": + role = request.POST.get("role", "").strip() + status_ids = request.POST.getlist("move_to_statuses") + + if role: + try: + perm, created = BoardRolePermission.objects.update_or_create( + project=project, + role=role, + ) + perm.move_to_statuses.set(status_ids) + messages.success(request, f"Permission saved for role '{role}'.") + except IntegrityError: + messages.error(request, "This permission already exists.") + else: + messages.error(request, "Role is required.") + + return redirect("project-board-project", project_id=project_id) + + return redirect("project-board-project", project_id=project_id) + + +@require_http_methods(["POST"]) +def board_permission_delete(request, project_id, permission_id): + project = get_object_or_404(Project, pk=project_id) + + if not request.user.is_admin: + messages.error( + request, "You do not have permission to manage board permissions." + ) + return redirect("project-board-project", project_id=project_id) + + permission = get_object_or_404( + BoardRolePermission, pk=permission_id, project=project + ) + permission.delete() + messages.success(request, "Permission deleted.") + + return redirect("project-board-project", project_id=project_id) diff --git a/src/dashboard/page_views/project_views.py b/src/dashboard/page_views/project_views.py index 935688b..a613c91 100644 --- a/src/dashboard/page_views/project_views.py +++ b/src/dashboard/page_views/project_views.py @@ -10,9 +10,11 @@ from django.urls import reverse from django.utils import timezone from django.views.decorators.http import require_http_methods +from src.accounts.models import ADMIN_ROLES +from src.accounts.models import User as AccountsUser from src.epics.models import Epic from src.notes.models import ProjectNote -from src.projects.models import Project, ProjectMember +from src.projects.models import BoardRolePermission, Project, ProjectMember from src.tickets.models import ( Ticket, TicketPriority, @@ -291,6 +293,11 @@ def project_detail(request, project_id): "today": today, "external_access": external_access, "is_admin": request.user.is_admin, + "permissions": BoardRolePermission.objects.filter(project=project).order_by( + "role" + ), + "role_choices": AccountsUser.ROLE_CHOICES, + "admin_roles": ADMIN_ROLES, }, )