# -*- encoding: utf-8 -*- import json from datetime import timedelta, datetime from django import template from django.contrib.auth.decorators import login_required from django.views.decorators.http import require_POST from django.http import HttpResponse, HttpResponseRedirect, JsonResponse from django.template import loader from django.shortcuts import render from django.urls import reverse from django.contrib.auth import get_user_model from django.views.generic import TemplateView from django.utils.decorators import method_decorator from apps.api.serializers import TicketSerializer from ..authentication.models import Department from .models import Ticket, TicketPriority, TicketTag class DashboardView(TemplateView): template_name = "home/dashboard.html" @method_decorator(login_required) def get(self, request, *args, **kwargs): return render(request, self.template_name) class TicketView(TemplateView): template_name = "home/tickets.html" @method_decorator(login_required) def get(self, request): priorities = TicketPriority.objects.all().order_by("order") tags = TicketTag.objects.all().order_by("order") departments = Department.objects.all().order_by("order") context = { "priorities": priorities, "tags": tags, "departments": departments } return render(request, "home/tickets.html", context) @login_required @require_POST def get_ticket(request): ticket = Ticket.objects.get(uuid=request.POST.get("ticket_uuid")) serializer = TicketSerializer(ticket) data = {"ticket": serializer.data} return JsonResponse(data) @login_required @require_POST def get_tickets(request): filters = json.loads(request.POST.get("filters", "{}")) queryset = Ticket.objects.all() for key, values in filters.items(): print(key, values) for value in values: if value == "all": continue # don't apply a filter if we want all queryset = queryset.filter(**{key: [value]}) tickets = queryset.order_by("-create_timestamp") serializer = TicketSerializer(tickets, many=True) data = {"tickets": serializer.data} return JsonResponse(data) @login_required @require_POST def get_filter_counts(request): priorities = TicketPriority.objects.all() tags = TicketTag.objects.all() departments = Department.objects.all() tickets = Ticket.objects.all() data = { "priority_counts": {}, "tag_counts": {}, "department_counts": {}, "ticket_count": tickets.count() } for priority in priorities: data["priority_counts"][str(priority.uuid)] = tickets.filter(priority=priority).count() for tag in tags: data["tag_counts"][str(tag.uuid)] = tickets.filter(tags__in=[tag]).count() for department in departments: data["department_counts"][str(department.uuid)] = tickets.filter(author__department=department).count() return JsonResponse(data) @login_required() @require_POST def new_ticket(request): print(request.POST) get = lambda key: request.POST.get(key) getlist = lambda key: request.POST.getlist(key) title = get("title") description = get("description") author_id = get("author_id") priority_id = get("priority_id") tag_ids = getlist("tag_ids[]") User = get_user_model() author = User.objects.get(id=author_id) priority = TicketPriority.objects.get(id=priority_id) tags = [ tag for tag in TicketTag.objects.filter(id__in=tag_ids) ] ticket = Ticket.objects.create( title=title, description=description, author=author, priority=priority, ) ticket.tags.set(tags) return JsonResponse({"success": "ticket created successfully"}) @login_required() def pages(request): context = {} # All resource paths end in .html. # Pick out the html file name from the url. And load that template. try: load_template = request.path.split('/')[-1] if load_template == 'admin': return HttpResponseRedirect(reverse('admin:index')) context['segment'] = load_template html_template = loader.get_template('home/' + load_template) return HttpResponse(html_template.render(context, request)) except template.TemplateDoesNotExist: html_template = loader.get_template('home/page-404.html') return HttpResponse(html_template.render(context, request)) except: html_template = loader.get_template('home/page-500.html') return HttpResponse(html_template.render(context, request))