Coverage for backend/django/core/auxiliary/models/MonitoringTable.py: 100%
32 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
1from django.db import models
2from core.managers import AccessControlManager, AllFlowsheetStatesManager
5class MonitoringTable(models.Model):
6 """
7 This model represents a monitoring table, which is a table that displays the values of
8 chosen properties.
9 """
10 flowsheet_state = models.ForeignKey("core_auxiliary.FlowsheetState", on_delete=models.CASCADE, related_name="monitoringTables")
11 group = models.ForeignKey("flowsheetInternals_graphicData.Grouping", on_delete=models.CASCADE, related_name="monitoringTables")
12 properties = models.ManyToManyField("core_auxiliary.PropertyInfo", through="core_auxiliary.MonitoringTableProperty", related_name="monitoringTables", blank=True)
13 title = models.CharField(max_length=255)
14 x = models.FloatField(default=440)
15 y = models.FloatField(default=110)
16 width = models.FloatField(default=380)
17 height = models.FloatField(default=100)
18 minimised = models.BooleanField(default=True)
19 visible = models.BooleanField(default=False)
21 created_at = models.DateTimeField(auto_now_add=True)
22 objects = AccessControlManager()
23 all_states = AllFlowsheetStatesManager()
27class MonitoringTableProperty(models.Model):
28 """
29 Selected property row for a monitoring table.
30 Stores ordering and explicit links to simulation object + property info.
31 """
33 flowsheet_state = models.ForeignKey(
34 "core_auxiliary.FlowsheetState",
35 on_delete=models.CASCADE,
36 related_name="monitoringTableProperties",
37 )
38 table = models.ForeignKey("core_auxiliary.MonitoringTable", on_delete=models.CASCADE, related_name="selectedProperties")
39 simulationObject = models.ForeignKey("flowsheetInternals_unitops.SimulationObject", on_delete=models.CASCADE, related_name="monitoringTableProperties")
40 propertyInfo = models.ForeignKey("core_auxiliary.PropertyInfo", on_delete=models.CASCADE, related_name="monitoringTableProperties")
41 sortIndex = models.PositiveIntegerField(default=0) # index for ordering properties within the table
43 created_at = models.DateTimeField(auto_now_add=True)
44 objects = AccessControlManager()
45 all_states = AllFlowsheetStatesManager()
47 def save(self, *args, **kwargs):
48 """Derive the required state scope from the owning monitoring table."""
50 if self.flowsheet_state_id is None and self.table_id is not None:
51 self.flowsheet_state_id = self.table.flowsheet_state_id
52 super().save(*args, **kwargs)
54 class Meta:
55 ordering = ["sortIndex", "created_at"]
56 constraints = [
57 models.UniqueConstraint(
58 fields=["table", "simulationObject", "propertyInfo"],
59 name="unique_monitoring_table_property",
60 )
61 ]