43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
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 todo.models import Task
|
|
from todo.utils import toggle_task_completed
|
|
from todo.utils import staff_check
|
|
|
|
|
|
@login_required
|
|
@user_passes_test(staff_check)
|
|
def toggle_done(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(
|
|
"todo: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
|
|
|
|
toggle_task_completed(task.id)
|
|
messages.success(request, "Task status changed for '{}'".format(task.title))
|
|
|
|
return redirect(redir_url)
|
|
|
|
else:
|
|
raise PermissionDenied
|