diff --git a/app/core/serializers/ticket.py b/app/core/serializers/ticket.py index 5ae45510..6b85cd7c 100644 --- a/app/core/serializers/ticket.py +++ b/app/core/serializers/ticket.py @@ -10,6 +10,7 @@ from api.exceptions import UnknownTicketType from core.models.ticket.ticket import Ticket 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) + category = TicketCategoryBaseSerializer() + opened_by = UserBaseSerializer() subscribed_users = UserBaseSerializer(many=True) diff --git a/app/core/serializers/ticket_category.py b/app/core/serializers/ticket_category.py new file mode 100644 index 00000000..d4f1a0a1 --- /dev/null +++ b/app/core/serializers/ticket_category.py @@ -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) diff --git a/app/core/viewsets/ticket.py b/app/core/viewsets/ticket.py index 5f4809b2..9c2b52e5 100644 --- a/app/core/viewsets/ticket.py +++ b/app/core/viewsets/ticket.py @@ -1,6 +1,14 @@ from api.exceptions import UnknownTicketType from api.viewsets.common import ModelViewSet +from assistance.serializers.request import ( + RequestAddTicketModelSerializer, + RequestChangeTicketModelSerializer, + RequestTriageTicketModelSerializer, + RequestImportTicketModelSerializer, + RequestTicketModelSerializer, + RequestTicketViewSerializer +) from core.serializers.ticket import ( Ticket, ) diff --git a/app/core/viewsets/ticket_category.py b/app/core/viewsets/ticket_category.py new file mode 100644 index 00000000..348919d3 --- /dev/null +++ b/app/core/viewsets/ticket_category.py @@ -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'] diff --git a/app/settings/viewsets/index.py b/app/settings/viewsets/index.py index eda9f543..f36563d9 100644 --- a/app/settings/viewsets/index.py +++ b/app/settings/viewsets/index.py @@ -50,6 +50,10 @@ class Index(CommonViewSet): { "name": "External Links", "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_type": reverse('v2:_api_v2_project_type-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( 'v2:_api_v2_user_settings-detail', request=request,