Skip to content

Commit

Permalink
Fix SQL Get all assignment types having assignments for this course p…
Browse files Browse the repository at this point in the history
…eriod

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)
  • Loading branch information
francoisjacquet committed Feb 17, 2024
1 parent a920198 commit 4b70c0c
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 57 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
-----------------
Expand Down
61 changes: 33 additions & 28 deletions modules/Grades/Assignments.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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' ) . "'
Expand All @@ -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";

Expand Down Expand Up @@ -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' ] );

Expand All @@ -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() . "'" );
Expand Down Expand Up @@ -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' ] );
Expand Down Expand Up @@ -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",
Expand Down
19 changes: 11 additions & 8 deletions modules/Grades/GradebookBreakdown.php
Original file line number Diff line number Diff line change
Expand Up @@ -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" );

Expand Down
24 changes: 13 additions & 11 deletions modules/Grades/Grades.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 '<pre>'; var_dump($types_RET); echo '</pre>';

Expand All @@ -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
Expand Down
37 changes: 27 additions & 10 deletions modules/Scheduling/includes/Courses.fnc.php
Original file line number Diff line number Diff line change
Expand Up @@ -709,23 +709,40 @@ 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',
[ 'STAFF_ID' => (int) $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;
}

Expand Down

0 comments on commit 4b70c0c

Please sign in to comment.