Add: UpdateTicket view and PageTitleMixin
This commit is contained in:
		
							parent
							
								
									138b8f26ad
								
							
						
					
					
						commit
						02a5492cd5
					
				| @ -6,7 +6,7 @@ from crispy_bootstrap5.bootstrap5 import FloatingField | |||||||
| from .models import Ticket | from .models import Ticket | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class CreateTicketForm(forms.ModelForm): | class TicketForm(forms.ModelForm): | ||||||
| 
 | 
 | ||||||
|     class Meta: |     class Meta: | ||||||
|         model = Ticket |         model = Ticket | ||||||
| @ -16,12 +16,12 @@ class CreateTicketForm(forms.ModelForm): | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|     def __init__(self, *args, **kwargs): |     def __init__(self, *args, **kwargs): | ||||||
|         super(CreateTicketForm, self).__init__(*args, **kwargs) |         super(TicketForm, self).__init__(*args, **kwargs) | ||||||
|         self.helper = FormHelper(self) |         self.helper = FormHelper(self) | ||||||
|         # self.helper.attrs = {"novalidate": ''} |         # self.helper.attrs = {"novalidate": ''} | ||||||
| 
 | 
 | ||||||
|         self.helper.layout = Layout( |         self.helper.layout = Layout( | ||||||
|             Div(FloatingField('number'), 'platform', css_class='col-md-2'), |             Div(FloatingField('number'), 'platform', css_class='col-lg-2'), | ||||||
|             Div('note', css_class='col-md-6'), |             Div('note', css_class='col-lg-6'), | ||||||
|             Submit('submit', 'Create', css_class='btn btn-success'), |             Submit('submit', 'Save', css_class='btn btn-primary'), | ||||||
|         ) |         ) | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| {% extends 'collector/base.html' %} | {% extends 'collector/base.html' %} | ||||||
| {% load static %} | {% load static %} | ||||||
| {% block title %}<title>Collector - {{ ticket.number }}</title>{% endblock title %} | {% block title %}<title>{{ title }}</title>{% endblock title %} | ||||||
| {% block main %}  | {% block main %}  | ||||||
| <div class="container mt-3"> | <div class="container mt-3"> | ||||||
|   <div class="row"> |   <div class="row"> | ||||||
| @ -31,7 +31,7 @@ | |||||||
|         <!-- Card buttons --> |         <!-- Card buttons --> | ||||||
|         <div class="d-flex w-100 justify-content-between"> |         <div class="d-flex w-100 justify-content-between"> | ||||||
|           <a |           <a | ||||||
|             href="/" |             href="{% url 'collector:update' ticket.platform.name ticket.number %}" | ||||||
|             class="btn btn-outline-warning mb-1 mt-1" |             class="btn btn-outline-warning mb-1 mt-1" | ||||||
|           ><i class="bi bi-pencil-square"></i> Edit</a> |           ><i class="bi bi-pencil-square"></i> Edit</a> | ||||||
|           <button |           <button | ||||||
|  | |||||||
| @ -1,12 +1,12 @@ | |||||||
| {% extends 'collector/base.html' %} | {% extends 'collector/base.html' %} | ||||||
| {% load static %} | {% load static %} | ||||||
| {% load crispy_forms_tags %} | {% load crispy_forms_tags %} | ||||||
| {% block title %}<title>Collector - create</title>{% endblock title %} | {% block title %}<title>{{ title }}</title>{% endblock title %} | ||||||
| {% block main %} | {% block main %} | ||||||
| <div class="container mt-3"> | <div class="container mt-3"> | ||||||
|     <div class="card"> |     <div class="card"> | ||||||
|       <div class="card-header"> |       <div class="card-header"> | ||||||
|         <h4>New ticket:</h4> |         <h3>Ticket:</h3> | ||||||
|       </div> |       </div> | ||||||
|       <div class="card-body"> |       <div class="card-body"> | ||||||
|         {% crispy form %} |         {% crispy form %} | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| {% extends 'collector/base.html' %}  | {% extends 'collector/base.html' %}  | ||||||
| {% load static %}  | {% load static %}  | ||||||
|  | {% block title %} {{ title }} {% endblock title %} | ||||||
| {% block content %} | {% block content %} | ||||||
| {% include 'collector/includes/navbar.html' %} | <div class="container mt-3"> | ||||||
| <div class="container mt-5"> |  | ||||||
|   <div class="row"> |   <div class="row"> | ||||||
|     <form method="post" action="{% url 'collector:delete' ticket.number %}"> |     <form method="post" action="{% url 'collector:delete' ticket.number %}"> | ||||||
|       {% csrf_token %} |       {% csrf_token %} | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| {% extends 'collector/base.html' %} | {% extends 'collector/base.html' %} | ||||||
| {% load static %} | {% load static %} | ||||||
| {% block title %}<title>Collector</title>{% endblock title %} | {% block title %}<title>{{ title }}</title>{% endblock title %} | ||||||
| {% block main %} | {% block main %} | ||||||
| <div class="container mt-3"> | <div class="container mt-3"> | ||||||
|   {% csrf_token %} |   {% csrf_token %} | ||||||
|  | |||||||
| @ -15,7 +15,6 @@ urlpatterns = [ | |||||||
|         views.CreateTicket.as_view(), |         views.CreateTicket.as_view(), | ||||||
|         name='create' |         name='create' | ||||||
|     ), |     ), | ||||||
| 
 |  | ||||||
