Skip to content

models

django_spire.metric.visual.models

Visual

Bases: HistoryModelMixin, ActivityMixin

name = models.CharField(max_length=255) class-attribute instance-attribute

description = models.TextField(default='') class-attribute instance-attribute

statistic = models.ForeignKey('django_spire_metric_domain.Statistic', on_delete=models.SET_NULL, null=True, blank=True, related_name='visuals', related_query_name='visual') class-attribute instance-attribute

reference = models.CharField(max_length=255, blank=True, default='') class-attribute instance-attribute

date = models.DateField(default=timezone.localdate) class-attribute instance-attribute

kind = models.CharField(max_length=20, choices=VisualKindChoices.choices, default=VisualKindChoices.INDICATOR) class-attribute instance-attribute

objects = querysets.VisualQuerySet().as_manager() class-attribute instance-attribute

services = VisualService() class-attribute instance-attribute

is_chart property

Meta

verbose_name = 'Visual' class-attribute instance-attribute
verbose_name_plural = 'Visuals' class-attribute instance-attribute
db_table = 'django_spire_metric_visual' class-attribute instance-attribute

__init_subclass__

Source code in django_spire/metric/visual/models.py
def __init_subclass__(cls, **kwargs: Any) -> None:
    super().__init_subclass__(**kwargs)

    kind = getattr(cls, 'KIND', None)
    if kind is not None:
        cls._kind_model_registry[kind] = cls

kind_model classmethod

Source code in django_spire/metric/visual/models.py
@classmethod
def kind_model(cls, kind: str) -> type[Visual]:
    return cls._kind_model_registry.get(kind, cls)

subclass_for classmethod

Source code in django_spire/metric/visual/models.py
@classmethod
def subclass_for(cls, obj: Visual) -> Visual:
    return cls.kind_model(obj.kind).objects.get(pk=obj.pk)

__str__

Source code in django_spire/metric/visual/models.py
def __str__(self) -> str:
    return self.name

IndicatorVisual

Bases: Visual

KIND = VisualKindChoices.INDICATOR class-attribute instance-attribute

objects = kind_manager(VisualKindChoices.INDICATOR) class-attribute instance-attribute

services = IndicatorVisualService() class-attribute instance-attribute

Meta

proxy = True class-attribute instance-attribute
verbose_name = 'Indicator Visual' class-attribute instance-attribute
verbose_name_plural = 'Indicator Visuals' class-attribute instance-attribute

save

Source code in django_spire/metric/visual/models.py
def save(self, *args, **kwargs) -> None:
    self.kind = self.KIND
    super().save(*args, **kwargs)

LineChartVisual

Bases: Visual

KIND = VisualKindChoices.LINE class-attribute instance-attribute

objects = kind_manager(VisualKindChoices.LINE) class-attribute instance-attribute

services = LineChartVisualService() class-attribute instance-attribute

Meta

proxy = True class-attribute instance-attribute
verbose_name = 'Line Chart Visual' class-attribute instance-attribute
verbose_name_plural = 'Line Chart Visuals' class-attribute instance-attribute

save

Source code in django_spire/metric/visual/models.py
def save(self, *args, **kwargs) -> None:
    self.kind = self.KIND
    super().save(*args, **kwargs)

BarChartVisual

Bases: Visual

KIND = VisualKindChoices.BAR class-attribute instance-attribute

objects = kind_manager(VisualKindChoices.BAR) class-attribute instance-attribute

services = BarChartVisualService() class-attribute instance-attribute

Meta

proxy = True class-attribute instance-attribute
verbose_name = 'Bar Chart Visual' class-attribute instance-attribute
verbose_name_plural = 'Bar Chart Visuals' class-attribute instance-attribute

save

Source code in django_spire/metric/visual/models.py
def save(self, *args, **kwargs) -> None:
    self.kind = self.KIND
    super().save(*args, **kwargs)

AreaChartVisual

Bases: Visual

KIND = VisualKindChoices.AREA class-attribute instance-attribute

objects = kind_manager(VisualKindChoices.AREA) class-attribute instance-attribute

services = AreaChartVisualService() class-attribute instance-attribute

Meta

