Free and open source ticket system written in python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at feat/minor-fixes 112 lines 4.9 kB view raw
1from django.shortcuts import render, redirect 2from django.contrib.auth.decorators import login_required 3from django.shortcuts import get_object_or_404 4from .models import Ticket, Template 5from django.db.models import Q 6from .forms import CommentForm, TicketForm, TemplateForm, TeamAssignmentForm, CategoryAssignmentForm 7 8 9@login_required 10def show_tickets(request): 11 tickets = Ticket.get_open_tickets(request.user).order_by("priority", "-updated_at") 12 return render(request, "ticketing/tickets.html", {"tickets": tickets}) 13 14 15@login_required 16def show_tickets_history(request): 17 tickets = Ticket.get_closed_tickets(request.user).order_by("priority", "-updated_at") 18 return render(request, "ticketing/tickets_history.html", {"tickets": tickets}) 19 20 21@login_required 22def show_ticket(request, ticket_id): 23 ticket = get_object_or_404(Ticket, pk=ticket_id) 24 can_edit = ticket.can_edit(request.user) 25 # comment_templates = Template.objects.filter(category=ticket.category) 26 27 if not ticket.can_open(request.user): 28 return redirect("all_tickets") 29 30 form, template_form, team_assignment_form, category_assignment_form = CommentForm( 31 ), TemplateForm(), TeamAssignmentForm(), CategoryAssignmentForm() 32 33 if request.method == "POST": 34 if 'apply_template' in request.POST and can_edit: 35 template_form = TemplateForm(request.POST) 36 if template_form.is_valid(): 37 template = template_form.cleaned_data["template_select"] 38 form = CommentForm(initial={"text": template.content}) 39 elif 'assign_to_team' in request.POST and can_edit: 40 team_assignment_form = TeamAssignmentForm(request.POST) 41 if team_assignment_form.is_valid(): 42 ticket.assign_to_team( 43 team_assignment_form.cleaned_data["team_select"]) 44 elif 'assign_to_category' in request.POST and can_edit: 45 category_assignment_form = CategoryAssignmentForm(request.POST) 46 if category_assignment_form.is_valid(): 47 ticket.category = category_assignment_form.cleaned_data["category_select"] 48 ticket.save() 49 elif 'assign_self' in request.POST and can_edit: 50 ticket.assigned_to = request.user 51 ticket.save() 52 elif 'reopen_ticket' in request.POST and can_edit: 53 ticket.status = Ticket.Status.IN_PROGRESS 54 ticket.save() 55 else: 56 form = CommentForm(request.POST, request.FILES) 57 if form.is_valid(): 58 ticket.comment_set.create( 59 user=request.user, ticket=ticket, 60 text=form.cleaned_data["text"], is_only_for_staff=form.cleaned_data["hidden_from_client"] 61 ) 62 # Add attachments 63 if form.cleaned_data["attachments"]: 64 for file in form.cleaned_data["attachments"]: 65 ticket.fileattachment_set.create(file=file) 66 67 if 'close' in request.POST and can_edit: 68 ticket.close_ticket() 69 return redirect("ticket_detail", ticket_id=ticket.id) 70 71 comments = ticket.comment_set.all() 72 context = { 73 "ticket": ticket, "comments": comments, "attachments": [attachment.file for attachment in ticket.fileattachment_set.all()], 74 "form": form, "template_form": template_form, 75 "team_assignment_form": team_assignment_form, "category_assignment_form": category_assignment_form, 76 "can_edit": can_edit 77 } 78 return render(request, "ticketing/ticket_detail.html", context) 79 80 81@login_required 82def create_ticket(request): 83 84 has_closed_tickets = Ticket.objects.filter( 85 user=request.user, status=Ticket.Status.CLOSED).exists() 86 87 if request.method == "POST": 88 form = TicketForm(request.user, request.POST, request.FILES) 89 if form.is_valid(): 90 ticket = form.save(commit=False) 91 ticket.user = request.user 92 ticket.save() 93 94 # Add attachments 95 if form.cleaned_data["attachments"]: 96 for file in form.cleaned_data["attachments"]: 97 ticket.fileattachment_set.create(file=file) 98 99 return redirect("ticket_detail", ticket_id=ticket.id) 100 else: 101 form = TicketForm(request.user) 102 return render(request, "ticketing/create_ticket.html", {"form": form, "has_closed_tickets": has_closed_tickets}) 103 104 105@login_required 106def dashboard(request): 107 108 tickets = Ticket.objects.all().order_by("-created_at") 109 open_tickets = tickets.filter(status=Ticket.Status.OPEN) 110 in_progress_tickets = tickets.filter(status=Ticket.Status.IN_PROGRESS) 111 closed_tickets = tickets.filter(status=Ticket.Status.CLOSED) 112 return render(request, "ticketing/dashboard.html", {"tickets": tickets, "open_tickets": open_tickets, "in_progress_tickets": in_progress_tickets, "closed_tickets": closed_tickets})