refactor(access): migrate sub-model viewset logic to common
ref: #724 #723
This commit is contained in:
@ -18,7 +18,7 @@ from access.models.entity import (
|
|||||||
Entity,
|
Entity,
|
||||||
)
|
)
|
||||||
|
|
||||||
from api.viewsets.common import ModelViewSet
|
from api.viewsets.common import SubModelViewSet
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -209,128 +209,43 @@ def spectacular_request_serializers( serializer_type = 'Model'):
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
class ViewSet( ModelViewSet ):
|
class ViewSet( SubModelViewSet ):
|
||||||
|
|
||||||
|
base_model = Entity
|
||||||
|
|
||||||
filterset_fields = [
|
filterset_fields = [
|
||||||
'organization',
|
'organization',
|
||||||
'is_global'
|
'is_global'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
model_kwarg = 'entity_model'
|
||||||
|
|
||||||
search_fields = [
|
search_fields = [
|
||||||
'model_notes',
|
'model_notes',
|
||||||
]
|
]
|
||||||
|
|
||||||
def related_objects(self, model, model_kwarg):
|
|
||||||
"""Recursive relate_objects fetch
|
|
||||||
|
|
||||||
Fetch the model that is lowest in the chain of inherited models
|
|
||||||
|
|
||||||
Args:
|
|
||||||
model (django.db.models.Model): The model to obtain the
|
|
||||||
related_model from.
|
|
||||||
model_kwarg (str): The URL Kwarg of the model.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
_type_: _description_
|
|
||||||
"""
|
|
||||||
|
|
||||||
related_model = None
|
|
||||||
|
|
||||||
if model_kwarg:
|
|
||||||
|
|
||||||
for related_object in model._meta.related_objects:
|
|
||||||
|
|
||||||
related_objects = getattr(related_object.related_model._meta, 'related_objects', [])
|
|
||||||
|
|
||||||
if(
|
|
||||||
str(
|
|
||||||
related_object.related_model._meta.verbose_name
|
|
||||||
).lower().replace(' ', '_') == model_kwarg
|
|
||||||
):
|
|
||||||
|
|
||||||
related_model = related_object.related_model
|
|
||||||
break
|
|
||||||
|
|
||||||
elif related_objects:
|
|
||||||
|
|
||||||
related_model = self.related_objects(model = related_object.related_model, model_kwarg = model_kwarg)
|
|
||||||
|
|
||||||
break
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return related_model
|
|
||||||
|
|
||||||
|
|
||||||
@property
|
|
||||||
def model(self):
|
|
||||||
|
|
||||||
|
|
||||||
if getattr(self, '_model', None) is not None:
|
|
||||||
|
|
||||||
return self._model
|
|
||||||
|
|
||||||
model_kwarg = None
|
|
||||||
|
|
||||||
if hasattr(self, 'kwargs'):
|
|
||||||
|
|
||||||
model_kwarg = self.kwargs.get('entity_model', None)
|
|
||||||
|
|
||||||
if model_kwarg:
|
|
||||||
|
|
||||||
self._model = self.related_objects(Entity, model_kwarg)
|
|
||||||
|
|
||||||
else:
|
|
||||||
|
|
||||||
self._model = Entity
|
|
||||||
|
|
||||||
return self._model
|
|
||||||
|
|
||||||
view_description = 'All entities'
|
view_description = 'All entities'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get_back_url(self) -> str:
|
def get_back_url(self) -> str:
|
||||||
|
|
||||||
if(
|
if(
|
||||||
self.back_url is None
|
self.back_url is None
|
||||||
and self.kwargs.get('entity_model', None) is not None
|
and self.kwargs.get(self.model_kwarg, None) is not None
|
||||||
):
|
):
|
||||||
|
|
||||||
self.back_url = reverse(
|
self.back_url = reverse(
|
||||||
viewname = '_api_v2_entity_sub-list',
|
viewname = '_api_v2_entity_sub-list',
|
||||||
request = self.request,
|
request = self.request,
|
||||||
kwargs = {
|
kwargs = {
|
||||||
'entity_model': self.kwargs['entity_model'],
|
'entity_model': self.kwargs[self.model_kwarg],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
return self.back_url
|
return self.back_url
|
||||||
|
|
||||||
|
|
||||||
def get_serializer_class(self):
|
|
||||||
|
|
||||||
serializer_module = importlib.import_module(
|
|
||||||
self.model._meta.app_label + '.serializers.' + str(
|
|
||||||
self.model._meta.verbose_name
|
|
||||||
).lower().replace(' ', '_')
|
|
||||||
)
|
|
||||||
|
|
||||||
if (
|
|
||||||
self.action == 'list'
|
|
||||||
or self.action == 'retrieve'
|
|
||||||
):
|
|
||||||
|
|
||||||
self.serializer_class = getattr(serializer_module, 'ViewSerializer')
|
|
||||||
|
|
||||||
|
|
||||||
else:
|
|
||||||
|
|
||||||
self.serializer_class = getattr(serializer_module, 'ModelSerializer')
|
|
||||||
|
|
||||||
|
|
||||||
return self.serializer_class
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@extend_schema_view( # prevent duplicate documentation of both /access/entity endpoints
|
@extend_schema_view( # prevent duplicate documentation of both /access/entity endpoints
|
||||||
create = extend_schema(exclude = True),
|
create = extend_schema(exclude = True),
|
||||||
|
@ -727,6 +727,115 @@ class ModelViewSet(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class SubModelViewSet(
|
||||||
|
ModelViewSetBase,
|
||||||
|
Create,
|
||||||
|
Retrieve,
|
||||||
|
Update,
|
||||||
|
Destroy,
|
||||||
|
List,
|
||||||
|
viewsets.ModelViewSet,
|
||||||
|
):
|
||||||
|
|
||||||
|
base_model = None
|
||||||
|
"""Model that is the base of this sub-model"""
|
||||||
|
|
||||||
|
model_kwarg: str = None
|
||||||
|
"""Kwarg name for the sub-model"""
|
||||||
|
|
||||||
|
|
||||||
|
@property
|
||||||
|
def model(self):
|
||||||
|
|
||||||
|
|
||||||
|
if getattr(self, '_model', None) is not None:
|
||||||
|
|
||||||
|
return self._model
|
||||||
|
|
||||||
|
model_kwarg = None
|
||||||
|
|
||||||
|
if hasattr(self, 'kwargs'):
|
||||||
|
|
||||||
|
model_kwarg = self.kwargs.get(self.model_kwarg, None)
|
||||||
|
|
||||||
|
if model_kwarg:
|
||||||
|
|
||||||
|
self._model = self.related_objects(self.base_model, model_kwarg)
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
self._model = self.base_model
|
||||||
|
|
||||||
|
return self._model
|
||||||
|
|
||||||
|
|
||||||
|
def related_objects(self, model, model_kwarg):
|
||||||
|
"""Recursive relate_objects fetch
|
||||||
|
|
||||||
|
Fetch the model that is lowest in the chain of inherited models
|
||||||
|
|
||||||
|
Args:
|
||||||
|
model (django.db.models.Model): The model to obtain the
|
||||||
|
related_model from.
|
||||||
|
model_kwarg (str): The URL Kwarg of the model.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
_type_: _description_
|
||||||
|
"""
|
||||||
|
|
||||||
|
related_model = None
|
||||||
|
|
||||||
|
if model_kwarg:
|
||||||
|
|
||||||
|
for related_object in model._meta.related_objects:
|
||||||
|
|
||||||
|
related_objects = getattr(related_object.related_model._meta, 'related_objects', [])
|
||||||
|
|
||||||
|
if(
|
||||||
|
str(
|
||||||
|
related_object.related_model._meta.verbose_name
|
||||||
|
).lower().replace(' ', '_') == model_kwarg
|
||||||
|
):
|
||||||
|
|
||||||
|
related_model = related_object.related_model
|
||||||
|
break
|
||||||
|
|
||||||
|
elif related_objects:
|
||||||
|
|
||||||
|
related_model = self.related_objects(model = related_object.related_model, model_kwarg = model_kwarg)
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
return related_model
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
|
||||||
|
serializer_module = importlib.import_module(
|
||||||
|
self.model._meta.app_label + '.serializers.' + str(
|
||||||
|
self.model._meta.verbose_name
|
||||||
|
).lower().replace(' ', '_')
|
||||||
|
)
|
||||||
|
|
||||||
|
if (
|
||||||
|
self.action == 'list'
|
||||||
|
or self.action == 'retrieve'
|
||||||
|
):
|
||||||
|
|
||||||
|
self.serializer_class = getattr(serializer_module, 'ViewSerializer')
|
||||||
|
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
self.serializer_class = getattr(serializer_module, 'ModelSerializer')
|
||||||
|
|
||||||
|
|
||||||
|
return self.serializer_class
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ModelCreateViewSet(
|
class ModelCreateViewSet(
|
||||||
ModelViewSetBase,
|
ModelViewSetBase,
|
||||||
Create,
|
Create,
|
||||||
|
Reference in New Issue
Block a user