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 -->
<ul class="navbar-nav flex-row flex-wrap me-md-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
class="form-control me-2"
type="search"
placeholder="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>
</li>
</ul>

View File

@ -7,8 +7,7 @@
{% csrf_token %}
<!-- Ticket -->
{% for ticket in tickets %}
<div class="row">
<div id="div-ticket-{{ ticket.number }}" class="list-group mb-2 ms-1">
<div id="div-ticket-{{ ticket.number }}" class="list-group mb-2">
<div class="list-group-item list-group-item-action disable" aria-current="true">
{% include 'collector/includes/ticket_info.html' %}
<div class="col-xl-6 mt-1 mb-2">
@ -16,7 +15,6 @@
{% if ticket.note %}
<div class="accordion-item">
<h2 class="accordion-header">
<button
class="accordion-button collapsed"
type="button" data-bs-toggle="collapse"
@ -78,7 +76,6 @@
</div>
</div>
</div>
</div>
<!-- Modal ticket -->
{% include 'collector/includes/modal_ticket.html' %}
<!-- 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
app_name = 'collector'
router = routers.DefaultRouter()
router.register(r'archives', views.ArchiveUploadViewSet)
urlpatterns = [
# █░█░█ █▀▀ █▄▄
@ -64,4 +70,12 @@ urlpatterns = [
views.DeleteTicketHandler.as_view(),
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.generic.detail import SingleObjectMixin
from django.urls import reverse_lazy
from django.db.models import Q
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 .forms import TicketForm
from .utils import PageTitleViewMixin, is_ajax
from .serializers import ArchiveUploadSerializer
class ArchiveHandlerView(LoginRequiredMixin, SingleObjectMixin, generic.View):
model = Archive
@ -53,6 +59,7 @@ class UpdateTicket(LoginRequiredMixin, PageTitleViewMixin, generic.UpdateView):
return f'{self.title} - {self.kwargs.get("ticket", "update")}'
def form_valid(self, form):
print(self.request.user)
form.instance.user = self.request.user
return super().form_valid(form)
@ -64,6 +71,23 @@ class ListAllTickets(PageTitleViewMixin, generic.ListView):
paginate_by = 5
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):
model = Ticket
@ -146,3 +170,13 @@ class DeleteTicketHandler(SingleObjectMixin, generic.View):
{'error': 'header XMLHttpRequest is required'},
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)