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

1from rest_framework import viewsets 

2 

3from apis_core.generic.schema import GenericAutoSchema 

4 

5from .filterbackends import GenericFilterBackend 

6from .helpers import first_member_match, makeclassprefix, module_paths 

7from .serializers import GenericHyperlinkedModelSerializer, serializer_factory 

8 

9 

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 """ 

18 

19 filter_backends = [GenericFilterBackend] 

20 schema = GenericAutoSchema() 

21 

22 def dispatch(self, *args, **kwargs): 

23 self.model = kwargs.get("contenttype").model_class() 

24 return super().dispatch(*args, **kwargs) 

25 

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()) 

32 

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 ) 

46 

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)