You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

291 lines
9.4 KiB

<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Rule manager class.
*
* @package tool_monitor
* @copyright 2014 onwards Simey Lameze <lameze@gmail.com>
* @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 <lameze@gmail.com>
* @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;
}
}