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

1from django.db import models 

2from core.managers import AccessControlManager, AllFlowsheetStatesManager 

3 

4 

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) 

20 

21 created_at = models.DateTimeField(auto_now_add=True) 

22 objects = AccessControlManager() 

23 all_states = AllFlowsheetStatesManager() 

24 

25 

26 

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 """ 

32 

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 

42 

43 created_at = models.DateTimeField(auto_now_add=True) 

44 objects = AccessControlManager() 

45 all_states = AllFlowsheetStatesManager() 

46 

47 def save(self, *args, **kwargs): 

48 """Derive the required state scope from the owning monitoring table.""" 

49 

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) 

53 

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 ] 

62