Moving to use API in home app

This commit is contained in:
Corban-Lee Jones 2024-01-14 01:51:56 +00:00
parent d8c608a03c
commit df82417790
3 changed files with 56 additions and 228 deletions

View File

@ -1,25 +1,20 @@
# -*- encoding: utf-8 -*-
from django.urls import path, re_path, include
from django.urls import path, include
from django.shortcuts import redirect
from apps.home import views
from .views import TicketView
def reverse_to_index(reqeust):
return redirect("dashboard")
urlpatterns = [
# The home page
path('', views.index, name='home'),
# Custom Dashboard
path("", reverse_to_index, name="index"),
path('dashboard/', views.dashboard, name="dashboard"),
path('tickets/', include([
path('', TicketView.as_view(), name="tickets"),
path('new/', views.new_ticket, name="ticket-new"),
path('get/', include([
path('one/', views.get_ticket, name="ticket-getone"),
path('many/', views.get_tickets, name="ticket-getmany"),
path("filtercounts/", views.get_filter_counts, name="ticket-getfiltercounts"),
])),
])),
# # Matches any html file

View File

@ -29,13 +29,11 @@ class TicketView(TemplateView):
@method_decorator(login_required)
def get(self, request):
tickets = Ticket.objects.all().order_by("-create_timestamp")
priorities = TicketPriority.objects.all()
tags = TicketTag.objects.all()
departments = Department.objects.all()
context = {
"tickets": tickets,
"priorities": priorities,
"tags": tags,
"departments": departments,
@ -44,108 +42,6 @@ class TicketView(TemplateView):
return render(request, "home/tickets.html", context)
# @method_decorator(login_required)
# @require_POST
# def fetch_ticket(self, request) -> JsonResponse:
# ticket = Ticket.objects.get(id=request.POST.get("ticket_id"))
# context = {"ticket": ticket.serialize()}
# return JsonResponse(context)
# @method_decorator(login_required)
# @require_POST
# def fetch_tickets(self, request) -> JsonResponse:
# 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")
# context = {"tickets": [ticket.serialize() for ticket in tickets]}
# return JsonResponse(context)
# @method_decorator(login_required)
# @require_POST
# def fetch_filter_counts(self, request) -> JsonResponse:
# priorities = TicketPriority.objects.all()
# tags = TicketTag.objects.all()
# departments = Department.objects.all()
# tickets = Ticket.objects.all()
# context = {
# "priority_counts": {},
# "tag_counts": {},
# "department_counts": {},
# "ticket_count": tickets.count()
# }
# for priority in priorities:
# priority_count = tickets.filter(priority=priority).count()
# context["priority_counts"][str(priority.id)] = priority_count
# for tag in tags:
# tag_count = tickets.filter(tags__in=[tag]).count()
# context["tag_counts"][str(tag.id)] = tag_count
# for department in departments:
# department_count = tickets.filter(author__department=department).count()
# context["department_counts"][str(department.id)] = department_count
# return JsonResponse(context)
# @method_decorator(login_required)
# @require_POST
# def new_ticket(self, request) -> JsonResponse:
# getall = lambda *keys: [request.POST.get(key) for key in keys]
# getlist = lambda key: request.POST.getlist(key)
# title, description, author_id, priority_id = getall(
# "title", "description", "author_id", "priority_id"
# )
# tag_ids = getlist("tag_ids[]")
# author = get_user_model().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 tickets(request):
tickets = Ticket.objects.all().order_by("-create_timestamp")
priorities = TicketPriority.objects.all()
tags = TicketTag.objects.all()
departments = Department.objects.all()
context = {
"tickets": tickets,
"priorities": priorities,
"tags": tags,
"departments": departments,
"dayago": datetime.now() - timedelta(hours=24)
}
return render(request, "home/tickets.html", context)
@login_required
@require_POST
@ -239,14 +135,6 @@ def new_ticket(request):
return JsonResponse({"success": "ticket created successfully"})
@login_required()
def index(request):
context = {'segment': 'index'}
html_template = loader.get_template('home/index.html')
return HttpResponse(html_template.render(context, request))
@login_required()
def pages(request):
context = {}

View File

@ -123,59 +123,35 @@
<div class="email-list h-100 layers">
<div class="layer w-100">
<div class="bgc-grey-100 peers ai-c p-20 fxw-nw">
<div class="peer me-auto">
<div class="btn-group" role="group">
<button type="button" class="email-side-toggle d-n@md+ btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-menu"></i>
</button>
<button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-folder"></i>
</button>
<button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-tag"></i>
</button>
<div class="peer me-auto">
<div class="btn-group" role="group">
<button id="btnGroupDrop1" type="button" class="btn cur-p bgc-white no-after dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="ti-more-alt"></i>
<button type="button" class="email-side-toggle d-n@md+ btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-menu"></i>
</button>
<!-- <button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-tag"></i>
</button> -->
<button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p" onclick="javascript:loadAllTickets();">
<i class="fa fa-refresh"></i>
</button>
<ul class="dropdown-menu fsz-sm" aria-labelledby="btnGroupDrop1">
<li>
<a href="" class="d-b td-n pY-5 pX-10 bgcH-grey-100 c-grey-700">
<i class="ti-trash mR-10"></i>
<span>Delete</span>
</a>
</li>
<li>
<a href="" class="d-b td-n pY-5 pX-10 bgcH-grey-100 c-grey-700">
<i class="ti-alert mR-10"></i>
<span>Mark as Spam</span>
</a>
</li>
<li>
<a href="" class="d-b td-n pY-5 pX-10 bgcH-grey-100 c-grey-700">
<i class="ti-star mR-10"></i>
<span>Star</span>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="peer">
<div class="btn-group" role="group">
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-angle-left"></i>
</button>
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-angle-right"></i>
</button>
<div class="peer">
Showing <span id="ticketCount" class="fw-bolder"></span> Results
<!-- <div class="btn-group" role="group">
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-angle-left"></i>
</button>
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-angle-right"></i>
</button>
</div> -->
</div>
</div>
</div>
</div>
<div class="layer w-100">
<div class="bdT bdB">
<input type="text" class="form-control m-0 bdw-0 pY-15 pX-20 bdrs-0" placeholder="Search...">
<input type="text" class="form-control m-0 bdw-0 pY-15 pX-20 bdrs-0" placeholder="Search...">
</div>
</div>
@ -187,50 +163,25 @@
<div class="bgc-grey-100 peers ai-c jc-sb p-20 fxw-nw d-n@md+">
<div class="peer">
<div class="btn-group" role="group">
<button type="button" class="back-to-mailbox btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-angle-left"></i>
</button>
<button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-folder"></i>
</button>
<button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-tag"></i>
</button>
<div class="btn-group" role="group">
<button id="btnGroupDrop1" type="button" class="btn cur-p bgc-white no-after dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="ti-more-alt"></i>
<button type="button" class="back-to-mailbox btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-angle-left"></i>
</button>
<button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p" onclick="javascript:loadAllTickets();">
<i class="fa fa-refresh"></i>
</button>
<button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-more-alt"></i>
</button>
<ul class="dropdown-menu fsz-sm" aria-labelledby="btnGroupDrop1">
<li>
<a href="" class="d-b td-n pY-5 pX-10 bgcH-grey-100 c-grey-700">
<i class="ti-trash mR-10"></i>
<span>Delete</span>
</a>
</li>
<li>
<a href="" class="d-b td-n pY-5 pX-10 bgcH-grey-100 c-grey-700">
<i class="ti-alert mR-10"></i>
<span>Mark as Spam</span>
</a>
</li>
<li>
<a href="" class="d-b td-n pY-5 pX-10 bgcH-grey-100 c-grey-700">
<i class="ti-star mR-10"></i>
<span>Star</span>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="peer">
<div class="btn-group" role="group">
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-angle-left"></i>
</button>
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-angle-right"></i>
</button>
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-angle-left"></i>
</button>
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
<i class="ti-angle-right"></i>
</button>
</div>
</div>
</div>
@ -247,7 +198,7 @@
<div id="ticketBadges" style="display: none;"></div>
</div>
</div>
<div class="peer">
<!-- <div class="peer">
<div class="btn-group" role="group">
<button id="btnGroupDrop2" class="btn btn-danger c-white bdrs-50p p-15 lh-0" style="display: none;" type="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="ti-menu"></i>
@ -256,7 +207,7 @@
test
</ul>
</div>
</div>
</div> -->
</div>
<!-- Content -->
@ -494,12 +445,8 @@
function loadFilterCounts() {
$.ajax({
url: "{% url 'ticket-getfiltercounts' %}",
type: "POST",
dataType: "json",
data: {
csrfmiddlewaretoken: "{{ csrf_token }}"
},
url: "{% url 'api:filter-counts' %}",
type: "GET",
success: function(data) {
console.log(JSON.stringify(data, null, 4));
@ -507,6 +454,7 @@
updateFilterCounts('tag', data);
updateFilterCounts('department', data);
$("#filterPriorityAll .badge").text(data.ticket_count);
$("#ticketCount").text(data.ticket_count)
},
error: function(data) {
@ -517,19 +465,17 @@
function loadAllTickets() {
$("#ticketsContainer").empty();
// alert(JSON.stringify(filters, null, 4));
$.ajax({
url: "{% url 'ticket-getmany' %}",
type: "POST",
url: "{% url 'api:ticket' %}",
type: "GET",
dataType: "json",
data: {
csrfmiddlewaretoken: "{{ csrf_token }}",
filters: JSON.stringify(filters)
},
data: filters,
success: function(data) {
console.log(JSON.stringify(data, null, 4))
data.tickets.forEach(function(ticket) {
data.forEach(function(ticket) {
var timestamp = new Date(ticket.timestamp);
var formattedTime;
@ -583,10 +529,10 @@
});
},
error: function(data) {
alert(JSON.stringify(data, null, 4))
alert(JSON.stringify(data, null, 4));
console.error(`${data.responseJSON.error}\n${data.responseJSON.detail}`);
}
});
}
function displayTicket(ticketElement) {
@ -621,17 +567,16 @@
displayedTicketID = ticketID;
$.ajax({
url: `{% url 'ticket-getone' %}`,
type: 'POST',
url: `{% url 'api:ticket' %}`,
type: 'get',
dataType: 'json',
data: {
csrfmiddlewaretoken: '{{ csrf_token }}',
ticket_uuid: ticketID
uuid__in: [ticketID]
},
success: function (data) {
console.log(JSON.stringify(data, null, 4));
var ticket = data.ticket;
var ticket = data[0];
var author = ticket.author;
var department = author.department;
var priority = ticket.priority;