|     # READ: |     # READ: | ||||||
|     path( |     path( | ||||||
|         '', |         '', | ||||||
| @ -42,6 +41,12 @@ urlpatterns = [ | |||||||
|         views.ArchiveHandlerView.as_view(), |         views.ArchiveHandlerView.as_view(), | ||||||
|         name="download" |         name="download" | ||||||
|     ), |     ), | ||||||
|  |     # UPDATE: | ||||||
|  |     path( | ||||||
|  |         'tickets/update/<slug:platform>/<int:ticket>/', | ||||||
|  |         views.UpdateTicket.as_view(), | ||||||
|  |         name='update' | ||||||
|  |     ), | ||||||
| 
 | 
 | ||||||
|     # ▄▀█ ░░█ ▄▀█ ▀▄▀ |     # ▄▀█ ░░█ ▄▀█ ▀▄▀ | ||||||
|     # █▀█ █▄█ █▀█ █░█ |     # █▀█ █▄█ █▀█ █░█ | ||||||
|  | |||||||
| @ -21,3 +21,19 @@ 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 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PageTitleViewMixin: | ||||||
|  |     title = 'Collector' | ||||||
|  | 
 | ||||||
|  |     def get_title(self, *args, **kwargs): | ||||||
|  |         """ | ||||||
|  |         Return the class title attr by default, | ||||||
|  |         but you can override this method to further customize | ||||||
|  |         """ | ||||||
|  |         return self.title | ||||||
|  | 
 | ||||||
|  |     def get_context_data(self, **kwargs): | ||||||
|  |         context = super().get_context_data(**kwargs) | ||||||
|  |         context['title'] = self.get_title() | ||||||
|  |         return context | ||||||
|  | |||||||
| @ -9,8 +9,8 @@ from rest_framework import status | |||||||
| # from rest_framework.response import Response | # from rest_framework.response import Response | ||||||
| 
 | 
 | ||||||
| from .models import Archive, Ticket | from .models import Archive, Ticket | ||||||
| from .forms import CreateTicketForm | from .forms import TicketForm | ||||||
| from .utils import is_ajax | from .utils import PageTitleViewMixin, is_ajax | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ArchiveHandlerView(LoginRequiredMixin, SingleObjectMixin, generic.View): | class ArchiveHandlerView(LoginRequiredMixin, SingleObjectMixin, generic.View): | ||||||
| @ -29,45 +29,70 @@ class ArchiveHandlerView(LoginRequiredMixin, SingleObjectMixin, generic.View): | |||||||
|             return JsonResponse({'file': path}, status=status.HTTP_200_OK) |             return JsonResponse({'file': path}, status=status.HTTP_200_OK) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class CreateTicket(LoginRequiredMixin, generic.CreateView): | class CreateTicket(LoginRequiredMixin, PageTitleViewMixin, generic.CreateView): | ||||||
|     model = Ticket |     model = Ticket | ||||||
|     form_class = CreateTicketForm |     form_class = TicketForm | ||||||
|     template_name = 'collector/ticket_create.html' |     template_name = 'collector/ticket_create.html' | ||||||
| 
 | 
 | ||||||
|  |     def get_title(self): | ||||||
|  |         return f'{self.title} - create' | ||||||
|  | 
 | ||||||
|     def form_valid(self, form): |     def form_valid(self, form): | ||||||
|         form.instance.user = self.request.user |         form.instance.user = self.request.user | ||||||
|         return super().form_valid(form) |         return super().form_valid(form) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ListAllTickets(generic.ListView): | class UpdateTicket(LoginRequiredMixin, PageTitleViewMixin, generic.UpdateView): | ||||||
|  |     model = Ticket | ||||||
|  |     form_class = TicketForm | ||||||
|  |     template_name = 'collector/ticket_create.html' | ||||||
|  |     slug_field = 'number' | ||||||
|  |     slug_url_kwarg = 'ticket' | ||||||
|  | 
 | ||||||
|  |     def get_title(self, **kwargs): | ||||||
|  |         return f'{self.title} - {self.kwargs.get("ticket", "update")}' | ||||||
|  | 
 | ||||||
|  |     def form_valid(self, form): | ||||||
|  |         form.instance.user = self.request.user | ||||||
|  |         return super().form_valid(form) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ListAllTickets(PageTitleViewMixin, generic.ListView): | ||||||
|     model = Ticket |     model = Ticket | ||||||
|     template_name = 'collector/tickets.html' |     template_name = 'collector/tickets.html' | ||||||
|     context_object_name = 'tickets' |     context_object_name = 'tickets' | ||||||
|     paginate_by = 5 |     paginate_by = 5 | ||||||
|  |     title = 'Collector - tickets' | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ListPlatformTickets(generic.ListView): | class ListPlatformTickets(PageTitleViewMixin, generic.ListView): | ||||||
|     model = Ticket |     model = Ticket | ||||||
|     template_name = 'collector/tickets.html' |     template_name = 'collector/tickets.html' | ||||||
|     context_object_name = 'tickets' |     context_object_name = 'tickets' | ||||||
|     # allow_empty = False |     # allow_empty = False | ||||||
|     paginate_by = 5 |     paginate_by = 5 | ||||||
| 
 | 
 | ||||||
|  |     def get_title(self, **kwargs): | ||||||
|  |         return f'{self.title} - {self.kwargs.get("platform", "tickets")}' | ||||||
|  | 
 | ||||||
|     def get_queryset(self): |     def get_queryset(self): | ||||||
|         return Ticket.objects.filter( |         return Ticket.objects.filter( | ||||||
|             platform__name=self.kwargs.get('platform') |             platform__name=self.kwargs.get('platform') | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class DetailTicket(generic.DetailView): | class DetailTicket(PageTitleViewMixin, generic.DetailView): | ||||||
|     model = Ticket |     model = Ticket | ||||||
|     template_name = 'collector/ticket.html' |     template_name = 'collector/ticket.html' | ||||||
|     context_object_name = 'ticket' |     context_object_name = 'ticket' | ||||||
|     slug_field = 'number' |     slug_field = 'number' | ||||||
|     slug_url_kwarg = 'ticket' |     slug_url_kwarg = 'ticket' | ||||||
| 
 | 
 | ||||||
|  |     def get_title(self, **kwargs): | ||||||
|  |         return f'{self.title} - {self.kwargs.get("ticket", "show")}' | ||||||
| 
 | 
 | ||||||
| class DeleteTicket(generic.DeleteView): | 
 | ||||||
|  | class DeleteTicket(PageTitleViewMixin, generic.DeleteView): | ||||||
|     model = Ticket |     model = Ticket | ||||||
|     template_name = 'collector/ticket_delete.html' |     template_name = 'collector/ticket_delete.html' | ||||||
|     context_object_name = 'ticket' |     context_object_name = 'ticket' | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user