Skip to content

Commit 236f7cc

Browse files
refactor: Simplify EntityList: merge draft_version+published_version -> entity_version
1 parent 3ac1e11 commit 236f7cc

5 files changed

Lines changed: 43 additions & 68 deletions

File tree

openedx_learning/apps/authoring/containers/api.py

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,7 @@ def create_next_defined_list(
8181
previous_entity_list: EntityList | None,
8282
new_entity_list: EntityList,
8383
entity_pks: list[int],
84-
draft_version_pks: list[int | None],
85-
published_version_pks: list[int | None],
84+
entity_version_pks: list[int | None],
8685
) -> EntityListRow:
8786
"""
8887
Create new entity list rows for an entity list.
@@ -91,8 +90,9 @@ def create_next_defined_list(
9190
previous_entity_list: The previous entity list that the new entity list is based on.
9291
new_entity_list: The entity list to create the rows for.
9392
entity_pks: The IDs of the publishable entities that the entity list rows reference.
94-
draft_version_pks: The IDs of the draft versions of the entities (PublishableEntityVersion) that the entity list rows reference.
95-
published_version_pks: The IDs of the published versions of the entities (PublishableEntityVersion) that the entity list rows reference.
93+
entity_version_pks: The IDs of the draft versions of the entities
94+
(PublishableEntityVersion) that the entity list rows reference, or
95+
Nones for "unpinned" (default).
9696
9797
Returns:
9898
The newly created entity list rows.
@@ -109,8 +109,8 @@ def create_next_defined_list(
109109
current_rows = previous_entity_list.entitylistrow_set.all()
110110
publishable_entities_in_rows = {row.entity.pk: row for row in current_rows}
111111
new_rows = []
112-
for order_num, entity_pk, draft_version_pk, published_version_pk in zip(
113-
order_nums, entity_pks, draft_version_pks, published_version_pks
112+
for order_num, entity_pk, entity_version_pk in zip(
113+
order_nums, entity_pks, entity_version_pks
114114
):
115115
row = publishable_entities_in_rows.get(entity_pk)
116116
if row and row.order_num == order_num:
@@ -121,26 +121,25 @@ def create_next_defined_list(
121121
entity_list=new_entity_list,
122122
entity_id=entity_pk,
123123
order_num=order_num,
124-
draft_version_id=draft_version_pk,
125-
published_version_id=published_version_pk,
124+
entity_version_id=entity_version_pk,
126125
)
127126
)
128127
EntityListRow.objects.bulk_create(new_rows)
129128
return new_entity_list
130129

131130
def create_defined_list_with_rows(
132131
entity_pks: list[int],
133-
draft_version_pks: list[int | None],
134-
published_version_pks: list[int | None],
132+
entity_version_pks: list[int | None],
135133
) -> EntityList:
136134
"""
137135
Create new entity list rows for an entity list.
138136
139137
Args:
140138
entity_list: The entity list to create the rows for.
141139
entity_pks: The IDs of the publishable entities that the entity list rows reference.
142-
draft_version_pks: The IDs of the draft versions of the entities (PublishableEntityVersion) that the entity list rows reference.
143-
published_version_pks: The IDs of the published versions of the entities (PublishableEntityVersion) that the entity list rows reference.
140+
entity_version_pks: The IDs of the versions of the entities
141+
(PublishableEntityVersion) that the entity list rows reference, or
142+
Nones for "unpinned" (default).
144143
145144
Returns:
146145
The newly created entity list.
@@ -154,11 +153,10 @@ def create_defined_list_with_rows(
154153
entity_list=entity_list,
155154
entity_id=entity_pk,
156155
order_num=order_num,
157-
draft_version_id=draft_version_pk,
158-
published_version_id=published_version_pk,
156+
entity_version_id=entity_version_pk,
159157
)
160-
for order_num, entity_pk, draft_version_pk, published_version_pk in zip(
161-
order_nums, entity_pks, draft_version_pks, published_version_pks
158+
for order_num, entity_pk, entity_version_pk in zip(
159+
order_nums, entity_pks, entity_version_pks
162160
)
163161
]
164162
)
@@ -186,8 +184,7 @@ def get_entity_list_with_pinned_versions(
186184
entity_list=entity_list,
187185
entity_id=row.entity.id,
188186
order_num=row.order_num,
189-
draft_version_id=None,
190-
published_version_id=None, # For simplicity, we are not copying the pinned versions
187+
entity_version_id=None, # For simplicity, we are not copying the pinned versions
191188
)
192189
for row in rows
193190
]
@@ -210,7 +207,7 @@ def check_unpinned_versions_in_defined_list(
210207
"""
211208
# Is there a way to short-circuit this?
212209
return any(
213-
row.draft_version is None or row.published_version is None
210+
row.entity_version is None
214211
for row in defined_list.entitylistrow_set.all()
215212
)
216213

@@ -239,8 +236,7 @@ def create_container_version(
239236
version_num: int,
240237
title: str,
241238
publishable_entities_pk: list[int],
242-
draft_version_pks: list[int | None],
243-
published_version_pks: list[int | None],
239+
entity_version_pks: list[int | None],
244240
entity: PublishableEntity,
245241
created: datetime,
246242
created_by: int | None,
@@ -270,8 +266,7 @@ def create_container_version(
270266
)
271267
defined_list = create_defined_list_with_rows(
272268
entity_pks=publishable_entities_pk,
273-
draft_version_pks=draft_version_pks,
274-
published_version_pks=published_version_pks,
269+
entity_version_pks=entity_version_pks,
275270
)
276271
container_version = ContainerEntityVersion.objects.create(
277272
publishable_entity_version=publishable_entity_version,
@@ -290,8 +285,7 @@ def create_next_container_version(
290285
container_pk: int,
291286
title: str,
292287
publishable_entities_pk: list[int],
293-
draft_version_pks: list[int | None],
294-
published_version_pks: list[int | None],
288+
entity_version_pks: list[int | None],
295289
entity: PublishableEntity,
296290
created: datetime,
297291
created_by: int | None,
@@ -349,8 +343,7 @@ def create_next_container_version(
349343
previous_entity_list=last_version.defined_list,
350344
new_entity_list=create_entity_list(),
351345
entity_pks=publishable_entities_pk,
352-
draft_version_pks=draft_version_pks,
353-
published_version_pks=published_version_pks,
346+
entity_version_pks=entity_version_pks,
354347
)
355348
next_initial_list = get_entity_list_with_pinned_versions(
356349
rows=next_defined_list.entitylistrow_set.all()
@@ -385,8 +378,7 @@ def create_container_and_version(
385378
created_by: int | None,
386379
title: str,
387380
publishable_entities_pk: list[int],
388-
draft_version_pks: list[int | None],
389-
published_version_pks: list[int | None],
381+
entity_version_pks: list[int | None],
390382
) -> ContainerEntityVersion:
391383
"""
392384
Create a new container and its first version.
@@ -410,8 +402,7 @@ def create_container_and_version(
410402
version_num=1,
411403
title=title,
412404
publishable_entities_pk=publishable_entities_pk,
413-
draft_version_pks=draft_version_pks,
414-
published_version_pks=published_version_pks,
405+
entity_version_pks=entity_version_pks,
415406
entity=container.publishable_entity,
416407
created=created,
417408
created_by=created_by,
@@ -507,8 +498,8 @@ def get_entities_in_draft_container(
507498
defined_list = container.versioning.draft.defined_list
508499
for row in defined_list.entitylistrow_set.order_by("order_num"):
509500
entity_list.append(ContainerEntityListEntry(
510-
entity_version=row.draft_version or row.entity.draft.version,
511-
pinned=row.draft_version is not None,
501+
entity_version=row.entity_version or row.entity.draft.version,
502+
pinned=row.entity_version is not None,
512503
))
513504
return entity_list
514505

@@ -535,8 +526,8 @@ def get_entities_in_published_container(
535526
entity_list = []
536527
for row in cev.defined_list.entitylistrow_set.order_by("order_num"):
537528
entity_list.append(ContainerEntityListEntry(
538-
entity_version=row.published_version or row.entity.published.version,
539-
pinned=row.published_version is not None,
529+
entity_version=row.entity_version or row.entity.published.version,
530+
pinned=row.entity_version is not None,
540531
))
541532
return entity_list
542533

@@ -572,7 +563,7 @@ def contains_unpublished_changes(
572563
# TODO: This is a naive inefficient implementation but hopefully correct.
573564
# Once we know it's correct and have a good test suite, then we can optimize.
574565
# We will likely change to a tracking-based approach rather than a "scan for changes" based approach.
575-
for row in defined_list.entitylistrow_set.filter(draft_version=None).select_related(
566+
for row in defined_list.entitylistrow_set.filter(entity_version=None).select_related(
576567
"entity__containerentity",
577568
"entity__draft__version",
578569
"entity__published__version",

openedx_learning/apps/authoring/containers/migrations/0001_initial.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 4.2.16 on 2024-10-29 12:57
1+
# Generated by Django 4.2.19 on 2025-02-14 23:04
22

33
from django.db import migrations, models
44
import django.db.models.deletion
@@ -33,10 +33,9 @@ class Migration(migrations.Migration):
3333
fields=[
3434
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
3535
('order_num', models.PositiveIntegerField()),
36-
('draft_version', models.ForeignKey(null=True, on_delete=django.db.models.deletion.RESTRICT, related_name='draft_version', to='oel_publishing.publishableentityversion')),
3736
('entity', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='oel_publishing.publishableentity')),
3837
('entity_list', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='oel_containers.entitylist')),
39-
('published_version', models.ForeignKey(null=True, on_delete=django.db.models.deletion.RESTRICT, related_name='published_version', to='oel_publishing.publishableentityversion')),
38+
('entity_version', models.ForeignKey(null=True, on_delete=django.db.models.deletion.RESTRICT, related_name='+', to='oel_publishing.publishableentityversion')),
4039
],
4140
),
4241
migrations.CreateModel(

openedx_learning/apps/authoring/containers/models.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,11 @@ class EntityListRow(models.Model):
5858
# So our approach to this is to use a value of None (null) to represent an
5959
# unpinned reference to a PublishableEntity. It's shorthand for "just use
6060
# the latest draft or published version of this, as appropriate".
61-
draft_version = models.ForeignKey(
61+
entity_version = models.ForeignKey(
6262
PublishableEntityVersion,
6363
on_delete=models.RESTRICT,
6464
null=True,
65-
related_name="draft_version",
66-
)
67-
published_version = models.ForeignKey(
68-
PublishableEntityVersion,
69-
on_delete=models.RESTRICT,
70-
null=True,
71-
related_name="published_version",
65+
related_name="+", # Do we need the reverse relation?
7266
)
7367

7468

openedx_learning/apps/authoring/units/api.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ def create_unit_version(
6060
version_num: int,
6161
title: str,
6262
publishable_entities_pks: list[int],
63-
draft_version_pks: list[int | None],
64-
published_version_pks: list[int | None],
63+
entity_version_pks: list[int | None],
6564
created: datetime,
6665
created_by: int | None = None,
6766
) -> Unit:
@@ -82,8 +81,7 @@ def create_unit_version(
8281
version_num,
8382
title,
8483
publishable_entities_pks,
85-
draft_version_pks,
86-
published_version_pks,
84+
entity_version_pks,
8785
unit.container_entity.publishable_entity,
8886
created,
8987
created_by,
@@ -100,8 +98,7 @@ def create_next_unit_version(
10098
unit: Unit,
10199
title: str,
102100
publishable_entities_pks: list[int],
103-
draft_version_pks: list[int | None],
104-
published_version_pks: list[int | None],
101+
entity_version_pks: list[int | None],
105102
created: datetime,
106103
created_by: int | None = None,
107104
) -> Unit:
@@ -122,8 +119,7 @@ def create_next_unit_version(
122119
unit.container_entity.pk,
123120
title,
124121
publishable_entities_pks,
125-
draft_version_pks,
126-
published_version_pks,
122+
entity_version_pks,
127123
unit.container_entity.publishable_entity,
128124
created,
129125
created_by,
@@ -157,11 +153,10 @@ def create_unit_and_version(
157153
unit,
158154
1,
159155
title,
160-
[],
161-
[],
162-
[],
163-
created,
164-
created_by,
156+
publishable_entities_pks=[],
157+
entity_version_pks=[],
158+
created=created,
159+
created_by=created_by,
165160
)
166161
return unit, unit_version
167162

tests/openedx_learning/apps/authoring/units/test_api.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,7 @@ def test_create_next_unit_version_with_two_components(self):
8181
self.component_1.publishable_entity.id,
8282
self.component_2.publishable_entity.id,
8383
],
84-
draft_version_pks=[None, None],
85-
published_version_pks=[None, None], # FIXME: why do we specify this?
84+
entity_version_pks=[None, None],
8685
created=self.now,
8786
created_by=None,
8887
)
@@ -122,8 +121,7 @@ def test_add_component_after_publish(self):
122121
publishable_entities_pks=[
123122
self.component_1.publishable_entity.id,
124123
],
125-
draft_version_pks=[None],
126-
published_version_pks=[None], # FIXME: why do we specify this?
124+
entity_version_pks=[None],
127125
created=self.now,
128126
created_by=None,
129127
)
@@ -157,8 +155,7 @@ def test_modify_component_after_publish(self):
157155
publishable_entities_pks=[
158156
self.component_1.publishable_entity.id,
159157
],
160-
draft_version_pks=[None],
161-
published_version_pks=[None], # FIXME: why do we specify this?
158+
entity_version_pks=[None],
162159
created=self.now,
163160
created_by=None,
164161
)
@@ -233,8 +230,7 @@ def test_query_count_of_contains_unpublished_changes(self):
233230
unit=unit,
234231
title=unit_version.title,
235232
publishable_entities_pks=publishable_entities_pks,
236-
draft_version_pks=[None] * component_count,
237-
published_version_pks=[None] * component_count, # FIXME: why do we specify this?
233+
entity_version_pks=[None] * component_count,
238234
created=self.now,
239235
)
240236
authoring_api.publish_all_drafts(self.learning_package.id)

0 commit comments

Comments
 (0)