From 320e7de8695668d5336091c19faaa160acb9a595 Mon Sep 17 00:00:00 2001 From: Petr Skoda Date: Sun, 18 Jul 2010 13:32:24 +0000 Subject: [PATCH] MDL-22620 new report that lists roles with unsupported context level assignments --- admin/report/unsuproles/index.php | 120 ++++++++++++++++++ .../unsuproles/lang/en/report_unsuproles.php | 31 +++++ admin/report/unsuproles/settings.php | 31 +++++ admin/report/unsuproles/version.php | 29 +++++ 4 files changed, 211 insertions(+) create mode 100644 admin/report/unsuproles/index.php create mode 100644 admin/report/unsuproles/lang/en/report_unsuproles.php create mode 100644 admin/report/unsuproles/settings.php create mode 100644 admin/report/unsuproles/version.php diff --git a/admin/report/unsuproles/index.php b/admin/report/unsuproles/index.php new file mode 100644 index 00000000000..7dfc731817f --- /dev/null +++ b/admin/report/unsuproles/index.php @@ -0,0 +1,120 @@ +. + +/** + * Report of unsupported role assignments, + * unsupported role assignments can be dropped from here. + * + * @package report + * @subpackage unsuproles + * @copyright 2010 Petr Skoda {@link http://skodak.org} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once(dirname(__FILE__).'/../../../config.php'); +require_once($CFG->libdir.'/adminlib.php'); + +$action = optional_param('action', '', PARAM_ACTION); + +$syscontext = get_context_instance(CONTEXT_SYSTEM); + +require_login(); +admin_externalpage_setup('reportunsuproles'); // checks permissions specified in settings.php + +if ($action === 'delete') { + $contextlevel = required_param('contextlevel', PARAM_INT); + $roleid = required_param('roleid', PARAM_INT); + $confirm = optional_param('confirm', 0, PARAM_BOOL); + + $role = $DB->get_record('role', array('id'=>$roleid), '*', MUST_EXIST); + + if ($confirm and confirm_sesskey()) { + $sql = "SELECT ra.* + FROM {role_assignments} ra + JOIN {context} c ON c.id = ra.contextid + LEFT JOIN {role_context_levels} rcl ON (rcl.roleid = ra.roleid AND rcl.contextlevel = c.contextlevel) + WHERE rcl.id IS NULL AND ra.roleid = :roleid AND c.contextlevel = :contextlevel"; + $ras = $DB->get_records_sql($sql, array('roleid'=>$roleid, 'contextlevel'=>$contextlevel)); + foreach ($ras as $ra) { + if (!empty($ra->component)) { + //bad luck, we can not mess with plugin ras! + //TODO: explain why not possible to remove ras + continue; + } + role_unassign($ra->roleid, $ra->userid, $ra->contextid); + } + redirect($PAGE->url); + } + //show confirmation + echo $OUTPUT->header(); + $yesurl = new moodle_url($PAGE->url, array('roleid'=>$roleid, 'contextlevel'=>$contextlevel, 'action'=>'delete', 'confirm'=>1, 'sesskey'=>sesskey())); + $levelname = get_contextlevel_name($contextlevel); + $rolename = format_string($role->name); + $message = get_string('confirmdelete', 'report_unsuproles', array('level'=>$levelname, 'role'=>$rolename)); + echo $OUTPUT->confirm($message, $yesurl, $PAGE->url); + echo $OUTPUT->footer(); + die(); +} + + +echo $OUTPUT->header(); +echo $OUTPUT->heading(get_string('pluginname', 'report_unsuproles')); + +$sql = "SELECT r.id AS roleid, c.contextlevel, r.sortorder, COUNT(ra.id) AS racount + FROM {role} r + JOIN {role_assignments} ra ON ra.roleid = r.id + JOIN {context} c ON c.id = ra.contextid + LEFT JOIN {role_context_levels} rcl ON (rcl.roleid = r.id AND rcl.contextlevel = c.contextlevel) + WHERE rcl.id IS NULL + GROUP BY r.id, c.contextlevel, r.sortorder + ORDER BY c.contextlevel ASC, r.sortorder ASC"; +//print the overview table + +$problems = array(); +$rs = $DB->get_recordset_sql($sql); +foreach ($rs as $problem) { + $problems[] = $problem; +} +$rs->close(); + +if (!$problems) { + notify(get_string('noprolbems', 'report_unsuproles'), 'notifysuccess'); +} else { + $roles = get_all_roles(); + $data = array(); + foreach ($problems as $problem) { + $levelname = get_contextlevel_name($problem->contextlevel); + $rolename = format_string($roles[$problem->roleid]->name); + //TODO: show list of users if count low + $count = $problem->racount; + $edit = array(); + $aurl = new moodle_url('/admin/roles/define.php', array('roleid'=>$problem->roleid, 'action'=>'edit')); + $edit[] = html_writer::link($aurl, html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('t/edit'), 'alt'=>get_string('edit'), 'class'=>'smallicon'))); + $aurl = new moodle_url($PAGE->url, array('roleid'=>$problem->roleid, 'contextlevel'=>$problem->contextlevel, 'action'=>'delete')); + $edit[] = html_writer::link($aurl, html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('t/delete'), 'alt'=>get_string('delete'), 'class'=>'smallicon'))); + $data[] = array($levelname, $rolename, $count, implode(' ', $edit)); + } + $table = new html_table(); + $table->head = array(get_string('contextlevel', 'report_unsuproles'), get_string('role'), get_string('count', 'report_unsuproles'), get_string('edit')); + $table->size = array('40%', '40%', '10%', '10%'); + $table->align = array('left', 'left', 'center', 'center'); + $table->width = '90%'; + $table->data = $data; + echo html_writer::table($table); +} + +echo $OUTPUT->footer(); \ No newline at end of file diff --git a/admin/report/unsuproles/lang/en/report_unsuproles.php b/admin/report/unsuproles/lang/en/report_unsuproles.php new file mode 100644 index 00000000000..b84feb5a4d6 --- /dev/null +++ b/admin/report/unsuproles/lang/en/report_unsuproles.php @@ -0,0 +1,31 @@ +. + +/** + * Strings for component 'report_unsuproles', language 'en', branch 'MOODLE_20_STABLE' + * + * @package report + * @subpackage unsuproles + * @copyright 2010 Petr Skoda {@link http://skodak.org} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +$string['contextlevel'] = 'Context level'; +$string['count'] = 'Count'; +$string['confirmdelete'] = 'Do you really want to delete all unsupported role assignments for role "{$a->role}" in context level "{$a->level}"?'; +$string['noprolbems'] = 'No unsupported role assignments found.'; +$string['pluginname'] = 'Unsupported role assignments'; diff --git a/admin/report/unsuproles/settings.php b/admin/report/unsuproles/settings.php new file mode 100644 index 00000000000..62c94038dde --- /dev/null +++ b/admin/report/unsuproles/settings.php @@ -0,0 +1,31 @@ +. + +/** + * Link to unsupported roles report + * + * @package report + * @subpackage unsuproles + * @copyright 2010 Petr Skoda {@link http://skodak.org} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die; + +if ($hassiteconfig) { + $ADMIN->add('roles', new admin_externalpage('reportunsuproles', get_string('pluginname', 'report_unsuproles'), "$CFG->wwwroot/$CFG->admin/report/unsuproles/index.php"), array('moodle/site:config', 'moodle/role:assign')); +} diff --git a/admin/report/unsuproles/version.php b/admin/report/unsuproles/version.php new file mode 100644 index 00000000000..6535b3ba041 --- /dev/null +++ b/admin/report/unsuproles/version.php @@ -0,0 +1,29 @@ +. + +/** + * Plugin version info + * + * @package report + * @subpackage unsuproles + * @copyright 2010 Petr Skoda {@link http://skodak.org} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +defined('MOODLE_INTERNAL') || die; + +$plugin->version = 2010071800; +