@@ -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
144171def 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
191207def 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
254247def 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 )
0 commit comments