Skip to content

Commit 443fe4b

Browse files
refactor: make create functions more DRY, remove redundant 'entity' arg
1 parent 2700605 commit 443fe4b

File tree

2 files changed

+68
-78
lines changed

2 files changed

+68
-78
lines changed

openedx_learning/apps/authoring/containers/api.py

Lines changed: 68 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -110,35 +110,62 @@ def create_entity_list_with_rows(
110110
return entity_list
111111

112112

113-
def get_entity_list_with_pinned_versions(
114-
rows: QuerySet[EntityListRow],
115-
) -> EntityList:
113+
def _create_container_version(
114+
container_pk: int,
115+
*,
116+
title: str,
117+
publishable_entities_pks: list[int],
118+
entity_version_pks: list[int | None],
119+
created: datetime,
120+
created_by: int | None,
121+
force_version_num: int | None = None,
122+
) -> ContainerEntityVersion:
116123
"""
117-
[ 🛑 UNSTABLE ]
118-
Copy rows from an existing entity list to a new entity list.
124+
Helper method used by create_container_version() and
125+
create_next_container_version().
119126
120-
Args:
121-
entity_list: The entity list to copy the rows to.
122-
rows: The rows to copy to the new entity list.
127+
Almost always, either force_version_num = 1 to create the initial version,
128+
or force_version_num is omitted to create the "next" version in sequence.
123129
124-
Returns:
125-
The newly created entity list.
130+
However, all our APIs do allow creating arbitrary version numbers, perhaps
131+
for import/export purposes.
126132
"""
127-
entity_list = create_entity_list()
128133
with atomic():
129-
_ = EntityListRow.objects.bulk_create(
130-
[
131-
EntityListRow(
132-
entity_list=entity_list,
133-
entity_id=row.entity.id,
134-
order_num=row.order_num,
135-
entity_version_id=None, # For simplicity, we are not copying the pinned versions
136-
)
137-
for row in rows
138-
]
134+
container = ContainerEntity.objects.select_related("publishable_entity").get(pk=container_pk)
135+
entity = container.publishable_entity
136+
137+
# Do a quick check that the given entities are in the right learning package:
138+
if PublishableEntity.objects.filter(
139+
pk__in=publishable_entities_pks,
140+
).exclude(
141+
learning_package_id=entity.learning_package_id,
142+
).exists():
143+
raise ValidationError("Container entities must be from the same learning package.")
144+
145+
if force_version_num is not None:
146+
next_version_num = force_version_num
147+
else:
148+
last_version = container.versioning.latest
149+
assert last_version is not None
150+
next_version_num = last_version.version_num + 1
151+
publishable_entity_version = publishing_api.create_publishable_entity_version(
152+
entity.pk,
153+
version_num=next_version_num,
154+
title=title,
155+
created=created,
156+
created_by=created_by,
157+
)
158+
next_entity_list = create_entity_list_with_rows(
159+
entity_pks=publishable_entities_pks,
160+
entity_version_pks=entity_version_pks,
161+
)
162+
next_container_version = ContainerEntityVersion.objects.create(
163+
publishable_entity_version=publishable_entity_version,
164+
container_id=container_pk,
165+
entity_list=next_entity_list,
139166
)
140167

141-
return entity_list
168+
return next_container_version
142169

143170

144171
def create_container_version(
@@ -148,7 +175,6 @@ def create_container_version(
148175
title: str,
149176
publishable_entities_pks: list[int],
150177
entity_version_pks: list[int | None],
151-
entity: PublishableEntity,
152178
created: datetime,
153179
created_by: int | None,
154180
) -> ContainerEntityVersion:
@@ -161,31 +187,21 @@ def create_container_version(
161187
version_num: The version number of the container.
162188
title: The title of the container.
163189
publishable_entities_pks: The IDs of the members of the container.
164-
entity: The entity that the container belongs to.
165190
created: The date and time the container version was created.
166191
created_by: The ID of the user who created the container version.
167192
168193
Returns:
169194
The newly created container version.
170195
"""
171-
with atomic():
172-
publishable_entity_version = publishing_api.create_publishable_entity_version(
173-
entity.pk,
174-
version_num=version_num,
175-
title=title,
176-
created=created,
177-
created_by=created_by,
178-
)
179-
entity_list = create_entity_list_with_rows(
180-
entity_pks=publishable_entities_pks,
181-
entity_version_pks=entity_version_pks,
182-
)
183-
container_version = ContainerEntityVersion.objects.create(
184-
publishable_entity_version=publishable_entity_version,
185-
container_id=container_pk,
186-
entity_list=entity_list,
187-
)
188-
return container_version
196+
return _create_container_version(
197+
container_pk,
198+
title=title,
199+
publishable_entities_pks=publishable_entities_pks,
200+
entity_version_pks=entity_version_pks,
201+
created=created,
202+
created_by=created_by,
203+
force_version_num=version_num,
204+
)
189205

190206

191207
def create_next_container_version(
@@ -194,7 +210,6 @@ def create_next_container_version(
194210
title: str,
195211
publishable_entities_pks: list[int],
196212
entity_version_pks: list[int | None],
197-
entity: PublishableEntity,
198213
created: datetime,
199214
created_by: int | None,
200215
) -> ContainerEntityVersion:
@@ -213,42 +228,20 @@ def create_next_container_version(
213228
container_pk: The ID of the container to create the next version of.
214229
title: The title of the container.
215230
publishable_entities_pks: The IDs of the members current members of the container.
216-
entity: The entity that the container belongs to.
217231
created: The date and time the container version was created.
218232
created_by: The ID of the user who created the container version.
219233
220234
Returns:
221235
The newly created container version.
222236
"""
223-
# Do a quick check that the given entities are in the right learning package:
224-
if PublishableEntity.objects.filter(
225-
pk__in=publishable_entities_pks,
226-
).exclude(
227-
learning_package_id=entity.learning_package_id,
228-
).exists():
229-
raise ValidationError("Container entities must be from the same learning package.")
230-
with atomic():
231-
container = ContainerEntity.objects.get(pk=container_pk)
232-
last_version = container.versioning.latest
233-
next_version_num = last_version.version_num + 1
234-
publishable_entity_version = publishing_api.create_publishable_entity_version(
235-
entity.pk,
236-
version_num=next_version_num,
237-
title=title,
238-
created=created,
239-
created_by=created_by,
240-
)
241-
next_entity_list = create_entity_list_with_rows(
242-
entity_pks=publishable_entities_pks,
243-
entity_version_pks=entity_version_pks,
244-
)
245-
next_container_version = ContainerEntityVersion.objects.create(
246-
publishable_entity_version=publishable_entity_version,
247-
container_id=container_pk,
248-
entity_list=next_entity_list,
249-
)
250-
251-
return next_container_version
237+
return _create_container_version(
238+
container_pk,
239+
title=title,
240+
publishable_entities_pks=publishable_entities_pks,
241+
entity_version_pks=entity_version_pks,
242+
created=created,
243+
created_by=created_by,
244+
)
252245

253246

254247
def create_container_and_version(
@@ -280,12 +273,11 @@ def create_container_and_version(
280273
with atomic():
281274
container = create_container(learning_package_id, key, created, created_by)
282275
container_version = create_container_version(
283-
container_pk=container.publishable_entity.pk,
284-
version_num=1,
276+
container.publishable_entity.pk,
277+
1,
285278
title=title,
286279
publishable_entities_pks=publishable_entities_pks,
287280
entity_version_pks=entity_version_pks,
288-
entity=container.publishable_entity,
289281
created=created,
290282
created_by=created_by,
291283
)

openedx_learning/apps/authoring/units/api.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ def create_unit_version(
8282
title=title,
8383
publishable_entities_pks=publishable_entities_pks,
8484
entity_version_pks=entity_version_pks,
85-
entity=unit.container_entity.publishable_entity,
8685
created=created,
8786
created_by=created_by,
8887
)
@@ -131,7 +130,6 @@ def create_next_unit_version(
131130
title=title,
132131
publishable_entities_pks=publishable_entities_pks,
133132
entity_version_pks=entity_version_pks,
134-
entity=unit.container_entity.publishable_entity,
135133
created=created,
136134
created_by=created_by,
137135
)

0 commit comments

Comments
 (0)