. /** * Rule manager class. * * @package tool_monitor * @copyright 2014 onwards Simey Lameze * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace tool_monitor; defined('MOODLE_INTERNAL') || die(); /** * Rule manager class. * * @package tool_monitor * @copyright 2014 onwards Simey Lameze * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class rule_manager { /** * Create a new rule. * * @param \stdClass $ruledata data to insert as new rule entry. * * @return rule An instance of rule class. */ public static function add_rule($ruledata) { global $DB; $now = time(); $ruledata->timecreated = $now; $ruledata->timemodified = $now; $ruledata->id = $DB->insert_record('tool_monitor_rules', $ruledata); // Trigger a rule created event. if ($ruledata->id) { if (!empty($ruledata->courseid)) { $courseid = $ruledata->courseid; $context = \context_course::instance($ruledata->courseid); } else { $courseid = 0; $context = \context_system::instance(); } $params = array( 'objectid' => $ruledata->id, 'courseid' => $courseid, 'context' => $context ); $event = \tool_monitor\event\rule_created::create($params); $event->trigger(); } return new rule($ruledata); } /** * Clean data submitted by mform. * * @param \stdClass $mformdata data to insert as new rule entry. * * @return \stdClass Cleaned rule data. */ public static function clean_ruledata_form($mformdata) { global $USER; $rule = new \stdClass(); if (!empty($mformdata->ruleid)) { $rule->id = $mformdata->ruleid; } $rule->userid = empty($mformdata->userid) ? $USER->id : $mformdata->userid; $rule->courseid = $mformdata->courseid; $rule->name = $mformdata->name; $rule->plugin = $mformdata->plugin; $rule->eventname = $mformdata->eventname; $rule->description = $mformdata->description['text']; $rule->descriptionformat = $mformdata->description['format']; $rule->frequency = $mformdata->frequency; $rule->timewindow = $mformdata->minutes * MINSECS; $rule->template = $mformdata->template['text']; $rule->templateformat = $mformdata->template['format']; return $rule; } /** * Delete a rule and associated subscriptions, by rule id. * * @param int $ruleid id of rule to be deleted. * @param \context|null $coursecontext the context of the course - this is passed when we * can not get the context via \context_course as the course has been deleted. * * @return bool */ public static function delete_rule($ruleid, $coursecontext = null) { global $DB; subscription_manager::remove_all_subscriptions_for_rule($ruleid, $coursecontext); // Retrieve the rule from the DB before we delete it, so we have a record when we trigger a rule deleted event. $rule = $DB->get_record('tool_monitor_rules', array('id' => $ruleid)); $success = $DB->delete_records('tool_monitor_rules', array('id' => $ruleid)); // If successful trigger a rule deleted event. if ($success) { // It is possible that we are deleting rules associated with a deleted course, so we should be // passing the context as the second parameter. if (!is_null($coursecontext)) { $context = $coursecontext; $courseid = $rule->courseid; } else if (!empty($rule->courseid) && ($context = \context_course::instance($rule->courseid, IGNORE_MISSING))) { $courseid = $rule->courseid; } else { $courseid = 0; $context = \context_system::instance(); } $params = array( 'objectid' => $rule->id, 'courseid' => $courseid, 'context' => $context ); $event = \tool_monitor\event\rule_deleted::create($params); $event->add_record_snapshot('tool_monitor_rules', $rule); $event->trigger(); } return $success; } /** * Get an instance of rule class. * * @param \stdClass|int $ruleorid A rule object from database or rule id. * * @return rule object with rule id. */ public static function get_rule($ruleorid) { global $DB; if (!is_object($ruleorid)) { $rule = $DB->get_record('tool_monitor_rules', array('id' => $ruleorid), '*', MUST_EXIST); } else { $rule = $ruleorid; } return new rule($rule); } /** * Update rule data. * * @throws \coding_exception if $record->ruleid is invalid. * @param object $ruledata rule data to be updated. * * @return bool */ public static function update_rule($ruledata) { global $DB; if (!self::get_rule($ruledata->id)) { throw new \coding_exception('Invalid rule ID.'); } $ruledata->timemodified = time(); $success = $DB->update_record('tool_monitor_rules', $ruledata); // If successful trigger a rule updated event. if ($success) { // If we do not have the course id we need to retrieve it. if (!isset($ruledata->courseid)) { $courseid = $DB->get_field('tool_monitor_rules', 'courseid', array('id' => $ruledata->id), MUST_EXIST); } else { $courseid = $ruledata->courseid; } if (!empty($courseid)) { $context = \context_course::instance($courseid); } else { $context = \context_system::instance(); } $params = array( 'objectid' => $ruledata->id, 'courseid' => $courseid, 'context' => $context ); $event = \tool_monitor\event\rule_updated::create($params); $event->trigger(); } return $success; } /** * Get rules by course id. * * @param int $courseid course id of the rule. * @param int $limitfrom Limit from which to fetch rules. * @param int $limitto Limit to which rules need to be fetched. * @param bool $includesite Determines whether we return site wide rules or not. * * @return array List of rules for the given course id, if specified will also include site rules. */ public static function get_rules_by_courseid($courseid, $limitfrom = 0, $limitto = 0, $includesite = true) { global $DB; $select = 'courseid = ?'; $params = array(); $params[] = $courseid; if ($includesite) { $select .= ' OR courseid = ?'; $params[] = 0; } $orderby = 'courseid DESC, name ASC'; return self::get_instances($DB->get_records_select('tool_monitor_rules', $select, $params, $orderby, '*', $limitfrom, $limitto)); } /** * Get rule count by course id. * * @param int $courseid course id of the rule. * * @return int count of rules present in system visible in the given course id. */ public static function count_rules_by_courseid($courseid) { global $DB; $select = "courseid = ? OR courseid = ?"; return $DB->count_records_select('tool_monitor_rules', $select, array(0, $courseid)); } /** * Get rules by plugin name. * * @param string $plugin plugin name of the rule. * * @return array List of rules for the given plugin name. */ public static function get_rules_by_plugin($plugin) { global $DB; return self::get_instances($DB->get_records('tool_monitor_rules', array('plugin' => $plugin))); } /** * Get rules by event name. * * @param string $eventname event name of the rule. * * @return array List of rules for the given event. */ public static function get_rules_by_event($eventname) { global $DB; return self::get_instances($DB->get_records('tool_monitor_rules', array('eventname' => $eventname))); } /** * Helper method to convert db records to instances. * * @param array $arr of rules. * * @return array of rules as instances. */ protected static function get_instances($arr) { $result = array(); foreach ($arr as $key => $sub) { $result[$key] = new rule($sub); } return $result; } }