Coverage for backend/django/flowsheetInternals/unitops/models/FlowsheetEditOperation.py: 100%

38 statements  

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

1from django.conf import settings 

2from django.db import models 

3 

4from core.managers import IdentityAccessControlManager 

5 

6 

7class FlowsheetEditOperation(models.Model): 

8 """A durable, reversible user edit applied to one flowsheet.""" 

9 

10 class Kind(models.TextChoices): 

11 Add = "add", "Add" 

12 Delete = "delete", "Delete" 

13 Move = "move", "Move" 

14 Group = "group", "Group" 

15 Ungroup = "ungroup", "Ungroup" 

16 Connection = "connection", "Connection" 

17 MergeStreams = "merge_streams", "Merge streams" 

18 PortAnchor = "port_anchor", "Port anchor" 

19 Duplicate = "duplicate", "Duplicate" 

20 SwitchVariant = "switch_variant", "Switch variant" 

21 FieldPatch = "field_patch", "Field patch" 

22 

23 class State(models.TextChoices): 

24 Applied = "applied", "Applied" 

25 Undone = "undone", "Undone" 

26 Invalidated = "invalidated", "Invalidated" 

27 

28 flowsheet = models.ForeignKey( 

29 "core_auxiliary.Flowsheet", 

30 on_delete=models.CASCADE, 

31 related_name="edit_operations", 

32 ) 

33 user = models.ForeignKey( 

34 settings.AUTH_USER_MODEL, 

35 on_delete=models.SET_NULL, 

36 null=True, 

37 related_name="flowsheet_edit_operations", 

38 ) 

39 kind = models.CharField(max_length=32, choices=Kind.choices) 

40 label_key = models.CharField(max_length=64) 

41 revision = models.PositiveBigIntegerField() 

42 last_revision = models.PositiveBigIntegerField() 

43 state = models.CharField( 

44 max_length=16, 

45 choices=State.choices, 

46 default=State.Applied, 

47 ) 

48 schema_version = models.PositiveIntegerField(default=1) 

49 forward_payload = models.JSONField(default=dict) 

50 inverse_payload = models.JSONField(default=dict) 

51 affected_object_ids = models.JSONField(default=list) 

52 affected_group_ids = models.JSONField(default=list) 

53 created_at = models.DateTimeField(auto_now_add=True) 

54 updated_at = models.DateTimeField(auto_now=True) 

55 

56 objects = IdentityAccessControlManager() 

57 

58 class Meta: 

59 ordering = ["revision"] 

60 constraints = [ 

61 models.UniqueConstraint( 

62 fields=["flowsheet", "revision"], 

63 name="unique_flowsheet_edit_revision", 

64 ) 

65 ]