Add: delete views and jq handler
This commit is contained in:
		
							parent
							
								
									52ad31c845
								
							
						
					
					
						commit
						89acf8e8bb
					
				| @ -1,11 +1,12 @@ | ||||
| $(function () { | ||||
|     console.log("JQ is ready to work"); | ||||
|     // CSRF token:
 | ||||
|     const csrf = $("input[name=csrfmiddlewaretoken]").val() | ||||
|      | ||||
|     const CSRF = $("input[name=csrfmiddlewaretoken]").val() | ||||
|     // -- -- -- --
 | ||||
|     function deleteArchiveListElement(id) { | ||||
|         const archiveList = `#li-archive-${id}` | ||||
|         $(archiveList).hide(1500); | ||||
|     } | ||||
|     }; | ||||
|     $(".btn-archive-eraser").click(function (e) {  | ||||
|         e.preventDefault(); | ||||
|         const archiveListElement = $(this).attr("data-jq-archive-target"); | ||||
| @ -13,18 +14,18 @@ $(function () { | ||||
|             type: "delete", | ||||
|             url: $(this).attr("href"), | ||||
|             headers: { | ||||
|                 'X-CSRFToken':csrf, | ||||
|                 'Content-Type':'application/json' | ||||
|                 "X-CSRFToken":CSRF, | ||||
|                 "Content-Type":"application/json" | ||||
|             }, | ||||
|             // beforeSend: function(xhr) {
 | ||||
|             //     xhr.setRequestHeader("X-CSRFToken", csrf);
 | ||||
|             // },
 | ||||
|             success: function (response) { | ||||
|                 console.log(response.status) | ||||
|                 console.log(response.status); | ||||
|                 deleteArchiveListElement(archiveListElement); | ||||
|             }, | ||||
|             error: function (response) { | ||||
|                 console.log(response.status) | ||||
|                 console.log(response.status); | ||||
|             } | ||||
|         }); | ||||
|     }); | ||||
| @ -41,21 +42,44 @@ $(function () { | ||||
|             type: "post", | ||||
|             url: $(this).attr("ticket-state-url"), | ||||
|             headers: { | ||||
|                 'X-CSRFToken':csrf, | ||||
|                 'Content-Type':'application/json' | ||||
|                 "X-CSRFToken":CSRF, | ||||
|                 "Content-Type":"application/json" | ||||
|             }, | ||||
|             contentType: 'application/json', | ||||
|             dataType: 'json', | ||||
|             contentType: "application/json; charset=utf-8", | ||||
|             dataType: "json", | ||||
|             data: JSON.stringify({ | ||||
|                 "resolved": resolved | ||||
|                 resolved: resolved, | ||||
|             }), | ||||
|             success: function (response) { | ||||
|                 console.log(response.status) | ||||
|                 console.log(response.resolved) | ||||
|             }, | ||||
|             error: function (response) { | ||||
|                 console.log(response.status) | ||||
|                 console.log(response.resolved) | ||||
|             } | ||||
|         }); | ||||
|     }); | ||||
|     $(".btn-ticket-del").click(function (e) { | ||||
|         e.preventDefault();  | ||||
|         const del_url = $(this).attr("href") | ||||
|         const redirect_url = $(this).attr("data-jq-ticket-del-redirect") | ||||
|         $.ajax({ | ||||
|             type: "DELETE", | ||||
|             url: del_url, | ||||
|             headers: { | ||||
|                 'X-CSRFToken':CSRF, | ||||
|                 'Content-Type':'application/json' | ||||
|             }, | ||||
|             success: function (response) { | ||||
|                 console.log(response.status); | ||||
|                 if (redirect_url) { | ||||
|                     window.location.href = redirect_url; | ||||
|                 }else { | ||||
|                     console.log("Need delete ticket card"); | ||||
|                 } | ||||
|             }, | ||||
|             error: function (response) { | ||||
|                 console.log(response.status); | ||||
|             } | ||||
|         }); | ||||
|     }); | ||||
|     console.log("JQ is ready to work"); | ||||
| }); | ||||
|  | ||||
| @ -0,0 +1,22 @@ | ||||
| {% extends 'collector/base.html' %}  | ||||
| {% load static %}  | ||||
| {% block content %} | ||||
| {% include 'collector/navigation.html' %} | ||||
| <div class="container mt-5"> | ||||
|   <div class="row"> | ||||
|     <form method="post" action="{% url 'delete' ticket.number %}"> | ||||
|       {% csrf_token %} | ||||
|       <button | ||||
|         type="button" | ||||
|         class="btn btn-secondary" | ||||
|         data-bs-dismiss="modal" | ||||
|       >Cancel</button> | ||||
|       <button | ||||
|         type="button" | ||||
|         class="btn btn-danger btn-archive-eraser" | ||||
|         data-bs-dismiss="modal" | ||||
|       >Delete</button> | ||||
|     </form> | ||||
|   </div> | ||||
| </div> | ||||
| {% endblock %} | ||||
| @ -58,7 +58,7 @@ | ||||
|           </ul> | ||||
|           <!-- Search --> | ||||
|           <ul class="navbar-nav flex-row flex-wrap ms-md-auto"> | ||||
|             <li class="nav-item py-2 py-lg-1 col-12 col-lg-auto"> | ||||
|             <li class="nav-item py-2 col-12 col-lg-auto"> | ||||
|             <form class="d-flex" role="search"> | ||||
|               <input | ||||
|                 class="form-control me-2" | ||||
|  | ||||
| @ -86,20 +86,28 @@ | ||||
|             <!-- Card buttons --> | ||||
|             <div class="d-flex w-100 justify-content-between"> | ||||
|               <a | ||||
|                 href="{{ ticket.get_absolute_url }}" | ||||
|                 href="/" | ||||
|                 class="btn btn-outline-warning mb-1 mt-1" | ||||
|               ><i class="bi bi-pencil-square"></i> Edit</a> | ||||
|               <a | ||||
|                 href="{{ ticket.get_absolute_url }}" | ||||
|               <button | ||||
|                 class="btn btn-outline-danger mb-1 mt-1" | ||||
|               ><i class="bi bi-trash"></i> Delete</a> | ||||
|                 data-bs-toggle="modal" | ||||
|                 data-bs-target="#modal-ticket-del" | ||||
|               ><i class="bi bi-trash"></i> Delete | ||||
|             </button> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <!-- Modal --> | ||||
|       <!-- Modal Archive --> | ||||
|       {% for archive in ticket.archive_set.all %} | ||||
|       <div class="modal fade" id="modal-archive-del-{{ archive.id }}" tabindex="-1" aria-labelledby="LabelArchive-{{ archive.id }}" aria-hidden="true"> | ||||
|       <div  | ||||
|         class="modal fade" | ||||
|         id="modal-archive-del-{{ archive.id }}" | ||||
|         tabindex="-1" | ||||
|         aria-labelledby="LabelArchive-{{ archive.id }}" | ||||
|         aria-hidden="true" | ||||
|       > | ||||
|         <div class="modal-dialog"> | ||||
|           <div class="modal-content"> | ||||
|             <div class="modal-header"> | ||||
| @ -129,6 +137,34 @@ | ||||
|         </div> | ||||
|       </div> | ||||
|       {% endfor %} | ||||
|       <!-- Modal Ticket --> | ||||
|       <div class="modal fade" id="modal-ticket-del" tabindex="-1" aria-labelledby="LabelTicket" aria-hidden="true"> | ||||
|         <div class="modal-dialog"> | ||||
|           <div class="modal-content"> | ||||
|             <div class="modal-header"> | ||||
|               <h5 class="modal-title" id="LabelTicket">Delete ticket #{{ ticket.number }} ?</h5> | ||||
|               <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> | ||||
|             </div> | ||||
|             <div class="modal-body"> | ||||
|               <p>Deleting a ticket will also permanently delete all files associated with it.</p> | ||||
|             </div> | ||||
|             <div class="modal-footer"> | ||||
|                 <button  | ||||
|                 type="button" | ||||
|                 class="btn btn-secondary" | ||||
|                 data-bs-dismiss="modal" | ||||
|                 >Cancel</button> | ||||
|                 <a | ||||
|                   type="button" | ||||
|                   href="{% url 'delete' ticket.number %}" | ||||
|                   class="btn btn-danger btn-ticket-del" | ||||
|                   data-bs-dismiss="modal" | ||||
|                   data-jq-ticket-del-redirect="{% url 'tickets' %}" | ||||
|                 >Delete</a> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </section> | ||||
| </main> | ||||
|  | ||||
| @ -12,7 +12,7 @@ urlpatterns = [ | ||||
|     path( | ||||
|         'tickets/', | ||||
|         views.ListAllTickets.as_view(), | ||||
|         name='index' | ||||
|         name='tickets' | ||||
|     ), | ||||
|     path( | ||||
|         'tickets/show/<slug:platform>/', | ||||
| @ -24,6 +24,11 @@ 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(), | ||||
|  | ||||
| @ -1,8 +1,10 @@ | ||||
| import json | ||||
| # from django.shortcuts import render | ||||
| # from django.shortcuts import render, redirect | ||||
| from django.contrib.auth.mixins import LoginRequiredMixin | ||||
| from django.http import FileResponse, JsonResponse, Http404 | ||||
| from django.http import FileResponse, HttpResponseNotAllowed, JsonResponse | ||||
| from django.views import generic | ||||
| from django.shortcuts import get_object_or_404 | ||||
| from django.urls import reverse_lazy | ||||
| 
 | ||||
| from rest_framework import status | ||||
| # from rest_framework.response import Response | ||||
| @ -13,10 +15,7 @@ from .utils import is_ajax | ||||
| 
 | ||||
| class ArchiveHandlerView(LoginRequiredMixin, generic.View): | ||||
|     def get(self, request, path): | ||||
|         try: | ||||
|             file = Archive.objects.get(file=path) | ||||
|         except Archive.DoesNotExist: | ||||
|             return Http404 | ||||
|         file = get_object_or_404(Archive, file=path) | ||||
|         return FileResponse(file.file) | ||||
| 
 | ||||
|     def delete(self, request, path): | ||||
| @ -74,24 +73,63 @@ class DetailTicket(generic.DetailView): | ||||
|     model = Ticket | ||||
|     template_name = 'collector/ticket.html' | ||||
|     context_object_name = 'ticket' | ||||
|     slug_field = 'number' | ||||
|     slug_url_kwarg = 'ticket' | ||||
| 
 | ||||
|     def post(self, request, platform, ticket): | ||||
|     def post(self, request, **kwargs): | ||||
|         if is_ajax(request): | ||||
|             model = self.get_object() | ||||
|             if request.body: | ||||
|                 data = json.loads(request.body) | ||||
|                 if data.get('resolved') is True: | ||||
|                     model.resolved = False | ||||
|                 resolved_field = data.get('resolved') | ||||
|                 if isinstance(resolved_field, bool): | ||||
|                     model.resolved = not resolved_field | ||||
|                     model.save() | ||||
|                 if data.get('resolved') is False: | ||||
|                     model.resolved = True | ||||
|                     model.save() | ||||
|         return JsonResponse({'status': 201}, status=status.HTTP_201_CREATED) | ||||
| 
 | ||||
|     def get_object(self, queryset=None): | ||||
|         return self.model.objects.get(number=self.kwargs.get('ticket')) | ||||
|                     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() | ||||
|         return context | ||||
| 
 | ||||
| 
 | ||||
| class DeleteTicket(generic.DeleteView): | ||||
|     model = Ticket | ||||
|     template_name = 'collector/delete_ticket.html' | ||||
|     context_object_name = 'ticket' | ||||
|     slug_field = 'number' | ||||
|     slug_url_kwarg = 'ticket' | ||||
|     success_url = reverse_lazy('tickets') | ||||
| 
 | ||||
|     def delete(self, request, *args, **kwargs): | ||||
|         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 | ||||
|             ) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user