diff --git a/api/core/workflows_services.py b/api/core/workflows_services.py index 2547681e56a2..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: @@ -86,18 +84,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..ff499cc04c2b --- /dev/null +++ b/api/tests/unit/features/versioning/test_unit_versioning_receiver.py @@ -0,0 +1,46 @@ +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 ) 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`