Compare commits

...

2 Commits

Author SHA1 Message Date
3e969de57f Create: api prototype 2023-08-08 14:42:57 +09:00
3b1b42d483 Create: search form 2023-08-07 12:31:30 +09:00
5 changed files with 82 additions and 8 deletions

View File

@ -0,0 +1,24 @@
from rest_framework import serializers
from .models import Archive, Ticket
class ArchiveUploadSerializer(serializers.ModelSerializer):
ticket_number = serializers.ReadOnlyField(source='ticket.number')
class Meta:
model = Archive
fields = ['file', 'ticket', 'ticket_number']
def to_internal_value(self, data):
try:
ticket = Ticket.objects.get(number=data['ticket'])
data['ticket'] = ticket.id
return super().to_internal_value(data)
except Exception:
return super().to_internal_value(data)
def to_representation(self, instance):
data = super().to_representation(instance)
data['ticket'] = data.pop('ticket_number')
return data

View File

@ -68,14 +68,19 @@
<!-- Search --> <!-- Search -->
<ul class="navbar-nav flex-row flex-wrap me-md-auto"> <ul class="navbar-nav flex-row flex-wrap me-md-auto">
<li class="nav-item py-2 col-12 col-lg-auto"> <li class="nav-item py-2 col-12 col-lg-auto">
<form class="d-flex" role="search"> <form class="d-flex" role="search" action="{% url 'collector:tickets' %}">
<input <input
class="form-control me-2" class="form-control me-2"
type="search" type="search"
placeholder="Search" placeholder="Search"
aria-label="Search" aria-label="Search"
name="search"
/> />
<button class="btn btn-outline-success" type="submit"><i class="bi bi-search"></i></button> <button
class="btn btn-outline-success"
type="submit">
<i class="bi bi-search"></i>
</button>
</form> </form>
</li> </li>
</ul> </ul>

View File

@ -7,8 +7,7 @@
{% csrf_token %} {% csrf_token %}
<!-- Ticket --> <!-- Ticket -->
{% for ticket in tickets %} {% for ticket in tickets %}
<div class="row"> <div id="div-ticket-{{ ticket.number }}" class="list-group mb-2">
<div id="div-ticket-{{ ticket.number }}" class="list-group mb-2 ms-1">
<div class="list-group-item list-group-item-action disable" aria-current="true"> <div class="list-group-item list-group-item-action disable" aria-current="true">
{% include 'collector/includes/ticket_info.html' %} {% include 'collector/includes/ticket_info.html' %}
<div class="col-xl-6 mt-1 mb-2"> <div class="col-xl-6 mt-1 mb-2">
@ -16,7 +15,6 @@
{% if ticket.note %} {% if ticket.note %}
<div class="accordion-item"> <div class="accordion-item">
<h2 class="accordion-header"> <h2 class="accordion-header">
<button <button
class="accordion-button collapsed" class="accordion-button collapsed"
type="button" data-bs-toggle="collapse" type="button" data-bs-toggle="collapse"
@ -78,7 +76,6 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- Modal ticket --> <!-- Modal ticket -->
{% include 'collector/includes/modal_ticket.html' %} {% include 'collector/includes/modal_ticket.html' %}
<!-- Modal archive --> <!-- Modal archive -->

View File

@ -1,8 +1,14 @@
from django.urls import path from django.urls import path, include
from rest_framework import routers
from . import views from . import views
app_name = 'collector' app_name = 'collector'
router = routers.DefaultRouter()
router.register(r'archives', views.ArchiveUploadViewSet)
urlpatterns = [ urlpatterns = [
# █░█░█ █▀▀ █▄▄ # █░█░█ █▀▀ █▄▄
@ -64,4 +70,12 @@ urlpatterns = [
views.DeleteTicketHandler.as_view(), views.DeleteTicketHandler.as_view(),
name='ajax_delete_ticket' name='ajax_delete_ticket'
), ),
# ▄▀█ █▀█ █
# █▀█ █▀▀ █
# -- -- --
# CREATE:
path('api/v1/', include(router.urls))
] ]

View File

@ -4,14 +4,20 @@ from django.http import FileResponse, JsonResponse
from django.views import generic from django.views import generic
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.db.models import Q
from rest_framework import status from rest_framework import status
# from rest_framework.response import Response from rest_framework.parsers import FormParser, MultiPartParser
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from .models import Archive, Ticket from .models import Archive, Ticket
from .forms import TicketForm from .forms import TicketForm
from .utils import PageTitleViewMixin, is_ajax from .utils import PageTitleViewMixin, is_ajax
from .serializers import ArchiveUploadSerializer
class ArchiveHandlerView(LoginRequiredMixin, SingleObjectMixin, generic.View): class ArchiveHandlerView(LoginRequiredMixin, SingleObjectMixin, generic.View):
model = Archive model = Archive
@ -53,6 +59,7 @@ class UpdateTicket(LoginRequiredMixin, PageTitleViewMixin, generic.UpdateView):
return f'{self.title} - {self.kwargs.get("ticket", "update")}' return f'{self.title} - {self.kwargs.get("ticket", "update")}'
def form_valid(self, form): def form_valid(self, form):
print(self.request.user)
form.instance.user = self.request.user form.instance.user = self.request.user
return super().form_valid(form) return super().form_valid(form)
@ -64,6 +71,23 @@ class ListAllTickets(PageTitleViewMixin, generic.ListView):
paginate_by = 5 paginate_by = 5
title = 'Collector - tickets' title = 'Collector - tickets'
def get_queryset(self):
search_query = self.request.GET.get('search', '')
if search_query:
query_list = []
try:
for item in search_query.split(','):
query_list.append(int(item))
except ValueError:
return super().get_queryset()
queryset = self.model.objects.filter(
Q(number__in=query_list) | Q(number__icontains=query_list[0])
)
self.paginate_by = 100 # fake disable pagination)
return queryset
return super().get_queryset()
class ListPlatformTickets(PageTitleViewMixin, generic.ListView): class ListPlatformTickets(PageTitleViewMixin, generic.ListView):
model = Ticket model = Ticket
@ -146,3 +170,13 @@ class DeleteTicketHandler(SingleObjectMixin, generic.View):
{'error': 'header XMLHttpRequest is required'}, {'error': 'header XMLHttpRequest is required'},
status=status.HTTP_406_NOT_ACCEPTABLE status=status.HTTP_406_NOT_ACCEPTABLE
) )
class ArchiveUploadViewSet(mixins.CreateModelMixin, GenericViewSet):
queryset = Archive.objects.order_by('-time_create')
serializer_class = ArchiveUploadSerializer
parser_classes = (MultiPartParser, FormParser)
# permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def perform_create(self, serializer):
serializer.save(user=self.request.user)