Free and open source ticket system written in python
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})