blob: e4bb6834c75c5ae89a979685dbd637b0415c7b7c [file] [log] [blame]
"""The stats models."""
from django.db import models
class _VersionStats(models.Model):
"""The base class for all-time stats of a version.
Sub-classes should be created to gather stats about a versioned
end-product such as a software build.
Attributes:
is_official_release (models.BooleanField): If this version is an
official release. Defaults to False.
is_beta_release (models.BooleanField): If this version is a beta
release. Defaults to False.
first_seen_on (models.DateField): Day this version has been seen for
the first time as reported by devices (not by the server). Defaults
to the current date.
released_on (models.DateField): Day this version has been released on.
Defaults to the current date.
heartbeats (models.IntegerField): The total heartbeats counted for this
version.
prob_crashes (models.IntegerField): The total probable crash reports
counted for this version.
smpl (models.IntegerField): The total SMPL reports counted for this
version.
other (models.IntegerField): The total of other reports counted for
this version.
"""
is_official_release = models.BooleanField(default=False)
is_beta_release = models.BooleanField(default=False)
first_seen_on = models.DateField()
released_on = models.DateField()
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):
"""The base class for daily stats of a version.
Sub-classes MUST define the foreign key `version` pointing back to the
`_VersionStats` implementation they are gathering stats for.
Attributes:
date (models.DateField): Day considered for the stats.
heartbeats (models.IntegerField): The total heartbeats counted for this
version on the day `date`.
prob_crashes (models.IntegerField): The total probable crash reports
counted for this version on the day `date`.
smpl (models.IntegerField): The total SMPL reports counted for this
version on the day `date`.
other (models.IntegerField): The total of other reports counted for
this version on the day `date`.
"""
date = models.DateField()
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):
"""The all-time stats of a software version.
Attributes:
build_fingerprint (models.CharField): The software build fingerprint
uniquely identifying this version.
"""
build_fingerprint = models.CharField(max_length=200, unique=True)
def __str__(self): # noqa: D105
return self.build_fingerprint
class VersionDaily(_DailyVersionStats):
"""The daily stats of a software version.
Attributes:
version (models.ForeignKey): The software version object (`Version`)
these daily stats are about.
"""
version = models.ForeignKey(
Version,
db_index=True,
related_name="daily_stats",
on_delete=models.CASCADE,
)
class RadioVersion(_VersionStats):
"""The all-time stats of a radio version.
Attributes:
radio_version (models.CharField): The radio version number uniquely
identifying this version.
"""
radio_version = models.CharField(max_length=200, unique=True)
def __str__(self): # noqa: D105
return self.radio_version
class RadioVersionDaily(_DailyVersionStats):
"""The daily stats of a radio version.
Attributes:
version (models.ForeignKey): The radio version object (`RadioVersion`)
these daily stats are about.
"""
version = models.ForeignKey(
RadioVersion,
db_index=True,
related_name="daily_stats",
on_delete=models.CASCADE,
)
class StatsMetadata(models.Model):
"""The stats metadata.
Attributes:
updated_at (models.DateTimeField): The last time the stats were
updated.
"""
updated_at = models.DateTimeField()