change_status.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. from django.contrib import messages
  2. from django.contrib.auth.decorators import login_required, user_passes_test
  3. from django.core.exceptions import PermissionDenied
  4. from django.http import HttpResponse
  5. from django.shortcuts import get_object_or_404, redirect
  6. from django.urls import reverse
  7. from tickets.models import Task
  8. from tickets.utils import change_task_status
  9. from tickets.utils import staff_check
  10. @login_required
  11. @user_passes_test(staff_check)
  12. def change_status(request, task_id: int) -> HttpResponse:
  13. """Toggle the completed status of a task from done to undone, or vice versa.
  14. Redirect to the list from which the task came.
  15. """
  16. if request.method == "POST":
  17. task = get_object_or_404(Task, pk=task_id)
  18. redir_url = reverse(
  19. "tickets:list_detail",
  20. kwargs={"list_id": task.task_list.id, "list_slug": task.task_list.slug},
  21. )
  22. # Permissions
  23. if not (
  24. (task.created_by == request.user)
  25. or (request.user.is_superuser)
  26. or (task.assigned_to == request.user)
  27. or (task.task_list.group in request.user.groups.all())
  28. ):
  29. raise PermissionDenied
  30. change_task_status(task.id, request.POST["select-status"])
  31. messages.success(request, "Task status changed for '{}'".format(task.title))
  32. return redirect(redir_url)
  33. else:
  34. raise PermissionDenied