Moving to use API in home app
This commit is contained in:
parent
d8c608a03c
commit
df82417790
@ -1,25 +1,20 @@
|
|||||||
# -*- encoding: utf-8 -*-
|
# -*- 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 apps.home import views
|
||||||
from .views import TicketView
|
from .views import TicketView
|
||||||
|
|
||||||
|
def reverse_to_index(reqeust):
|
||||||
|
return redirect("dashboard")
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
path("", reverse_to_index, name="index"),
|
||||||
# The home page
|
|
||||||
path('', views.index, name='home'),
|
|
||||||
|
|
||||||
# Custom Dashboard
|
|
||||||
path('dashboard/', views.dashboard, name="dashboard"),
|
path('dashboard/', views.dashboard, name="dashboard"),
|
||||||
path('tickets/', include([
|
path('tickets/', include([
|
||||||
path('', TicketView.as_view(), name="tickets"),
|
path('', TicketView.as_view(), name="tickets"),
|
||||||
path('new/', views.new_ticket, name="ticket-new"),
|
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
|
# # Matches any html file
|
||||||
|
@ -29,13 +29,11 @@ class TicketView(TemplateView):
|
|||||||
|
|
||||||
@method_decorator(login_required)
|
@method_decorator(login_required)
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
tickets = Ticket.objects.all().order_by("-create_timestamp")
|
|
||||||
priorities = TicketPriority.objects.all()
|
priorities = TicketPriority.objects.all()
|
||||||
tags = TicketTag.objects.all()
|
tags = TicketTag.objects.all()
|
||||||
departments = Department.objects.all()
|
departments = Department.objects.all()
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
"tickets": tickets,
|
|
||||||
"priorities": priorities,
|
"priorities": priorities,
|
||||||
"tags": tags,
|
"tags": tags,
|
||||||
"departments": departments,
|
"departments": departments,
|
||||||
@ -44,108 +42,6 @@ class TicketView(TemplateView):
|
|||||||
|
|
||||||
return render(request, "home/tickets.html", context)
|
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
|
@login_required
|
||||||
@require_POST
|
@require_POST
|
||||||
@ -239,14 +135,6 @@ def new_ticket(request):
|
|||||||
return JsonResponse({"success": "ticket created successfully"})
|
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()
|
@login_required()
|
||||||
def pages(request):
|
def pages(request):
|
||||||
context = {}
|
context = {}
|
||||||
|
@ -123,59 +123,35 @@
|
|||||||
<div class="email-list h-100 layers">
|
<div class="email-list h-100 layers">
|
||||||
<div class="layer w-100">
|
<div class="layer w-100">
|
||||||
<div class="bgc-grey-100 peers ai-c p-20 fxw-nw">
|
<div class="bgc-grey-100 peers ai-c p-20 fxw-nw">
|
||||||
<div class="peer me-auto">
|
<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="btn-group" role="group">
|
<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">
|
<button type="button" class="email-side-toggle d-n@md+ btn bgc-white bdrs-2 mR-3 cur-p">
|
||||||
<i class="ti-more-alt"></i>
|
<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>
|
</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>
|
||||||
</div>
|
<div class="peer">
|
||||||
<div class="peer">
|
Showing <span id="ticketCount" class="fw-bolder"></span> Results
|
||||||
<div class="btn-group" role="group">
|
<!-- <div class="btn-group" role="group">
|
||||||
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
|
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
|
||||||
<i class="ti-angle-left"></i>
|
<i class="ti-angle-left"></i>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
|
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
|
||||||
<i class="ti-angle-right"></i>
|
<i class="ti-angle-right"></i>
|
||||||
</button>
|
</button>
|
||||||
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="layer w-100">
|
<div class="layer w-100">
|
||||||
<div class="bdT bdB">
|
<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>
|
||||||
</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="bgc-grey-100 peers ai-c jc-sb p-20 fxw-nw d-n@md+">
|
||||||
<div class="peer">
|
<div class="peer">
|
||||||
<div class="btn-group" role="group">
|
<div class="btn-group" role="group">
|
||||||
<button type="button" class="back-to-mailbox btn bgc-white bdrs-2 mR-3 cur-p">
|
<button type="button" class="back-to-mailbox btn bgc-white bdrs-2 mR-3 cur-p">
|
||||||
<i class="ti-angle-left"></i>
|
<i class="ti-angle-left"></i>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p">
|
<button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p" onclick="javascript:loadAllTickets();">
|
||||||
<i class="ti-folder"></i>
|
<i class="fa fa-refresh"></i>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p">
|
<button type="button" class="btn bgc-white bdrs-2 mR-3 cur-p">
|
||||||
<i class="ti-tag"></i>
|
<i class="ti-more-alt"></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>
|
</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>
|
</div>
|
||||||
<div class="peer">
|
<div class="peer">
|
||||||
<div class="btn-group" role="group">
|
<div class="btn-group" role="group">
|
||||||
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
|
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
|
||||||
<i class="ti-angle-left"></i>
|
<i class="ti-angle-left"></i>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
|
<button type="button" class="fsz-xs btn bgc-white bdrs-2 mR-3 cur-p">
|
||||||
<i class="ti-angle-right"></i>
|
<i class="ti-angle-right"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -247,7 +198,7 @@
|
|||||||
<div id="ticketBadges" style="display: none;"></div>
|
<div id="ticketBadges" style="display: none;"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="peer">
|
<!-- <div class="peer">
|
||||||
<div class="btn-group" role="group">
|
<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">
|
<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>
|
<i class="ti-menu"></i>
|
||||||
@ -256,7 +207,7 @@
|
|||||||
test
|
test
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Content -->
|
<!-- Content -->
|
||||||
@ -494,12 +445,8 @@
|
|||||||
|
|
||||||
function loadFilterCounts() {
|
function loadFilterCounts() {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "{% url 'ticket-getfiltercounts' %}",
|
url: "{% url 'api:filter-counts' %}",
|
||||||
type: "POST",
|
type: "GET",
|
||||||
dataType: "json",
|
|
||||||
data: {
|
|
||||||
csrfmiddlewaretoken: "{{ csrf_token }}"
|
|
||||||
},
|
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
console.log(JSON.stringify(data, null, 4));
|
console.log(JSON.stringify(data, null, 4));
|
||||||
|
|
||||||
@ -507,6 +454,7 @@
|
|||||||
updateFilterCounts('tag', data);
|
updateFilterCounts('tag', data);
|
||||||
updateFilterCounts('department', data);
|
updateFilterCounts('department', data);
|
||||||
$("#filterPriorityAll .badge").text(data.ticket_count);
|
$("#filterPriorityAll .badge").text(data.ticket_count);
|
||||||
|
$("#ticketCount").text(data.ticket_count)
|
||||||
|
|
||||||
},
|
},
|
||||||
error: function(data) {
|
error: function(data) {
|
||||||
@ -517,19 +465,17 @@
|
|||||||
|
|
||||||
function loadAllTickets() {
|
function loadAllTickets() {
|
||||||
$("#ticketsContainer").empty();
|
$("#ticketsContainer").empty();
|
||||||
|
// alert(JSON.stringify(filters, null, 4));
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "{% url 'ticket-getmany' %}",
|
url: "{% url 'api:ticket' %}",
|
||||||
type: "POST",
|
type: "GET",
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
data: {
|
data: filters,
|
||||||
csrfmiddlewaretoken: "{{ csrf_token }}",
|
|
||||||
filters: JSON.stringify(filters)
|
|
||||||
},
|
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
console.log(JSON.stringify(data, null, 4))
|
console.log(JSON.stringify(data, null, 4))
|
||||||
|
|
||||||
data.tickets.forEach(function(ticket) {
|
data.forEach(function(ticket) {
|
||||||
var timestamp = new Date(ticket.timestamp);
|
var timestamp = new Date(ticket.timestamp);
|
||||||
var formattedTime;
|
var formattedTime;
|
||||||
|
|
||||||
@ -583,10 +529,10 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
error: function(data) {
|
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) {
|
function displayTicket(ticketElement) {
|
||||||
@ -621,17 +567,16 @@
|
|||||||
displayedTicketID = ticketID;
|
displayedTicketID = ticketID;
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: `{% url 'ticket-getone' %}`,
|
url: `{% url 'api:ticket' %}`,
|
||||||
type: 'POST',
|
type: 'get',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
data: {
|
data: {
|
||||||
csrfmiddlewaretoken: '{{ csrf_token }}',
|
uuid__in: [ticketID]
|
||||||
ticket_uuid: ticketID
|
|
||||||
},
|
},
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
console.log(JSON.stringify(data, null, 4));
|
console.log(JSON.stringify(data, null, 4));
|
||||||
|
|
||||||
var ticket = data.ticket;
|
var ticket = data[0];
|
||||||
var author = ticket.author;
|
var author = ticket.author;
|
||||||
var department = author.department;
|
var department = author.department;
|
||||||
var priority = ticket.priority;
|
var priority = ticket.priority;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user