blob: 732e5956f409d7f2bd22293812cbce829a4a7d92 [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
8from crashreports.models import (
9 Crashreport, Device, HeartBeat, LogFile
10)
Dirk Vogt67eb1482016-10-13 12:42:56 +020011from crashreports.permissions import user_is_hiccup_staff
12
13
14class PrivateField(serializers.ReadOnlyField):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020015 """Class for making a field private.
16
17 The private attribute can then only be read by Hiccup staff members
18 """
Dirk Vogt67eb1482016-10-13 12:42:56 +020019
20 def get_attribute(self, instance):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020021 """Get the private attribute.
22
Dirk Vogt67eb1482016-10-13 12:42:56 +020023 Given the *outgoing* object instance, return the primitive value
24 that should be used for this field.
25 """
26 if user_is_hiccup_staff(self.context['request'].user):
27 return super(PrivateField, self).get_attribute(instance)
28 return -1
Dirk Vogtd1345212016-09-14 14:31:45 +020029
Dirk Vogtf2a33422016-10-11 17:17:26 +020030
Dirk Vogtd1345212016-09-14 14:31:45 +020031class CrashReportSerializer(serializers.ModelSerializer):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020032 """Serializer for CrashReport instances."""
33
Dirk Vogtf2a33422016-10-11 17:17:26 +020034 permission_classes = (permissions.AllowAny,)
Dirk Vogt83107df2017-05-02 12:04:19 +020035 logfiles = serializers.HyperlinkedRelatedField(
36 read_only=True,
37 many=True,
38 view_name='api_v1_logfiles_by_id',
39 )
Dirk Vogtf2a33422016-10-11 17:17:26 +020040 uuid = serializers.CharField(max_length=64)
Dirk Vogt67eb1482016-10-13 12:42:56 +020041 id = PrivateField()
42 device_local_id = serializers.IntegerField(required=False)
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020043 date = serializers.DateTimeField(default_timezone=timezone.utc)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020044
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020045 class Meta: # noqa: D106
Dirk Vogtd1345212016-09-14 14:31:45 +020046 model = Crashreport
Dirk Vogtf2a33422016-10-11 17:17:26 +020047 exclude = ('device',)
48
49 def create(self, validated_data):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020050 """Create a crashreport.
51
52 Args:
53 validated_data: Data of the crashreport, excluding the device
54
55 Returns: The created report
56
57 """
Dirk Vogtf2a33422016-10-11 17:17:26 +020058 try:
59 device = Device.objects.get(uuid=validated_data['uuid'])
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020060 except ObjectDoesNotExist:
Dirk Vogtf2a33422016-10-11 17:17:26 +020061 raise NotFound(detail="uuid does not exist")
62 validated_data.pop('uuid', None)
63 report = Crashreport(**validated_data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020064 report.device = device
Dirk Vogtf2a33422016-10-11 17:17:26 +020065 report.save()
66 return report
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020067
68
69class HeartBeatSerializer(serializers.ModelSerializer):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020070 """Serializer for HeartBeat instances."""
71
Dirk Vogt36635692016-10-17 12:19:10 +020072 permission_classes = (permissions.IsAuthenticated,)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020073 uuid = serializers.CharField(max_length=64)
Dirk Vogt67eb1482016-10-13 12:42:56 +020074 id = PrivateField()
75 device_local_id = serializers.IntegerField(required=False)
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020076 date = serializers.DateTimeField(default_timezone=timezone.utc)
Dirk Vogte1784882016-10-13 16:09:38 +020077
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020078 class Meta: # noqa: D106
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020079 model = HeartBeat
80 exclude = ('device',)
81
82 def create(self, validated_data):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020083 """Create a heartbeat report.
84
85 Args:
86 validated_data: Data of the heartbeat, excluding the device
87
88 Returns: The created heartbeat
89
90 """
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020091 try:
92 device = Device.objects.get(uuid=validated_data['uuid'])
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +020093 except ObjectDoesNotExist:
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020094 raise NotFound(detail="uuid does not exist")
95 validated_data.pop('uuid', None)
96 heartbeat = HeartBeat(**validated_data)
97 heartbeat.device = device
98 heartbeat.save()
99 return heartbeat
100
Dirk Vogtf2a33422016-10-11 17:17:26 +0200101
Dirk Vogt83107df2017-05-02 12:04:19 +0200102class LogFileSerializer(serializers.ModelSerializer):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200103 """Serializer for LogFile instances."""
104
Dirk Vogt83107df2017-05-02 12:04:19 +0200105 permission_classes = (permissions.IsAdminUser,)
106
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200107 class Meta: # noqa: D106
Dirk Vogt83107df2017-05-02 12:04:19 +0200108 model = LogFile
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200109 fields = '__all__'
Dirk Vogt83107df2017-05-02 12:04:19 +0200110
111
Dirk Vogtf2a33422016-10-11 17:17:26 +0200112class DeviceSerializer(serializers.ModelSerializer):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200113 """Serializer for Device instances."""
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200114
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200115 permission_classes = (permissions.IsAdminUser,)
116 board_date = serializers.DateTimeField(default_timezone=timezone.utc)
117 last_heartbeat = serializers.DateTimeField(default_timezone=timezone.utc)
118
119 class Meta: # noqa: D106
Dirk Vogtf2a33422016-10-11 17:17:26 +0200120 model = Device
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200121 fields = '__all__'
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +0100122
123
124class DeviceCreateSerializer(DeviceSerializer):
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200125 """Serializer for creating Device instances."""
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +0100126
Mitja Nikolaus5c3e0572018-07-30 13:36:14 +0200127 class Meta: # noqa: D106
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +0100128 model = Device
129 fields = ('board_date', 'chipset')
130 extra_kwargs = {
131 'board_date': {'required': True},
132 'chipset': {'required': True},
133 }