Coverage for backend/django/PinchAnalysis/models/OutputModels.py: 91%

109 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2026-07-22 05:22 +0000

1from django.db import models 

2from django.contrib.postgres.fields import ArrayField 

3from core.auxiliary.enums import pinchEnums 

4from core.managers import AccessControlManager, AllFlowsheetStatesManager 

5 

6class PinchOutputs(models.Model): 

7 flowsheet_state = models.ForeignKey("core_auxiliary.FlowsheetState", on_delete=models.CASCADE, related_name="Outputs") 

8 project_owner = models.OneToOneField("PinchAnalysis.StreamDataProject", on_delete=models.CASCADE, related_name="Outputs", null=True) 

9 name = models.CharField(max_length=64, blank=True, null=True) 

10 

11 created_at = models.DateTimeField(auto_now_add=True) 

12 objects = AccessControlManager() 

13 all_states = AllFlowsheetStatesManager() 

14 

15 

16 

17class PinchTemp(models.Model): 

18 flowsheet_state = models.ForeignKey("core_auxiliary.FlowsheetState", on_delete=models.CASCADE, related_name="PinchTemps") 

19 cold_temp = models.FloatField(blank=True, null=True) 

20 hot_temp = models.FloatField(blank=True, null=True) 

21 

22 created_at = models.DateTimeField(auto_now_add=True) 

23 objects = AccessControlManager() 

24 all_states = AllFlowsheetStatesManager() 

25 

26 

27 

28class TargetSummary(models.Model): 

29 flowsheet_state = models.ForeignKey("core_auxiliary.FlowsheetState", on_delete=models.CASCADE, related_name="TargetSummaries") 

30 output_owner = models.ForeignKey(PinchOutputs, on_delete=models.CASCADE, related_name="targets", null=True) 

31 name = models.CharField(max_length=128) 

32 row_type = models.CharField(choices=pinchEnums.SummaryRowType.choices , default=pinchEnums.SummaryRowType.CONTENT) 

33 temp_pinch = models.ForeignKey(PinchTemp, on_delete=models.CASCADE, related_name="summary_owner", null=True, blank=True) 

34 Qh = models.FloatField(default=0.0, blank=True, null=True) 

35 Qc = models.FloatField(default=0.0, blank=True, null=True) 

36 Qr = models.FloatField(default=0.0, blank=True, null=True) 

37 degree_of_integration = models.FloatField(default=100.0, blank=True, null=True) 

38 utility_cost = models.FloatField(default=0.0, blank=True, null=True) 

39 work_target = models.FloatField(default=0.0, blank=True, null=True) 

40 turbine_efficiency_target = models.FloatField(default=0.0, blank=True, null=True) 

41 area = models.FloatField(default=0.0, blank=True, null=True) 

42 num_units = models.FloatField(default=0.0, blank=True, null=True) 

43 capital_cost = models.FloatField(default=0.0, blank=True, null=True) 

44 total_cost = models.FloatField(default=0.0, blank=True, null=True) 

45 exergy_sources = models.FloatField(default=0.0, blank=True, null=True) 

46 exergy_sinks = models.FloatField(default=0.0, blank=True, null=True) 

47 ETE = models.FloatField(default=0.0, blank=True, null=True) 

48 exergy_req_min = models.FloatField(default=0.0, blank=True, null=True) 

49 exergy_des_min = models.FloatField(default=0.0, blank=True, null=True) 

50 

51 created_at = models.DateTimeField(auto_now_add=True) 

52 objects = AccessControlManager() 

53 all_states = AllFlowsheetStatesManager() 

54 

55 

56 class Meta: 

57 ordering = ['created_at'] 

58 

59 @classmethod 

60 def create(cls, **kwargs): 

61 defaults = { 

62 'output_owner': kwargs.get('output_owner', None), 

63 'name': kwargs.get('name', None), 

64 'Qh': kwargs.get('Qh', 0.0), 

65 'Qc': kwargs.get('Qc', 0.0), 

66 'Qr': kwargs.get('Qr', 0.0), 

67 'degree_of_integration': kwargs.get('degree_of_integration', 100.0), 

68 'utility_cost': kwargs.get('utility_cost', 0.0), 

69 'work_target': kwargs.get('work_target', 0.0), 

70 'turbine_efficiency_target': kwargs.get('turbine_efficiency_target', 0.0), 

71 'area': kwargs.get('area', 0.0), 

72 'num_units': kwargs.get('num_units', 0.0), 

73 'capital_cost': kwargs.get('capital_cost', 0.0), 

74 'total_cost': kwargs.get('total_cost', 0.0), 

75 } 

