From 0a7e4488915b9df2b35354ddada0230143f4697e Mon Sep 17 00:00:00 2001 From: Rebecca Graber Date: Thu, 25 Jan 2024 09:28:31 -0500 Subject: [PATCH] feat: use new setting to set ce_source (#305) --- CHANGELOG.rst | 6 ++++++ openedx_events/__init__.py | 2 +- openedx_events/data.py | 27 ++++++++++++++++++++++++--- openedx_events/tests/test_data.py | 20 ++++++++++++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 5a602cc5..b620219e 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -14,6 +14,12 @@ Change Log Unreleased ---------- +[9.3.0] - 2024-01-24 +-------------------- +Changed +~~~~~~~ +* Allow new EVENTS_SERVICE_NAME setting to override SERVICE_VARIANT for data source. + [9.2.0] - 2023-11-16 -------------------- Added diff --git a/openedx_events/__init__.py b/openedx_events/__init__.py index c1facb6f..bb45b9cd 100644 --- a/openedx_events/__init__.py +++ b/openedx_events/__init__.py @@ -5,4 +5,4 @@ more information about the project. """ -__version__ = "9.2.0" +__version__ = "9.3.0" diff --git a/openedx_events/data.py b/openedx_events/data.py index 6b8f2661..962f6565 100644 --- a/openedx_events/data.py +++ b/openedx_events/data.py @@ -27,6 +27,29 @@ def _ensure_utc_time(_, attribute, value): raise ValueError(f"'{attribute.name}' must have timezone.utc") +def get_service_name(): + """ + Get the service name of the producing/consuming service of an event (or None if not set). + + Uses EVENTS_SERVICE_NAME setting if present, otherwise looks for SERVICE_VARIANT. + """ + # .. setting_name: EVENTS_SERVICE_NAME + # .. setting_default: None + # .. setting_description: Identifier for the producing/consuming service of an event. For example, "cms" or + # "course-discovery." Used, among other places, to determine the source header of the event. + return getattr(settings, "EVENTS_SERVICE_NAME", None) or getattr(settings, "SERVICE_VARIANT", None) + + +def _get_source(): + """ + Get the source for an event using the service name. + + If the service name is set, the full source will be set to openedx//web or + openedx/SERVICE_NAME_UNSET/web if service name is None. + """ + return "openedx/{service}/web".format(service=(get_service_name() or "SERVICE_NAME_UNSET")) + + @attr.s(frozen=True) class EventsMetadata: """ @@ -61,9 +84,7 @@ class EventsMetadata: ) source = attr.ib( type=str, default=None, - converter=attr.converters.default_if_none( - attr.Factory(lambda: "openedx/{service}/web".format(service=getattr(settings, "SERVICE_VARIANT", ""))) - ), + converter=attr.converters.default_if_none(attr.Factory(_get_source)), validator=attr.validators.instance_of(str), ) sourcehost = attr.ib( diff --git a/openedx_events/tests/test_data.py b/openedx_events/tests/test_data.py index 6a08448f..60ea9b11 100644 --- a/openedx_events/tests/test_data.py +++ b/openedx_events/tests/test_data.py @@ -2,11 +2,14 @@ from datetime import datetime, timezone from uuid import UUID +import ddt from django.test import TestCase +from django.test.utils import override_settings from openedx_events.data import EventsMetadata +@ddt.ddt class TestEventsMetadata(TestCase): """ Tests for the EventsMetadata class. @@ -26,3 +29,20 @@ def test_events_metadata_to_and_from_json(self): as_json = self.metadata.to_json() from_json = EventsMetadata.from_json(as_json) self.assertEqual(self.metadata, from_json) + + @ddt.data( + ('settings_variant', None, 'openedx/settings_variant/web'), + (None, 'my_service', 'openedx/my_service/web'), + (None, None, 'openedx/SERVICE_NAME_UNSET/web'), + ('settings_variant', 'my_service', 'openedx/my_service/web') + ) + @ddt.unpack + def test_events_metadata_source(self, settings_variant, event_bus_service_name, expected_source): + with override_settings( + SERVICE_VARIANT=settings_variant, + EVENTS_SERVICE_NAME=event_bus_service_name, + ): + metadata = EventsMetadata( + event_type='test_type' + ) + self.assertEqual(metadata.source, expected_source)