From 4b70c0c5390d93a03a2873171cffee1328916aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Jacquet?= Date: Sat, 17 Feb 2024 18:15:02 +0100 Subject: [PATCH] Fix SQL Get all assignment types having assignments for this course period Needed since we are now updating types owner (STAFF_ID) on course period teacher change. As a teacher may have various course periods for the same course, and thus shared types, then, he would loose access to his types (and assignments) when one of those course periods' teacher is changed. To prevent this edge case, when getting types, we check if 1. STAFF_ID is current teacher (owner) 2. Or, if type has assignments for this course period and teacher (old owner) --- CHANGES.md | 1 + modules/Grades/Assignments.php | 61 +++++++++++---------- modules/Grades/GradebookBreakdown.php | 19 ++++--- modules/Grades/Grades.php | 24 ++++---- modules/Scheduling/includes/Courses.fnc.php | 37 +++++++++---- 5 files changed, 85 insertions(+), 57 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f66173eeb..a9245bf09 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ Changes in 11.4.3 ----------------- - Fix SQL update gradebook_assignment_types only for old teacher's assignments in Courses.fnc.php +- Fix SQL Get all assignment types having assignments for this course period in GradebookBreakdown.php, Assignments.php, Grades.php & Courses.fnc.php Changes in 11.4.2 ----------------- diff --git a/modules/Grades/Assignments.php b/modules/Grades/Assignments.php index 2c2368eeb..7880de3db 100644 --- a/modules/Grades/Assignments.php +++ b/modules/Grades/Assignments.php @@ -478,9 +478,7 @@ { $assignment_type_sql = "SELECT ASSIGNMENT_TYPE_ID FROM gradebook_assignment_types - WHERE COURSE_ID=(SELECT COURSE_ID - FROM course_periods - WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "') + WHERE COURSE_ID='" . (int) $course_id . "' AND ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['assignment_type_id'] . "'" . $hide_previous_assignment_types_sql; @@ -499,9 +497,7 @@ // SQL Check requested assignment belongs to teacher and current Marking Period. $assignment_RET = DBGet( "SELECT ASSIGNMENT_TYPE_ID,MARKING_PERIOD_ID FROM gradebook_assignments - WHERE (COURSE_ID=(SELECT COURSE_ID - FROM course_periods - WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "') + WHERE (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') AND ASSIGNMENT_ID='" . (int) $_REQUEST['assignment_id'] . "' AND STAFF_ID='" . User( 'STAFF_ID' ) . "' @@ -521,12 +517,15 @@ } // ASSIGNMENT TYPES. + // Fix SQL Get all assignment types having assignments for this course period $assignment_types_sql = "SELECT ASSIGNMENT_TYPE_ID,TITLE,SORT_ORDER - FROM gradebook_assignment_types - WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' - AND COURSE_ID=(SELECT COURSE_ID - FROM course_periods - WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "')" . + FROM gradebook_assignment_types gt + WHERE (STAFF_ID='" . User( 'STAFF_ID' ) . "' + OR EXISTS(SELECT 1 FROM gradebook_assignments + WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' + AND (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') + AND ASSIGNMENT_TYPE_ID=gt.ASSIGNMENT_TYPE_ID)) + AND COURSE_ID='" . (int) $course_id . "'" . $hide_previous_assignment_types_sql . " ORDER BY SORT_ORDER IS NULL,SORT_ORDER,TITLE"; @@ -586,17 +585,20 @@ && $_REQUEST['assignment_type_id'] !== 'new' && $_REQUEST['assignment_id'] !== 'new' ) { - $assignment_type_sql = "SELECT at.TITLE,at.FINAL_GRADE_PERCENT,SORT_ORDER,COLOR, + // Fix SQL Get all assignment types having assignments for this course period + $assignment_type_sql = "SELECT gt.TITLE,gt.FINAL_GRADE_PERCENT,SORT_ORDER,COLOR, (SELECT sum(FINAL_GRADE_PERCENT) - FROM gradebook_assignment_types - WHERE COURSE_ID=(SELECT COURSE_ID - FROM course_periods - WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "') - AND STAFF_ID='" . User( 'STAFF_ID' ) . "'" . - $hide_previous_assignment_types_sql . + FROM gradebook_assignment_types gt2 + WHERE (STAFF_ID='" . User( 'STAFF_ID' ) . "' + OR EXISTS(SELECT 1 FROM gradebook_assignments + WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' + AND (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') + AND ASSIGNMENT_TYPE_ID=gt2.ASSIGNMENT_TYPE_ID)) + AND COURSE_ID='" . (int) $course_id . "'" . + $hide_previous_assignment_types_sql . ") AS TOTAL_PERCENT - FROM gradebook_assignment_types at - WHERE at.ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['assignment_type_id'] . "'"; + FROM gradebook_assignment_types gt + WHERE gt.ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['assignment_type_id'] . "'"; $RET = DBGet( $assignment_type_sql, [ 'FINAL_GRADE_PERCENT' => '_makePercent' ] ); @@ -610,14 +612,14 @@ $assignment_type_has_assignments = DBGetOne( "SELECT 1 FROM gradebook_assignments WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' - AND (COURSE_ID=(SELECT COURSE_ID FROM course_periods WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "') OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') + AND (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') AND ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['assignment_type_id'] . "' AND MARKING_PERIOD_ID='" . UserMP() . "'" ); $assignment_type_assignments_warn_all_0_points = ! DBGetOne( "SELECT 1 FROM gradebook_assignments WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' - AND (COURSE_ID=(SELECT COURSE_ID FROM course_periods WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "') OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') + AND (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') AND ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['assignment_type_id'] . "' AND POINTS<>'0' AND MARKING_PERIOD_ID='" . UserMP() . "'" ); @@ -645,12 +647,15 @@ } elseif ( $_REQUEST['assignment_type_id'] == 'new' ) { + // Fix SQL Get all assignment types having assignments for this course period $assignment_type_sql = "SELECT sum(FINAL_GRADE_PERCENT) AS TOTAL_PERCENT - FROM gradebook_assignment_types - WHERE COURSE_ID=(SELECT COURSE_ID - FROM course_periods - WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "') - AND STAFF_ID='" . User( 'STAFF_ID' ) . "'" . + FROM gradebook_assignment_types gt + WHERE (STAFF_ID='" . User( 'STAFF_ID' ) . "' + OR EXISTS(SELECT 1 FROM gradebook_assignments + WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' + AND (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') + AND ASSIGNMENT_TYPE_ID=gt.ASSIGNMENT_TYPE_ID)) + AND COURSE_ID='" . (int) $course_id . "'" . $hide_previous_assignment_types_sql; $RET = DBGet( $assignment_type_sql, [ 'FINAL_GRADE_PERCENT' => '_makePercent' ] ); @@ -1007,7 +1012,7 @@ $assn_RET = DBGet( "SELECT ASSIGNMENT_ID,TITLE,POINTS FROM gradebook_assignments WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' - AND (COURSE_ID=(SELECT COURSE_ID FROM course_periods WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "') OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') + AND (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') AND ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['assignment_type_id'] . "' AND MARKING_PERIOD_ID='" . UserMP() . "' ORDER BY " . DBEscapeIdentifier( Preferences( 'ASSIGNMENT_SORTING', 'Gradebook' ) ) . " DESC", diff --git a/modules/Grades/GradebookBreakdown.php b/modules/Grades/GradebookBreakdown.php index 84420e975..19e7d54c1 100644 --- a/modules/Grades/GradebookBreakdown.php +++ b/modules/Grades/GradebookBreakdown.php @@ -60,19 +60,22 @@ $grades[] = [ 'TITLE' => $grade['TITLE'], 'GPA_VALUE' => $grade['GPA_VALUE'] ]; } -$sql = "SELECT ASSIGNMENT_TYPE_ID,TITLE - FROM gradebook_assignment_types - WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' +// Fix SQL Get all assignment types having assignments for this course period +$types_RET = DBGet( "SELECT ASSIGNMENT_TYPE_ID,TITLE + FROM gradebook_assignment_types gt + WHERE (STAFF_ID='" . User( 'STAFF_ID' ) . "' + OR EXISTS(SELECT 1 FROM gradebook_assignments + WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' + AND (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') + AND ASSIGNMENT_TYPE_ID=gt.ASSIGNMENT_TYPE_ID + AND MARKING_PERIOD_ID='" . UserMP() . "')) AND COURSE_ID='" . (int) $course_id . "' - ORDER BY TITLE"; - -$types_RET = DBGet( $sql ); + ORDER BY TITLE" ); $assignments_RET = DBGet( "SELECT ASSIGNMENT_ID,TITLE,POINTS FROM gradebook_assignments WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' - AND ((COURSE_ID='" . (int) $course_id . "' - AND STAFF_ID='" . User( 'STAFF_ID' ) . "') OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') + AND (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') AND MARKING_PERIOD_ID='" . UserMP() . "' ORDER BY " . DBEscapeIdentifier( Preferences( 'ASSIGNMENT_SORTING', 'Gradebook' ) ) . " DESC" ); diff --git a/modules/Grades/Grades.php b/modules/Grades/Grades.php index 48320980b..0213c8a1c 100644 --- a/modules/Grades/Grades.php +++ b/modules/Grades/Grades.php @@ -40,6 +40,10 @@ $_ROSARIO['allow_edit'] = true; } +$course_id = DBGetOne( "SELECT COURSE_ID + FROM course_periods + WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "'" ); + $gradebook_config = ProgramUserConfig( 'Gradebook' ); //$max_allowed = Preferences('ANOMALOUS_MAX','Gradebook')/100; @@ -59,14 +63,16 @@ unset( $_SESSION['student_id'] ); } +// Fix SQL get all assignment types having assignments for this course period $types_RET = DBGet( "SELECT ASSIGNMENT_TYPE_ID,TITLE,FINAL_GRADE_PERCENT,COLOR FROM gradebook_assignment_types gt -WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' -AND COURSE_ID=(SELECT COURSE_ID FROM course_periods WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "') -AND (SELECT count(1) FROM gradebook_assignments WHERE STAFF_ID=gt.STAFF_ID -AND ((COURSE_ID=gt.COURSE_ID AND STAFF_ID=gt.STAFF_ID) OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') -AND MARKING_PERIOD_ID='" . UserMP() . "' -AND ASSIGNMENT_TYPE_ID=gt.ASSIGNMENT_TYPE_ID)>0 +WHERE (STAFF_ID='" . User( 'STAFF_ID' ) . "' + OR EXISTS(SELECT 1 FROM gradebook_assignments + WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "' + AND (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "') + AND ASSIGNMENT_TYPE_ID=gt.ASSIGNMENT_TYPE_ID + AND MARKING_PERIOD_ID='" . UserMP() . "')) +AND COURSE_ID='" . (int) $course_id . "' ORDER BY SORT_ORDER IS NULL,SORT_ORDER,TITLE", [ 'TITLE' => '_makeTitle' ], [ 'ASSIGNMENT_TYPE_ID' ] ); //echo '
'; var_dump($types_RET); echo '
'; @@ -85,11 +91,7 @@ THEN 'Y' ELSE NULL END AS DUE FROM gradebook_assignments ga,gradebook_assignment_types gat WHERE ga.STAFF_ID='" . User( 'STAFF_ID' ) . "' -AND ((ga.COURSE_ID=(SELECT cp.COURSE_ID - FROM course_periods cp - WHERE cp.COURSE_PERIOD_ID='" . UserCoursePeriod() . "') - AND ga.STAFF_ID='" . User( 'STAFF_ID' ) . "') - OR ga.COURSE_PERIOD_ID='" . UserCoursePeriod() . "') +AND (ga.COURSE_ID='" . (int) $course_id . "' OR ga.COURSE_PERIOD_ID='" . UserCoursePeriod() . "') AND ga.MARKING_PERIOD_ID='" . UserMP() . "'" . ( $_REQUEST['type_id'] ? " AND ga.ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['type_id'] . "'" : '' ) . " AND gat.ASSIGNMENT_TYPE_ID=ga.ASSIGNMENT_TYPE_ID diff --git a/modules/Scheduling/includes/Courses.fnc.php b/modules/Scheduling/includes/Courses.fnc.php index eaca44605..be2a8cb52 100644 --- a/modules/Scheduling/includes/Courses.fnc.php +++ b/modules/Scheduling/includes/Courses.fnc.php @@ -709,16 +709,6 @@ function CoursePeriodUpdateTeacher( $cp_id, $old_teacher_id, $new_teacher_id ) [ 'STAFF_ID' => (int) $old_teacher_id, 'COURSE_PERIOD_ID' => (int) $cp_id ] ); - // Update gradebook_assignment_types. - // Fix SQL update gradebook_assignment_types only for old teacher's assignments - DBQuery( "UPDATE gradebook_assignment_types - SET STAFF_ID='" . (int) $new_teacher_id . "' - WHERE STAFF_ID='" . (int) $old_teacher_id . "' - AND ASSIGNMENT_TYPE_ID IN(SELECT ASSIGNMENT_TYPE_ID - FROM gradebook_assignments - WHERE STAFF_ID='" . (int) $old_teacher_id . "' - AND COURSE_PERIOD_ID='" . (int) $cp_id . "')" ); - // Update gradebook_assignments. DBUpdate( 'gradebook_assignments', @@ -726,6 +716,33 @@ function CoursePeriodUpdateTeacher( $cp_id, $old_teacher_id, $new_teacher_id ) [ 'STAFF_ID' => (int) $old_teacher_id, 'COURSE_PERIOD_ID' => (int) $cp_id ] ); + $course_id = DBGetOne( "SELECT COURSE_ID + FROM course_periods + WHERE COURSE_PERIOD_ID='" . (int) $cp_id . "'" ); + + // Update shared assignments if old teacher has no more course periods in this course + DBQuery( "UPDATE gradebook_assignments + SET STAFF_ID='" . (int) $new_teacher_id . "' + WHERE STAFF_ID='" . (int) $old_teacher_id . "' + AND COURSE_ID='" . (int) $course_id . "' + AND NOT EXISTS(SELECT 1 FROM course_periods + WHERE COURSE_ID='" . (int) $course_id . "' + AND TEACHER_ID='" . (int) $old_teacher_id . "')" ); + + // Update gradebook_assignment_types. + // Only if has assignments or if old teacher has no more course periods in this course + DBQuery( "UPDATE gradebook_assignment_types + SET STAFF_ID='" . (int) $new_teacher_id . "' + WHERE STAFF_ID='" . (int) $old_teacher_id . "' + AND COURSE_ID='" . (int) $course_id . "' + AND (ASSIGNMENT_TYPE_ID IN(SELECT ASSIGNMENT_TYPE_ID + FROM gradebook_assignments + WHERE STAFF_ID='" . (int) $new_teacher_id . "' + AND (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . (int) $cp_id . "')) + OR NOT EXISTS(SELECT 1 FROM course_periods + WHERE COURSE_ID='" . (int) $course_id . "' + AND TEACHER_ID='" . (int) $old_teacher_id . "'))" ); + return true; }