blob: f7fd05c5c56027d5b8e50817d0870ab50f7bca92 [file] [log] [blame]
from django.db import models
from crashreports.models import *
from django.db.models import F
from django.db.models.signals import post_save
from django.dispatch import receiver
import datetime
@receiver(post_save, sender=Crashreport)
def on_crashreport_create(sender, **kwargs):
crashreport = kwargs.get('instance')
v, _ = Version.objects.get_or_create(build_fingerprint=crashreport.build_fingerprint)
vd, _ = VersionDaily.objects.get_or_create(version=v, date=crashreport.date)
stats = [v, vd]
if crashreport.radio_version:
rv, _ = RadioVersion.objects.get_or_create(radio_version=crashreport.radio_version)
rvd, _ = RadioVersionDaily.objects.get_or_create(version=rv, date=crashreport.date)
stats += [rv, rvd]
if crashreport.boot_reason == "RTC alarm":
for element in stats:
element.smpl = F('smpl') + 1
elif crashreport.boot_reason in ["UNKNOWN", "keyboard power on"]:
for element in stats:
element.prob_crashes = F('prob_crashes') + 1
else:
for element in stats:
element.other = F('other') + 1
for element in stats:
element.save()
@receiver(post_save, sender=HeartBeat)
def on_heartbeat_create(sender, **kwargs):
hb = kwargs.get('instance')
v, _ = Version.objects.get_or_create(build_fingerprint=hb.build_fingerprint)
vd, _ = VersionDaily.objects.get_or_create(version=v, date=hb.date)
stats = [v, vd]
if hb.radio_version:
rv, _ = RadioVersion.objects.get_or_create(radio_version=hb.radio_version)
rvd, _ = RadioVersionDaily.objects.get_or_create(version=rv, date=hb.date)
stats += [rv, rvd]
for element in stats:
element.heartbeats = F('heartbeats') + 1
element.save()
class _VersionStats(models.Model):
is_official_release = models.BooleanField(default=False)
is_beta_release = models.BooleanField(default=False)
first_seen_on = models.DateField(auto_now_add=True)
released_on = models.DateField(auto_now_add=True)
heartbeats = models.IntegerField(default=0)
prob_crashes = models.IntegerField(default=0)
smpl = models.IntegerField(default=0)
other = models.IntegerField(default=0)
class Meta:
abstract = True
class _DailyVersionStats(models.Model):
date = models.DateField(auto_now_add=True)
heartbeats = models.IntegerField(default=0)
prob_crashes = models.IntegerField(default=0)
smpl = models.IntegerField(default=0)
other = models.IntegerField(default=0)
class Meta:
abstract = True
class Version(_VersionStats):
build_fingerprint = models.CharField(max_length=200, unique=True)
def __str__(self):
return self.build_fingerprint
class VersionDaily(_DailyVersionStats):
version = models.ForeignKey(Version, db_index=True, related_name='daily_stats',
on_delete=models.CASCADE)
class RadioVersion(_VersionStats):
radio_version = models.CharField(max_length=200, unique=True)
def __str__(self):
return self.radio_version
class RadioVersionDaily(_DailyVersionStats):
version = models.ForeignKey(RadioVersion, db_index=True, related_name='daily_stats',
on_delete=models.CASCADE)