Refactor Done and Delete actions in list and detail views

This commit is contained in:
Scot Hacker 2018-04-08 00:49:01 -07:00
parent 4fe3829b98
commit 9098e3f0d4
7 changed files with 108 additions and 141 deletions

View file

@ -12,6 +12,7 @@ from django.db.models import Q
from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render, redirect
from django.template.loader import render_to_string
from django.urls import reverse
from django.utils import timezone
from django.utils.text import slugify
from django.views.decorators.csrf import csrf_exempt
@ -19,8 +20,6 @@ from django.views.decorators.csrf import csrf_exempt
from todo.forms import AddTaskListForm, AddEditTaskForm, AddExternalTaskForm, SearchForm
from todo.models import Task, TaskList, Comment
from todo.utils import (
toggle_done,
toggle_deleted,
send_notify_mail,
send_email_to_thread_participants,
)
@ -137,16 +136,6 @@ def list_detail(request, list_id=None, list_slug=None, view_completed=False):
else:
tasks = tasks.filter(completed=False)
if request.POST:
# Process completed and deleted tasks on each POST
results_changed = toggle_done(request.POST.getlist('toggle_done_tasks'))
for res in results_changed:
messages.success(request, res)
results_changed = toggle_deleted(request.POST.getlist('toggle_deleted_tasks'))
for res in results_changed:
messages.success(request, res)
# ######################
# Add New Task Form
# ######################
@ -382,7 +371,6 @@ def external_add(request) -> HttpResponse:
messages.warning(request, "Task saved but mail not sent. Contact your administrator.")
messages.success(request, "Your trouble ticket has been submitted. We'll get back to you soon.")
return redirect(settings.TODO_PUBLIC_SUBMIT_REDIRECT)
else:
@ -393,3 +381,51 @@ def external_add(request) -> HttpResponse:
}
return render(request, 'todo/add_task_external.html', context)
@login_required
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.
"""
task = get_object_or_404(Task, pk=task_id)
# Permissions
if not (
(task.created_by == request.user) or
(task.assigned_to == request.user) or
(task.task_list.group in request.user.groups.all())
):
raise PermissionDenied
tlist = task.task_list
task.completed = not task.completed
task.save()
messages.success(request, "Task status changed for '{}'".format(task.title))
return redirect(reverse('todo:list_detail', kwargs={"list_id": tlist.id, "list_slug": tlist.slug}))
@login_required
def delete_task(request, task_id: int) -> HttpResponse:
"""Delete specified task.
Redirect to the list from which the task came.
"""
task = get_object_or_404(Task, pk=task_id)
# Permissions
if not (
(task.created_by == request.user) or
(task.assigned_to == request.user) or
(task.task_list.group in request.user.groups.all())
):
raise PermissionDenied
tlist = task.task_list
task.delete()
messages.success(request, "Task '{}' has been deleted".format(task.title))
return redirect(reverse('todo:list_detail', kwargs={"list_id": tlist.id, "list_slug": tlist.slug}))