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…
Reference in New Issue
Block a user