blob: 4d881632c83e6a5db83c235cdf41757f6658d21a [file] [log] [blame]
Borjan Tchakaloff340b6f32018-03-01 15:23:43 +04001from django.utils import timezone
Dirk Vogtd1345212016-09-14 14:31:45 +02002from rest_framework import serializers
Dirk Vogtf2a33422016-10-11 17:17:26 +02003from rest_framework.exceptions import NotFound
4from crashreports.models import Crashreport
5from crashreports.models import Device
Dirk Vogtc9e10ab2016-10-12 13:58:15 +02006from crashreports.models import HeartBeat
Dirk Vogt83107df2017-05-02 12:04:19 +02007from crashreports.models import LogFile
8
Dirk Vogtd1345212016-09-14 14:31:45 +02009from rest_framework import permissions
Dirk Vogt67eb1482016-10-13 12:42:56 +020010from crashreports.permissions import user_is_hiccup_staff
11
12
13class PrivateField(serializers.ReadOnlyField):
14
15 def get_attribute(self, instance):
16 """
17 Given the *outgoing* object instance, return the primitive value
18 that should be used for this field.
19 """
20 if user_is_hiccup_staff(self.context['request'].user):
21 return super(PrivateField, self).get_attribute(instance)
22 return -1
Dirk Vogtd1345212016-09-14 14:31:45 +020023
Dirk Vogtf2a33422016-10-11 17:17:26 +020024
Dirk Vogtd1345212016-09-14 14:31:45 +020025class CrashReportSerializer(serializers.ModelSerializer):
Dirk Vogtf2a33422016-10-11 17:17:26 +020026 permission_classes = (permissions.AllowAny,)
Dirk Vogt83107df2017-05-02 12:04:19 +020027 logfiles = serializers.HyperlinkedRelatedField(
28 read_only=True,
29 many=True,
30 view_name='api_v1_logfiles_by_id',
31 )
Dirk Vogtf2a33422016-10-11 17:17:26 +020032 uuid = serializers.CharField(max_length=64)
Dirk Vogt67eb1482016-10-13 12:42:56 +020033 id = PrivateField()
34 device_local_id = serializers.IntegerField(required=False)
Borjan Tchakaloff340b6f32018-03-01 15:23:43 +040035 date = serializers.DateTimeField(default_timezone=timezone.UTC())
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020036
Dirk Vogtd1345212016-09-14 14:31:45 +020037 class Meta:
38 model = Crashreport
Dirk Vogtf2a33422016-10-11 17:17:26 +020039 exclude = ('device',)
40
41 def create(self, validated_data):
42 try:
43 device = Device.objects.get(uuid=validated_data['uuid'])
44 except:
45 raise NotFound(detail="uuid does not exist")
46 validated_data.pop('uuid', None)
47 report = Crashreport(**validated_data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020048 report.device = device
Dirk Vogtf2a33422016-10-11 17:17:26 +020049 report.save()
50 return report
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020051
52
53class HeartBeatSerializer(serializers.ModelSerializer):
Dirk Vogt36635692016-10-17 12:19:10 +020054 permission_classes = (permissions.IsAuthenticated,)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020055 uuid = serializers.CharField(max_length=64)
Dirk Vogt67eb1482016-10-13 12:42:56 +020056 id = PrivateField()
57 device_local_id = serializers.IntegerField(required=False)
Borjan Tchakaloff340b6f32018-03-01 15:23:43 +040058 date = serializers.DateTimeField(default_timezone=timezone.UTC())
Dirk Vogte1784882016-10-13 16:09:38 +020059
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020060 class Meta:
61 model = HeartBeat
62 exclude = ('device',)
63
64 def create(self, validated_data):
65 try:
66 device = Device.objects.get(uuid=validated_data['uuid'])
67 except:
68 raise NotFound(detail="uuid does not exist")
69 validated_data.pop('uuid', None)
70 heartbeat = HeartBeat(**validated_data)
71 heartbeat.device = device
72 heartbeat.save()
73 return heartbeat
74
Dirk Vogtf2a33422016-10-11 17:17:26 +020075
Dirk Vogt83107df2017-05-02 12:04:19 +020076class LogFileSerializer(serializers.ModelSerializer):
77 permission_classes = (permissions.IsAdminUser,)
78
79 class Meta:
80 model = LogFile
81
82
Dirk Vogtf2a33422016-10-11 17:17:26 +020083class DeviceSerializer(serializers.ModelSerializer):
84 permission_classes = (permissions.IsAdminUser,)
Borjan Tchakaloff340b6f32018-03-01 15:23:43 +040085 board_date = serializers.DateTimeField(default_timezone=timezone.UTC())
86 last_heartbeat = serializers.DateTimeField(default_timezone=timezone.UTC())
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020087
Dirk Vogtf2a33422016-10-11 17:17:26 +020088 class Meta:
89 model = Device
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +010090
91
92class DeviceCreateSerializer(DeviceSerializer):
93
94 class Meta:
95 model = Device
96 fields = ('board_date', 'chipset')
97 extra_kwargs = {
98 'board_date': {'required': True},
99 'chipset': {'required': True},
100 }