License * - http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once($CFG->dirroot . "/mod/iassign/locallib.php"); function iassign_extend_settings_navigation(settings_navigation $settingsnav, navigation_node $iassignnode) { global $USER, $PAGE, $CFG, $DB, $OUTPUT; if (optional_param('iassign_current', 0, PARAM_INT)) { $childnode = $iassignnode->create(get_string('edit_iassign', 'iassign'), new moodle_url('/mod/iassign/view.php', array('action' => 'edit', 'id' => optional_param('id', 0, PARAM_INT), 'iassign_current' => optional_param('iassign_current', 0, PARAM_INT) )), navigation_node::TYPE_SETTING); // 2019/02/12 $children_key_list = $iassignnode->get_children_key_list(); if (is_array($children_key_list) && count($children_key_list)>0) $iassignnode->add_node($childnode, $children_key_list[0]); //TODO: verify... // else $iassignnode->add_node($childnode, ""); } } /// List of features supported in iAssign module // @param string $feature FEATURE_xx constant for requested feature // @return mixed True if module supports feature, false if not, null if doesn't know function iassign_supports ($feature) { switch ($feature) { case FEATURE_GROUPS: return false; case FEATURE_GROUPINGS: return false; case FEATURE_GROUPMEMBERSONLY: return false; case FEATURE_MOD_INTRO: return true; case FEATURE_SHOW_DESCRIPTION: return true; case FEATURE_COMPLETION_TRACKS_VIEWS: return true; case FEATURE_GRADE_HAS_GRADE: return true; case FEATURE_GRADE_OUTCOMES: return true; case FEATURE_GRADE_HAS_GRADE: return true; case FEATURE_BACKUP_MOODLE2: return true; default: return null; } } /// Function for insert a link with messages in iassigns for students and teacher. // @param cm_info $cm_info array Informations of module course. // @see http://docs.moodle.org/dev/Module_visibility_and_display function iassign_cm_info_view (cm_info $cm_info) { global $CFG, $DB, $USER, $COURSE; $comment_unread = ""; $sum_comment = 0; $iassign_statements = $DB->get_records("iassign_statement", array("iassignid" => $cm_info->instance)); foreach ($iassign_statements as $iassign_statement) { $cm = get_coursemodule_from_instance("iassign", $iassign_statement->id, optional_param('id', 0, PARAM_INT)); if ($cm) { $contextuser = context_module::instance($cm->id); $teacher_access = has_capability('mod/iassign:evaluateiassign', $contextuser, $USER->id); $student_access = has_capability('mod/iassign:submitiassign', $contextuser, $USER->id); $iassign_submissions = array(); if ($teacher_access) { $receiver = '1'; $iassign_submissions = $DB->get_records("iassign_submission", array("iassign_statementid" => $iassign_statement->id)); } else if ($student_access) { $receiver = '2'; $iassign_submissions = $DB->get_records("iassign_submission", array("iassign_statementid" => $iassign_statement->id, "userid" => $USER->id)); } foreach ($iassign_submissions as $iassign_submission) { $params = array('iassign_submissionid' => $iassign_submission->id, 'return_status' => '0', 'receiver' => $receiver); $strQuery = 'SELECT COUNT(iassign_submissionid) FROM {iassign_submission_comment} WHERE ' . ' iassign_submissionid = :iassign_submissionid AND return_status= :return_status AND receiver= :receiver'; $verify_message = $DB->get_record_sql($strQuery, $params); if ($verify_message) foreach ($verify_message as $tmp) $sum_comment += $tmp; } } } if ($sum_comment != 0) { $comment_unread_message = get_string('comment_unread', 'iassign'); if ($sum_comment == 1) $comment_unread_message = get_string('comment_unread_one', 'iassign'); if ($teacher_access) $comment_unread = "  " . iassign_icons::insert('comment_unread') . " ($sum_comment " . $comment_unread_message . ")"; else if ($student_access) //http://localhost/moodle24/mod/iassign/view.php?id=463&userid_iassign=4&action=view&iassign_current=1 $comment_unread = "  " . iassign_icons::insert('comment_unread') . " ($sum_comment " . get_string('comment_unread', 'iassign') . ")"; } $cm_info->set_after_link($comment_unread); } /// This function is used by the reset_course_userdata function in moodlelib. // @param $data the data submitted from the reset course. // @return array status array function iassign_reset_userdata ($data) { return array(); } /// List of view style log actions // @return array function iassign_get_view_actions () { return array('view', 'view submission'); } /// List of update style log actions // @return array function iassign_get_post_actions () { return array('update', 'add', 'upload', 'update comment', 'update submission', 'delete iassign', 'add comment', 'add submission'); } /// Adds an iAssign instance // @param object $iassign An object from the form in mod_form.php // @return Fail / id number of the new instance function iassign_add_instance ($data, $mform) { global $DB; $cmid = $data->coursemodule; $iassignid = $DB->insert_record("iassign", $data); $data->id = $iassignid; $context = context_module::instance($cmid); $iassign = $DB->get_record('iassign', array('id' => $iassignid), '*', MUST_EXIST); iassign_grade_item($iassign); // log event ----------------------------------------------------- iassign_log::add_log('add_iassign', 'name: ' . $data->name, $cmid); // log event ----------------------------------------------------- return $iassign->id; } /// Display an item in grade of activities iAssign. // @param object $iassign An object from the form. function iassign_grade_item ($iassign) { global $DB, $CFG; require_once($CFG->libdir . '/gradelib.php'); /// @todo Ver código comentado // if (!$iassign->id = $DB->insert_record("iassign", $iassign)) // return false; // $iassign=(stripslashes_recursive($iassign)); $iassign->grade = 0; $grades = NULL; if (array_key_exists('cmidnumber', $iassign)) { //it may not be always present $params = array('itemname' => $iassign->name, 'idnumber' => $iassign->cmidnumber); } else { $params = array('itemname' => $iassign->name); } if ($iassign->grade > 0) { $params['gradetype'] = GRADE_TYPE_VALUE; $params['gradiLMx'] = $iassign->grade; $params['grademin'] = 0; } else { $params['gradetype'] = GRADE_TYPE_NONE; } if ($grades === 'reset') { $params['reset'] = true; $grades = NULL; } else if (!empty($grades)) { // Need to calculate raw grade (Note: $grades has many forms) if (is_object($grades)) { $grades = array($grades->userid => $grades); } else if (array_key_exists('userid', $grades)) { $grades = array($grades['userid'] => $grades); } foreach ($grades as $key => $grade) { $grades[$key] = $grade = (array) $grade; } $grades[$key]['rawgrade'] = ($grade['rawgrade'] * $iassign->grade / 100); } grade_update('mod/iassign', $iassign->course, 'mod', 'iassign', $iassign->id, 0, $grades, $params); } /// This function will update an existing instance with new data. // @param object $iassign An object from the form in mod.html // @return boolean Fail Return the result. function iassign_update_instance ($data, $mform) { global $DB, $CFG; $data->id = $data->instance; $cmid = $data->coursemodule; $DB->update_record("iassign", $data); $context = context_module::instance($cmid); iassign_grade_item_update($data->id); // log event ----------------------------------------------------- iassign_log::add_log('update_iassign', 'name: ' . $data->name, $cmid); // log event ----------------------------------------------------- return true; } /// Update an item in grade of activities iAssign. // @param int $iassignid Id to activities iAssign function iassign_grade_item_update ($iassignid) { global $USER, $CFG, $COURSE, $DB, $OUTPUT; require_once($CFG->libdir . '/gradelib.php'); // $sum_grade = $DB->get_records_sql("SELECT SUM(grade) as total FROM {$CFG->prefix}iassign_statement s WHERE s.iassignid = '$iassignid' AND s.type_iassign=3"); $sum_grade = 0; $grade = $DB->get_records('iassign_statement', array('iassignid' => $iassignid, 'type_iassign' => 3)); foreach ($grade as $tmp) { $sum_grade += $tmp->grade; } $grade_iassign = $DB->get_record("iassign", array("id" => $iassignid)); $grades = NULL; $params = array('itemname' => $grade_iassign->name); $params['iteminstance'] = $iassignid; $params['gradetype'] = GRADE_TYPE_VALUE; if ($sum_grade != 0) { $params['gradiLMx'] = $sum_grade; $params['rawgradiLMx'] = $sum_grade; } else { $params['gradiLMx'] = 0; $params['rawgradiLMx'] = 0; } $params['grademin'] = 0; grade_update('mod/iassign', $grade_iassign->course, 'mod', 'iassign', $iassignid, 0, $grades, $params); $grades = $DB->get_records('grade_grades', array('itemid' => $iassignid)); if ($grades) { foreach ($grades as $grade) { $grade->rawgradiLMx = $params['rawgradiLMx']; $DB->update_record("grade_grades", $grade); } } } /// Delete an item in grade of activities iAssign. // @param int $id Id to activities iAssign function iassign_delete_instance ($id) { global $DB; $result = true; if (!$iassign = $DB->get_record("iassign", array("id" => $id))) { return false; } $DB->delete_records('event', array('modulename' => 'iassign', 'instance' => $iassign->id)); iassign_grade_item_delete($iassign); $iassign_statements = $DB->get_records("iassign_statement", array("iassignid" => $iassign->id)); if ($iassign_statements) { foreach ($iassign_statements as $iassign_statement) { $iassign_statements_submissions = $DB->get_records("iassign_submission", array("iassign_statementid" => $iassign_statement->id)); if ($iassign_statements_submissions) { foreach ($iassign_statements_submissions as $iassign_statements_submission) { $DB->delete_records('iassign_submission_comment', array('iassign_submissionid' => $iassign_statements_submission->id)); } $DB->delete_records("iassign_submission ", array("iassign_statementid" => $iassign_statement->id)); } } $DB->delete_records("iassign_statement", array("iassignid" => $iassign->id)); } if (!$DB->delete_records("iassign", array("id" => $iassign->id))) { $result = false; } return $result; } /// Given an ID of an instance of this module, // this function will permanently delete the instance // and any data that depends on it. // @param object $iassign function iassign_grade_item_delete ($iassign) { global $DB, $CFG; require_once($CFG->libdir . '/gradelib.php'); grade_update('mod/iassign', $iassign->course, 'mod', 'iassign', $iassign->id, 0, NULL, array('deleted' => 1)); } /// Return a small object with summary information about what a // user has done with a given particular instance of this module // Used for user activity reports. // $return->time = the time they did it // $return->info = a short text description // @return boolean Return the state of function. function iassign_user_outline ($course, $user, $mod, $iassign) { return true; } /// Print a detailed representation of what a user has done with // a given particular instance of this module, for user activity reports. // @return boolean Return the state of function. function iassign_user_complete ($course, $user, $mod, $iassign) { return true; } /// Given a course and a time, this module should find recent activity // that has occurred in ia activities and print it out. // Return true if there was output, or false is there was none. // @return boolean Return the state of function. function iassign_print_recent_activity ($course, $isteacher, $timestart) { global $DB, $CFG; return false; // True if anything was printed, otherwise false } /// Function to be run periodically according to the moodle cron // This function searches for things that need to be done, such // as sending out mail, toggling flags etc ... // @return boolean Return the state of function. function iassign_cron () { global $DB, $CFG; return true; } /// Must return an array of grades for a given instance of this module, // indexed by user. It also returns a maximum allowed grade. // Example: // $return->grades = array of grades; // $return->maxgrade = maximum allowed grade; // return $return; // @param int $iassignid ID of an instance of this module // @return mixed Null or object with an array of grades and with the maximum grade function iassign_grades ($iassignid) { return NULL; } /// Must return an array of user records (all data) who are participants // for a given instance of ia. Must include every user involved // in the instance, independient of his role (student, teacher, admin...) // See other modules as example. // @param int $iassignid ID of an instance of this module // @return mixed boolean/array of students function iassign_get_participants ($iassignid) { return false; } /// This function returns if a scale is being used by one ia // it it has support for grading and scales. Commented code should be // modified if necessary. See forum, glossary or journal modules // as reference. // @param int $iassignid ID of an instance of this module // @return mixed boolean/array of students function iassign_scale_used ($iassignid, $scaleid) { $return = false; /// @todo Ver código comentado //$rec = $DB->get_record("iassign","id","$iassignid","scale","-$scaleid"); //if (!empty($rec) && !empty($scaleid)) { $return = true; } return $return; } /// Checks if scale is being used by any instance of ia. // This function was added in 1.9 // This is used to find out if scale used anywhere // @param $scaleid int // @return boolean True if the scale is used by any ia function iassign_scale_used_anywhere ($scaleid) { if ($scaleid and record_exists('iassign', 'grade', -$scaleid)) { return true; } else { return false; } } /// Search iLM // @param boolean $enable // @return array of iLM function search_iLM ($enable) { global $DB; $ilms = $DB->get_records('iassign_ilm', array('enable' => $enable)); return $ilms; } /// Base implementation for backing up subtype specific information // for one single module // @return boolean Return the state of function. function backup_one_mod ($bf, $preferences, $iassign) { return true; } /// Base implementation for backing up subtype specific information // for one single submission // @return boolean Return the state of function. function backup_one_submission ($bf, $preferences, $iassign, $submission) { return true; } /// Base implementation for restoring subtype specific information // for one single module // @return boolean Return the state of function. function restore_one_mod ($info, $restore, $iassign) { return true; } /// Base implementation for restoring subtype specific information // for one single submission // @return boolean function restore_one_submission ($info, $restore, $iassign, $submission) { return true; } /// Serves the data attachments. Implements needed access control ;-) // @param object $course // @param object $cm // @param object $context // @param string $filearea // @param array $args // @param bool $forcedownload // @return bool false if file not found, does not return if found - justsend the file function iassign_pluginfile ($course, $cm, $context, $filearea, $args, $forcedownload) { global $CFG, $DB; require_course_login($course, true, $cm); $fileareas = array('exercise', 'submit', 'activity', 'ilm'); if (!in_array($filearea, $fileareas)) { return false; } $fs = get_file_storage(); $postid = (int) array_shift($args); $relativepath = implode('/', $args); $fullpath = "/$context->id/mod_iassign/$filearea/$postid/$relativepath"; if (!$file = $fs->get_file_by_hash(sha1($fullpath)) or $file->is_directory()) { return false; } // finally send the file send_stored_file($file, 0, 0, false); // download MUST be forced - security! return false; } /// Display an url from access iLM. // @calledby settings.php // @param string $url Initial url // @return string Return the url formatted. function display_url_ilm ($url) { // note: empty URL are prevented in form validation $url = trim($url); // remove encoded entities - we want the raw URI here $url = html_entity_decode($url, ENT_QUOTES, 'UTF-8'); if (!preg_match('|^[a-z]+:|i', $url) and ! preg_match('|^/|', $url)) { // invalid URI, try to fix it by making it normal URL, please note relative url are not allowed, /xx/yy links are ok $url = 'http://' . $url; } return $url; }