feat(core): Base viewset for model notes

ref: #389 #525
This commit is contained in:
2025-02-07 18:08:42 +09:30
parent f833b93074
commit a132baa838
3 changed files with 70 additions and 176 deletions

View File

@ -0,0 +1,60 @@
from django.contrib.auth.models import ContentType
from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiResponse
from core.serializers.model_notes import (
ModelNotes,
ModelNoteModelSerializer,
ModelNoteViewSerializer
)
from api.viewsets.common import ModelViewSet
from config_management.models.groups import ConfigGroups
from itam.models.device import Device
from itam.models.operating_system import OperatingSystem
from itam.models.software import Software
from itim.models.services import Service
class ModelNoteViewSet(ModelViewSet):
"""Base class for Model Notes
This class is intended not to be used directly. It should be used as an
inherited class.
The inherited class must include the following class objects:
- get_serializer_class function
- model attribute containing the notes model for the model to receive notes
"""
filterset_fields = []
search_fields = [
'content',
]
view_description = 'Model notes'
def get_queryset(self):
if self.queryset is not None:
return self.queryset
self.queryset = self.model.objects.filter(
content_type = ContentType.objects.get(
app_label = str(self.model._meta.app_label).lower(),
model = str(self.model.model.field.related_model.__name__).replace(' ', '').lower()
).id,
model = int(self.kwargs['model_id'])
)
return self.queryset

View File

@ -1,165 +0,0 @@
from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiResponse
from core.serializers.notes import (
Notes,
NoteModelSerializer,
NoteViewSerializer
)
from api.viewsets.common import ModelViewSet
from config_management.models.groups import ConfigGroups
from itam.models.device import Device
from itam.models.operating_system import OperatingSystem
from itam.models.software import Software
from itim.models.services import Service
@extend_schema_view(
create=extend_schema(
summary = 'Create a note',
description = '',
responses = {
201: OpenApiResponse(description='created', response=NoteViewSerializer),
400: OpenApiResponse(description='Validation failed.'),
403: OpenApiResponse(description='User is missing create permissions'),
}
),
destroy = extend_schema(
summary = 'Delete a note',
description = ''
),
list = extend_schema(
summary = 'Fetch all notes',
description='',
),
retrieve = extend_schema(
summary = 'Fetch a single note',
description='',
),
update = extend_schema(exclude = True),
partial_update = extend_schema(
summary = 'Update a note',
description = ''
),
)
class ViewSet(ModelViewSet):
filterset_fields = [
'config_group',
'device',
]
search_fields = [
'note',
]
model = Notes
view_description = 'Model notes'
def get_serializer_class(self):
if self.serializer_class is not None:
return self.serializer_class
if (
self.action == 'list'
or self.action == 'retrieve'
):
self.serializer_class = ViewSerializer
else:
self.serializer_class = ModelSerializer
return self.serializer_class
def get_queryset(self):
if self.queryset is not None:
return self.queryset
self.queryset = super().get_queryset()
if 'device_id' in self.kwargs:
self.queryset = self.queryset.filter(device_id=self.kwargs['device_id']).order_by('-created')
self.parent_model = Device
self.parent_model_pk_kwarg = 'device_id'
elif 'config_group_id' in self.kwargs:
self.queryset = self.queryset.filter(config_group_id=self.kwargs['config_group_id']).order_by('-created')
self.parent_model = ConfigGroups
self.parent_model_pk_kwarg = 'config_group_id'
elif 'operating_system_id' in self.kwargs:
self.queryset = self.queryset.filter(operatingsystem_id=self.kwargs['operating_system_id']).order_by('-created')
self.parent_model = OperatingSystem
self.parent_model_pk_kwarg = 'operating_system_id'
elif 'service_id' in self.kwargs:
self.queryset = self.queryset.filter(service_id=self.kwargs['service_id']).order_by('-created')
self.parent_model = Service
self.parent_model_pk_kwarg = 'service_id'
elif 'software_id' in self.kwargs:
self.queryset = self.queryset.filter(software_id=self.kwargs['software_id']).order_by('-created')
self.parent_model = Software
self.parent_model_pk_kwarg = 'software_id'
return self.queryset
def get_view_name(self):
if self.detail:
return "Note"
return 'Notes'
def get_serializer_class(self):
if self.serializer_class:
return self.serializer_class
if (
self.action == 'list'
or self.action == 'retrieve'
):
self.serializer_class = globals()[str( self.model._meta.verbose_name).replace(' ' , '') + 'ViewSerializer']
else:
self.serializer_class = globals()[str( self.model._meta.verbose_name).replace(' ' , '') + 'ModelSerializer']
return self.serializer_class