blob: e5a718e340fdf1d60f1149bfe51f078e4d961a61 [file] [log] [blame]
Mitja Nikolaus1280ef42018-08-21 16:20:07 +02001"""REST API for accessing heartbeats."""
2
Mitja Nikolaus1280ef42018-08-21 16:20:07 +02003from django.utils.decorators import method_decorator
4from drf_yasg import openapi
5from drf_yasg.utils import swagger_auto_schema
6from rest_framework import generics, status
7from rest_framework.exceptions import NotFound, ValidationError
8
Dirk Vogtc9e10ab2016-10-12 13:58:15 +02009from crashreports.models import HeartBeat
Mitja Nikolaus4d759da2018-08-28 15:31:29 +020010from crashreports.permissions import (
11 HasRightsOrIsDeviceOwnerDeviceCreation,
12 SWAGGER_SECURITY_REQUIREMENTS_ALL,
13)
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020014from crashreports.response_descriptions import default_desc
15from crashreports.serializers import HeartBeatSerializer
Mitja Nikolause2928eb2018-11-02 15:07:20 +010016from crashreports.utils import get_object_by_lookup_fields
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020017
Dirk Vogte1784882016-10-13 16:09:38 +020018
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020019@method_decorator(
20 name="get",
Mitja Nikolaus4d759da2018-08-28 15:31:29 +020021 decorator=swagger_auto_schema(
22 operation_description="List heartbeats",
23 security=SWAGGER_SECURITY_REQUIREMENTS_ALL,
24 ),
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020025)
26@method_decorator(
27 name="post",
28 decorator=swagger_auto_schema(
29 operation_description="Create a heartbeat",
Mitja Nikolaus4d759da2018-08-28 15:31:29 +020030 security=SWAGGER_SECURITY_REQUIREMENTS_ALL,
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020031 request_body=HeartBeatSerializer,
32 responses=dict(
33 [
34 default_desc(ValidationError),
35 (
36 status.HTTP_404_NOT_FOUND,
37 openapi.Response(
38 "No device with the given uuid could be found."
39 ),
40 ),
41 ]
42 ),
43 ),
44)
Dirk Vogte1784882016-10-13 16:09:38 +020045class ListCreateView(generics.ListCreateAPIView):
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020046 """Endpoint for listing heartbeats and creating new heartbeats."""
47
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020048 queryset = HeartBeat.objects.all()
49 paginate_by = 20
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020050 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation,)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020051 serializer_class = HeartBeatSerializer
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020052 filter_fields = ("device", "build_fingerprint", "radio_version")
Dirk Vogte1784882016-10-13 16:09:38 +020053
Mitja Nikolaus773d0cd2018-08-31 10:55:43 +020054 def get(self, request, *args, **kwargs):
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020055 """Override device__uuid parameter with uuid."""
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020056 if "uuid" in kwargs:
Dirk Vogte1784882016-10-13 16:09:38 +020057 self.queryset = HeartBeat.objects.filter(
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020058 device__uuid=kwargs["uuid"]
59 )
Mitja Nikolaus773d0cd2018-08-31 10:55:43 +020060 return generics.ListCreateAPIView.get(self, request, *args, **kwargs)
Dirk Vogte1784882016-10-13 16:09:38 +020061
62
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020063@method_decorator(
64 name="get",
65 decorator=swagger_auto_schema(
66 operation_description="Get a heartbeat",
Mitja Nikolaus4d759da2018-08-28 15:31:29 +020067 security=SWAGGER_SECURITY_REQUIREMENTS_ALL,
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020068 responses=dict([default_desc(NotFound)]),
69 ),
70)
71@method_decorator(
72 name="put",
73 decorator=swagger_auto_schema(
74 operation_description="Update a heartbeat",
Mitja Nikolaus4d759da2018-08-28 15:31:29 +020075 security=SWAGGER_SECURITY_REQUIREMENTS_ALL,
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020076 responses=dict([default_desc(NotFound), default_desc(ValidationError)]),
77 ),
78)
79@method_decorator(
80 name="patch",
81 decorator=swagger_auto_schema(
82 operation_description="Partially update a heartbeat",
Mitja Nikolaus4d759da2018-08-28 15:31:29 +020083 security=SWAGGER_SECURITY_REQUIREMENTS_ALL,
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020084 responses=dict([default_desc(NotFound), default_desc(ValidationError)]),
85 ),
86)
87@method_decorator(
88 name="delete",
89 decorator=swagger_auto_schema(
90 operation_description="Delete a heartbeat",
Mitja Nikolaus4d759da2018-08-28 15:31:29 +020091 security=SWAGGER_SECURITY_REQUIREMENTS_ALL,
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020092 responses=dict([default_desc(NotFound)]),
93 ),
94)
Dirk Vogte1784882016-10-13 16:09:38 +020095class RetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020096 """Endpoint for retrieving, updating and deleting heartbeats."""
97
98 # pylint: disable=too-many-ancestors
99
Dirk Vogte1784882016-10-13 16:09:38 +0200100 queryset = HeartBeat.objects.all()
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +0200101 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation,)
Dirk Vogte1784882016-10-13 16:09:38 +0200102 serializer_class = HeartBeatSerializer
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +0200103 multiple_lookup_fields = {"id", "device__uuid", "device_local_id"}
Dirk Vogte1784882016-10-13 16:09:38 +0200104
105 def get_object(self):
Mitja Nikolaus1280ef42018-08-21 16:20:07 +0200106 """Retrieve a heartbeat."""
Mitja Nikolause2928eb2018-11-02 15:07:20 +0100107 return get_object_by_lookup_fields(self, self.multiple_lookup_fields)