Skip to content

Commit f17cec5

Browse files
feat: emit version IDs in events as well as version numbers
1 parent d370852 commit f17cec5

5 files changed

Lines changed: 47 additions & 26 deletions

File tree

src/openedx_content/applets/collections/signal_handlers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@ def on_entities_changed(
2121
Dispatches a task to emit LEARNING_PACKAGE_COLLECTION_CHANGED for any
2222
collections that contain the changed entities.
2323
"""
24-
removed_entity_ids = [record.entity_id for record in change_log.changes if record.new_version is None]
25-
# old_version=None covers both brand-new entities and restored soft-deletes; we can't distinguish
24+
removed_entity_ids = [record.entity_id for record in change_log.changes if record.new_version_id is None]
25+
# old_version_id=None covers both brand-new entities and restored soft-deletes; we can't distinguish
2626
# them here without a DB query. The task is a no-op for new entities (not yet in any collection).
2727
# TODO: if ChangeLogRecordData gains a 'restored' flag, filter to only restored entities here.
2828
# (Newly-created entities cannot be part of collections yet, so we only care about entities that
2929
# were previously in collections, then deleted and then restored.)
3030
added_entity_ids = [
3131
record.entity_id
3232
for record in change_log.changes
33-
if record.old_version is None and record.new_version is not None
33+
if record.old_version_id is None and record.new_version_id is not None
3434
]
3535

3636
if not removed_entity_ids and not added_entity_ids:

src/openedx_content/applets/collections/tasks.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ def emit_collections_changed_for_entity_changes_task(
3131
with entities_removed (for deletions) and/or entities_added (for restorations).
3232
A single event covers both if the same collection has entities in both lists.
3333
34-
Triggered by LEARNING_PACKAGE_ENTITIES_CHANGED. New entities (old_version=None
35-
→ new_version is not None) that aren't in any collection result in a no-op.
34+
Triggered by LEARNING_PACKAGE_ENTITIES_CHANGED. New entities
35+
(old_version_id=None, new_version_id is not None) that aren't in any
36+
collection result in a no-op.
3637
"""
3738
all_entity_ids = list(set(removed_entity_ids) | set(added_entity_ids))
3839
if not all_entity_ids:

src/openedx_content/applets/publishing/api.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,9 @@ def _emit_event_for_change_log(
945945
signals.ChangeLogRecordData(
946946
entity_id=record.entity_id,
947947
old_version=record.old_version.version_num if record.old_version else None,
948+
old_version_id=record.old_version_id,
948949
new_version=record.new_version.version_num if record.new_version else None,
950+
new_version_id=record.new_version_id,
949951
direct=record.direct if isinstance(record, PublishLogRecord) else None,
950952
)
951953
for record in change_log.records.order_by("id").select_related("old_version", "new_version").all()

src/openedx_content/applets/publishing/signals.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,18 @@ class ChangeLogRecordData:
4444
entity_id: PublishableEntity.ID
4545

4646
old_version: int | None
47+
"""The old version number of this entity. None if newly-created or un-deleted."""
48+
old_version_id: int | None
4749
"""
48-
The old version_num of this entity (not the PublishableEntityVersion ID).
49-
This is None if the entity is newly created.
50+
The old version of this entity (the PublishableEntityVersion ID).
51+
This is None if the entity is newly created (or un-deleted).
5052
"""
5153

5254
new_version: int | None
55+
"""The old version number of this entity. None if newly-created or un-deleted."""
56+
new_version_id: int | None
5357
"""
54-
The new version_num of this entity (not the PublishableEntityVersion ID).
58+
The new version of this entity (the PublishableEntityVersion ID.
5559
This is None if the entity is now deleted.
5660
"""
5761

tests/openedx_content/applets/publishing/test_signals.py

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,20 @@ def publish_entity(obj: PublishableEntity) -> PublishLog:
2121
return api.publish_from_drafts(lp_id, draft_qset=api.get_all_drafts(lp_id).filter(entity=obj))
2222

2323

24+
def change_record(obj: PublishableEntity, old_version: int | None, new_version: int | None, direct: bool | None = None):
25+
"""Helper function to construct ChangeLogRecordData() using only version numbers instead of numbers+IDs"""
26+
old_version_id = obj.versions.get(version_num=old_version).id if old_version is not None else None
27+
new_version_id = obj.versions.get(version_num=new_version).id if new_version is not None else None
28+
return api.signals.ChangeLogRecordData(
29+
entity_id=obj.id,
30+
old_version=old_version,
31+
old_version_id=old_version_id,
32+
new_version=new_version,
33+
new_version_id=new_version_id,
34+
direct=direct,
35+
)
36+
37+
2438
# LEARNING_PACKAGE_ENTITIES_CHANGED
2539

2640

@@ -55,7 +69,7 @@ def test_single_entity_changed() -> None:
5569
assert event.kwargs["changed_by"].user_id is None
5670
assert event.kwargs["change_log"].draft_change_log_id == expected_draft_change_log_id
5771
assert event.kwargs["change_log"].changes == [
58-
api.signals.ChangeLogRecordData(entity_id=entity.id, old_version=None, new_version=NEW_VERSION_NUM),
72+
change_record(entity, old_version=None, new_version=NEW_VERSION_NUM),
5973
]
6074
assert event.kwargs["metadata"].time == now_time
6175

@@ -116,11 +130,11 @@ def test_multiple_entites_changed(admin_user) -> None:
116130
assert event.kwargs["change_log"].draft_change_log_id == draft_change_log.id
117131
assert event.kwargs["change_log"].changes == [
118132
# Entity 1 jumps from no version to version 2:
119-
api.signals.ChangeLogRecordData(entity_id=entity1.id, old_version=None, new_version=2),
133+
change_record(entity1, old_version=None, new_version=2),
120134
# Entity 2 jumps v1 -> v2:
121-
api.signals.ChangeLogRecordData(entity_id=entity2.id, old_version=1, new_version=2),
135+
change_record(entity2, old_version=1, new_version=2),
122136
# Entity 3 gets deleted:
123-
api.signals.ChangeLogRecordData(entity_id=entity3.id, old_version=1, new_version=None),
137+
change_record(entity3, old_version=1, new_version=None),
124138
]
125139
assert event.kwargs["metadata"].time == now_time
126140

@@ -182,8 +196,8 @@ def create_entity(name: str, dependencies: list[PublishableEntity.ID] | None = N
182196
event = captured[0]
183197
assert event.signal is api.signals.LEARNING_PACKAGE_ENTITIES_CHANGED
184198
assert event.kwargs["change_log"].changes == [
185-
api.signals.ChangeLogRecordData(entity_id=child1.id, old_version=1, new_version=2), # directly modified
186-
api.signals.ChangeLogRecordData(entity_id=parent1.id, old_version=1, new_version=1), # side effect
199+
change_record(child1, old_version=1, new_version=2), # directly modified
200+
change_record(parent1, old_version=1, new_version=1), # side effect
187201
]
188202

189203

@@ -224,9 +238,9 @@ def test_publish_events(admin_user) -> None:
224238
assert event.kwargs["change_log"].changes == [
225239
# Entity 1 is not yet published, since it has no draft version.
226240
# Entity 2 is newly published, and now at v2:
227-
api.signals.ChangeLogRecordData(entity_id=entity2.id, old_version=None, new_version=2, direct=True),
241+
change_record(entity2, old_version=None, new_version=2, direct=True),
228242
# Entity 3 is newly published, and now at v1:
229-
api.signals.ChangeLogRecordData(entity_id=entity3.id, old_version=None, new_version=1, direct=True),
243+
change_record(entity3, old_version=None, new_version=1, direct=True),
230244
]
231245
assert event.kwargs["metadata"].time == first_publish_time
232246

@@ -253,11 +267,11 @@ def test_publish_events(admin_user) -> None:
253267
assert event.kwargs["change_log"].publish_log_id == second_log.id
254268
assert event.kwargs["change_log"].changes == [
255269
# Entity 1 is newly published at v1:
256-
api.signals.ChangeLogRecordData(entity_id=entity1.id, old_version=None, new_version=1, direct=True),
270+
change_record(entity1, old_version=None, new_version=1, direct=True),
257271
# Entity 2 jumps v2 -> v3:
258-
api.signals.ChangeLogRecordData(entity_id=entity2.id, old_version=2, new_version=3, direct=True),
272+
change_record(entity2, old_version=2, new_version=3, direct=True),
259273
# Entity 3 gets deleted:
260-
api.signals.ChangeLogRecordData(entity_id=entity3.id, old_version=1, new_version=None, direct=True),
274+
change_record(entity3, old_version=1, new_version=None, direct=True),
261275
]
262276
assert event.kwargs["metadata"].time == second_publish_time
263277

@@ -323,10 +337,10 @@ def create_entity(name: str, dependencies: list[PublishableEntity.ID] | None = N
323337
event = captured[0]
324338
assert event.signal is api.signals.LEARNING_PACKAGE_ENTITIES_PUBLISHED
325339
assert event.kwargs["change_log"].changes == [
326-
api.signals.ChangeLogRecordData(entity_id=grandparent1.id, old_version=None, new_version=1, direct=True),
327-
api.signals.ChangeLogRecordData(entity_id=parent1.id, old_version=None, new_version=1, direct=False),
328-
api.signals.ChangeLogRecordData(entity_id=child1.id, old_version=None, new_version=1, direct=False),
329-
api.signals.ChangeLogRecordData(entity_id=child2.id, old_version=None, new_version=1, direct=False),
340+
change_record(grandparent1, old_version=None, new_version=1, direct=True),
341+
change_record(parent1, old_version=None, new_version=1, direct=False),
342+
change_record(child1, old_version=None, new_version=1, direct=False),
343+
change_record(child2, old_version=None, new_version=1, direct=False),
330344
]
331345

332346
# publish the rest:
@@ -342,7 +356,7 @@ def create_entity(name: str, dependencies: list[PublishableEntity.ID] | None = N
342356
event = captured[0]
343357
assert event.signal is api.signals.LEARNING_PACKAGE_ENTITIES_PUBLISHED
344358
assert event.kwargs["change_log"].changes == [
345-
api.signals.ChangeLogRecordData(entity_id=child3.id, old_version=1, new_version=2, direct=True),
346-
api.signals.ChangeLogRecordData(entity_id=parent2.id, old_version=1, new_version=1, direct=False),
347-
api.signals.ChangeLogRecordData(entity_id=grandparent2.id, old_version=1, new_version=1, direct=False),
359+
change_record(child3, old_version=1, new_version=2, direct=True),
360+
change_record(parent2, old_version=1, new_version=1, direct=False),
361+
change_record(grandparent2, old_version=1, new_version=1, direct=False),
348362
]

0 commit comments

Comments
 (0)