Dirk Vogt | 62ff7f2 | 2017-05-04 16:07:21 +0200 | [diff] [blame] | 1 | from django.db import models |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame^] | 2 | from crashreports.models import * |
| 3 | from django.db.models.signals import post_save |
| 4 | from django.dispatch import receiver |
| 5 | import datetime |
Dirk Vogt | 62ff7f2 | 2017-05-04 16:07:21 +0200 | [diff] [blame] | 6 | |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame^] | 7 | |
| 8 | def 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 | |
| 20 | def 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) |
| 29 | def 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) |
| 46 | def 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 | |
| 56 | class 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 | |
| 70 | class 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() |