Dirk Vogt | 62ff7f2 | 2017-05-04 16:07:21 +0200 | [diff] [blame] | 1 | from rest_framework import generics |
| 2 | from rest_framework import serializers |
| 3 | from rest_framework.response import Response |
| 4 | from rest_framework.views import APIView |
| 5 | from crashreports.permissions import HasRightsOrIsDeviceOwnerDeviceCreation |
| 6 | from django.db import connection |
| 7 | from . import raw_querys |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 8 | from crashreport_stats.models import * |
Dirk Vogt | 62ff7f2 | 2017-05-04 16:07:21 +0200 | [diff] [blame] | 9 | import zipfile |
| 10 | from crashreports.models import * |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 11 | from django.db.models.expressions import F |
| 12 | import django_filters |
| 13 | from rest_framework import filters |
Dirk Vogt | 62ff7f2 | 2017-05-04 16:07:21 +0200 | [diff] [blame] | 14 | |
| 15 | def 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 | |
| 23 | class 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 | |
| 35 | class 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 | |
| 47 | class 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 | |
| 68 | class 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 Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 81 | |
| 82 | |
| 83 | class 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 | |
| 91 | class VersionSerializer(serializers.ModelSerializer): |
| 92 | permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, ) |
| 93 | class Meta: |
| 94 | model = Version |
| 95 | |
| 96 | class VersionListView(generics.ListAPIView): |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 97 | queryset = Version.objects.all().order_by('-heartbeats') |
| 98 | permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, ) |
| 99 | serializer_class = VersionSerializer |
| 100 | filter_backends = (filters.DjangoFilterBackend,) |
| 101 | filter_class = (VersionFilter) |
| 102 | |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 103 | class VersionDailyFilter(filters.FilterSet): |
| 104 | date_start = django_filters.DateFilter(name="date", lookup_expr='gte') |
| 105 | date_end = django_filters.DateFilter(name="date", lookup_expr='lte') |
| 106 | version__build_fingerprint = django_filters.CharFilter() |
| 107 | version__is_official_release = django_filters.BooleanFilter() |
| 108 | version__is_beta_release = django_filters.BooleanFilter() |
| 109 | class Meta: |
| 110 | model = VersionDaily |
| 111 | |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 112 | class VersionDailySerializer(serializers.ModelSerializer): |
| 113 | permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, ) |
| 114 | build_fingerprint = serializers.CharField() |
| 115 | class Meta: |
| 116 | model = VersionDaily |
| 117 | |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 118 | class VersionDailyListView(generics.ListAPIView): |
Dirk Vogt | 6353a7f | 2017-06-09 15:11:49 +0200 | [diff] [blame^] | 119 | queryset = VersionDaily.objects.annotate(build_fingerprint=F('version__build_fingerprint')).all().order_by('date') |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 120 | permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, ) |
| 121 | filter_backends = (filters.DjangoFilterBackend,) |
| 122 | serializer_class = VersionDailySerializer |
| 123 | filter_class = (VersionDailyFilter) |
| 124 | filter_fields = ('version__build_fingerprint','version__is_official_release','version__is_beta_release',) |