blob: dffce5685044424040b5125f394df9421740a4e0 [file] [log] [blame]
Dirk Vogtd1345212016-09-14 14:31:45 +02001from rest_framework import serializers
Dirk Vogtf2a33422016-10-11 17:17:26 +02002from rest_framework.exceptions import NotFound
3from crashreports.models import Crashreport
4from crashreports.models import Device
Dirk Vogtc9e10ab2016-10-12 13:58:15 +02005from crashreports.models import HeartBeat
Dirk Vogt83107df2017-05-02 12:04:19 +02006from crashreports.models import LogFile
7
Dirk Vogtd1345212016-09-14 14:31:45 +02008from rest_framework import permissions
Dirk Vogt67eb1482016-10-13 12:42:56 +02009from crashreports.permissions import user_is_hiccup_staff
10
11
12class PrivateField(serializers.ReadOnlyField):
13
14 def get_attribute(self, instance):
15 """
16 Given the *outgoing* object instance, return the primitive value
17 that should be used for this field.
18 """
19 if user_is_hiccup_staff(self.context['request'].user):
20 return super(PrivateField, self).get_attribute(instance)
21 return -1
Dirk Vogtd1345212016-09-14 14:31:45 +020022
Dirk Vogtf2a33422016-10-11 17:17:26 +020023
Dirk Vogtd1345212016-09-14 14:31:45 +020024class CrashReportSerializer(serializers.ModelSerializer):
Dirk Vogtf2a33422016-10-11 17:17:26 +020025 permission_classes = (permissions.AllowAny,)
Dirk Vogt83107df2017-05-02 12:04:19 +020026 logfiles = serializers.HyperlinkedRelatedField(
27 read_only=True,
28 many=True,
29 view_name='api_v1_logfiles_by_id',
30 )
Dirk Vogtf2a33422016-10-11 17:17:26 +020031 uuid = serializers.CharField(max_length=64)
Dirk Vogt67eb1482016-10-13 12:42:56 +020032 id = PrivateField()
33 device_local_id = serializers.IntegerField(required=False)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020034
Dirk Vogtd1345212016-09-14 14:31:45 +020035 class Meta:
36 model = Crashreport
Dirk Vogtf2a33422016-10-11 17:17:26 +020037 exclude = ('device',)
38
39 def create(self, validated_data):
40 try:
41 device = Device.objects.get(uuid=validated_data['uuid'])
42 except:
43 raise NotFound(detail="uuid does not exist")
44 validated_data.pop('uuid', None)
45 report = Crashreport(**validated_data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020046 report.device = device
Dirk Vogtf2a33422016-10-11 17:17:26 +020047 report.save()
48 return report
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020049
50
51class HeartBeatSerializer(serializers.ModelSerializer):
Dirk Vogt36635692016-10-17 12:19:10 +020052 permission_classes = (permissions.IsAuthenticated,)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020053 uuid = serializers.CharField(max_length=64)
Dirk Vogt67eb1482016-10-13 12:42:56 +020054 id = PrivateField()
55 device_local_id = serializers.IntegerField(required=False)
Dirk Vogte1784882016-10-13 16:09:38 +020056
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020057 class Meta:
58 model = HeartBeat
59 exclude = ('device',)
60
61 def create(self, validated_data):
62 try:
63 device = Device.objects.get(uuid=validated_data['uuid'])
64 except:
65 raise NotFound(detail="uuid does not exist")
66 validated_data.pop('uuid', None)
67 heartbeat = HeartBeat(**validated_data)
68 heartbeat.device = device
69 heartbeat.save()
70 return heartbeat
71
Dirk Vogtf2a33422016-10-11 17:17:26 +020072
Dirk Vogt83107df2017-05-02 12:04:19 +020073class LogFileSerializer(serializers.ModelSerializer):
74 permission_classes = (permissions.IsAdminUser,)
75
76 class Meta:
77 model = LogFile
78
79
Dirk Vogtf2a33422016-10-11 17:17:26 +020080class DeviceSerializer(serializers.ModelSerializer):
81 permission_classes = (permissions.IsAdminUser,)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020082
Dirk Vogtf2a33422016-10-11 17:17:26 +020083 class Meta:
84 model = Device
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +010085
86
87class DeviceCreateSerializer(DeviceSerializer):
88
89 class Meta:
90 model = Device
91 fields = ('board_date', 'chipset')
92 extra_kwargs = {
93 'board_date': {'required': True},
94 'chipset': {'required': True},
95 }