blob: 04f38ab6154998640dfc413f360a493bb4c07f6c [file] [log] [blame]
Dirk Vogt62ff7f22017-05-04 16:07:21 +02001from django.db import models
Dirk Vogt1accb672017-05-10 14:07:42 +02002from crashreports.models import *
3from django.db.models.signals import post_save
4from django.dispatch import receiver
5import datetime
Dirk Vogt62ff7f22017-05-04 16:07:21 +02006
Dirk Vogt1accb672017-05-10 14:07:42 +02007
8def getVersion(build_fingerprint):
9 v= None
10 try:
11 v = Version.objects.get(build_fingerprint=build_fingerprint)
12 except Version.DoesNotExist:
13 v =Version(build_fingerprint=build_fingerprint,
14 first_seen_on=datetime.date.today(),
15 released_on=datetime.date.today(),
16 heartbeats=0, prob_crashes=0, smpl=0, other=0)
17 v.save()
18 return v
19
20def getVersionDaily(version,day):
21 try:
22 v = VersionDaily.objects.get(version=version, date=day)
23 except VersionDaily.DoesNotExist:
24 v =VersionDaily(version=version, date=day,
25 heartbeats=0, prob_crashes=0, smpl=0, other=0)
26 return v
27
28@receiver(post_save, sender=Crashreport)
29def on_crashreport_create(sender, **kwargs):
30 crashreport = kwargs.get('instance')
31 v= getVersion(crashreport.build_fingerprint)
32 vd = getVersionDaily(v, crashreport.date.date())
33 if crashreport.boot_reason == "RTC alarm":
34 v.smpl = v.smpl + 1
35 vd.smpl = vd.smpl + 1
36 elif crashreport.boot_reason in ["UNKNOWN", "keyboard power on"]:
37 v.prob_crashes = v.prob_crashes + 1
38 vd.prob_crashes = vd.prob_crashes + 1
39 else:
40 v.other = v.other + 1
41 vd.other = vd.other + 1
42 v.save()
43 vd.save()
44
45@receiver(post_save, sender=HeartBeat)
46def on_heartbeat_create(sender, **kwargs):
47 hb = kwargs.get('instance')
48 v = getVersion(hb.build_fingerprint)
49 vd = getVersionDaily(v, hb.date)
50 v.heartbeats = v.heartbeats + 1
51 vd.heartbeats = vd.heartbeats + 1
52 v.save()
53 vd.save()
54
55
56class Version(models.Model):
57 build_fingerprint = models.CharField(max_length=200, unique=True)
58 is_official_release = models.BooleanField(default=False)
59 is_beta_release = models.BooleanField(default=False)
60 first_seen_on = models.DateField()
61 released_on = models.DateField()
62 heartbeats = models.IntegerField()
63 prob_crashes = models.IntegerField()
64 smpl = models.IntegerField()
65 other = models.IntegerField()
66 def __str__(self):
67 return self.build_fingerprint
68
69
70class VersionDaily(models.Model):
71 version = models.ForeignKey(Version, db_index=True, related_name='daily_stats', on_delete=models.CASCADE)
72 date = models.DateField()
73 heartbeats = models.IntegerField()
74 prob_crashes = models.IntegerField()
75 smpl = models.IntegerField()
76 other = models.IntegerField()