blob: abe4e81e0aa85ad2fee9bcfe2e35dc5156988f09 [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,
Dirk Vogt7439ee72017-12-05 15:51:17 +010065 'smpl_per_day' : smpl_per_day,
66 'board_date' : device[0].board_date,
Dirk Vogt62ff7f22017-05-04 16:07:21 +020067 })
68
69class LogFileDownload(APIView):
70 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
71 def get(self, request, id, format=None):
72 try:
73 logfile = LogFile.objects.get(id=id)
74 except:
75 raise NotFound(detail="Logfile does not exist.")
76 zf = zipfile.ZipFile(logfile.logfile.path)
77 ret = {}
78 for f in zf.filelist:
79 fo = zf.open(f)
80 ret[f.filename] = fo.read()
81 return Response(ret)
Dirk Vogt1accb672017-05-10 14:07:42 +020082
83
84class VersionFilter(filters.FilterSet):
85 first_seen_before = django_filters.DateFilter(name="first_seen_on", lookup_expr='lte')
86 first_seen_after = django_filters.DateFilter(name="first_seen_on", lookup_expr='gte')
87 released_before = django_filters.DateFilter(name="released_on", lookup_expr='lte')
88 released_after = django_filters.DateFilter(name="released_on", lookup_expr='gte')
89 class Meta:
90 model = Version
91
92class VersionSerializer(serializers.ModelSerializer):
93 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
94 class Meta:
95 model = Version
96
97class VersionListView(generics.ListAPIView):
Dirk Vogt1accb672017-05-10 14:07:42 +020098 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
Dirk Vogt1accb672017-05-10 14:07:42 +0200104class VersionDailyFilter(filters.FilterSet):
105 date_start = django_filters.DateFilter(name="date", lookup_expr='gte')
106 date_end = django_filters.DateFilter(name="date", lookup_expr='lte')
107 version__build_fingerprint = django_filters.CharFilter()
108 version__is_official_release = django_filters.BooleanFilter()
109 version__is_beta_release = django_filters.BooleanFilter()
110 class Meta:
111 model = VersionDaily
112
Dirk Vogt1accb672017-05-10 14:07:42 +0200113class VersionDailySerializer(serializers.ModelSerializer):
114 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
115 build_fingerprint = serializers.CharField()
116 class Meta:
117 model = VersionDaily
118
Dirk Vogt1accb672017-05-10 14:07:42 +0200119class VersionDailyListView(generics.ListAPIView):
Dirk Vogt6353a7f2017-06-09 15:11:49 +0200120 queryset = VersionDaily.objects.annotate(build_fingerprint=F('version__build_fingerprint')).all().order_by('date')
Dirk Vogt1accb672017-05-10 14:07:42 +0200121 permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
122 filter_backends = (filters.DjangoFilterBackend,)
123 serializer_class = VersionDailySerializer
124 filter_class = (VersionDailyFilter)
125 filter_fields = ('version__build_fingerprint','version__is_official_release','version__is_beta_release',)