feat(core): Add Ticket Category API v2 endpoint

ref: #248 #365
This commit is contained in:
2024-10-26 20:54:50 +09:30
parent 0612c2350d
commit f5eb4c25b2
5 changed files with 166 additions and 0 deletions

View File

@ -10,6 +10,7 @@ from api.exceptions import UnknownTicketType
from core.models.ticket.ticket import Ticket from core.models.ticket.ticket import Ticket
from core.fields.badge import Badge, BadgeField from core.fields.badge import Badge, BadgeField
from core.serializers.ticket_category import TicketCategoryBaseSerializer
@ -160,6 +161,8 @@ class TicketViewSerializer(TicketModelSerializer):
assigned_teams = TeamBaseSerializer(many=True) assigned_teams = TeamBaseSerializer(many=True)
category = TicketCategoryBaseSerializer()
opened_by = UserBaseSerializer() opened_by = UserBaseSerializer()
subscribed_users = UserBaseSerializer(many=True) subscribed_users = UserBaseSerializer(many=True)

View File

@ -0,0 +1,71 @@
from rest_framework.reverse import reverse
from rest_framework import serializers
from access.serializers.organization import OrganizationBaseSerializer
from core.models.ticket.ticket_category import TicketCategory
class TicketCategoryBaseSerializer(serializers.ModelSerializer):
display_name = serializers.SerializerMethodField('get_display_name')
def get_display_name(self, item):
return str( item )
url = serializers.HyperlinkedIdentityField(
view_name="v2:_api_v2_ticket_category-detail", format="html"
)
class Meta:
model = TicketCategory
fields = [
'id',
'display_name',
'name',
'url',
]
read_only_fields = [
'id',
'display_name',
'name',
'url',
]
class TicketCategoryModelSerializer(TicketCategoryBaseSerializer):
_urls = serializers.SerializerMethodField('get_url')
def get_url(self, item):
return {
'_self': reverse("API:_api_v2_ticket_category-detail", request=self._context['view'].request, kwargs={'pk': item.pk}),
}
class Meta:
model = TicketCategory
fields = '__all__'
read_only_fields = [
'id',
'display_name',
'created',
'modified',
'_urls',
]
class TicketCategoryViewSerializer(TicketCategoryModelSerializer):
organization = OrganizationBaseSerializer(many=False, read_only=True)

View File

@ -1,6 +1,14 @@
from api.exceptions import UnknownTicketType from api.exceptions import UnknownTicketType
from api.viewsets.common import ModelViewSet from api.viewsets.common import ModelViewSet
from assistance.serializers.request import (
RequestAddTicketModelSerializer,
RequestChangeTicketModelSerializer,
RequestTriageTicketModelSerializer,
RequestImportTicketModelSerializer,
RequestTicketModelSerializer,
RequestTicketViewSerializer
)
from core.serializers.ticket import ( from core.serializers.ticket import (
Ticket, Ticket,
) )

View File

@ -0,0 +1,79 @@
from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiResponse
from api.viewsets.common import ModelViewSet
from core.serializers.ticket_category import (
TicketCategory,
TicketCategoryModelSerializer,
TicketCategoryViewSerializer
)
@extend_schema_view(
create=extend_schema(
summary = 'Create a ticket category',
description='',
responses = {
201: OpenApiResponse(description='Created', response=TicketCategoryViewSerializer),
403: OpenApiResponse(description='User is missing add permissions'),
}
),
destroy = extend_schema(
summary = 'Delete a ticket category',
description = '',
responses = {
204: OpenApiResponse(description=''),
403: OpenApiResponse(description='User is missing delete permissions'),
}
),
list = extend_schema(
summary = 'Fetch all ticket categories',
description='',
responses = {
200: OpenApiResponse(description='', response=TicketCategoryViewSerializer),
403: OpenApiResponse(description='User is missing view permissions'),
}
),
retrieve = extend_schema(
summary = 'Fetch a single ticket category',
description='',
responses = {
200: OpenApiResponse(description='', response=TicketCategoryViewSerializer),
403: OpenApiResponse(description='User is missing view permissions'),
}
),
update = extend_schema(exclude = True),
partial_update = extend_schema(
summary = 'Update a ticket category',
description = '',
responses = {
200: OpenApiResponse(description='', response=TicketCategoryViewSerializer),
403: OpenApiResponse(description='User is missing change permissions'),
}
),
)
class ViewSet(ModelViewSet):
filterset_fields = [
'organization',
]
search_fields = [
'name',
]
model = TicketCategory
def get_serializer_class(self):
if (
self.action == 'list'
or self.action == 'retrieve'
):
return globals()[str( self.model._meta.verbose_name).replace(' ', '') + 'ViewSerializer']
return globals()[str( self.model._meta.verbose_name).replace(' ', '') + 'ModelSerializer']

View File

@ -50,6 +50,10 @@ class Index(CommonViewSet):
{ {
"name": "External Links", "name": "External Links",
"model": "external_link" "model": "external_link"
},
{
"name": "Ticket Category",
"model": "ticket_category"
} }
] ]
}, },
@ -119,6 +123,7 @@ class Index(CommonViewSet):
"project_state": reverse('v2:_api_v2_project_state-list', request=request), "project_state": reverse('v2:_api_v2_project_state-list', request=request),
"project_type": reverse('v2:_api_v2_project_type-list', request=request), "project_type": reverse('v2:_api_v2_project_type-list', request=request),
"software_category": reverse('v2:_api_v2_software_category-list', request=request), "software_category": reverse('v2:_api_v2_software_category-list', request=request),
"ticket_category": reverse('v2:_api_v2_ticket_category-list', request=request),
"user_settings": reverse( "user_settings": reverse(
'v2:_api_v2_user_settings-detail', 'v2:_api_v2_user_settings-detail',
request=request, request=request,