task_detail.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import datetime
  2. import os
  3. import bleach
  4. from django.contrib import messages
  5. from django.contrib.auth.decorators import login_required, user_passes_test
  6. from django.core.exceptions import PermissionDenied
  7. from django.http import HttpResponse
  8. from django.shortcuts import get_object_or_404, redirect, render
  9. from tickets.queries import Query as q
  10. from tickets.defaults import defaults
  11. from tickets.forms import TicketForm
  12. from tickets.models import Attachment, Comment, Task
  13. from tickets.utils import (
  14. send_email_to_thread_participants,
  15. staff_check,
  16. user_can_read_task,
  17. send_notify_change_mail
  18. )
  19. def handle_add_comment(request, task):
  20. if not request.POST.get("add_comment"):
  21. return
  22. Comment.objects.create(
  23. author=request.user, task=task, body=bleach.clean(request.POST["comment-body"], strip=True)
  24. )
  25. send_email_to_thread_participants(
  26. task,
  27. request.POST["comment-body"],
  28. request.user,
  29. subject='New comment posted on task "{}"'.format(task.title),
  30. )
  31. messages.success(request, "Comment posted. Notification email sent to thread participants.")
  32. @login_required
  33. @user_passes_test(staff_check)
  34. def task_detail(request, task_id: int) -> HttpResponse:
  35. """View task details. Allow task details to be edited. Process new comments on task.
  36. """
  37. ticket = get_object_or_404(Task.objects.select_related("created_by", "assigned_to"), pk=task_id)
  38. comment_list = Comment.objects.filter(task=task_id).order_by("-date")
  39. states_list = ticket.now_state_list()
  40. #q.get_tickets()
  41. # Ensure user has permission to view task. Superusers can view all tasks.
  42. # Get the group this task belongs to, and check whether current user is a member of that group.
  43. if not user_can_read_task(ticket, request.user):
  44. raise PermissionDenied
  45. # Save submitted comments
  46. handle_add_comment(request, ticket)
  47. # Save task edits
  48. if not request.POST.get("ticket_edit"):
  49. form = TicketForm(request.user, instance=ticket, initial={"task_list": ticket.task_list, "type_disabled": True})
  50. else:
  51. form = TicketForm(request.user, request.POST, instance=ticket, initial={"task_list": ticket.task_list, "type_disabled": True})
  52. if form.is_valid():
  53. edited_ticket = form.save(commit=False)
  54. edited_ticket.note = bleach.clean(form.cleaned_data["note"], strip=True)
  55. edited_ticket.title = bleach.clean(form.cleaned_data["title"], strip=True)
  56. edited_ticket.status = request.POST.get("state")
  57. edited_ticket.save()
  58. print(ticket)
  59. send_notify_change_mail(ticket, request.user)
  60. messages.success(request, "The task has been edited.")
  61. return redirect("tickets:list_detail", list_id=ticket.task_list.id, list_slug=ticket.task_list.slug)
  62. if ticket.due_date:
  63. thedate = ticket.due_date
  64. else:
  65. thedate = datetime.datetime.now()
  66. # Handle uploaded files
  67. if request.FILES.get("attachment_file_input"):
  68. file = request.FILES.get("attachment_file_input")
  69. if file.size > defaults("TICKETS_MAXIMUM_ATTACHMENT_SIZE"):
  70. messages.error(request, f"File exceeds maximum attachment size.")
  71. return redirect("tickets:task_detail", task_id=ticket.id)
  72. name, extension = os.path.splitext(file.name)
  73. if extension not in defaults("TICKETS_LIMIT_FILE_ATTACHMENTS"):
  74. messages.error(request, f"This site does not allow upload of {extension} files.")
  75. return redirect("tickets:task_detail", task_id=ticket.id)
  76. Attachment.objects.create(
  77. task=ticket, added_by=request.user, timestamp=datetime.datetime.now(), file=file
  78. )
  79. messages.success(request, f"File attached successfully")
  80. return redirect("tickets:task_detail", task_id=ticket.id)
  81. context = {
  82. "task": ticket,
  83. "states_list": states_list,
  84. "comment_list": comment_list,
  85. "form": form,
  86. "thedate": thedate,
  87. "comment_classes": defaults("TICKETS_COMMENT_CLASSES"),
  88. "attachments_enabled": defaults("TICKETS_ALLOW_FILE_ATTACHMENTS"),
  89. }
  90. return render(request, "tickets/task_detail.html", context)