From c99d8c7738cd6efef80aafc6d62add5bb764f038 Mon Sep 17 00:00:00 2001 From: Sahil Date: Mon, 18 May 2026 14:27:02 +0530 Subject: [PATCH 1/2] fixed multiple environmnet document queued --- api/core/workflows_services.py | 12 ------ api/features/versioning/receivers.py | 5 ++- .../test_unit_versioning_receiver.py | 42 +++++++++++++++++++ .../core/test_unit_workflows_models.py | 18 ++------ 4 files changed, 50 insertions(+), 27 deletions(-) create mode 100644 api/tests/unit/features/versioning/test_unit_versioning_receiver.py diff --git a/api/core/workflows_services.py b/api/core/workflows_services.py index 2547681e56a2..b824fa0a4ee8 100644 --- a/api/core/workflows_services.py +++ b/api/core/workflows_services.py @@ -86,18 +86,6 @@ def _publish_environment_feature_versions( ) for environment_feature_version in environment_feature_versions: - trigger_update_version_webhooks.delay( - kwargs={ - "environment_feature_version_uuid": str( - environment_feature_version.uuid - ) - }, - delay_until=environment_feature_version.live_from, - ) - rebuild_environment_document.delay( - kwargs={"environment_id": self.change_request.environment_id}, - delay_until=environment_feature_version.live_from, - ) environment_feature_version_published.send( EnvironmentFeatureVersion, instance=environment_feature_version ) diff --git a/api/features/versioning/receivers.py b/api/features/versioning/receivers.py index 175fd1113f55..e6de2b24a249 100644 --- a/api/features/versioning/receivers.py +++ b/api/features/versioning/receivers.py @@ -44,7 +44,10 @@ def cache_fields(instance: EnvironmentFeatureVersion, **kwargs): # type: ignore @receiver(environment_feature_version_published, sender=EnvironmentFeatureVersion) -def update_environment_document(instance: EnvironmentFeatureVersion, **kwargs): # type: ignore[no-untyped-def] +def update_environment_document(instance: EnvironmentFeatureVersion, **kwargs) -> None: # type: ignore[no-untyped-def] + now = timezone.now() + if not instance.live_from or instance.live_from <= now: + return rebuild_environment_document.delay( kwargs={"environment_id": instance.environment_id}, delay_until=instance.live_from, diff --git a/api/tests/unit/features/versioning/test_unit_versioning_receiver.py b/api/tests/unit/features/versioning/test_unit_versioning_receiver.py new file mode 100644 index 000000000000..bdaf8053cc2d --- /dev/null +++ b/api/tests/unit/features/versioning/test_unit_versioning_receiver.py @@ -0,0 +1,42 @@ +from datetime import timedelta +from unittest import mock + +from django.utils import timezone + +from features.versioning.receivers import update_environment_document + + +def test_update_environment_document__immediate_publish__does_not_schedule_rebuild() -> None: + # Given + mock_instance = mock.MagicMock() + mock_instance.live_from = timezone.now() - timedelta(seconds=1) + mock_instance.environment_id = 1 + + # When + with mock.patch( + "features.versioning.receivers.rebuild_environment_document" + ) as mock_rebuild: + update_environment_document(instance=mock_instance) + + # Then + mock_rebuild.delay.assert_not_called() + + +def test_update_environment_document__scheduled_publish__schedules_rebuild_at_live_from() -> None: + # Given + future = timezone.now() + timedelta(hours=1) + mock_instance = mock.MagicMock() + mock_instance.live_from = future + mock_instance.environment_id = 1 + + # When + with mock.patch( + "features.versioning.receivers.rebuild_environment_document" + ) as mock_rebuild: + update_environment_document(instance=mock_instance) + + # Then + mock_rebuild.delay.assert_called_once_with( + kwargs={"environment_id": 1}, + delay_until=future, + ) 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 4068d34021d4..1be447aeb132 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 @@ -699,11 +699,8 @@ def test_change_request_commit__v2_versioning__publishes_environment_feature_ver change_request.environment_feature_versions.add(environment_feature_version) - mock_rebuild_environment_document_task = mocker.patch( - "core.workflows_services.rebuild_environment_document" - ) - mock_trigger_update_version_webhooks = mocker.patch( - "core.workflows_services.trigger_update_version_webhooks" + mock_signal = mocker.patch( + "core.workflows_services.environment_feature_version_published" ) # When @@ -715,15 +712,8 @@ def test_change_request_commit__v2_versioning__publishes_environment_feature_ver assert environment_feature_version.published_by == admin_user assert environment_feature_version.live_from == now - mock_rebuild_environment_document_task.delay.assert_called_once_with( - kwargs={"environment_id": environment.id}, - delay_until=environment_feature_version.live_from, - ) - mock_trigger_update_version_webhooks.delay.assert_called_once_with( - kwargs={ - "environment_feature_version_uuid": str(environment_feature_version.uuid) - }, - delay_until=environment_feature_version.live_from, + mock_signal.send.assert_called_once_with( + EnvironmentFeatureVersion, instance=environment_feature_version ) From 84d46c0168a3745da24459da5c4ce206089bc882 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 09:01:12 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- api/core/workflows_services.py | 2 -- .../features/versioning/test_unit_versioning_receiver.py | 8 ++++++-- .../observability/_events-catalogue.md | 6 +++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/api/core/workflows_services.py b/api/core/workflows_services.py index b824fa0a4ee8..3b706e3e3c87 100644 --- a/api/core/workflows_services.py +++ b/api/core/workflows_services.py @@ -4,10 +4,8 @@ from django.db import transaction from django.utils import timezone -from environments.tasks import rebuild_environment_document from features.versioning.models import EnvironmentFeatureVersion from features.versioning.signals import environment_feature_version_published -from features.versioning.tasks import trigger_update_version_webhooks from features.workflows.core.exceptions import ChangeRequestNotApprovedError if TYPE_CHECKING: diff --git a/api/tests/unit/features/versioning/test_unit_versioning_receiver.py b/api/tests/unit/features/versioning/test_unit_versioning_receiver.py index bdaf8053cc2d..ff499cc04c2b 100644 --- a/api/tests/unit/features/versioning/test_unit_versioning_receiver.py +++ b/api/tests/unit/features/versioning/test_unit_versioning_receiver.py @@ -6,7 +6,9 @@ from features.versioning.receivers import update_environment_document -def test_update_environment_document__immediate_publish__does_not_schedule_rebuild() -> None: +def test_update_environment_document__immediate_publish__does_not_schedule_rebuild() -> ( + None +): # Given mock_instance = mock.MagicMock() mock_instance.live_from = timezone.now() - timedelta(seconds=1) @@ -22,7 +24,9 @@ def test_update_environment_document__immediate_publish__does_not_schedule_rebui mock_rebuild.delay.assert_not_called() -def test_update_environment_document__scheduled_publish__schedules_rebuild_at_live_from() -> None: +def test_update_environment_document__scheduled_publish__schedules_rebuild_at_live_from() -> ( + None +): # Given future = timezone.now() + timedelta(hours=1) mock_instance = mock.MagicMock() diff --git a/docs/docs/deployment-self-hosting/observability/_events-catalogue.md b/docs/docs/deployment-self-hosting/observability/_events-catalogue.md index 1d126c0430d7..577bdf6f0274 100644 --- a/docs/docs/deployment-self-hosting/observability/_events-catalogue.md +++ b/docs/docs/deployment-self-hosting/observability/_events-catalogue.md @@ -381,7 +381,7 @@ Attributes: ### `workflows.change_request.committed` Logged at `info` from: - - `api/core/workflows_services.py:39` + - `api/core/workflows_services.py:37` Attributes: - `environment.id` @@ -391,7 +391,7 @@ Attributes: ### `workflows.missing_live_segment` Logged at `warning` from: - - `api/core/workflows_services.py:114` + - `api/core/workflows_services.py:100` Attributes: - `draft_segment` @@ -399,7 +399,7 @@ Attributes: ### `workflows.segment_revision_created` Logged at `info` from: - - `api/core/workflows_services.py:119` + - `api/core/workflows_services.py:105` Attributes: - `revision_id`