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 () {
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;
$(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"

View File

@ -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 %}>
</div>
<div class="col-xl-6 mb-2">
@ -156,7 +157,7 @@
>Cancel</button>
<a
type="button"
href="{% url 'delete' ticket.number %}"
href="{% url 'ajax_delete_ticket' ticket.number %}"
class="btn btn-danger btn-ticket-del"
data-bs-dismiss="modal"
data-jq-ticket-del-redirect="{% url 'tickets' %}"

View File

@ -4,6 +4,12 @@ from . import views
urlpatterns = [
# █░█░█ █▀▀ █▄▄
# ▀▄▀▄▀ ██▄ █▄█
# -- -- -- -- --
# READ:
path(
'',
views.ListAllTickets.as_view(),
@ -24,14 +30,26 @@ urlpatterns = [
views.DetailTicket.as_view(),
name='ticket'
),
path(
'tickets/delete/<int:ticket>/',
views.AjaxDeleteTicketHandler.as_view(),
name='delete'
),
path(
'archives/<path:path>',
views.ArchiveHandlerView.as_view(),
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):
if request.headers.get('x-requested-with') == 'XMLHttpRequest':
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
return True

View File

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