blob: adc15e45db0c587e4b592a5d236608982888529b [file] [log] [blame]
Mitja Nikolaus1280ef42018-08-21 16:20:07 +02001"""REST API for accessing heartbeats."""
2
Dirk Vogte1784882016-10-13 16:09:38 +02003from django.shortcuts import get_object_or_404
Mitja Nikolaus1280ef42018-08-21 16:20:07 +02004from django.utils.decorators import method_decorator
5from drf_yasg import openapi
6from drf_yasg.utils import swagger_auto_schema
7from rest_framework import generics, status
8from rest_framework.exceptions import NotFound, ValidationError
9
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020010from crashreports.models import HeartBeat
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020011from crashreports.permissions import HasRightsOrIsDeviceOwnerDeviceCreation
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020012from crashreports.response_descriptions import default_desc
13from crashreports.serializers import HeartBeatSerializer
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020014
Dirk Vogte1784882016-10-13 16:09:38 +020015
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020016@method_decorator(
17 name="get",
18 decorator=swagger_auto_schema(operation_description="List heartbeats"),
19)
20@method_decorator(
21 name="post",
22 decorator=swagger_auto_schema(
23 operation_description="Create a heartbeat",
24 request_body=HeartBeatSerializer,
25 responses=dict(
26 [
27 default_desc(ValidationError),
28 (
29 status.HTTP_404_NOT_FOUND,
30 openapi.Response(
31 "No device with the given uuid could be found."
32 ),
33 ),
34 ]
35 ),
36 ),
37)
Dirk Vogte1784882016-10-13 16:09:38 +020038class ListCreateView(generics.ListCreateAPIView):
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020039 """Endpoint for listing heartbeats and creating new heartbeats."""
40
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020041 queryset = HeartBeat.objects.all()
42 paginate_by = 20
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020043 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation,)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020044 serializer_class = HeartBeatSerializer
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020045 filter_fields = ("device", "build_fingerprint", "radio_version")
Dirk Vogte1784882016-10-13 16:09:38 +020046
47 def get(self, *args, **kwargs):
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020048 """Override device__uuid parameter with uuid."""
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020049 if "uuid" in kwargs:
Dirk Vogte1784882016-10-13 16:09:38 +020050 self.queryset = HeartBeat.objects.filter(
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020051 device__uuid=kwargs["uuid"]
52 )
Dirk Vogte1784882016-10-13 16:09:38 +020053 return generics.ListCreateAPIView.get(self, *args, **kwargs)
54
55
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020056@method_decorator(
57 name="get",
58 decorator=swagger_auto_schema(
59 operation_description="Get a heartbeat",
60 responses=dict([default_desc(NotFound)]),
61 ),
62)
63@method_decorator(
64 name="put",
65 decorator=swagger_auto_schema(
66 operation_description="Update a heartbeat",
67 responses=dict([default_desc(NotFound), default_desc(ValidationError)]),
68 ),
69)
70@method_decorator(
71 name="patch",
72 decorator=swagger_auto_schema(
73 operation_description="Partially update a heartbeat",
74 responses=dict([default_desc(NotFound), default_desc(ValidationError)]),
75 ),
76)
77@method_decorator(
78 name="delete",
79 decorator=swagger_auto_schema(
80 operation_description="Delete a heartbeat",
81 responses=dict([default_desc(NotFound)]),
82 ),
83)
Dirk Vogte1784882016-10-13 16:09:38 +020084class RetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020085 """Endpoint for retrieving, updating and deleting heartbeats."""
86
87 # pylint: disable=too-many-ancestors
88
Dirk Vogte1784882016-10-13 16:09:38 +020089 queryset = HeartBeat.objects.all()
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020090 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation,)
Dirk Vogte1784882016-10-13 16:09:38 +020091 serializer_class = HeartBeatSerializer
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020092 multiple_lookup_fields = {"id", "device__uuid", "device_local_id"}
Dirk Vogte1784882016-10-13 16:09:38 +020093
94 def get_object(self):
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020095 """Retrieve a heartbeat."""
Dirk Vogte1784882016-10-13 16:09:38 +020096 queryset = self.get_queryset()
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020097 query_filter = {}
Dirk Vogte1784882016-10-13 16:09:38 +020098 for field in self.multiple_lookup_fields:
99 if field in self.kwargs:
Mitja Nikolaus1280ef42018-08-21 16:20:07 +0200100 query_filter[field] = self.kwargs[field]
101 obj = get_object_or_404(queryset, **query_filter)
Dirk Vogte1784882016-10-13 16:09:38 +0200102 self.check_object_permissions(self.request, obj)
103 return obj