Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/rest_framework/mixins.py: 93%

53 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2023-07-17 14:22 -0600

1""" 

2Basic building blocks for generic class based views. 

3 

4We don't bind behaviour to http method handlers yet, 

5which allows mixin classes to be composed in interesting ways. 

6""" 

7from rest_framework import status 

8from rest_framework.response import Response 

9from rest_framework.settings import api_settings 

10 

11 

12class CreateModelMixin: 

13 """ 

14 Create a model instance. 

15 """ 

16 def create(self, request, *args, **kwargs): 

17 serializer = self.get_serializer(data=request.data) 

18 serializer.is_valid(raise_exception=True) 

19 self.perform_create(serializer) 

20 headers = self.get_success_headers(serializer.data) 

21 return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) 

22 

23 def perform_create(self, serializer): 

24 serializer.save() 

25 

26 def get_success_headers(self, data): 

27 try: 

28 return {'Location': str(data[api_settings.URL_FIELD_NAME])} 

29 except (TypeError, KeyError): 

30 return {} 

31 

32 

33class ListModelMixin: 

34 """ 

35 List a queryset. 

36 """ 

37 def list(self, request, *args, **kwargs): 

38 queryset = self.filter_queryset(self.get_queryset()) 

39 

40 page = self.paginate_queryset(queryset) 

41 if page is not None: 41 ↛ 45line 41 didn't jump to line 45, because the condition on line 41 was never false

42 serializer = self.get_serializer(page, many=True) 

43 return self.get_paginated_response(serializer.data) 

44 

45 serializer = self.get_serializer(queryset, many=True) 

46 return Response(serializer.data) 

47 

48 

49class RetrieveModelMixin: 

50 """ 

51 Retrieve a model instance. 

52 """ 

53 def retrieve(self, request, *args, **kwargs): 

54 instance = self.get_object() 

55 serializer = self.get_serializer(instance) 

56 return Response(serializer.data) 

57 

58 

59class UpdateModelMixin: 

60 """ 

61 Update a model instance. 

62 """ 

63 def update(self, request, *args, **kwargs): 

64 partial = kwargs.pop('partial', False) 

65 instance = self.get_object() 

66 serializer = self.get_serializer(instance, data=request.data, partial=partial) 

67 serializer.is_valid(raise_exception=True) 

68 self.perform_update(serializer) 

69 

70 if getattr(instance, '_prefetched_objects_cache', None): 70 ↛ 73line 70 didn't jump to line 73, because the condition on line 70 was never true

71 # If 'prefetch_related' has been applied to a queryset, we need to 

72 # forcibly invalidate the prefetch cache on the instance. 

73 instance._prefetched_objects_cache = {} 

74 

75 return Response(serializer.data) 

76 

77 def perform_update(self, serializer): 

78 serializer.save() 

79 

80 def partial_update(self, request, *args, **kwargs): 

81 kwargs['partial'] = True 

82 return self.update(request, *args, **kwargs) 

83 

84 

85class DestroyModelMixin: 

86 """ 

87 Destroy a model instance. 

88 """ 

89 def destroy(self, request, *args, **kwargs): 

90 instance = self.get_object() 

91 self.perform_destroy(instance) 

92 return Response(status=status.HTTP_204_NO_CONTENT) 

93 

94 def perform_destroy(self, instance): 

95 instance.delete()