ÿØÿà JFIF    ÿÛ „  ( %!1"%)+...383-7(-.+  -%%--------+------------/----------------------------ÿÀ  ¶" ÿÄ     ÿÄ @    !1AQaq‘¡"±ÁÑð2’BRráS‚ñ3b¢CT²Ò #cÿÄ    ÿÄ '   1!AQ2a"‘±#ÿÚ   ? ò(/p‘—–¢·,M|¯G»R£üešT. ôŸEoCFñ‡ 4ÔkåóxR|µÁ¨ÓDà!Ç´µ˜‡p ÍQ‹§!þž^õWsŒy  åÁ§$á«%ºq˜™JyyË0y«^Ϗ -3ÃÏËÈ£Æ\P’ä„s&•‹Üs üô'àWt¹pñCp$bÚF`·7.^)¾!)ÒÙ˜–ÅÏš^h¾ø³·ìe±ŒaeÖ—Í,e=B}Jéߦ$$½—šÙÜCC¯¶è8β–Åkèwx LÉngT±æ¹£Ócœ¿Í/©Éÿ ‰ÚCÒ­mq;Tt¶–}0"zÖPcd1š­¤tˆ„ÐÓâqú[™öUCŠ2޿د­É(¸ßúçšmW,Ò ºf‹Ån™ÄLêÁ8üÁkÁ€L¥ÍuJ1œôrÂSŒÓöt!7EUíïb)AËi¬â-ÙHk8òÁiXYwÅ)O^"ÇØriÛô{»wRUKÙÏÚlÓ¬€‚’שT ] ªb—ÊîKC^×M“xùäñz¬zJ× {4[¹M'IÆeH1LCWÕ]œûº WDæà°OÅ‚¹c²ÞuA–rL`HšpCez‡V’— Ž‚Ë„–ñ­'µR0ÕÖ=À:±G»C\nÆÉ5*¢ †3šhQ4ýÒi$Õ1"Ü]¢p-q3zcQ$ªö¨¥æf›‘»´ÝÚHá„e²JÇ–iÊ:·à¬Øc5Åk»Laª*wi [0Ówk ¦a¦0Õ²ÅÅ‚T¸’³q:Æ<¹ú Ò˜Æ}2VE•Ѐp¡Ô3Úº …h³^LJºçì¥Ánó|˜ÖˆÎˆ+« ¦dø‘Mº–d\ªDðÛ„Ì×LÝ——Ð9Ç|•FèçVm™¨€™3õS–9Äå¢<̉Ìm¢±`·º˜&Z²ž Ë®D«¶»6™‰©­HÈ Àá«h­i³04æ’hxœi3ï¨(ÓL·†‹¶ËpŒ ƒÜÒ? :õdsÀ –3æÓ·Üjâ¬9—]8n¼&]I F£¼…ì–—Œ0v°LǐÅfÛ2TÖ’aµ˜N@ÖBSÏ^à´4-±°b×nÈÈœÆD=KdŒø…ÄÈK,›ÖR§fjü$^ÔÎ!„6^ s:Üun\ôkCÞò÷<—Lúl Í›G¹ÀPá¼Nc¡šÒ…ÙWͳœ±vÊáЄ×9‹P‰cEØ‘™›µŸP<×g1 º©Ø¬wiÁ^l5× I/';Ë+´Z‡ÓÄFÕp[Èð’ HÄ ó 9¬Dl4“é±Ï”V=^Hð;žLädÉa‚°Ë,#/Ž~²BÔÛ QãñQtIeórVB,ÏÂf‹4#Μc‹É3ZIÖ Œ¢¥·üxa‡Ãçè„jŠ[5 Ä!U?,3žÎ×…ðdÓ÷háŠA‰ìÄ4÷ÃÜZÃE{‰®+W\ZÍE[‰»µk»MÝ­`¢©†˜ÃV‹-f¢¡†¢a«eŠ%«Y¨©q%jâd,Ôq`) ¤¦…šˆ ¦E>0Ùb²t–Ÿ  ÷jsςҒKÈcø(é›;k(’#ôŒQ ™C> õ³M9óºÆµ¤çâ;uÀ)5>RÔ¸fÓ~Ȧ—’-$fe«"FâUˆÊwµPÏu w+"åÉó¨6s™Û9(À¨ù©hE°½†n`m~“@©›p!Vkhµ Á1šbEqqÊ@ºèl›2 –Yã%‘‚hÛ{a¶‡ÅÞM²¬çL34®Çl]®‹ŽØŒm'RÜe35æöˆ­Á­ cP9šeÁköo´L³Ì=p8]”‡B¶,šº|ɏdzXˆØk*ÇÚ{#ñ‰pã(€¶‡9ý'šÜ³½¯kƒ†Â’ëSOƒ•Å®H6+a¢µˆ‹Y¨b˜b+XˆÖ!°u!¢"µˆˆn2ˆ Å0Ä`Å Ô®c(ÓÜGº•Ä»Œ âWî%q.áÐÄ÷î%umÍ£+ÜQ,Vn¦-GphU¸¢X­&,Gt ·K¢ÅÅ·¥RÄÊÉbKn N­R2g$VµÕó Qr#–ÓZUÏð0ÎtÙÀœz ëöo“Îk¯n„T°"SÞ+³/…€½"ižãO%Í%&Δâ‘ËØ´IˆÓ°Ë‰ÞM3.™yçÁzit›`4C`k¢¼á!álÄï sÂ[×!¤l¾æo"ƒIÔ'@ªu)3›ô®“@Z à¾] üœ'‡4¸PÞkÁ-qÄH‰ÓÍBd´ÿ —¹°ÄA&ÊUC„öz‚‚RæŠtf¬>˜ÑidšEçÑL÷áý¡V±h§­c¿¥¨ƒ@g¼…Ýö^ÞËc.ž„æ“I[ ª+·zÐÒÚ,½Ð»¶€C›7jk$๖€Ž¾ÅÙpp¶ÍþéΤ ½ØÎŒq ñpæžÅ¥#Øâ49ÃÂK^MYV“,¶Éz_òæ:…;Õ«¦I3âJ£¤û5$7Èxün\â]Êe¯(Ÿ&Ž‹¶2<6Ćf× æ¢ƱqWı[(ÙÂŽç‚T7¨@ÈÉÍß‚ïÙ"&3TYlGށ†)†#5ŠA©^T2ÆÁ†)©†©†¤yGXÁ†©"†)©¼ÅV WS†#©]R–r‹q5ÕbâWþBh¯u+ªÅÄ×ü„nÑ^êkªÁj‰jeœWˆÕÕ`µDµ2Ì+Ä µDµµ5Ô{¤Þ0RF’H÷AÛ<ÊÁ§ ƈæ0Ñ£ê4 öÚµ[¬/1²€â<-¬šö²r×0o×w ´xÐÒË„ g01¬„åEM蛇Ã\6µE›‘fÙO k÷CºnÓ1`iîÒ² áÂ!ÑLÄÿ ³¬\õ*:M=Ç»c‹2[‰ØsÕLò\ŒK L^™üÄN\¶#» Ç\……ßïIœÉ$¸ÎñÍ®ÔHÇ Ûí/´>Li”„†g^$ 7NÍÑÑ2M2ªNg=k½Ð}Ÿl6‡ —JWˆ”ÞéT·+µ¦üÂFè¢Vs6ýÆ4»2+2IÝ9ô9®ÇGÙÇ1+Ä8;*Õ§ž½D*îÑWÚçá3Ma¤·ˆ¥t}š²Ü…Q+Æüµ8HíS”üxGéÁˆ¦Ël„éÈ 5 µÄƒ6äÜ(kIš¯S†fÖ&¸®×v|Äyˆ*禌Éù@7-®Ä[]ÎÖ¿ê`º…=:…žJVnݳvðÖKE¼‚ »mà ÷f®:Ë ™–4rð¡4` ܹçž~‹C=œ…¾Ïj|VDtK.ƒ"9 Ï ­–éXá³6WÒïIL-Ї Ç PK!\p db/access.phpnu[. /** * Defines capabilities for the outcomes report * * @package gradereport_outcomes * @copyright 2007 Petr Skoda * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); $capabilities = array( 'gradereport/outcomes:view' => array( 'riskbitmask' => RISK_PERSONAL, 'captype' => 'read', 'contextlevel' => CONTEXT_COURSE, 'archetypes' => array( 'teacher' => CAP_ALLOW, 'editingteacher' => CAP_ALLOW, 'manager' => CAP_ALLOW ) ) ); PK!\*cvv lang/en/gradereport_outcomes.phpnu[. /** * Strings for component 'gradereport_outcomes', language 'en' * * @package gradereport_outcomes * @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ $string['addoutcome'] = 'Add an outcome'; $string['courseoutcomes'] = 'Course outcomes'; $string['coursespecoutcome'] = 'Course outcomes'; $string['eventgradereportviewed'] = 'Grade outcomes report viewed'; $string['pluginname'] = 'Outcomes report'; $string['privacy:metadata'] = 'The Grade outcomes report only shows data stored in other locations.'; $string['outcomes:view'] = 'View outcomes report'; $string['usedgradeitem'] = 'Number of grade items'; PK!\Fg version.phpnu[. /** * Version details for the outcomes report * * @package gradereport_outcomes * @copyright 1999 onwards Martin Dougiamas (http://dougiamas.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); $plugin->version = 2025041400; // The current plugin version (Date: YYYYMMDDXX). $plugin->requires = 2025040800; // Requires this Moodle version. $plugin->component = 'gradereport_outcomes'; // Full name of the plugin (used for diagnostics) PK!\]"  classes/privacy/provider.phpnu[. /** * Privacy Subsystem implementation for gradereport_outcomes. * * @package gradereport_outcomes * @copyright 2018 Sara Arjona * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace gradereport_outcomes\privacy; defined('MOODLE_INTERNAL') || die(); /** * Privacy Subsystem for gradereport_outcomes implementing null_provider. * * @copyright 2018 Sara Arjona * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class provider implements \core_privacy\local\metadata\null_provider { /** * Get the language string identifier with the component's language * file to explain why this plugin stores no data. * * @return string */ public static function get_reason(): string { return 'privacy:metadata'; } } PK!\Q%classes/event/grade_report_viewed.phpnu[. /** * Outcomes report viewed event. * * @package gradereport_outcomes * @copyright 2014 Adrian Greeve * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace gradereport_outcomes\event; defined('MOODLE_INTERNAL') || die(); /** * Outcomes report viewed event class. * * @package gradereport_outcomes * @since Moodle 2.8 * @copyright 2014 Adrian Greeve * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class grade_report_viewed extends \core\event\grade_report_viewed { /** * Returns localised general event name. * * @return string */ public static function get_name() { return get_string('eventgradereportviewed', 'gradereport_outcomes'); } } PK!\ْU index.phpnu[. /** * The gradebook outcomes report * * @package gradereport_outcomes * @copyright 2007 Nicolas Connault * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ include_once('../../../config.php'); require_once($CFG->libdir . '/gradelib.php'); require_once $CFG->dirroot.'/grade/lib.php'; $courseid = required_param('id', PARAM_INT); // course id $PAGE->set_url('/grade/report/outcomes/index.php', array('id'=>$courseid)); if (!$course = $DB->get_record('course', array('id' => $courseid))) { throw new \moodle_exception('invalidcourseid'); } require_login($course); $context = context_course::instance($course->id); require_capability('gradereport/outcomes:view', $context); if (empty($CFG->enableoutcomes)) { redirect(course_get_url($course), get_string('outcomesdisabled', 'core_grades')); } // First make sure we have proper final grades. $regradetask = \core_course\task\regrade_final_grades::create($courseid); $indicatormessage = get_string('recalculatinggradesadhoc', 'grades'); $indicatorheading = get_string('recalculatinggrades', 'grades'); $taskindicator = new \core\output\task_indicator($regradetask, $indicatorheading, $indicatormessage, $PAGE->url); if (!$taskindicator->has_task_record()) { grade_regrade_final_grades_if_required($course); } // Grab all outcomes used in course. $report_info = array(); $outcomes = grade_outcome::fetch_all_available($courseid); // Will exclude grades of suspended users if required. $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol); $showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol); $showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $context); if ($showonlyactiveenrol) { $suspendedusers = get_suspended_userids($context); } // Get grade_items that use each outcome. foreach ($outcomes as $outcomeid => $outcome) { $report_info[$outcomeid]['items'] = $DB->get_records_select('grade_items', "outcomeid = ? AND courseid = ?", array($outcomeid, $courseid)); $report_info[$outcomeid]['outcome'] = $outcome; // Get average grades for each item. if (is_array($report_info[$outcomeid]['items'])) { foreach ($report_info[$outcomeid]['items'] as $itemid => $item) { $params = array(); $hidesuspendedsql = ''; if ($showonlyactiveenrol && !empty($suspendedusers)) { list($notinusers, $params) = $DB->get_in_or_equal($suspendedusers, SQL_PARAMS_QM, null, false); $hidesuspendedsql = ' AND userid ' . $notinusers; } $params = array_merge(array($itemid), $params); $sql = "SELECT itemid, AVG(finalgrade) AS avg, COUNT(finalgrade) AS count FROM {grade_grades} WHERE itemid = ?". $hidesuspendedsql. " GROUP BY itemid"; $info = $DB->get_records_sql($sql, $params); if (!$info) { unset($report_info[$outcomeid]['items'][$itemid]); continue; } else { $info = reset($info); $avg = round($info->avg, 2); $count = $info->count; } $report_info[$outcomeid]['items'][$itemid]->avg = $avg; $report_info[$outcomeid]['items'][$itemid]->count = $count; } } } print_grade_page_head($courseid, 'report', 'outcomes'); if ($taskindicator->has_task_record()) { echo $OUTPUT->render($taskindicator); echo $OUTPUT->footer(); exit; } $html = '' . "\n"; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= '' . "\n"; $row = 0; foreach ($report_info as $outcomeid => $outcomedata) { $rowspan = count($outcomedata['items']); // If there are no items for this outcome, rowspan will equal 0, which is not good. if ($rowspan == 0) { $rowspan = 1; } $shortname_html = '\n"; $sitewide = get_string('no'); if (empty($outcomedata['outcome']->courseid)) { $sitewide = get_string('yes'); } $sitewide_html = '\n"; $outcomedata['outcome']->sum = 0; $scale = new grade_scale(array('id' => $outcomedata['outcome']->scaleid), false); $print_tr = false; $items_html = ''; if (!empty($outcomedata['items'])) { foreach ($outcomedata['items'] as $itemid => $item) { if ($print_tr) { $row++; $items_html .= "\n"; } $grade_item = new grade_item($item, false); if ($item->itemtype == 'mod') { $cm = get_coursemodule_from_instance($item->itemmodule, $item->iteminstance, $item->courseid); $itemname = ''.format_string($cm->name, true, $cm->course).''; } else { $itemname = $grade_item->get_name(); } $outcomedata['outcome']->sum += $item->avg; $gradehtml = $scale->get_nearest_item($item->avg); $items_html .= "" . "" . "\n"; $print_tr = true; } } else { $items_html .= "\n"; } // Calculate outcome average. if (is_array($outcomedata['items'])) { $count = count($outcomedata['items']); if ($count > 0) { $avg = $outcomedata['outcome']->sum / $count; } else { $avg = $outcomedata['outcome']->sum; } $avg_html = $scale->get_nearest_item($avg) . " (" . round($avg, 2) . ")\n"; } else { $avg_html = ' - '; } $outcomeavg_html = '\n"; $html .= $shortname_html . $outcomeavg_html . $sitewide_html . $items_html; $row++; } $html .= '
' . get_string('outcomeshortname', 'grades') . '' . get_string('courseavg', 'grades') . '' . get_string('sitewide', 'grades') . '' . get_string('activities', 'grades') . '' . get_string('average', 'grades') . '' . get_string('numberofgrades', 'grades') . '
' . $outcomedata['outcome']->shortname . "' . $sitewide . "
$itemname$gradehtml ($item->avg)$item->count
- - 0
' . $avg_html . "
'; echo $html; $event = \gradereport_outcomes\event\grade_report_viewed::create( array( 'context' => $context, 'courseid' => $courseid, ) ); $event->trigger(); echo $OUTPUT->footer(); PK!\p db/access.phpnu[PK!\*cvv 1lang/en/gradereport_outcomes.phpnu[PK!\Fg  version.phpnu[PK!\]"  classes/privacy/provider.phpnu[PK!\Q%Iclasses/event/grade_report_viewed.phpnu[PK!\ْU vindex.phpnu[PK;