blob: b7c07dc3f672817b431f72112303fb0868c193f6 [file] [log] [blame]
Dirk Vogt62ff7f22017-05-04 16:07:21 +02001from rest_framework import generics
2from rest_framework import serializers
3from rest_framework.response import Response
4from rest_framework.views import APIView
5from crashreports.permissions import HasRightsOrIsDeviceOwnerDeviceCreation
6from django.db import connection
7from . import raw_querys
Dirk Vogt1accb672017-05-10 14:07:42 +02008from crashreport_stats.models import *
Dirk Vogt62ff7f22017-05-04 16:07:21 +02009import zipfile
10from crashreports.models import *
Dirk Vogt1accb672017-05-10 14:07:42 +020011from django.db.models.expressions import F
12import django_filters
13from rest_framework import filters
Dirk Vogt62ff7f22017-05-04 16:07:21 +020014
15def dictfetchall(cursor):
16 "Returns all rows from a cursor as a dict"
17 desc = cursor.description
18 return [
19 dict(zip([col[0] for col in desc], row))
20 for row in cursor.fetchall()
21 ]
22
23class DeviceUpdateHistory(APIView):
24 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
25 def get(self, request, uuid, format=None):
26 cursor = connection.cursor()
27 raw_querys.execute_device_update_history_query(
28 cursor,
29 {
30 'uuid': uuid
31 })
32 res = dictfetchall(cursor)
33 return Response(res)
34
35class DeviceReportHistory(APIView):
36 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
37 def get(self, request, uuid, format=None):
38 cursor = connection.cursor()
39 raw_querys.execute_device_report_history(
40 cursor,
41 {
42 'uuid': uuid
43 })
44 res = dictfetchall(cursor)
45 return Response(res)
46
47class DeviceStat(APIView):
48 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
49 def get(self, request, uuid, format=None, ):
50 device = Device.objects.filter(uuid=uuid)
51 last_active = HeartBeat.objects.filter(device=device).order_by('-date')[0].date
52 heartbeats = HeartBeat.objects.filter(device=device).count()
53 crashreports = Crashreport.objects.filter(device=device).filter(boot_reason__in=["UNKNOWN", "keyboard power on"]).count()
54 crashes_per_day = crashreports*1.0/heartbeats if heartbeats > 0 else 0
55 smpls = Crashreport.objects.filter(device=device).filter(boot_reason__in=["RTC alarm"]).count()
56 smpl_per_day = smpls*1.0/heartbeats if heartbeats > 0 else 0
57 return Response(
58 {
59 'uuid' : uuid,
60 'last_active' : last_active,
61 'heartbeats' : heartbeats,
62 'crashreports' : crashreports,
63 'crashes_per_day' : crashes_per_day,
64 'smpls' : smpls,
65 'smpl_per_day' : smpl_per_day
66 })
67
68class LogFileDownload(APIView):
69 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
70 def get(self, request, id, format=None):
71 try:
72 logfile = LogFile.objects.get(id=id)
73 except:
74 raise NotFound(detail="Logfile does not exist.")
75 zf = zipfile.ZipFile(logfile.logfile.path)
76 ret = {}
77 for f in zf.filelist:
78 fo = zf.open(f)
79 ret[f.filename] = fo.read()
80 return Response(ret)
Dirk Vogt1accb672017-05-10 14:07:42 +020081
82
83class VersionFilter(filters.FilterSet):
84 first_seen_before = django_filters.DateFilter(name="first_seen_on", lookup_expr='lte')
85 first_seen_after = django_filters.DateFilter(name="first_seen_on", lookup_expr='gte')
86 released_before = django_filters.DateFilter(name="released_on", lookup_expr='lte')
87 released_after = django_filters.DateFilter(name="released_on", lookup_expr='gte')
88 class Meta:
89 model = Version
90
91class VersionSerializer(serializers.ModelSerializer):
92 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
93 class Meta:
94 model = Version
95
96class VersionListView(generics.ListAPIView):
97
98 queryset = Version.objects.all().order_by('-heartbeats')
99 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
100 serializer_class = VersionSerializer
101 filter_backends = (filters.DjangoFilterBackend,)
102 filter_class = (VersionFilter)
103
104
105class VersionDailyFilter(filters.FilterSet):
106 date_start = django_filters.DateFilter(name="date", lookup_expr='gte')
107 date_end = django_filters.DateFilter(name="date", lookup_expr='lte')
108 version__build_fingerprint = django_filters.CharFilter()
109 version__is_official_release = django_filters.BooleanFilter()
110 version__is_beta_release = django_filters.BooleanFilter()
111 class Meta:
112 model = VersionDaily
113
114
115class VersionDailySerializer(serializers.ModelSerializer):
116 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
117 build_fingerprint = serializers.CharField()
118 class Meta:
119 model = VersionDaily
120
121
122class VersionDailyListView(generics.ListAPIView):
123 queryset = VersionDaily.objects.annotate(build_fingerprint=F('version__build_fingerprint')).all()
124 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
125 filter_backends = (filters.DjangoFilterBackend,)
126 serializer_class = VersionDailySerializer
127 filter_class = (VersionDailyFilter)
128 filter_fields = ('version__build_fingerprint','version__is_official_release','version__is_beta_release',)