Coverage for apis_core/generic/api_views.py: 48%
23 statements
« prev ^ index » next coverage.py v7.6.10, created at 2025-02-19 16:54 +0000
« prev ^ index » next coverage.py v7.6.10, created at 2025-02-19 16:54 +0000
1from rest_framework import viewsets
3from apis_core.generic.schema import GenericAutoSchema
5from .filterbackends import GenericFilterBackend
6from .helpers import first_member_match, makeclassprefix, module_paths
7from .serializers import GenericHyperlinkedModelSerializer, serializer_factory
10class ModelViewSet(viewsets.ModelViewSet):
11 """
12 API ViewSet for a generic model.
13 The queryset is overridden by the first match from
14 the `first_member_match` helper.
15 The serializer class is overridden by the first match from
16 the `first_member_match` helper.
17 """
19 filter_backends = [GenericFilterBackend]
20 schema = GenericAutoSchema()
22 def dispatch(self, *args, **kwargs):
23 self.model = kwargs.get("contenttype").model_class()
24 return super().dispatch(*args, **kwargs)
26 def get_queryset(self):
27 queryset_methods = module_paths(
28 self.model, path="querysets", suffix="ViewSetQueryset"
29 )
30 queryset = first_member_match(queryset_methods) or (lambda x: x)
31 return queryset(self.model.objects.all())
33 def get_serializer_class(self):
34 renderer = getattr(getattr(self, "request", {}), "accepted_renderer", None)
35 serializer_class_modules = module_paths(
36 self.model, path="serializers", suffix="Serializer"
37 )
38 if renderer is not None:
39 prefix = makeclassprefix(renderer.format)
40 serializer_class_modules = (
41 module_paths(
42 self.model, path="serializers", suffix=f"{prefix}Serializer"
43 )
44 + serializer_class_modules
45 )
47 serializer_class = first_member_match(
48 serializer_class_modules,
49 getattr(renderer, "serializer", GenericHyperlinkedModelSerializer),
50 )
51 return serializer_factory(self.model, serializer=serializer_class)