proxy = True class-attribute instance-attribute
verbose_name = 'Area Chart Visual' class-attribute instance-attribute
verbose_name_plural = 'Area Chart Visuals' class-attribute instance-attribute

save

Source code in django_spire/metric/visual/models.py
def save(self, *args, **kwargs) -> None:
    self.kind = self.KIND
    super().save(*args, **kwargs)

PieChartVisual

Bases: Visual

KIND = VisualKindChoices.PIE class-attribute instance-attribute

objects = kind_manager(VisualKindChoices.PIE) class-attribute instance-attribute

services = PieChartVisualService() class-attribute instance-attribute

Meta

proxy = True class-attribute instance-attribute
verbose_name = 'Pie Chart Visual' class-attribute instance-attribute
verbose_name_plural = 'Pie Chart Visuals' class-attribute instance-attribute

save

Source code in django_spire/metric/visual/models.py
def save(self, *args, **kwargs) -> None:
    self.kind = self.KIND
    super().save(*args, **kwargs)

GaugeChartVisual

Bases: Visual

KIND = VisualKindChoices.GAUGE class-attribute instance-attribute

objects = kind_manager(VisualKindChoices.GAUGE) class-attribute instance-attribute

services = GaugeChartVisualService() class-attribute instance-attribute

Meta

proxy = True class-attribute instance-attribute
verbose_name = 'Gauge Chart Visual' class-attribute instance-attribute
verbose_name_plural = 'Gauge Chart Visuals' class-attribute instance-attribute

save

Source code in django_spire/metric/visual/models.py
def save(self, *args, **kwargs) -> None:
    self.kind = self.KIND
    super().save(*args, **kwargs)

VisualCondition

Bases: HistoryModelMixin, ActivityMixin

visual = models.ForeignKey(Visual, on_delete=models.CASCADE, related_name='conditions', related_query_name='condition') class-attribute instance-attribute

state = models.CharField(max_length=10, choices=VisualConditionStateChoices.choices, default=VisualConditionStateChoices.GREEN) class-attribute instance-attribute

operator = models.CharField(max_length=10, choices=VisualConditionOperatorChoices.choices, default=VisualConditionOperatorChoices.GT) class-attribute instance-attribute

target = models.DecimalField(max_digits=16, decimal_places=4, default=0) class-attribute instance-attribute

tolerance = models.DecimalField(max_digits=16, decimal_places=4, default=0) class-attribute instance-attribute

order = models.PositiveSmallIntegerField(default=0) class-attribute instance-attribute

objects = querysets.VisualConditionQuerySet().as_manager() class-attribute instance-attribute

services = VisualConditionService() class-attribute instance-attribute

color property

icon property

Meta

verbose_name = 'Visual Condition' class-attribute instance-attribute
verbose_name_plural = 'Visual Conditions' class-attribute instance-attribute
db_table = 'django_spire_metric_visual_condition' class-attribute instance-attribute
ordering = ('order',) class-attribute instance-attribute
constraints = [models.UniqueConstraint(fields=('visual', 'order'), name='unique_visual_condition_order')] class-attribute instance-attribute

matches

Source code in django_spire/metric/visual/models.py
def matches(self, value: Decimal) -> bool:
    value = Decimal(value)

    comparisons: dict[str, bool] = {
        VisualConditionOperatorChoices.GT: value > self.target,
        VisualConditionOperatorChoices.GTE: value >= self.target,
        VisualConditionOperatorChoices.LT: value < self.target,
        VisualConditionOperatorChoices.LTE: value <= self.target,
        VisualConditionOperatorChoices.EQ: value == self.target,
        VisualConditionOperatorChoices.BETWEEN: abs(value - self.target) <= self.tolerance,
    }

    return comparisons.get(self.operator, False)

__str__

Source code in django_spire/metric/visual/models.py
def __str__(self) -> str:
    return f'{self.get_state_display()} ({self.get_operator_display()} {self.target})'

kind_manager

Source code in django_spire/metric/visual/models.py
def kind_manager(kind: str) -> models.Manager:
    class VisualKindManager(models.Manager.from_queryset(querysets.VisualQuerySet)):
        def get_queryset(self) -> models.QuerySet:
            return super().get_queryset().filter(kind=kind)

    return VisualKindManager()