Coverage for backend/core/auxiliary/models/Flowsheet.py: 97%
58 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
1from django.db import models
2from django.utils import timezone
3from core.auxiliary.enums.FlowsheetTemplateType import FlowsheetTemplateType
4from authentication.user.models import User
5from authentication.user.AccessTable import AccessTable
6import core.auxiliary.enums.ViewType as ViewType
9class Flowsheet(models.Model):
10 name = models.CharField(max_length=64, default="Flowsheet")
11 buildVersion = models.CharField(max_length=32, default=None, null=True)
12 buildDate = models.CharField(max_length=32, default=None, null=True)
13 savedDate = models.DateTimeField(null=True)
14 # objectCounter = models.IntegerField(default=0)
15 rootGrouping = models.ForeignKey("flowsheetInternals_graphicData.Grouping", default=None, null=True, on_delete=models.CASCADE, related_name="flowsheets")
16 owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name="flowsheets", null=True)
17 flowsheet_template_type = models.CharField(max_length=32, choices=FlowsheetTemplateType.choices , default=FlowsheetTemplateType.NotTemplate)
18 created_at = models.DateTimeField(auto_now_add=True)
20 @classmethod
21 def create(cls, **kwargs):
22 from flowsheetInternals.graphicData.models.groupingModel import Grouping
23 from PinchAnalysis.models.StreamDataProject import StreamDataProject
25 project_number = Flowsheet.objects.count() + 1
26 saved_date = timezone.now()
28 field_values = {
29 'name': kwargs.get('name', f'Project-{project_number}'),
30 'buildVersion': kwargs.get('buildVersion', 'Not set'),
31 'buildDate': kwargs.get('buildDate', 'No Build Date Set'),
32 'savedDate': saved_date,
33 'owner': kwargs.get('owner')
34 }
36 instance = Flowsheet.objects.create(**field_values)
38 AccessTable.objects.create(
39 user=instance.owner,
40 flowsheet=instance,
41 )
43 # create the root group
44 rootGroup = Grouping.create(instance, group=None, componentName="Flowsheet", visible=True, isRoot=True)
46 instance.rootGrouping = rootGroup
47 instance.save()
49 StreamDataProject.create(rootGroup, flowsheet=instance)
50 return instance
52 def set_saved_date(self):
53 self.savedDate = timezone.now()
54 self.save()
57 @classmethod
58 def share_flowsheet(cls, owner, flowsheet_id, user_email):
59 """
60 Share a flowsheet with a user by their email address.
61 """
62 flowsheet = cls.objects.get(id=flowsheet_id, owner=owner)
63 user = User.objects.get(email=user_email)
64 AccessTable.objects.create(user=user, flowsheet=flowsheet)
66 @classmethod
67 def get_flowsheets_by_view_type(cls, user, view_type):
68 # filter to exclude templates
69 base_query = cls.objects.filter(flowsheet_template_type=FlowsheetTemplateType.NotTemplate)
71 if view_type == ViewType.ALL:
72 return base_query.filter(access_list__user=user)
73 elif view_type == ViewType.SHARED:
74 return base_query.filter(access_list__user=user).exclude(owner=user)
75 elif view_type == ViewType.OWNED:
76 return base_query.filter(owner=user)
77 else:
78 return base_query.filter(owner=user)
80 @classmethod
81 def get_shared_users(cls, owner, flowsheet_id):
82 flowsheet = cls.objects.get(id=flowsheet_id, owner=owner)
83 return AccessTable.objects.filter(flowsheet=flowsheet).exclude(user=owner).values_list('user__email', flat=True)
85 @classmethod
86 def remove_user(cls, owner, flowsheet_id, user_email):
87 """
88 Remove a user from the access list of the flowsheet.
89 """
90 flowsheet = cls.objects.get(id=flowsheet_id, owner=owner)
91 user = User.objects.get(email=user_email)
92 if user.id == owner.id: 92 ↛ 93line 92 didn't jump to line 93 because the condition on line 92 was never true
93 raise ValueError("Cannot remove the owner of the flowsheet.")
95 AccessTable.objects.get(user=user, flowsheet=flowsheet).delete()