From e511ac805aa9a661ddfcfbc088c10f289be0f5cf Mon Sep 17 00:00:00 2001 From: Owen Herbert Date: Tue, 14 Apr 2026 15:13:10 +1000 Subject: [PATCH 1/4] Add observee visibility --- session.php | 27 +++++++++++++++++++++++++++ sessionsummary.php | 27 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/session.php b/session.php index 587c50b..095bdb8 100644 --- a/session.php +++ b/session.php @@ -187,6 +187,33 @@ echo $OUTPUT->header(); echo $OUTPUT->heading(get_string('markingobservation', 'observation'), 2); +// Display the learner (observee) being observed. +$observee = \core_user::get_user($sessiondata['observee'], '*', MUST_EXIST); + +// Determine which identity fields the current user (grader) is permitted to see. +$identityfields = \core_user\fields::get_identity_fields($PAGE->context, false); + +// fullname() respects $CFG->fullnamedisplay / $CFG->alternativefullnameformat. +$canviewfullnames = has_capability('moodle/site:viewfullnames', $PAGE->context); + +echo $OUTPUT->container_start('my-2'); +echo $OUTPUT->heading(get_string('observee', 'observation') . ': ' . fullname($observee, $canviewfullnames), 5); + +// Build secondary details line - only include fields the admin has enabled and the +// current user is permitted to view. +$observeedetails = []; +if (in_array('email', $identityfields) && !empty($observee->email)) { + $observeedetails[] = get_string('email') . ': ' . + html_writer::tag('a', $observee->email, ['href' => 'mailto:' . $observee->email]); +} +if (in_array('username', $identityfields) && !empty($observee->username)) { + $observeedetails[] = get_string('username') . ': ' . s($observee->username); +} +if (!empty($observeedetails)) { + echo html_writer::tag('p', implode('  |  ', $observeedetails), ['class' => 'text-muted mb-0']); +} +echo $OUTPUT->container_end(); + if ($markingform->no_submit_button_pressed()) { $fromform = $markingform->get_submitted_data(); diff --git a/sessionsummary.php b/sessionsummary.php index 1af9a89..00bc94b 100644 --- a/sessionsummary.php +++ b/sessionsummary.php @@ -103,6 +103,33 @@ echo $OUTPUT->heading(get_string('sessionsummary', 'observation'), 2); +// Display the learner (observee) being observed. +$observee = \core_user::get_user($sessioninfo['observee'], '*', MUST_EXIST); + +// Determine which identity fields the current user (grader) is permitted to see. +$identityfields = \core_user\fields::get_identity_fields($PAGE->context, false); + +// fullname() respects $CFG->fullnamedisplay / $CFG->alternativefullnameformat. +$canviewfullnames = has_capability('moodle/site:viewfullnames', $PAGE->context); + +echo $OUTPUT->container_start('my-2'); +echo $OUTPUT->heading(get_string('observee', 'observation') . ': ' . fullname($observee, $canviewfullnames), 5); + +// Build secondary details line - only include fields the admin has enabled and the +// current user is permitted to view. +$observeedetails = []; +if (in_array('email', $identityfields) && !empty($observee->email)) { + $observeedetails[] = get_string('email') . ': ' . + html_writer::tag('a', $observee->email, ['href' => 'mailto:' . $observee->email]); +} +if (in_array('username', $identityfields) && !empty($observee->username)) { + $observeedetails[] = get_string('username') . ': ' . s($observee->username); +} +if (!empty($observeedetails)) { + echo html_writer::tag('p', implode('  |  ', $observeedetails), ['class' => 'text-muted mb-0']); +} +echo $OUTPUT->container_end(); + // Summary of points and responses. echo \mod_observation\observation_manager::format_points_and_responses($obid, $sessionid); From 04c77adb8f39058218f5a7e7606d1a71ac0f88ec Mon Sep 17 00:00:00 2001 From: Owen Herbert Date: Wed, 15 Apr 2026 07:33:52 +1000 Subject: [PATCH 2/4] Move rendering to observation_manager.php --- classes/observation_manager.php | 38 +++++++++++++++++++++++++++++++++ session.php | 26 +--------------------- sessionsummary.php | 26 +--------------------- 3 files changed, 40 insertions(+), 50 deletions(-) diff --git a/classes/observation_manager.php b/classes/observation_manager.php index ce453ce..c26de0e 100644 --- a/classes/observation_manager.php +++ b/classes/observation_manager.php @@ -383,6 +383,44 @@ public static function submit_point_response(int $sessionid, int $pointid, $data } } + /** + * Renders a labelled info box showing the observee's details to the grader. + * @param int $observeeid ID of the observee being observed in this session + * @param context $context context to check permissions against for which fields to show + * @return string HTML string + */ + public static function render_observee_details(int $observeeid, \context $context) { + global $OUTPUT; + + // Display the learner (observee) being observed. + $observee = \core_user::get_user($observeeid, '*', MUST_EXIST); + + // Determine which identity fields the current user (grader) is permitted to see. + $identityfields = \core_user\fields::get_identity_fields($context, false); + + // fullname() respects $CFG->fullnamedisplay / $CFG->alternativefullnameformat. + $canviewfullnames = has_capability('moodle/site:viewfullnames', $context); + + $out = $OUTPUT->container_start('my-2'); + $out .= $OUTPUT->heading(get_string('observee', 'observation') . ': ' . fullname($observee, $canviewfullnames), 5); + + // Build secondary details line - only include fields the admin has enabled and the + // current user is permitted to view. + $observeedetails = []; + if (in_array('email', $identityfields) && !empty($observee->email)) { + $observeedetails[] = get_string('email') . ': ' . + \html_writer::tag('a', $observee->email, ['href' => 'mailto:' . $observee->email]); + } + if (in_array('username', $identityfields) && !empty($observee->username)) { + $observeedetails[] = get_string('username') . ': ' . s($observee->username); + } + if (!empty($observeedetails)) { + $out .= \html_writer::tag('p', implode('  |  ', $observeedetails), ['class' => 'text-muted mb-0']); + } + $out .= $OUTPUT->container_end(); + return $out; + } + /** * Generates a HTML table that summarises the observation points and their responses * @param int $observationid ID of the observation instance diff --git a/session.php b/session.php index 095bdb8..7fd5076 100644 --- a/session.php +++ b/session.php @@ -188,31 +188,7 @@ echo $OUTPUT->heading(get_string('markingobservation', 'observation'), 2); // Display the learner (observee) being observed. -$observee = \core_user::get_user($sessiondata['observee'], '*', MUST_EXIST); - -// Determine which identity fields the current user (grader) is permitted to see. -$identityfields = \core_user\fields::get_identity_fields($PAGE->context, false); - -// fullname() respects $CFG->fullnamedisplay / $CFG->alternativefullnameformat. -$canviewfullnames = has_capability('moodle/site:viewfullnames', $PAGE->context); - -echo $OUTPUT->container_start('my-2'); -echo $OUTPUT->heading(get_string('observee', 'observation') . ': ' . fullname($observee, $canviewfullnames), 5); - -// Build secondary details line - only include fields the admin has enabled and the -// current user is permitted to view. -$observeedetails = []; -if (in_array('email', $identityfields) && !empty($observee->email)) { - $observeedetails[] = get_string('email') . ': ' . - html_writer::tag('a', $observee->email, ['href' => 'mailto:' . $observee->email]); -} -if (in_array('username', $identityfields) && !empty($observee->username)) { - $observeedetails[] = get_string('username') . ': ' . s($observee->username); -} -if (!empty($observeedetails)) { - echo html_writer::tag('p', implode('  |  ', $observeedetails), ['class' => 'text-muted mb-0']); -} -echo $OUTPUT->container_end(); +echo \mod_observation\observation_manager::render_observee_details($sessiondata['observee'], $PAGE->context); if ($markingform->no_submit_button_pressed()) { $fromform = $markingform->get_submitted_data(); diff --git a/sessionsummary.php b/sessionsummary.php index 00bc94b..e918faf 100644 --- a/sessionsummary.php +++ b/sessionsummary.php @@ -104,31 +104,7 @@ echo $OUTPUT->heading(get_string('sessionsummary', 'observation'), 2); // Display the learner (observee) being observed. -$observee = \core_user::get_user($sessioninfo['observee'], '*', MUST_EXIST); - -// Determine which identity fields the current user (grader) is permitted to see. -$identityfields = \core_user\fields::get_identity_fields($PAGE->context, false); - -// fullname() respects $CFG->fullnamedisplay / $CFG->alternativefullnameformat. -$canviewfullnames = has_capability('moodle/site:viewfullnames', $PAGE->context); - -echo $OUTPUT->container_start('my-2'); -echo $OUTPUT->heading(get_string('observee', 'observation') . ': ' . fullname($observee, $canviewfullnames), 5); - -// Build secondary details line - only include fields the admin has enabled and the -// current user is permitted to view. -$observeedetails = []; -if (in_array('email', $identityfields) && !empty($observee->email)) { - $observeedetails[] = get_string('email') . ': ' . - html_writer::tag('a', $observee->email, ['href' => 'mailto:' . $observee->email]); -} -if (in_array('username', $identityfields) && !empty($observee->username)) { - $observeedetails[] = get_string('username') . ': ' . s($observee->username); -} -if (!empty($observeedetails)) { - echo html_writer::tag('p', implode('  |  ', $observeedetails), ['class' => 'text-muted mb-0']); -} -echo $OUTPUT->container_end(); +echo \mod_observation\observation_manager::render_observee_details($sessioninfo['observee'], $PAGE->context); // Summary of points and responses. echo \mod_observation\observation_manager::format_points_and_responses($obid, $sessionid); From 79f9222e007125c26f276636051ffabc0bcd35c5 Mon Sep 17 00:00:00 2001 From: Owen Herbert Date: Mon, 20 Apr 2026 14:02:00 +1000 Subject: [PATCH 3/4] Fix codechecker --- classes/observation_manager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/observation_manager.php b/classes/observation_manager.php index c26de0e..a4cc2ed 100644 --- a/classes/observation_manager.php +++ b/classes/observation_manager.php @@ -398,7 +398,7 @@ public static function render_observee_details(int $observeeid, \context $contex // Determine which identity fields the current user (grader) is permitted to see. $identityfields = \core_user\fields::get_identity_fields($context, false); - // fullname() respects $CFG->fullnamedisplay / $CFG->alternativefullnameformat. + // Variable fullname() respects $CFG->fullnamedisplay / $CFG->alternativefullnameformat. $canviewfullnames = has_capability('moodle/site:viewfullnames', $context); $out = $OUTPUT->container_start('my-2'); From 45ca0bd154302547a6212b6804df19183ec6f3cb Mon Sep 17 00:00:00 2001 From: Owen Herbert Date: Mon, 20 Apr 2026 14:02:57 +1000 Subject: [PATCH 4/4] Fix codechecker --- classes/observation_manager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/observation_manager.php b/classes/observation_manager.php index a4cc2ed..682c362 100644 --- a/classes/observation_manager.php +++ b/classes/observation_manager.php @@ -405,7 +405,7 @@ public static function render_observee_details(int $observeeid, \context $contex $out .= $OUTPUT->heading(get_string('observee', 'observation') . ': ' . fullname($observee, $canviewfullnames), 5); // Build secondary details line - only include fields the admin has enabled and the - // current user is permitted to view. + // Current user is permitted to view. $observeedetails = []; if (in_array('email', $identityfields) && !empty($observee->email)) { $observeedetails[] = get_string('email') . ': ' .