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

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 

7 

8 

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) 

19 

20 @classmethod 

21 def create(cls, **kwargs): 

22 from flowsheetInternals.graphicData.models.groupingModel import Grouping 

23 from PinchAnalysis.models.StreamDataProject import StreamDataProject 

24 

25 project_number = Flowsheet.objects.count() + 1 

26 saved_date = timezone.now() 

27 

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 } 

35 

36 instance = Flowsheet.objects.create(**field_values) 

37 

38 AccessTable.objects.create( 

39 user=instance.owner, 

40 flowsheet=instance, 

41 ) 

42 

43 # create the root group 

44 rootGroup = Grouping.create(instance, group=None, componentName="Flowsheet", visible=True, isRoot=True) 

45 

46 instance.rootGrouping = rootGroup 

47 instance.save() 

48 

49 StreamDataProject.create(rootGroup, flowsheet=instance) 

50 return instance 

51 

52 def set_saved_date(self): 

53 self.savedDate = timezone.now() 

54 self.save() 

55 

56 

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) 

65 

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) 

70 

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) 

79 

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) 

84 

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

94 

95 AccessTable.objects.get(user=user, flowsheet=flowsheet).delete()