@@ -160,6 +160,7 @@ async def update_archive_course(
160160):
161161 """
162162 Update archive's course. Only admins can change archive's course.
163+ Supports both transferring to existing course by ID or creating new course by name and category.
163164 """
164165 if not current_user .is_admin :
165166 raise HTTPException (
@@ -181,16 +182,59 @@ async def update_archive_course(
181182 detail = "Archive not found"
182183 )
183184
184- new_course_query = select (Course ).where (Course .id == course_update .course_id )
185- new_course_result = await db .execute (new_course_query )
186- new_course = new_course_result .scalar_one_or_none ()
185+ # Determine target course
186+ new_course = None
187187
188- if not new_course :
188+ if course_update .course_id :
189+ # Check if trying to transfer to the same course
190+ if course_update .course_id == course_id :
191+ raise HTTPException (
192+ status_code = status .HTTP_400_BAD_REQUEST ,
193+ detail = "Cannot transfer archive to the same course"
194+ )
195+
196+ # Transfer to existing course by ID
197+ new_course_query = select (Course ).where (Course .id == course_update .course_id )
198+ new_course_result = await db .execute (new_course_query )
199+ new_course = new_course_result .scalar_one_or_none ()
200+
201+ if not new_course :
202+ raise HTTPException (
203+ status_code = status .HTTP_404_NOT_FOUND ,
204+ detail = "Target course not found"
205+ )
206+ elif course_update .course_name and course_update .course_category :
207+ # Transfer to course by name and category, create if not exists
208+ new_course_query = select (Course ).where (
209+ Course .name == course_update .course_name ,
210+ Course .category == course_update .course_category
211+ )
212+ new_course_result = await db .execute (new_course_query )
213+ new_course = new_course_result .scalar_one_or_none ()
214+
215+ if new_course :
216+ # Check if trying to transfer to the same course
217+ if new_course .id == course_id :
218+ raise HTTPException (
219+ status_code = status .HTTP_400_BAD_REQUEST ,
220+ detail = "Cannot transfer archive to the same course"
221+ )
222+ else :
223+ # Create new course if it doesn't exist
224+ new_course = Course (
225+ name = course_update .course_name ,
226+ category = course_update .course_category
227+ )
228+ db .add (new_course )
229+ await db .commit ()
230+ await db .refresh (new_course )
231+ else :
189232 raise HTTPException (
190- status_code = status .HTTP_404_NOT_FOUND ,
191- detail = "Target course not found "
233+ status_code = status .HTTP_400_BAD_REQUEST ,
234+ detail = "Either course_id or both course_name and course_category must be provided "
192235 )
193- archive .course_id = course_update .course_id
236+
237+ archive .course_id = new_course .id
194238 archive .updated_at = datetime .now (timezone .utc )
195239
196240 await db .commit ()
@@ -200,7 +244,7 @@ async def update_archive_course(
200244 "message" : f"Archive moved to course '{ new_course .name } '" ,
201245 "archive_id" : archive .id ,
202246 "old_course_id" : course_id ,
203- "new_course_id" : course_update . course_id
247+ "new_course_id" : new_course . id
204248 }
205249
206250@router .delete ("/{course_id}/archives/{archive_id}" )
0 commit comments