123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- import datetime
- import os
- import bleach
- 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, render
- from tickets.queries import Query as q
- from tickets.defaults import defaults
- from tickets.forms import TicketForm
- from tickets.models import Attachment, Comment, Task
- from tickets.utils import (
- send_email_to_thread_participants,
- staff_check,
- user_can_read_task,
- send_notify_change_mail
- )
- 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.")
- @login_required
- @user_passes_test(staff_check)
- def task_detail(request, task_id: int) -> HttpResponse:
- """View task details. Allow task details to be edited. Process new comments on task.
- """
- ticket = get_object_or_404(Task.objects.select_related("created_by", "assigned_to"), pk=task_id)
- comment_list = Comment.objects.filter(task=task_id).order_by("-date")
- states_list = ticket.now_state_list()
- #q.get_tickets()
- # Ensure user has permission to view task. Superusers can view all tasks.
- # Get the group this task belongs to, and check whether current user is a member of that group.
- if not user_can_read_task(ticket, request.user):
- raise PermissionDenied
- # Save submitted comments
- handle_add_comment(request, ticket)
- # Save task edits
- if not request.POST.get("ticket_edit"):
- form = TicketForm(request.user, instance=ticket, initial={"task_list": ticket.task_list, "type_disabled": True})
- else:
- form = TicketForm(request.user, request.POST, instance=ticket, initial={"task_list": ticket.task_list, "type_disabled": True})
-
- if form.is_valid():
- edited_ticket = form.save(commit=False)
- edited_ticket.note = bleach.clean(form.cleaned_data["note"], strip=True)
- edited_ticket.title = bleach.clean(form.cleaned_data["title"], strip=True)
- edited_ticket.status = request.POST.get("state")
- edited_ticket.save()
- print(ticket)
- send_notify_change_mail(ticket, request.user)
- messages.success(request, "The task has been edited.")
- return redirect("tickets:list_detail", list_id=ticket.task_list.id, list_slug=ticket.task_list.slug)
- if ticket.due_date:
- thedate = ticket.due_date
- else:
- thedate = datetime.datetime.now()
- # Handle uploaded files
- if request.FILES.get("attachment_file_input"):
- file = request.FILES.get("attachment_file_input")
- if file.size > defaults("TICKETS_MAXIMUM_ATTACHMENT_SIZE"):
- messages.error(request, f"File exceeds maximum attachment size.")
- return redirect("tickets:task_detail", task_id=ticket.id)
- name, extension = os.path.splitext(file.name)
- if extension not in defaults("TICKETS_LIMIT_FILE_ATTACHMENTS"):
- messages.error(request, f"This site does not allow upload of {extension} files.")
- return redirect("tickets:task_detail", task_id=ticket.id)
- Attachment.objects.create(
- task=ticket, added_by=request.user, timestamp=datetime.datetime.now(), file=file
- )
- messages.success(request, f"File attached successfully")
- return redirect("tickets:task_detail", task_id=ticket.id)
- context = {
- "task": ticket,
- "states_list": states_list,
- "comment_list": comment_list,
- "form": form,
- "thedate": thedate,
- "comment_classes": defaults("TICKETS_COMMENT_CLASSES"),
- "attachments_enabled": defaults("TICKETS_ALLOW_FILE_ATTACHMENTS"),
- }
- return render(request, "tickets/task_detail.html", context)
|