blob: af71a70780943c7adb8480f3a263a8faee9d4aa0 [file] [log] [blame]
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +02001"""Serializers for Crashreport-related models."""
Borjan Tchakaloff340b6f32018-03-01 15:23:43 +04002from django.utils import timezone
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +02003from django.core.exceptions import ObjectDoesNotExist
Dirk Vogtd1345212016-09-14 14:31:45 +02004from rest_framework import serializers
Dirk Vogtf2a33422016-10-11 17:17:26 +02005from rest_framework.exceptions import NotFound
Dirk Vogtd1345212016-09-14 14:31:45 +02006from rest_framework import permissions
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +02007
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +02008from crashreports.models import Crashreport, Device, HeartBeat, LogFile
Dirk Vogt67eb1482016-10-13 12:42:56 +02009from crashreports.permissions import user_is_hiccup_staff
10
11
12class PrivateField(serializers.ReadOnlyField):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020013 """Class for making a field private.
14
15 The private attribute can then only be read by Hiccup staff members
16 """
Dirk Vogt67eb1482016-10-13 12:42:56 +020017
18 def get_attribute(self, instance):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020019 """Get the private attribute.
20
Dirk Vogt67eb1482016-10-13 12:42:56 +020021 Given the *outgoing* object instance, return the primitive value
22 that should be used for this field.
23 """
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020024 if user_is_hiccup_staff(self.context["request"].user):
Dirk Vogt67eb1482016-10-13 12:42:56 +020025 return super(PrivateField, self).get_attribute(instance)
26 return -1
Dirk Vogtd1345212016-09-14 14:31:45 +020027
Dirk Vogtf2a33422016-10-11 17:17:26 +020028
Dirk Vogtd1345212016-09-14 14:31:45 +020029class CrashReportSerializer(serializers.ModelSerializer):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020030 """Serializer for CrashReport instances."""
31
Dirk Vogtf2a33422016-10-11 17:17:26 +020032 permission_classes = (permissions.AllowAny,)
Dirk Vogt83107df2017-05-02 12:04:19 +020033 logfiles = serializers.HyperlinkedRelatedField(
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020034 read_only=True, many=True, view_name="api_v1_logfiles_by_id"
35 )
Dirk Vogtf2a33422016-10-11 17:17:26 +020036 uuid = serializers.CharField(max_length=64)
Dirk Vogt67eb1482016-10-13 12:42:56 +020037 id = PrivateField()
38 device_local_id = serializers.IntegerField(required=False)
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020039 date = serializers.DateTimeField(default_timezone=timezone.utc)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020040
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020041 class Meta: # noqa: D106
Dirk Vogtd1345212016-09-14 14:31:45 +020042 model = Crashreport
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020043 exclude = ("device",)
Dirk Vogtf2a33422016-10-11 17:17:26 +020044
45 def create(self, validated_data):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020046 """Create a crashreport.
47
48 Args:
49 validated_data: Data of the crashreport, excluding the device
50
51 Returns: The created report
52
53 """
Dirk Vogtf2a33422016-10-11 17:17:26 +020054 try:
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020055 device = Device.objects.get(uuid=validated_data["uuid"])
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020056 except ObjectDoesNotExist:
Dirk Vogtf2a33422016-10-11 17:17:26 +020057 raise NotFound(detail="uuid does not exist")
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020058 validated_data.pop("uuid", None)
Dirk Vogtf2a33422016-10-11 17:17:26 +020059 report = Crashreport(**validated_data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020060 report.device = device
Dirk Vogtf2a33422016-10-11 17:17:26 +020061 report.save()
62 return report
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020063
64
65class HeartBeatSerializer(serializers.ModelSerializer):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020066 """Serializer for HeartBeat instances."""
67
Dirk Vogt36635692016-10-17 12:19:10 +020068 permission_classes = (permissions.IsAuthenticated,)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020069 uuid = serializers.CharField(max_length=64)
Dirk Vogt67eb1482016-10-13 12:42:56 +020070 id = PrivateField()
71 device_local_id = serializers.IntegerField(required=False)
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020072 date = serializers.DateTimeField(default_timezone=timezone.utc)
Dirk Vogte1784882016-10-13 16:09:38 +020073
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020074 class Meta: # noqa: D106
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020075 model = HeartBeat
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020076 exclude = ("device",)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020077
78 def create(self, validated_data):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020079 """Create a heartbeat report.
80
81 Args:
82 validated_data: Data of the heartbeat, excluding the device
83
84 Returns: The created heartbeat
85
86 """
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020087 try:
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020088 device = Device.objects.get(uuid=validated_data["uuid"])
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020089 except ObjectDoesNotExist:
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020090 raise NotFound(detail="uuid does not exist")
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +020091 validated_data.pop("uuid", None)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020092 heartbeat = HeartBeat(**validated_data)
93 heartbeat.device = device
94 heartbeat.save()
95 return heartbeat
96
Dirk Vogtf2a33422016-10-11 17:17:26 +020097
Dirk Vogt83107df2017-05-02 12:04:19 +020098class LogFileSerializer(serializers.ModelSerializer):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020099 """Serializer for LogFile instances."""
100
Dirk Vogt83107df2017-05-02 12:04:19 +0200101 permission_classes = (permissions.IsAdminUser,)
102
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200103 class Meta: # noqa: D106
Dirk Vogt83107df2017-05-02 12:04:19 +0200104 model = LogFile
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +0200105 fields = "__all__"
Dirk Vogt83107df2017-05-02 12:04:19 +0200106
107
Dirk Vogtf2a33422016-10-11 17:17:26 +0200108class DeviceSerializer(serializers.ModelSerializer):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200109 """Serializer for Device instances."""
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200110
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200111 permission_classes = (permissions.IsAdminUser,)
112 board_date = serializers.DateTimeField(default_timezone=timezone.utc)
113 last_heartbeat = serializers.DateTimeField(default_timezone=timezone.utc)
114
115 class Meta: # noqa: D106
Dirk Vogtf2a33422016-10-11 17:17:26 +0200116 model = Device
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +0200117 fields = "__all__"
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +0100118
119
120class DeviceCreateSerializer(DeviceSerializer):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200121 """Serializer for creating Device instances."""
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +0100122
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200123 class Meta: # noqa: D106
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +0100124 model = Device
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +0200125 fields = ("board_date", "chipset")
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +0100126 extra_kwargs = {
Mitja Nikolauscb50f2c2018-08-24 13:54:48 +0200127 "board_date": {"required": True},
128 "chipset": {"required": True},
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +0100129 }