From 6186181f65a31fc4f28f6a1be7b7d6cb917d4929 Mon Sep 17 00:00:00 2001 From: Oscar Levin Date: Tue, 18 Aug 2026 14:17:52 -0600 Subject: [PATCH] Add warnings if due dates can't be shifted when importing assignments --- .../admin_server_api/routers/instructor.py | 20 ++++-- .../ImportAssignmentModal.spec.tsx | 1 + .../importAssignment/ImportPreviewPanel.tsx | 6 ++ .../store/assignment/assignment.logic.api.ts | 19 +++++ .../src/types/assignmentSharing.ts | 6 ++ .../routers/instructor.py | 2 + components/rsptx/db/crud/assignment.py | 70 ++++++++++++++----- .../rsptx/db/test_assignment_sharing.py | 36 ++++++++++ 8 files changed, 140 insertions(+), 20 deletions(-) diff --git a/bases/rsptx/admin_server_api/routers/instructor.py b/bases/rsptx/admin_server_api/routers/instructor.py index 49ae9050c..ab0fb89b3 100644 --- a/bases/rsptx/admin_server_api/routers/instructor.py +++ b/bases/rsptx/admin_server_api/routers/instructor.py @@ -1206,15 +1206,18 @@ async def copy_assignment( target_course=course, importing_user=user, ) + message = f'Copied as "{result.name}". It is hidden until you make it visible.' + if result.duedate_warning: + message += f" {result.duedate_warning}" return JSONResponse( content={ "success": True, - "message": f'Copied as "{result.name}". It is hidden until you ' - f"make it visible.", + "message": message, "imported": [result.name], "skipped_existing": [], "skipped_readings": result.skipped_readings, "failed": [], + "duedate_warning": result.duedate_warning, } ) @@ -1237,16 +1240,25 @@ async def copy_assignment( parts.append(f"{len(bulk.failed)} could not be copied") if bulk.skipped_readings: parts.append(f"{bulk.skipped_readings} readings left behind") + if bulk.duedate_not_shifted: + parts.append(f"{bulk.duedate_not_shifted} due dates not adjusted") + + message = ", ".join(parts) + ". Copies are hidden until you make them visible." + if bulk.duedate_not_shifted: + message += ( + " Some due dates could not be adjusted because a course timezone " + "setting is invalid -- update it in Course Settings." + ) return JSONResponse( content={ "success": True, - "message": ", ".join(parts) - + ". Copies are hidden until you make them visible.", + "message": message, "imported": bulk.imported, "skipped_existing": bulk.skipped_existing, "skipped_readings": bulk.skipped_readings, "failed": bulk.failed, + "duedate_not_shifted": bulk.duedate_not_shifted, } ) diff --git a/bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/importAssignment/ImportAssignmentModal.spec.tsx b/bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/importAssignment/ImportAssignmentModal.spec.tsx index 1f428796c..72c34b14b 100644 --- a/bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/importAssignment/ImportAssignmentModal.spec.tsx +++ b/bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/importAssignment/ImportAssignmentModal.spec.tsx @@ -101,6 +101,7 @@ const { already_imported: false, imported_as: null, skipped_readings: 0, + duedate_warning: null, questions: [ { id: 11, diff --git a/bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/importAssignment/ImportPreviewPanel.tsx b/bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/importAssignment/ImportPreviewPanel.tsx index 59596ffa0..e000d4c5f 100644 --- a/bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/importAssignment/ImportPreviewPanel.tsx +++ b/bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/importAssignment/ImportPreviewPanel.tsx @@ -68,6 +68,12 @@ export const ImportPreviewPanel = ({ assignmentId, onClose }: ImportPreviewPanel ) : null} + {preview.duedate_warning ? ( + + {preview.duedate_warning} + + ) : null} + {preview.skipped_readings > 0 ? (