123456789101112131415161718192021222324252627282930313233343536373839404142 |
- from django.contrib import messages
- from django.contrib.auth.decorators import login_required, user_passes_test
- from django.core.exceptions import PermissionDenied
- from django.http import HttpResponse
- from django.shortcuts import get_object_or_404, redirect
- from django.urls import reverse
- from tickets.models import Task
- from tickets.utils import change_task_status
- from tickets.utils import staff_check
- @login_required
- @user_passes_test(staff_check)
- def change_status(request, task_id: int) -> HttpResponse:
- """Toggle the completed status of a task from done to undone, or vice versa.
- Redirect to the list from which the task came.
- """
- if request.method == "POST":
- task = get_object_or_404(Task, pk=task_id)
- redir_url = reverse(
- "tickets:list_detail",
- kwargs={"list_id": task.task_list.id, "list_slug": task.task_list.slug},
- )
- # Permissions
- if not (
- (task.created_by == request.user)
- or (request.user.is_superuser)
- or (task.assigned_to == request.user)
- or (task.task_list.group in request.user.groups.all())
- ):
- raise PermissionDenied
- change_task_status(task.id, request.POST["select-status"])
- messages.success(request, "Task status changed for '{}'".format(task.title))
- return redirect(redir_url)
- else:
- raise PermissionDenied
|