. /** * Class represents a single rule. * * @package tool_monitor * @copyright 2014 onwards Ankit Agarwal * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace tool_monitor; defined('MOODLE_INTERNAL') || die(); /** * Class represents a single rule. * * @since Moodle 2.8 * @package tool_monitor * @copyright 2014 onwards Ankit Agarwal * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class rule { /** * @var \stdClass The rule object form database. */ protected $rule; /** * Constructor. * * @param \stdClass $rule A rule object from database. */ public function __construct($rule) { $this->rule = $rule; } /** * Can the user manage this rule? Defaults to $USER. * * @param int $userid Check against this userid. * @return bool true if the current user can manage this rule, else false. */ public function can_manage_rule($userid = null) { $courseid = $this->courseid; $context = empty($courseid) ? \context_system::instance() : \context_course::instance($this->courseid); return has_capability('tool/monitor:managerules', $context, $userid); } /** * Api to duplicate a rule in a given courseid. * * @param int $finalcourseid Final course id. */ public function duplicate_rule($finalcourseid) { $rule = fullclone($this->rule); unset($rule->id); $rule->courseid = $finalcourseid; $time = time(); $rule->timecreated = $time; $rule->timemodified = $time; rule_manager::add_rule($rule); } /** * Delete this rule. * * Note: It also removes all associated subscriptions. */ public function delete_rule() { rule_manager::delete_rule($this->id); } /** * Gets the rule subscribe options for a given course and rule. * * Could be a select drop down with a list of possible module * instances or a single link to subscribe if the rule plugin * is not a module. * * @param int $courseid course id * * @return \single_select|\moodle_url|string * @throws \coding_exception */ public function get_subscribe_options($courseid) { global $CFG; $url = new \moodle_url($CFG->wwwroot. '/admin/tool/monitor/index.php', array( 'courseid' => $courseid, 'ruleid' => $this->id, 'action' => 'subscribe', 'sesskey' => sesskey() )); if (strpos($this->plugin, 'mod_') !== 0) { return $url; } else { // Single select when the plugin is an activity. $options = array(); $options[0] = get_string('allmodules', 'tool_monitor'); if ($courseid == 0) { // They need to be in a course to select module instance. return get_string('selectcourse', 'tool_monitor'); } // Let them select an instance. $cms = get_fast_modinfo($courseid); $instances = $cms->get_instances_of(str_replace('mod_', '', $this->plugin)); foreach ($instances as $cminfo) { // Don't list instances that are not visible or available to the user. if ($cminfo->uservisible && $cminfo->available) { $options[$cminfo->id] = $cminfo->get_formatted_name(); } } return new \single_select($url, 'cmid', $options); } } /** * Subscribe an user to this rule. * * @param int $courseid Course id. * @param int $cmid Course module id. * @param int $userid User id. * * @throws \coding_exception */ public function subscribe_user($courseid, $cmid, $userid = 0) { global $USER; if ($this->courseid != $courseid && $this->courseid != 0) { // Trying to subscribe to a rule that belongs to a different course. Should never happen. throw new \coding_exception('Can not subscribe to rules from a different course'); } if ($cmid !== 0) { $cms = get_fast_modinfo($courseid); $cminfo = $cms->get_cm($cmid); if (!$cminfo->uservisible || !$cminfo->available) { // Trying to subscribe to a hidden or restricted cm. Should never happen. throw new \coding_exception('You cannot do that'); } } $userid = empty($userid) ? $USER->id : $userid; subscription_manager::create_subscription($this->id, $courseid, $cmid, $userid); } /** * Magic get method. * * @param string $prop property to get. * * @return mixed * @throws \coding_exception */ public function __get($prop) { if (property_exists($this->rule, $prop)) { return $this->rule->$prop; } throw new \coding_exception('Property "' . $prop . '" doesn\'t exist'); } /** * Return the rule data to be used while setting mform. * * @throws \coding_exception */ public function get_mform_set_data() { if (!empty($this->rule)) { $rule = fullclone($this->rule); $rule->description = array('text' => $rule->description, 'format' => $rule->descriptionformat); $rule->template = array('text' => $rule->template, 'format' => $rule->templateformat); return $rule; } throw new \coding_exception('Invalid call to get_mform_set_data.'); } /** * Method to get event name. * * @return string * @throws \coding_exception */ public function get_event_name() { $eventclass = $this->eventname; if (class_exists($eventclass)) { return $eventclass::get_name_with_info(); } return get_string('eventnotfound', 'tool_monitor'); } /** * Get filter description. * * @return string */ public function get_filters_description() { $a = new \stdClass(); $a->freq = $this->frequency; $mins = $this->timewindow / MINSECS; // Convert seconds to minutes. $a->mins = $mins; return get_string('freqdesc', 'tool_monitor', $a); } /** * Get properly formatted name of the course associated. * * @param \context $context context where this name would be displayed. * @return string The course fullname. */ public function get_course_name($context) { $courseid = $this->courseid; if (empty($courseid)) { return get_string('site'); } else { $course = get_course($courseid); return format_string($course->fullname, true, array('context' => $context)); } } /** * Get properly formatted name of the rule associated. * * @param \context $context context where this name would be displayed. * @return string Formatted name of the rule. */ public function get_name(\context $context) { return format_text($this->name, FORMAT_HTML, array('context' => $context)); } /** * Get properly formatted description of the rule associated. * * @param \context $context context where this description would be displayed. * @return string Formatted description of the rule. */ public function get_description(\context $context) { return format_text($this->description, $this->descriptionformat, array('context' => $context)); } /** * Get name of the plugin associated with this rule * * @return string Plugin name. */ public function get_plugin_name() { if ($this->plugin === 'core') { $string = get_string('core', 'tool_monitor'); } else if (get_string_manager()->string_exists('pluginname', $this->plugin)) { $string = get_string('pluginname', $this->plugin); } else { $string = $this->plugin; } return $string; } }