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
« 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.
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
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)
23 def perform_create(self, serializer):
24 serializer.save()
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 {}
33class ListModelMixin:
34 """
35 List a queryset.
36 """
37 def list(self, request, *args, **kwargs):
38 queryset = self.filter_queryset(self.get_queryset())
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)
45 serializer = self.get_serializer(queryset, many=True)
46 return Response(serializer.data)
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)
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)
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 = {}
75 return Response(serializer.data)
77 def perform_update(self, serializer):
78 serializer.save()
80 def partial_update(self, request, *args, **kwargs):
81 kwargs['partial'] = True
82 return self.update(request, *args, **kwargs)
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)
94 def perform_destroy(self, instance):
95 instance.delete()