blob: 6563caa7643a35af54258229446c4d52c9fa5521 [file] [log] [blame]
Mitja Nikolaus1280ef42018-08-21 16:20:07 +02001"""REST API for accessing log files."""
2from django.core.exceptions import ObjectDoesNotExist
3from django.utils.decorators import method_decorator
4from drf_yasg import openapi
5from drf_yasg.utils import swagger_auto_schema
Dirk Vogt7160b5e2016-10-12 17:04:40 +02006
Mitja Nikolaus1280ef42018-08-21 16:20:07 +02007from rest_framework import generics, status
8from rest_framework.decorators import (
9 api_view,
10 parser_classes,
11 permission_classes,
12)
13from rest_framework.exceptions import (
14 PermissionDenied,
15 NotFound,
16 ValidationError,
17)
Dirk Vogt7160b5e2016-10-12 17:04:40 +020018from rest_framework.parsers import FileUploadParser
19from rest_framework.permissions import IsAuthenticated
Dirk Vogt7160b5e2016-10-12 17:04:40 +020020from rest_framework.response import Response
Dirk Vogt83107df2017-05-02 12:04:19 +020021
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020022from crashreports.response_descriptions import default_desc
Dirk Vogt83107df2017-05-02 12:04:19 +020023from crashreports.serializers import LogFileSerializer
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020024from crashreports.models import Crashreport, LogFile
25from crashreports.permissions import (
26 HasRightsOrIsDeviceOwnerDeviceCreation,
27 user_owns_uuid,
28 user_is_hiccup_staff,
29)
Dirk Vogt83107df2017-05-02 12:04:19 +020030
31
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020032@method_decorator(
33 name="get",
34 decorator=swagger_auto_schema(operation_description="List log files"),
35)
Dirk Vogt83107df2017-05-02 12:04:19 +020036class ListCreateView(generics.ListAPIView):
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020037 """Endpoint for listing log files."""
38
Dirk Vogt83107df2017-05-02 12:04:19 +020039 queryset = LogFile.objects.all()
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020040 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation,)
Dirk Vogt83107df2017-05-02 12:04:19 +020041 serializer_class = LogFileSerializer
42
43
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020044@method_decorator(
45 name="get",
46 decorator=swagger_auto_schema(
47 operation_description="Get a log file",
48 responses=dict([default_desc(NotFound)]),
49 ),
50)
51@method_decorator(
52 name="put",
53 decorator=swagger_auto_schema(
54 operation_description="Update a log file",
55 responses=dict([default_desc(NotFound), default_desc(ValidationError)]),
56 ),
57)
58@method_decorator(
59 name="patch",
60 decorator=swagger_auto_schema(
61 operation_description="Partially update a log file",
62 responses=dict([default_desc(NotFound), default_desc(ValidationError)]),
63 ),
64)
65@method_decorator(
66 name="delete",
67 decorator=swagger_auto_schema(
68 operation_description="Delete a log file",
69 responses=dict([default_desc(NotFound)]),
70 ),
71)
Dirk Vogt83107df2017-05-02 12:04:19 +020072class RetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020073 """Endpoint for retrieving, updating and deleting log files."""
74
75 # pylint: disable=too-many-ancestors
76
Dirk Vogt83107df2017-05-02 12:04:19 +020077 queryset = LogFile.objects.all()
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020078 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation,)
Dirk Vogt83107df2017-05-02 12:04:19 +020079 serializer_class = LogFileSerializer
Dirk Vogt7160b5e2016-10-12 17:04:40 +020080
81
Mitja Nikolaus1280ef42018-08-21 16:20:07 +020082@swagger_auto_schema(
83 method="post",
84 request_body=LogFileSerializer,
85 responses=dict(
86 [
87 default_desc(ValidationError),
88 (
89 status.HTTP_404_NOT_FOUND,
90 openapi.Response("Crashreport does not exist."),
91 ),
92 (status.HTTP_201_CREATED, openapi.Response("Created")),
93 ]
94 ),
95)
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020096@api_view(http_method_names=["POST"])
97@parser_classes([FileUploadParser])
98@permission_classes([IsAuthenticated])
Dirk Vogt36635692016-10-17 12:19:10 +020099def logfile_put(request, uuid, device_local_id, filename):
Mitja Nikolaus1280ef42018-08-21 16:20:07 +0200100 """Upload a log file for a crash report."""
Dirk Vogt7160b5e2016-10-12 17:04:40 +0200101 try:
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +0200102 crashreport = Crashreport.objects.get(
103 device__uuid=uuid, device_local_id=device_local_id
104 )
Mitja Nikolaus1280ef42018-08-21 16:20:07 +0200105 except ObjectDoesNotExist:
Dirk Vogt36635692016-10-17 12:19:10 +0200106 raise NotFound(detail="Crashreport does not exist.")
107
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +0200108 if not (
109 user_owns_uuid(request.user, crashreport.device.uuid)
110 or user_is_hiccup_staff(request.user)
111 ):
Dirk Vogt7160b5e2016-10-12 17:04:40 +0200112 raise PermissionDenied(detail="Not allowed.")
Mitja Nikolaus1280ef42018-08-21 16:20:07 +0200113 file = request.data["file"]
114 logfile = LogFile(crashreport=crashreport, logfile=file)
Dirk Vogt7160b5e2016-10-12 17:04:40 +0200115 logfile.save()
Dirk Vogt36635692016-10-17 12:19:10 +0200116 return Response(status=201)