Modified: views and and urlconf

This commit is contained in:
Stepan Zhukovsky 2023-08-04 10:15:25 +09:00
parent 89acf8e8bb
commit 941a4979f8
5 changed files with 87 additions and 71 deletions

View File

@ -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"

View File

@ -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' %}"

View File

@ -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'
),
] ]

View File

@ -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

View File

@ -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 JsonResponse(
return response {'error': 'header XMLHttpRequest is required'},
status=status.HTTP_406_NOT_ACCEPTABLE
)
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
)