ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ.. /** * Library of functions and constants for notes * * @package core_notes * @copyright 2007 onwards Yu Zhang * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ /** * Constants for states. */ define('NOTES_STATE_DRAFT', 'draft'); define('NOTES_STATE_PUBLIC', 'public'); define('NOTES_STATE_SITE', 'site'); /** * Constants for note parts (flags used by note_print and note_print_list). */ define('NOTES_SHOW_FULL', 0x07); define('NOTES_SHOW_HEAD', 0x02); define('NOTES_SHOW_BODY', 0x01); define('NOTES_SHOW_FOOT', 0x04); /** * Retrieves a list of note objects with specific atributes. * * @param int $courseid id of the course in which the notes were posted (0 means any) * @param int $userid id of the user to which the notes refer (0 means any) * @param string $state state of the notes (i.e. draft, public, site) ('' means any) * @param int $author id of the user who modified the note last time (0 means any) * @param string $order an order to sort the results in * @param int $limitfrom number of records to skip (offset) * @param int $limitnum number of records to fetch * @return array of note objects */ function note_list($courseid=0, $userid=0, $state = '', $author = 0, $order='lastmodified DESC', $limitfrom=0, $limitnum=0) { global $DB; // Setup filters. $selects = array(); $params = array(); if ($courseid) { $selects[] = 'courseid=?'; $params[] = $courseid; } if ($userid) { $selects[] = 'userid=?'; $params[] = $userid; } if ($author) { $selects[] = 'usermodified=?'; $params[] = $author; } if ($state) { $selects[] = 'publishstate=?'; $params[] = $state; } $selects[] = "module=?"; $params[] = 'notes'; $select = implode(' AND ', $selects); $fields = 'id,courseid,userid,content,format,created,lastmodified,usermodified,publishstate'; return $DB->get_records_select('post', $select, $params, $order, $fields, $limitfrom, $limitnum); } /** * Retrieves a note object based on its id. * * @param int $noteid ID of the note to retrieve * @return stdClass object */ function note_load($noteid) { global $DB; $fields = 'id,courseid,userid,content,format,created,lastmodified,usermodified,publishstate'; return $DB->get_record('post', array('id' => $noteid, 'module' => 'notes'), $fields); } /** * Saves a note object. The note object is passed by reference and its fields (i.e. id) * might change during the save. * * @param stdClass $note object to save * @return boolean true if the object was saved; false otherwise */ function note_save(&$note) { global $USER, $DB; // Setup & clean fields. $note->module = 'notes'; $note->lastmodified = time(); $note->usermodified = $USER->id; if (empty($note->format)) { $note->format = FORMAT_PLAIN; } if (empty($note->publishstate)) { $note->publishstate = NOTES_STATE_PUBLIC; } if (empty(trim($note->content))) { // Don't save empty notes. return false; } // Save data. if (empty($note->id)) { // Insert new note. $note->created = $note->lastmodified; $id = $DB->insert_record('post', $note); $note = note_load($id); // Trigger event. $event = \core\event\note_created::create(array( 'objectid' => $note->id, 'courseid' => $note->courseid, 'relateduserid' => $note->userid, 'userid' => $note->usermodified, 'context' => context_course::instance($note->courseid), 'other' => array('publishstate' => $note->publishstate) )); $event->trigger(); } else { // Update old note. $DB->update_record('post', $note); $note = note_load($note->id); // Trigger event. $event = \core\event\note_updated::create(array( 'objectid' => $note->id, 'courseid' => $note->courseid, 'relateduserid' => $note->userid, 'userid' => $note->usermodified, 'context' => context_course::instance($note->courseid), 'other' => array('publishstate' => $note->publishstate) )); $event->trigger(); } unset($note->module); return true; } /** * Deletes a note object based on its id. * * @param int|object $note id of the note to delete, or a note object which is to be deleted. * @return boolean true always */ function note_delete($note) { global $DB; if (is_int($note)) { $noteid = $note; } else { $noteid = $note->id; } // Get the full record, note_load doesn't return everything. $note = $DB->get_record('post', array('id' => $noteid), '*', MUST_EXIST); $return = $DB->delete_records('post', array('id' => $note->id, 'module' => 'notes')); // Trigger event. $event = \core\event\note_deleted::create(array( 'objectid' => $note->id, 'courseid' => $note->courseid, 'relateduserid' => $note->userid, 'userid' => $note->usermodified, 'context' => context_course::instance($note->courseid), 'other' => array('publishstate' => $note->publishstate) )); $event->add_record_snapshot('post', $note); $event->trigger(); return $return; } /** * Converts a state value to its corespondent name * * @param string $state state value to convert * @return string corespondent state name */ function note_get_state_name($state) { // Cache state names. static $states; if (empty($states)) { $states = note_get_state_names(); } if (isset($states[$state])) { return $states[$state]; } else { return null; } } /** * Returns an array of mappings from state values to state names * * @return array of mappings */ function note_get_state_names() { return array( NOTES_STATE_DRAFT => get_string('personal', 'notes'), NOTES_STATE_PUBLIC => get_string('course', 'notes'), NOTES_STATE_SITE => get_string('site', 'notes'), ); } /** * Prints a note object * * @param note $note the note object to print * @param int $detail OR-ed NOTES_SHOW_xyz flags that specify which note parts to print */ function note_print($note, $detail = NOTES_SHOW_FULL) { global $CFG, $USER, $DB, $OUTPUT; if (!$user = $DB->get_record('user', array('id' => $note->userid))) { debugging("User $note->userid not found"); return; } if (!$author = $DB->get_record('user', array('id' => $note->usermodified))) { debugging("User $note->usermodified not found"); return; } $context = context_course::instance($note->courseid); $systemcontext = context_system::instance(); $authoring = new stdClass(); $authoring->name = '' . fullname($author) . ''; $authoring->date = userdate($note->lastmodified); echo '
'; // Print note head (e.g. author, user refering to, etc). if ($detail & NOTES_SHOW_HEAD) { echo '
'; echo '
'; echo $OUTPUT->user_picture($user, array('courseid' => $note->courseid)); echo fullname($user) . '
'; echo '
' . get_string('bynameondate', 'notes', $authoring) . ' (' . get_string('created', 'notes') . ': ' . userdate($note->created) . ')
'; echo '
'; } // Print note content. if ($detail & NOTES_SHOW_BODY) { echo '
'; echo format_text($note->content, $note->format, array('overflowdiv' => true)); echo '
'; } // Print note options (e.g. delete, edit). if ($detail & NOTES_SHOW_FOOT) { if (has_capability('moodle/notes:manage', $systemcontext) && $note->publishstate == NOTES_STATE_SITE || has_capability('moodle/notes:manage', $context) && ($note->publishstate == NOTES_STATE_PUBLIC || $note->usermodified == $USER->id)) { echo ''; } } echo '
'; } /** * Prints a list of note objects * * @param array $notes array of note objects to print * @param int $detail OR-ed NOTES_SHOW_xyz flags that specify which note parts to print */ function note_print_list($notes, $detail = NOTES_SHOW_FULL) { echo '
'; foreach ($notes as $note) { note_print($note, $detail); } echo '
'; } /** * Retrieves and prints a list of note objects with specific atributes. * * @param string $header HTML to print above the list * @param int $addcourseid id of the course for the add notes link (0 hide link) * @param boolean $viewnotes true if the notes should be printed; false otherwise (print notesnotvisible string) * @param int $courseid id of the course in which the notes were posted (0 means any) * @param int $userid id of the user to which the notes refer (0 means any) * @param string $state state of the notes (i.e. draft, public, site) ('' means any) * @param int $author id of the user who modified the note last time (0 means any) */ function note_print_notes($header, $addcourseid = 0, $viewnotes = true, $courseid = 0, $userid = 0, $state = '', $author = 0) { global $CFG; if ($header) { echo '

' . $header . '

'; echo '
'; } if ($addcourseid) { if ($userid) { echo '

' . get_string('addnewnote', 'notes') . '

'; } else { echo '

' . get_string('addnewnoteselect', 'notes') . '

'; } } if ($viewnotes) { $notes = note_list($courseid, $userid, $state, $author); if ($notes) { note_print_list($notes); } } else { echo '

' . get_string('notesnotvisible', 'notes') . '

'; } if ($header) { echo '
'; // The notesgroup div. } } /** * Delete all notes about users in course- * @param int $courseid * @return bool success */ function note_delete_all($courseid) { global $DB; return $DB->delete_records('post', array('module' => 'notes', 'courseid' => $courseid)); } /** * Return a list of page types * @param string $pagetype current page type * @param stdClass $parentcontext Block's parent context * @param stdClass $currentcontext Current context of block */ function note_page_type_list($pagetype, $parentcontext, $currentcontext) { return array('notes-*' => get_string('page-notes-x', 'notes')); } /** * Trigger notes viewed event * * @param stdClass $context context object * @param int $userid user id (the user we are viewing the notes) * @since Moodle 2.9 */ function note_view($context, $userid) { $event = \core\event\notes_viewed::create(array( 'relateduserid' => $userid, 'context' => $context )); $event->trigger(); } /** * Add nodes to myprofile page. * * @param \core_user\output\myprofile\tree $tree Tree object * @param stdClass $user user object * @param bool $iscurrentuser * @param stdClass $course Course object * * @return bool */ function core_notes_myprofile_navigation(core_user\output\myprofile\tree $tree, $user, $iscurrentuser, $course) { global $CFG; if (empty($CFG->enablenotes)) { // Notes are disabled, nothing to do. return false; } if (isguestuser($user)) { // No notes for guest users. return false; } $url = new moodle_url("/notes/index.php", array('user' => $user->id)); $title = get_string('notes', 'core_notes'); if (empty($course)) { // Site level profile. if (!has_capability('moodle/notes:view', context_system::instance())) { // No cap, nothing to do. return false; } } else { if (!has_capability('moodle/notes:view', context_course::instance($course->id))) { // No cap, nothing to do. return false; } $url->param('course', $course->id); } $notesnode = new core_user\output\myprofile\node('miscellaneous', 'notes', $title, null, $url); $tree->add_node($notesnode); }