@@ -110,44 +110,13 @@ 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 :
116- """
117- [ 🛑 UNSTABLE ]
118- Copy rows from an existing entity list to a new entity list.
119-
120- Args:
121- entity_list: The entity list to copy the rows to.
122- rows: The rows to copy to the new entity list.
123-
124- Returns:
125- The newly created entity list.
126- """
127- entity_list = create_entity_list ()
128- 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- ]
139- )
140-
141- return entity_list
142-
143-
144113def create_container_version (
145114 container_pk : int ,
146115 version_num : int ,
147116 * ,
148117 title : str ,
149118 publishable_entities_pks : list [int ],
150- entity_version_pks : list [int | None ],
119+ entity_version_pks : list [int | None ] | None ,
151120 created : datetime ,
152121 created_by : int | None ,
153122) -> ContainerEntityVersion :
@@ -169,31 +138,45 @@ def create_container_version(
169138 with atomic ():
170139 container = ContainerEntity .objects .select_related ("publishable_entity" ).get (pk = container_pk )
171140 entity = container .publishable_entity
141+
142+ # Do a quick check that the given entities are in the right learning package:
143+ if PublishableEntity .objects .filter (
144+ pk__in = publishable_entities_pks ,
145+ ).exclude (
146+ learning_package_id = entity .learning_package_id ,
147+ ).exists ():
148+ raise ValidationError ("Container entities must be from the same learning package." )
149+
150+ assert title is not None
151+ assert publishable_entities_pks is not None
152+ if entity_version_pks is None :
153+ entity_version_pks = [None ] * len (publishable_entities_pks )
154+ entity_list = create_entity_list_with_rows (
155+ entity_pks = publishable_entities_pks ,
156+ entity_version_pks = entity_version_pks ,
157+ )
172158 publishable_entity_version = publishing_api .create_publishable_entity_version (
173159 entity .pk ,
174160 version_num = version_num ,
175161 title = title ,
176162 created = created ,
177163 created_by = created_by ,
178164 )
179- entity_list = create_entity_list_with_rows (
180- entity_pks = publishable_entities_pks ,
181- entity_version_pks = entity_version_pks ,
182- )
183165 container_version = ContainerEntityVersion .objects .create (
184166 publishable_entity_version = publishable_entity_version ,
185167 container_id = container_pk ,
186168 entity_list = entity_list ,
187169 )
170+
188171 return container_version
189172
190173
191174def create_next_container_version (
192175 container_pk : int ,
193176 * ,
194- title : str ,
195- publishable_entities_pks : list [int ],
196- entity_version_pks : list [int | None ],
177+ title : str | None ,
178+ publishable_entities_pks : list [int ] | None ,
179+ entity_version_pks : list [int | None ] | None ,
197180 created : datetime ,
198181 created_by : int | None ,
199182) -> ContainerEntityVersion :
@@ -210,37 +193,45 @@ def create_next_container_version(
210193
211194 Args:
212195 container_pk: The ID of the container to create the next version of.
213- title: The title of the container.
214- publishable_entities_pks: The IDs of the members current members of the container.
196+ title: The title of the container. None to keep the current title.
197+ publishable_entities_pks: The IDs of the members current members of the container. Or None for no change.
198+ entity_version_pks: The IDs of the versions to pin to, if pinning is desired.
215199 created: The date and time the container version was created.
216200 created_by: The ID of the user who created the container version.
217201
218202 Returns:
219203 The newly created container version.
220204 """
221- # Do a quick check that the given entities are in the right learning package:
222- if PublishableEntity .objects .filter (
223- pk__in = publishable_entities_pks ,
224- ).exclude (
225- learning_package_id = entity .learning_package_id ,
226- ).exists ():
227- raise ValidationError ("Container entities must be from the same learning package." )
228205 with atomic ():
229206 container = ContainerEntity .objects .select_related ("publishable_entity" ).get (pk = container_pk )
230207 entity = container .publishable_entity
231208 last_version = container .versioning .latest
209+ assert last_version is not None
232210 next_version_num = last_version .version_num + 1
211+ if publishable_entities_pks is None :
212+ # We're only changing metadata. Keep the same entity list.
213+ next_entity_list = last_version .entity_list
214+ else :
215+ # Do a quick check that the given entities are in the right learning package:
216+ if PublishableEntity .objects .filter (
217+ pk__in = publishable_entities_pks ,
218+ ).exclude (
219+ learning_package_id = entity .learning_package_id ,
220+ ).exists ():
221+ raise ValidationError ("Container entities must be from the same learning package." )
222+ if entity_version_pks is None :
223+ entity_version_pks = [None ] * len (publishable_entities_pks )
224+ next_entity_list = create_entity_list_with_rows (
225+ entity_pks = publishable_entities_pks ,
226+ entity_version_pks = entity_version_pks ,
227+ )
233228 publishable_entity_version = publishing_api .create_publishable_entity_version (
234229 entity .pk ,
235230 version_num = next_version_num ,
236- title = title ,
231+ title = title if title is not None else last_version . title ,
237232 created = created ,
238233 created_by = created_by ,
239234 )
240- next_entity_list = create_entity_list_with_rows (
241- entity_pks = publishable_entities_pks ,
242- entity_version_pks = entity_version_pks ,
243- )
244235 next_container_version = ContainerEntityVersion .objects .create (
245236 publishable_entity_version = publishable_entity_version ,
246237 container_id = container_pk ,
0 commit comments