Add: UpdateTicket view and PageTitleMixin

This commit is contained in:
Stepan Zhukovsky 2023-08-06 11:53:09 +09:00
parent 138b8f26ad
commit 02a5492cd5
8 changed files with 67 additions and 21 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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'
),
# ▄▀█ ░░█ ▄▀█ ▀▄▀ # ▄▀█ ░░█ ▄▀█ ▀▄▀
# █▀█ █▄█ █▀█ █░█ # █▀█ █▄█ █▀█ █░█

View File

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

View File

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