2019-03-11 07:04:19 +00:00
|
|
|
import bleach
|
2018-12-21 10:00:36 +00:00
|
|
|
import datetime
|
|
|
|
|
2019-03-11 07:04:19 +00:00
|
|
|
from django import forms
|
|
|
|
from django.conf import settings
|
2018-12-21 10:00:36 +00:00
|
|
|
from django.contrib import messages
|
2019-01-10 08:39:21 +00:00
|
|
|
from django.contrib.auth.decorators import login_required, user_passes_test
|
2018-12-21 10:00:36 +00:00
|
|
|
from django.core.exceptions import PermissionDenied
|
|
|
|
from django.http import HttpResponse
|
2019-03-11 07:04:19 +00:00
|
|
|
from django.shortcuts import get_object_or_404, redirect, render, redirect
|
|
|
|
from django.urls import reverse
|
|
|
|
from django.utils.decorators import method_decorator
|
2018-12-21 10:00:36 +00:00
|
|
|
|
|
|
|
from todo.forms import AddEditTaskForm
|
|
|
|
from todo.models import Comment, Task
|
2019-03-11 07:04:19 +00:00
|
|
|
from todo.utils import send_email_to_thread_participants, toggle_task_completed, staff_check, user_can_read_task
|
|
|
|
from todo.features import HAS_TASK_MERGE
|
|
|
|
|
|
|
|
|
|
|
|
if HAS_TASK_MERGE:
|
|
|
|
from dal import autocomplete
|
|
|
|
from todo.views.task_autocomplete import TaskAutocomplete
|
|
|
|
|
|
|
|
|
|
|
|
def handle_add_comment(request, task):
|
|
|
|
if not request.POST.get("add_comment"):
|
|
|
|
return
|
|
|
|
|
|
|
|
Comment.objects.create(
|
|
|
|
author=request.user,
|
|
|
|
task=task,
|
|
|
|
body=bleach.clean(request.POST["comment-body"], strip=True),
|
|
|
|
)
|
|
|
|
|
|
|
|
send_email_to_thread_participants(
|
|
|
|
task,
|
|
|
|
request.POST["comment-body"],
|
|
|
|
request.user,
|
|
|
|
subject='New comment posted on task "{}"'.format(task.title),
|
|
|
|
)
|
|
|
|
|
|
|
|
messages.success(
|
|
|
|
request, "Comment posted. Notification email sent to thread participants."
|
|
|
|
)
|
2018-12-21 10:00:36 +00:00
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2019-01-10 08:39:21 +00:00
|
|
|
@user_passes_test(staff_check)
|
2018-12-21 10:00:36 +00:00
|
|
|
def task_detail(request, task_id: int) -> HttpResponse:
|
|
|
|
"""View task details. Allow task details to be edited. Process new comments on task.
|
|
|
|
"""
|
|
|
|
|
|
|
|
task = get_object_or_404(Task, pk=task_id)
|
2019-03-11 07:04:19 +00:00
|
|
|
comment_list = Comment.objects.filter(task=task_id).order_by('-date')
|
2018-12-21 10:00:36 +00:00
|
|
|
|
|
|
|
# Ensure user has permission to view task. Admins can view all tasks.
|
|
|
|
# Get the group this task belongs to, and check whether current user is a member of that group.
|
2019-03-11 07:04:19 +00:00
|
|
|
if not user_can_read_task(task, request.user):
|
2018-12-21 10:00:36 +00:00
|
|
|
raise PermissionDenied
|
|
|
|
|
2019-03-11 07:04:19 +00:00
|
|
|
# Handle task merging
|
|
|
|
if not HAS_TASK_MERGE:
|
|
|
|
merge_form = None
|
|
|
|
else:
|
|
|
|
class MergeForm(forms.Form):
|
|
|
|
merge_target = forms.ModelChoiceField(
|
|
|
|
queryset=Task.objects.all(),
|
|
|
|
widget=autocomplete.ModelSelect2(
|
|
|
|
url=reverse("todo:task_autocomplete", kwargs={"task_id": task_id})
|
|
|
|
),
|
|
|
|
)
|
2018-12-21 10:00:36 +00:00
|
|
|
|
2019-03-11 07:04:19 +00:00
|
|
|
# Handle task merging
|
|
|
|
if not request.POST.get("merge_task_into"):
|
|
|
|
merge_form = MergeForm()
|
|
|
|
else:
|
|
|
|
merge_form = MergeForm(request.POST)
|
|
|
|
if merge_form.is_valid():
|
|
|
|
merge_target = merge_form.cleaned_data["merge_target"]
|
|
|
|
if not user_can_read_task(merge_target, request.user):
|
|
|
|
raise PermissionDenied
|
|
|
|
|
|
|
|
task.merge_into(merge_target)
|
|
|
|
return redirect(reverse(
|
|
|
|
"todo:task_detail",
|
|
|
|
kwargs={"task_id": merge_target.pk}
|
|
|
|
))
|
|
|
|
|
|
|
|
# Save submitted comments
|
|
|
|
handle_add_comment(request, task)
|
2018-12-21 10:00:36 +00:00
|
|
|
|
|
|
|
# Save task edits
|
2019-03-11 07:04:19 +00:00
|
|
|
if not request.POST.get("add_edit_task"):
|
2018-12-21 10:00:36 +00:00
|
|
|
form = AddEditTaskForm(
|
2019-03-11 07:04:19 +00:00
|
|
|
request.user, instance=task, initial={"task_list": task.task_list}
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
form = AddEditTaskForm(
|
|
|
|
request.user,
|
|
|
|
request.POST,
|
|
|
|
instance=task,
|
|
|
|
initial={"task_list": task.task_list},
|
2018-12-21 10:00:36 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
if form.is_valid():
|
|
|
|
item = form.save(commit=False)
|
|
|
|
item.note = bleach.clean(form.cleaned_data["note"], strip=True)
|
|
|
|
item.save()
|
|
|
|
messages.success(request, "The task has been edited.")
|
|
|
|
return redirect(
|
2019-03-11 07:04:19 +00:00
|
|
|
"todo:list_detail",
|
|
|
|
list_id=task.task_list.id,
|
|
|
|
list_slug=task.task_list.slug,
|
2018-12-21 10:00:36 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
# Mark complete
|
|
|
|
if request.POST.get("toggle_done"):
|
|
|
|
results_changed = toggle_task_completed(task.id)
|
|
|
|
if results_changed:
|
|
|
|
messages.success(request, f"Changed completion status for task {task.id}")
|
|
|
|
|
|
|
|
return redirect("todo:task_detail", task_id=task.id)
|
|
|
|
|
|
|
|
if task.due_date:
|
|
|
|
thedate = task.due_date
|
|
|
|
else:
|
|
|
|
thedate = datetime.datetime.now()
|
|
|
|
|
2019-03-11 07:04:19 +00:00
|
|
|
context = {
|
|
|
|
"task": task,
|
|
|
|
"comment_list": comment_list,
|
|
|
|
"form": form,
|
|
|
|
"merge_form": merge_form,
|
|
|
|
"thedate": thedate,
|
|
|
|
"comment_classes": getattr(settings, 'TODO_COMMENT_CLASSES', []),
|
|
|
|
}
|
2018-12-21 10:00:36 +00:00
|
|
|
|
|
|
|
return render(request, "todo/task_detail.html", context)
|