diff --git a/api/core/workflows_services.py b/api/core/workflows_services.py index 4481e08ed2ef..c68429ee2408 100644 --- a/api/core/workflows_services.py +++ b/api/core/workflows_services.py @@ -141,5 +141,6 @@ def _publish_segments(self) -> None: live_segment.name = draft_segment.name live_segment.description = draft_segment.description live_segment.feature = draft_segment.feature + live_segment.rules_data = draft_segment.rules_data live_segment.save() live_segment.copy_rules_and_conditions_from(draft_segment) diff --git a/api/segments/models.py b/api/segments/models.py index 2fd49c38716d..dc6fafff6b5f 100644 --- a/api/segments/models.py +++ b/api/segments/models.py @@ -109,7 +109,7 @@ class Segment( ) rules_data: models.JSONField[ - list[SegmentRuleType], list[SegmentRuleType] | None + list[SegmentRuleType] | None, list[SegmentRuleType] | None ] = models.JSONField(null=True) version = models.IntegerField(default=1, null=True) diff --git a/api/tests/unit/features/workflows/core/test_unit_workflows_models.py b/api/tests/unit/features/workflows/core/test_unit_workflows_models.py index 9f3036f37bed..d4fb731421e4 100644 --- a/api/tests/unit/features/workflows/core/test_unit_workflows_models.py +++ b/api/tests/unit/features/workflows/core/test_unit_workflows_models.py @@ -1,4 +1,5 @@ import json +from copy import deepcopy from datetime import timedelta import freezegun @@ -44,6 +45,9 @@ from organisations.models import Organisation from projects.models import Project from segments.models import Condition, Segment, SegmentRule + +# TODO: Delete alias as per https://github.com/Flagsmith/flagsmith/issues/7818 +from segments.types import SegmentRule as SegmentRuleType from users.models import FFAdminUser now = timezone.now() @@ -860,7 +864,46 @@ def test_change_request_live_from__with_change_set__sets_live_from_to_commit_tim assert change_request.live_from == now -def test_change_request_commit__with_draft_segment__publishes_segment_rules( +def test_change_request_commit__with_draft_segment__publishes_draft( + segment: Segment, + segment_rules: list[SegmentRuleType], + change_request: ChangeRequest, + admin_user: FFAdminUser, + log: StructuredLogCapture, +) -> None: + # Given + draft_rules = deepcopy(segment_rules) + draft_rules[0]["conditions"][0]["value"] = "blue" + draft_segment = Segment.objects.create( + name="new-name", + description="new-description", + change_request=change_request, + project=segment.project, + version_of=segment, + rules_data=draft_rules, + ) + + # When + change_request.commit(admin_user) + + # Then + segment.refresh_from_db() + assert segment.version == 2 + assert segment.name == "new-name" + assert segment.description == "new-description" + assert segment.rules_data == draft_rules + revision = segment.versioned_segments.exclude( + id__in=[segment.id, draft_segment.id] + ).get() + assert revision.version == 1 + assert revision.rules_data == segment_rules + assert log.has( + "segment-revision-created", segment_id=segment.id, revision_id=revision.id + ) + + +# TODO: Delete as per https://github.com/Flagsmith/flagsmith/issues/7818 +def test_change_request_commit__with_draft_segment__publishes_segment_rules_x_replaced_above( segment: Segment, change_request: ChangeRequest, admin_user: FFAdminUser,