From 941a4979f87b3ebf3167421bc4bd72721a28f6ad Mon Sep 17 00:00:00 2001 From: MOIS3Y Date: Fri, 4 Aug 2023 10:15:25 +0900 Subject: [PATCH] Modified: views and and urlconf --- .../static/collector/js/jq.ticket.detail.js | 11 +- .../collector/templates/collector/ticket.html | 5 +- logs_collector/collector/urls.py | 28 ++++- logs_collector/collector/utils.py | 2 +- logs_collector/collector/views.py | 112 ++++++++---------- 5 files changed, 87 insertions(+), 71 deletions(-) diff --git a/logs_collector/collector/static/collector/js/jq.ticket.detail.js b/logs_collector/collector/static/collector/js/jq.ticket.detail.js index abf74bd..036aef1 100644 --- a/logs_collector/collector/static/collector/js/jq.ticket.detail.js +++ b/logs_collector/collector/static/collector/js/jq.ticket.detail.js @@ -32,15 +32,20 @@ $(function () { $("#ticket-state").click(function () { console.log('Press'); 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!!!') - resolved = true; + resolved = true; + $(this).attr("ticket-state-switch", "0"); // disable + } else { resolved = false; + $(this).attr("ticket-state-switch", "1"); // enable } + console.log(resolved) $.ajax({ type: "post", - url: $(this).attr("ticket-state-url"), + url: ticket_state_url, headers: { "X-CSRFToken":CSRF, "Content-Type":"application/json" diff --git a/logs_collector/collector/templates/collector/ticket.html b/logs_collector/collector/templates/collector/ticket.html index 9a66987..0138d0c 100644 --- a/logs_collector/collector/templates/collector/ticket.html +++ b/logs_collector/collector/templates/collector/ticket.html @@ -20,7 +20,8 @@ type="checkbox" role="switch" 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 %}>
@@ -156,7 +157,7 @@ >Cancel /', - views.AjaxDeleteTicketHandler.as_view(), - name='delete' - ), path( 'archives/', views.ArchiveHandlerView.as_view(), name="download" ), + + # ▄▀█ ░░█ ▄▀█ ▀▄▀ + # █▀█ █▄█ █▀█ █░█ + # -- -- -- -- -- + + # UPDATE: + path( + 'ajax/tickets/update///', + views.UpdateTicketStateHandler.as_view(), + name='ajax_update_state_ticket' + ), + # DELETE: + path( + 'ajax/tickets/delete//', + views.DeleteTicketHandler.as_view(), + name='ajax_delete_ticket' + ), ] diff --git a/logs_collector/collector/utils.py b/logs_collector/collector/utils.py index 1a10837..9ac6bcd 100644 --- a/logs_collector/collector/utils.py +++ b/logs_collector/collector/utils.py @@ -19,5 +19,5 @@ def get_file_size(file_path, unit='bytes'): def is_ajax(request): - if request.headers.get('x-requested-with') == 'XMLHttpRequest': + if request.headers.get('X-Requested-With') == 'XMLHttpRequest': return True diff --git a/logs_collector/collector/views.py b/logs_collector/collector/views.py index 8a0e4a1..4375e06 100644 --- a/logs_collector/collector/views.py +++ b/logs_collector/collector/views.py @@ -1,9 +1,8 @@ import json -# from django.shortcuts import render, redirect 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.shortcuts import get_object_or_404 +from django.views.generic.detail import SingleObjectMixin from django.urls import reverse_lazy from rest_framework import status @@ -13,30 +12,20 @@ from .models import Archive, Ticket, Platform 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): - file = get_object_or_404(Archive, file=path) - return FileResponse(file.file) + self.object = self.get_object() + return FileResponse(self.object.file) def delete(self, request, path): - try: - file = Archive.objects.get(file=path) - file.delete() - return JsonResponse( - { - '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 - ) + if is_ajax(request): + self.object = self.get_object() + self.object.delete() + return JsonResponse({'file': path}, status=status.HTTP_200_OK) class ListAllTickets(generic.ListView): @@ -76,25 +65,6 @@ class DetailTicket(generic.DetailView): slug_field = 'number' 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): context = super().get_context_data(**kwargs) context['platforms'] = Platform.objects.all() @@ -109,27 +79,49 @@ class DeleteTicket(generic.DeleteView): slug_url_kwarg = 'ticket' 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): - print("HELLO FROM AJAX") self.object = self.get_object() self.object.delete() return JsonResponse( {'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( - {'status': status.HTTP_200_OK}, - status=status.HTTP_200_OK - ) + return JsonResponse( + {'error': 'header XMLHttpRequest is required'}, + status=status.HTTP_406_NOT_ACCEPTABLE + )