76 

77 defaults.update(**kwargs) 

78 instance = cls.objects.create(**defaults) 

79 instance.save() 

80 return instance 

81 

82class HeatSupplierUtilitySummary(models.Model): 

83 flowsheet_state = models.ForeignKey("core_auxiliary.FlowsheetState", on_delete=models.CASCADE, related_name="HeatSupplierUtilities") 

84 name = models.CharField(max_length=128) 

85 summary_owner = models.ForeignKey(TargetSummary, on_delete=models.CASCADE, related_name="hot_utilities", null=True, blank=True) 

86 heat_flow = models.FloatField(default=None, null=True) 

87 

88 created_at = models.DateTimeField(auto_now_add=True) 

89 objects = AccessControlManager() 

90 all_states = AllFlowsheetStatesManager() 

91 

92 

93 

94 

95class HeatReceiverUtilitySummary(models.Model): 

96 flowsheet_state = models.ForeignKey("core_auxiliary.FlowsheetState", on_delete=models.CASCADE, related_name="HeatReceiverUtilities") 

97 name = models.CharField(max_length=128) 

98 summary_owner = models.ForeignKey(TargetSummary, on_delete=models.CASCADE, related_name="cold_utilities", null=True, blank=True) 

99 heat_flow = models.FloatField(default=None, null=True) 

100 

101 created_at = models.DateTimeField(auto_now_add=True) 

102 objects = AccessControlManager() 

103 all_states = AllFlowsheetStatesManager() 

104 

105 

106 

107class PinchGraphSet(models.Model): 

108 flowsheet_state = models.ForeignKey("core_auxiliary.FlowsheetState", on_delete=models.CASCADE, related_name="PinchGraphSets") 

109 name = models.CharField(max_length=64) 

110 output_owner = models.ForeignKey(PinchOutputs, on_delete=models.CASCADE, related_name="graph_sets", null=True) 

111 

112 created_at = models.DateTimeField(auto_now_add=True) 

113 objects = AccessControlManager() 

114 all_states = AllFlowsheetStatesManager() 

115 

116 

117 class Meta: 

118 ordering = ['created_at'] 

119 

120 @classmethod 

121 def create(cls, **kwargs): 

122 defaults = { 

123 'output_owner': kwargs.get('output_owner', None), 

124 'name': kwargs.get('name', None), 

125 } 

126 

127 defaults.update(**kwargs) 

128 instance = cls.objects.create(**defaults) 

129 instance.save() 

130 return instance 

131 

132class PinchGraph(models.Model): 

133 flowsheet_state = models.ForeignKey("core_auxiliary.FlowsheetState", on_delete=models.CASCADE, related_name="PinchGraphs") 

134 name = models.CharField(max_length=64, null=True, blank=True) 

135 graph_set = models.ForeignKey(PinchGraphSet, on_delete=models.CASCADE, related_name="graphs", null=True) 

136 type = models.CharField(choices=pinchEnums.GraphType.choices , default=pinchEnums.GraphType.CC) 

137 

138 created_at = models.DateTimeField(auto_now_add=True) 

139 objects = AccessControlManager() 

140 all_states = AllFlowsheetStatesManager() 

141 

142 

143 

144# Can be considered a "line segment" for CC's 

145class PinchCurve(models.Model): 

146 flowsheet_state = models.ForeignKey("core_auxiliary.FlowsheetState", on_delete=models.CASCADE, related_name="PinchCurves") 

147 graph = models.ForeignKey(PinchGraph, on_delete=models.CASCADE, related_name="segments", null=True) 

148 title = models.CharField(max_length=64) 

149 colour = models.IntegerField(choices=pinchEnums.LineColour.choices , default=pinchEnums.LineColour.Hot) 

150 arrow = models.CharField(choices=pinchEnums.ArrowHead.choices , default=pinchEnums.ArrowHead.NO_ARROW) 

151 

152 created_at = models.DateTimeField(auto_now_add=True) 

153 objects = AccessControlManager() 

154 all_states = AllFlowsheetStatesManager() 

155 

156 

157 

158class GraphDataPoint(models.Model): 

159 flowsheet_state = models.ForeignKey("core_auxiliary.FlowsheetState", on_delete=models.CASCADE, related_name="GraphDataPoints") 

160 curve = models.ForeignKey(PinchCurve, on_delete=models.CASCADE, related_name="data_points") 

161 x = models.FloatField(null=True) 

162 y = models.FloatField(null=True) 

163 

164 created_at = models.DateTimeField(auto_now_add=True) 

165 objects = AccessControlManager() 

166 all_states = AllFlowsheetStatesManager() 

167