Modified: views and and urlconf
This commit is contained in:
parent
89acf8e8bb
commit
941a4979f8
@ -32,15 +32,20 @@ $(function () {
|
|||||||
$("#ticket-state").click(function () {
|
$("#ticket-state").click(function () {
|
||||||
console.log('Press');
|
console.log('Press');
|
||||||
let resolved = false;
|
let resolved = false;
|
||||||
if ($(this).attr("checked")) {
|
let ticket_state_url = $(this).attr("ticket-state-url")
|
||||||
|
if ($(this).attr("ticket-state-switch") === "1") {
|
||||||
console.log('Find it!!!')
|
console.log('Find it!!!')
|
||||||
resolved = true;
|
resolved = true;
|
||||||
|
$(this).attr("ticket-state-switch", "0"); // disable
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
resolved = false;
|
resolved = false;
|
||||||
|
$(this).attr("ticket-state-switch", "1"); // enable
|
||||||
}
|
}
|
||||||
|
console.log(resolved)
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "post",
|
type: "post",
|
||||||
url: $(this).attr("ticket-state-url"),
|
url: ticket_state_url,
|
||||||
headers: {
|
headers: {
|
||||||
"X-CSRFToken":CSRF,
|
"X-CSRFToken":CSRF,
|
||||||
"Content-Type":"application/json"
|
"Content-Type":"application/json"
|
||||||
|
@ -20,7 +20,8 @@
|
|||||||
type="checkbox"
|
type="checkbox"
|
||||||
role="switch"
|
role="switch"
|
||||||
id="ticket-state"
|
id="ticket-state"
|
||||||
ticket-state-url="{% url 'ticket' ticket.platform ticket.number %}"
|
ticket-state-url="{% url 'ajax_update_state_ticket' ticket.platform ticket.number %}"
|
||||||
|
{% if ticket.resolved %} ticket-state-switch="1" {% endif %}
|
||||||
{% if ticket.resolved %} checked {% endif %}>
|
{% if ticket.resolved %} checked {% endif %}>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xl-6 mb-2">
|
<div class="col-xl-6 mb-2">
|
||||||
@ -156,7 +157,7 @@
|
|||||||
>Cancel</button>
|
>Cancel</button>
|
||||||
<a
|
<a
|
||||||
type="button"
|
type="button"
|
||||||
href="{% url 'delete' ticket.number %}"
|
href="{% url 'ajax_delete_ticket' ticket.number %}"
|
||||||
class="btn btn-danger btn-ticket-del"
|
class="btn btn-danger btn-ticket-del"
|
||||||
data-bs-dismiss="modal"
|
data-bs-dismiss="modal"
|
||||||
data-jq-ticket-del-redirect="{% url 'tickets' %}"
|
data-jq-ticket-del-redirect="{% url 'tickets' %}"
|
||||||
|
@ -4,6 +4,12 @@ from . import views
|
|||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
||||||
|
# █░█░█ █▀▀ █▄▄
|
||||||
|
# ▀▄▀▄▀ ██▄ █▄█
|
||||||
|
# -- -- -- -- --
|
||||||
|
|
||||||
|
# READ:
|
||||||
path(
|
path(
|
||||||
'',
|
'',
|
||||||
views.ListAllTickets.as_view(),
|
views.ListAllTickets.as_view(),
|
||||||
@ -24,14 +30,26 @@ urlpatterns = [
|
|||||||
views.DetailTicket.as_view(),
|
views.DetailTicket.as_view(),
|
||||||
name='ticket'
|
name='ticket'
|
||||||
),
|
),
|
||||||
path(
|
|
||||||
'tickets/delete/<int:ticket>/',
|
|
||||||
views.AjaxDeleteTicketHandler.as_view(),
|
|
||||||
name='delete'
|
|
||||||
),
|
|
||||||
path(
|
path(
|
||||||
'archives/<path:path>',
|
'archives/<path:path>',
|
||||||
views.ArchiveHandlerView.as_view(),
|
views.ArchiveHandlerView.as_view(),
|
||||||
name="download"
|
name="download"
|
||||||
),
|
),
|
||||||
|
|
||||||
|
# ▄▀█ ░░█ ▄▀█ ▀▄▀
|
||||||
|
# █▀█ █▄█ █▀█ █░█
|
||||||
|
# -- -- -- -- --
|
||||||
|
|
||||||
|
# UPDATE:
|
||||||
|
path(
|
||||||
|
'ajax/tickets/update/<slug:platform>/<int:ticket>/',
|
||||||
|
views.UpdateTicketStateHandler.as_view(),
|
||||||
|
name='ajax_update_state_ticket'
|
||||||
|
),
|
||||||
|
# DELETE:
|
||||||
|
path(
|
||||||
|
'ajax/tickets/delete/<int:ticket>/',
|
||||||
|
views.DeleteTicketHandler.as_view(),
|
||||||
|
name='ajax_delete_ticket'
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
@ -19,5 +19,5 @@ def get_file_size(file_path, unit='bytes'):
|
|||||||
|
|
||||||
|
|
||||||
def is_ajax(request):
|
def is_ajax(request):
|
||||||
if request.headers.get('x-requested-with') == 'XMLHttpRequest':
|
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
|
||||||
return True
|
return True
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
import json
|
import json
|
||||||
# from django.shortcuts import render, redirect
|
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.http import FileResponse, HttpResponseNotAllowed, JsonResponse
|
from django.http import FileResponse, JsonResponse
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
from django.shortcuts import get_object_or_404
|
from django.views.generic.detail import SingleObjectMixin
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
|
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
@ -13,30 +12,20 @@ from .models import Archive, Ticket, Platform
|
|||||||
from .utils import is_ajax
|
from .utils import is_ajax
|
||||||
|
|
||||||
|
|
||||||
class ArchiveHandlerView(LoginRequiredMixin, generic.View):
|
class ArchiveHandlerView(LoginRequiredMixin, SingleObjectMixin, generic.View):
|
||||||
|
model = Archive
|
||||||
|
slug_field = 'file'
|
||||||
|
slug_url_kwarg = 'path'
|
||||||
|
|
||||||
def get(self, request, path):
|
def get(self, request, path):
|
||||||
file = get_object_or_404(Archive, file=path)
|
self.object = self.get_object()
|
||||||
return FileResponse(file.file)
|
return FileResponse(self.object.file)
|
||||||
|
|
||||||
def delete(self, request, path):
|
def delete(self, request, path):
|
||||||
try:
|
if is_ajax(request):
|
||||||
file = Archive.objects.get(file=path)
|
self.object = self.get_object()
|
||||||
file.delete()
|
self.object.delete()
|
||||||
return JsonResponse(
|
return JsonResponse({'file': path}, status=status.HTTP_200_OK)
|
||||||
{
|
|
||||||
'file': path,
|
|
||||||
'status': status.HTTP_200_OK
|
|
||||||
},
|
|
||||||
status=status.HTTP_200_OK
|
|
||||||
)
|
|
||||||
except Archive.DoesNotExist:
|
|
||||||
return JsonResponse(
|
|
||||||
{
|
|
||||||
'file': path,
|
|
||||||
'status': status.HTTP_204_NO_CONTENT
|
|
||||||
},
|
|
||||||
status=status.HTTP_204_NO_CONTENT
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class ListAllTickets(generic.ListView):
|
class ListAllTickets(generic.ListView):
|
||||||
@ -76,25 +65,6 @@ class DetailTicket(generic.DetailView):
|
|||||||
slug_field = 'number'
|
slug_field = 'number'
|
||||||
slug_url_kwarg = 'ticket'
|
slug_url_kwarg = 'ticket'
|
||||||
|
|
||||||
def post(self, request, **kwargs):
|
|
||||||
if is_ajax(request):
|
|
||||||
model = self.get_object()
|
|
||||||
if request.body:
|
|
||||||
data = json.loads(request.body)
|
|
||||||
resolved_field = data.get('resolved')
|
|
||||||
if isinstance(resolved_field, bool):
|
|
||||||
model.resolved = not resolved_field
|
|
||||||
model.save()
|
|
||||||
return JsonResponse(
|
|
||||||
{'resolved': not resolved_field},
|
|
||||||
status=status.HTTP_201_CREATED
|
|
||||||
)
|
|
||||||
return JsonResponse(
|
|
||||||
{'resolved': 'must be a boolean'},
|
|
||||||
status=status.HTTP_400_BAD_REQUEST
|
|
||||||
)
|
|
||||||
return HttpResponseNotAllowed(permitted_methods=['GET'])
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
context['platforms'] = Platform.objects.all()
|
context['platforms'] = Platform.objects.all()
|
||||||
@ -109,27 +79,49 @@ class DeleteTicket(generic.DeleteView):
|
|||||||
slug_url_kwarg = 'ticket'
|
slug_url_kwarg = 'ticket'
|
||||||
success_url = reverse_lazy('tickets')
|
success_url = reverse_lazy('tickets')
|
||||||
|
|
||||||
def delete(self, request, *args, **kwargs):
|
|
||||||
|
class UpdateTicketStateHandler(SingleObjectMixin, generic.View):
|
||||||
|
model = Ticket
|
||||||
|
slug_field = 'number'
|
||||||
|
slug_url_kwarg = 'ticket'
|
||||||
|
|
||||||
|
def post(self, request, **kwargs):
|
||||||
|
if is_ajax(request):
|
||||||
|
self.object = self.get_object()
|
||||||
|
if request.body:
|
||||||
|
data = json.loads(request.body)
|
||||||
|
resolved_field = data.get('resolved')
|
||||||
|
if isinstance(resolved_field, bool):
|
||||||
|
self.object.resolved = not resolved_field
|
||||||
|
self.object.save()
|
||||||
|
return JsonResponse(
|
||||||
|
{'resolved': not resolved_field},
|
||||||
|
status=status.HTTP_201_CREATED
|
||||||
|
)
|
||||||
|
return JsonResponse(
|
||||||
|
{'resolved': 'must be a boolean'},
|
||||||
|
status=status.HTTP_400_BAD_REQUEST
|
||||||
|
)
|
||||||
|
return JsonResponse(
|
||||||
|
{'error': 'header XMLHttpRequest is required'},
|
||||||
|
status=status.HTTP_406_NOT_ACCEPTABLE
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class DeleteTicketHandler(SingleObjectMixin, generic.View):
|
||||||
|
model = Ticket
|
||||||
|
slug_field = 'number'
|
||||||
|
slug_url_kwarg = 'ticket'
|
||||||
|
|
||||||
|
def delete(self, request, ticket):
|
||||||
if is_ajax(request):
|
if is_ajax(request):
|
||||||
print("HELLO FROM AJAX")
|
|
||||||
self.object = self.get_object()
|
self.object = self.get_object()
|
||||||
self.object.delete()
|
self.object.delete()
|
||||||
return JsonResponse(
|
return JsonResponse(
|
||||||
{'status': status.HTTP_200_OK},
|
{'status': status.HTTP_200_OK},
|
||||||
status=status.HTTP_200_OK
|
status=status.HTTP_200_OK
|
||||||
)
|
)
|
||||||
response = super().delete(self, request, *args, **kwargs)
|
|
||||||
return response
|
|
||||||
|
|
||||||
|
|
||||||
class AjaxDeleteTicketHandler(generic.View):
|
|
||||||
|
|
||||||
def delete(self, request, ticket):
|
|
||||||
if is_ajax(request):
|
|
||||||
print("HELLO FROM AJAX")
|
|
||||||
obj = Ticket.objects.get(number=ticket)
|
|
||||||
obj.delete()
|
|
||||||
return JsonResponse(
|
return JsonResponse(
|
||||||
{'status': status.HTTP_200_OK},
|
{'error': 'header XMLHttpRequest is required'},
|
||||||
status=status.HTTP_200_OK
|
status=status.HTTP_406_NOT_ACCEPTABLE
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user