mirror of
https://github.com/moodle/moodle.git
synced 2025-08-05 08:56:36 +02:00
Merge branch 'wip-MDL-34189-master' of git://github.com/marinaglancy/moodle
This commit is contained in:
commit
efe3aefaf2
10 changed files with 383 additions and 48 deletions
|
@ -26,6 +26,7 @@ require('../config.php');
|
|||
require_once($CFG->dirroot.'/cohort/locallib.php');
|
||||
|
||||
$id = required_param('id', PARAM_INT);
|
||||
$returnurl = optional_param('returnurl', '', PARAM_LOCALURL);
|
||||
|
||||
require_login();
|
||||
|
||||
|
@ -38,7 +39,11 @@ $PAGE->set_context($context);
|
|||
$PAGE->set_url('/cohort/assign.php', array('id'=>$id));
|
||||
$PAGE->set_pagelayout('admin');
|
||||
|
||||
if ($returnurl) {
|
||||
$returnurl = new moodle_url($returnurl);
|
||||
} else {
|
||||
$returnurl = new moodle_url('/cohort/index.php', array('contextid' => $cohort->contextid));
|
||||
}
|
||||
|
||||
if (!empty($cohort->component)) {
|
||||
// We can not manually edit cohorts that were created by external systems, sorry.
|
||||
|
@ -100,6 +105,7 @@ if (optional_param('remove', false, PARAM_BOOL) && confirm_sesskey()) {
|
|||
?>
|
||||
<form id="assignform" method="post" action="<?php echo $PAGE->url ?>"><div>
|
||||
<input type="hidden" name="sesskey" value="<?php echo sesskey() ?>" />
|
||||
<input type="hidden" name="returnurl" value="<?php echo $returnurl->out_as_local_url() ?>" />
|
||||
|
||||
<table summary="" class="generaltable generalbox boxaligncenter" cellspacing="0">
|
||||
<tr>
|
||||
|
|
|
@ -31,6 +31,7 @@ $id = optional_param('id', 0, PARAM_INT);
|
|||
$contextid = optional_param('contextid', 0, PARAM_INT);
|
||||
$delete = optional_param('delete', 0, PARAM_BOOL);
|
||||
$confirm = optional_param('confirm', 0, PARAM_BOOL);
|
||||
$returnurl = optional_param('returnurl', '', PARAM_LOCALURL);
|
||||
|
||||
require_login();
|
||||
|
||||
|
@ -52,7 +53,11 @@ if ($id) {
|
|||
|
||||
require_capability('moodle/cohort:manage', $context);
|
||||
|
||||
if ($returnurl) {
|
||||
$returnurl = new moodle_url($returnurl);
|
||||
} else {
|
||||
$returnurl = new moodle_url('/cohort/index.php', array('contextid'=>$context->id));
|
||||
}
|
||||
|
||||
if (!empty($cohort->component)) {
|
||||
// We can not manually edit cohorts that were created by external systems, sorry.
|
||||
|
@ -60,7 +65,8 @@ if (!empty($cohort->component)) {
|
|||
}
|
||||
|
||||
$PAGE->set_context($context);
|
||||
$PAGE->set_url('/cohort/edit.php', array('contextid'=>$context->id, 'id'=>$cohort->id));
|
||||
$baseurl = new moodle_url('/cohort/edit.php', array('contextid' => $context->id, 'id' => $cohort->id));
|
||||
$PAGE->set_url($baseurl);
|
||||
$PAGE->set_context($context);
|
||||
$PAGE->set_pagelayout('admin');
|
||||
|
||||
|
@ -84,7 +90,8 @@ if ($delete and $cohort->id) {
|
|||
$PAGE->set_heading($COURSE->fullname);
|
||||
echo $OUTPUT->header();
|
||||
echo $OUTPUT->heading($strheading);
|
||||
$yesurl = new moodle_url('/cohort/edit.php', array('id'=>$cohort->id, 'delete'=>1, 'confirm'=>1,'sesskey'=>sesskey()));
|
||||
$yesurl = new moodle_url('/cohort/edit.php', array('id' => $cohort->id, 'delete' => 1,
|
||||
'confirm' => 1, 'sesskey' => sesskey(), 'returnurl' => $returnurl->out_as_local_url()));
|
||||
$message = get_string('delconfirm', 'cohort', format_string($cohort->name));
|
||||
echo $OUTPUT->confirm($message, $yesurl, $returnurl);
|
||||
echo $OUTPUT->footer();
|
||||
|
@ -107,7 +114,7 @@ $PAGE->set_title($strheading);
|
|||
$PAGE->set_heading($COURSE->fullname);
|
||||
$PAGE->navbar->add($strheading);
|
||||
|
||||
$editform = new cohort_edit_form(null, array('editoroptions'=>$editoroptions, 'data'=>$cohort));
|
||||
$editform = new cohort_edit_form(null, array('editoroptions'=>$editoroptions, 'data'=>$cohort, 'returnurl'=>$returnurl));
|
||||
|
||||
if ($editform->is_cancelled()) {
|
||||
redirect($returnurl);
|
||||
|
@ -121,12 +128,22 @@ if ($editform->is_cancelled()) {
|
|||
cohort_add_cohort($data);
|
||||
}
|
||||
|
||||
// Use new context id, it could have been changed.
|
||||
if ($returnurl->get_param('showall') || $returnurl->get_param('contextid') == $data->contextid) {
|
||||
// Redirect to where we were before.
|
||||
redirect($returnurl);
|
||||
} else {
|
||||
// Use new context id, it has been changed.
|
||||
redirect(new moodle_url('/cohort/index.php', array('contextid' => $data->contextid)));
|
||||
}
|
||||
}
|
||||
|
||||
echo $OUTPUT->header();
|
||||
echo $OUTPUT->heading($strheading);
|
||||
|
||||
if (!$id && ($editcontrols = cohort_edit_controls($context, $baseurl))) {
|
||||
echo $OUTPUT->render($editcontrols);
|
||||
}
|
||||
|
||||
echo $editform->display();
|
||||
echo $OUTPUT->footer();
|
||||
|
||||
|
|
|
@ -53,6 +53,11 @@ class cohort_edit_form extends moodleform {
|
|||
$mform->addElement('hidden', 'id');
|
||||
$mform->setType('id', PARAM_INT);
|
||||
|
||||
if (isset($this->_customdata['returnurl'])) {
|
||||
$mform->addElement('hidden', 'returnurl', $this->_customdata['returnurl']->out_as_local_url());
|
||||
$mform->setType('returnurl', PARAM_LOCALURL);
|
||||
}
|
||||
|
||||
$this->add_action_buttons();
|
||||
|
||||
$this->set_data($cohort);
|
||||
|
|
|
@ -25,10 +25,12 @@
|
|||
require('../config.php');
|
||||
require($CFG->dirroot.'/cohort/lib.php');
|
||||
require_once($CFG->libdir.'/adminlib.php');
|
||||
require_once($CFG->libdir.'/coursecatlib.php');
|
||||
|
||||
$contextid = optional_param('contextid', 0, PARAM_INT);
|
||||
$page = optional_param('page', 0, PARAM_INT);
|
||||
$searchquery = optional_param('search', '', PARAM_RAW);
|
||||
$showall = optional_param('showall', false, PARAM_BOOL);
|
||||
|
||||
require_login();
|
||||
|
||||
|
@ -61,13 +63,18 @@ if ($category) {
|
|||
$PAGE->set_url('/cohort/index.php', array('contextid'=>$context->id));
|
||||
$PAGE->set_title($strcohorts);
|
||||
$PAGE->set_heading($COURSE->fullname);
|
||||
$showall = false;
|
||||
} else {
|
||||
admin_externalpage_setup('cohorts', '', null, '', array('pagelayout'=>'report'));
|
||||
}
|
||||
|
||||
echo $OUTPUT->header();
|
||||
|
||||
if ($showall) {
|
||||
$cohorts = cohort_get_all_cohorts($page, 25, $searchquery);
|
||||
} else {
|
||||
$cohorts = cohort_get_cohorts($context->id, $page, 25, $searchquery);
|
||||
}
|
||||
|
||||
$count = '';
|
||||
if ($cohorts['allcohorts'] > 0) {
|
||||
|
@ -80,6 +87,22 @@ if ($cohorts['allcohorts'] > 0) {
|
|||
|
||||
echo $OUTPUT->heading(get_string('cohortsin', 'cohort', $context->get_context_name()).$count);
|
||||
|
||||
$params = array('page' => $page);
|
||||
if ($contextid) {
|
||||
$params['contextid'] = $contextid;
|
||||
}
|
||||
if ($searchquery) {
|
||||
$params['search'] = $searchquery;
|
||||
}
|
||||
if ($showall) {
|
||||
$params['showall'] = true;
|
||||
}
|
||||
$baseurl = new moodle_url('/cohort/index.php', $params);
|
||||
|
||||
if ($editcontrols = cohort_edit_controls($context, $baseurl)) {
|
||||
echo $OUTPUT->render($editcontrols);
|
||||
}
|
||||
|
||||
// Add search form.
|
||||
$search = html_writer::start_tag('form', array('id'=>'searchcohortquery', 'method'=>'get'));
|
||||
$search .= html_writer::start_tag('div');
|
||||
|
@ -87,25 +110,26 @@ $search .= html_writer::label(get_string('searchcohort', 'cohort'), 'cohort_sear
|
|||
$search .= html_writer::empty_tag('input', array('id'=>'cohort_search_q', 'type'=>'text', 'name'=>'search', 'value'=>$searchquery));
|
||||
$search .= html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('search', 'cohort')));
|
||||
$search .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'contextid', 'value'=>$contextid));
|
||||
$search .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'showall', 'value'=>$showall));
|
||||
$search .= html_writer::end_tag('div');
|
||||
$search .= html_writer::end_tag('form');
|
||||
echo $search;
|
||||
|
||||
|
||||
// Output pagination bar.
|
||||
$params = array('page' => $page);
|
||||
if ($contextid) {
|
||||
$params['contextid'] = $contextid;
|
||||
}
|
||||
if ($search) {
|
||||
$params['search'] = $searchquery;
|
||||
}
|
||||
$baseurl = new moodle_url('/cohort/index.php', $params);
|
||||
echo $OUTPUT->paging_bar($cohorts['totalcohorts'], $page, 25, $baseurl);
|
||||
|
||||
$data = array();
|
||||
foreach($cohorts['cohorts'] as $cohort) {
|
||||
$line = array();
|
||||
$cohortcontext = context::instance_by_id($cohort->contextid);
|
||||
if ($showall) {
|
||||
if ($cohortcontext->contextlevel == CONTEXT_COURSECAT) {
|
||||
$cat = coursecat::get($cohortcontext->instanceid);
|
||||
$line[] = html_writer::link(new moodle_url('/cohort/index.php' , array('contextid' => $cohort->contextid)), $cat->get_formatted_name());
|
||||
} else {
|
||||
$line[] = get_string('coresystem');
|
||||
}
|
||||
}
|
||||
$line[] = format_string($cohort->name);
|
||||
$line[] = s($cohort->idnumber); // All idnumbers are plain text.
|
||||
$line[] = format_text($cohort->description, $cohort->descriptionformat);
|
||||
|
@ -120,12 +144,19 @@ foreach($cohorts['cohorts'] as $cohort) {
|
|||
|
||||
$buttons = array();
|
||||
if (empty($cohort->component)) {
|
||||
if ($manager) {
|
||||
$buttons[] = html_writer::link(new moodle_url('/cohort/edit.php', array('id'=>$cohort->id, 'delete'=>1)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('t/delete'), 'alt'=>get_string('delete'), 'class'=>'iconsmall')));
|
||||
$buttons[] = html_writer::link(new moodle_url('/cohort/edit.php', array('id'=>$cohort->id)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('t/edit'), 'alt'=>get_string('edit'), 'class'=>'iconsmall')));
|
||||
$cohortmanager = has_capability('moodle/cohort:manage', $cohortcontext);
|
||||
$cohortcanassign = has_capability('moodle/cohort:assign', $cohortcontext);
|
||||
|
||||
$urlparams = array('id' => $cohort->id, 'returnurl' => $baseurl->out_as_local_url());
|
||||
if ($cohortmanager) {
|
||||
$buttons[] = html_writer::link(new moodle_url('/cohort/edit.php', $urlparams + array('delete' => 1)),
|
||||
html_writer::empty_tag('img', array('src' => $OUTPUT->pix_url('t/delete'), 'alt' => get_string('delete'), 'class' => 'iconsmall')));
|
||||
$buttons[] = html_writer::link(new moodle_url('/cohort/edit.php', $urlparams),
|
||||
html_writer::empty_tag('img', array('src' => $OUTPUT->pix_url('t/edit'), 'alt' => get_string('edit'), 'class' => 'iconsmall')));
|
||||
}
|
||||
if ($manager or $canassign) {
|
||||
$buttons[] = html_writer::link(new moodle_url('/cohort/assign.php', array('id'=>$cohort->id)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('i/users'), 'alt'=>get_string('assign', 'core_cohort'), 'class'=>'iconsmall')));
|
||||
if ($cohortcanassign) {
|
||||
$buttons[] = html_writer::link(new moodle_url('/cohort/assign.php', $urlparams),
|
||||
html_writer::empty_tag('img', array('src' => $OUTPUT->pix_url('i/users'), 'alt' => get_string('assign', 'core_cohort'), 'class' => 'iconsmall')));
|
||||
}
|
||||
}
|
||||
$line[] = implode(' ', $buttons);
|
||||
|
@ -136,14 +167,13 @@ $table = new html_table();
|
|||
$table->head = array(get_string('name', 'cohort'), get_string('idnumber', 'cohort'), get_string('description', 'cohort'),
|
||||
get_string('memberscount', 'cohort'), get_string('component', 'cohort'), get_string('edit'));
|
||||
$table->colclasses = array('leftalign name', 'leftalign id', 'leftalign description', 'leftalign size','centeralign source', 'centeralign action');
|
||||
if ($showall) {
|
||||
array_unshift($table->head, get_string('category'));
|
||||
array_unshift($table->colclasses, 'leftalign category');
|
||||
}
|
||||
$table->id = 'cohorts';
|
||||
$table->attributes['class'] = 'admintable generaltable';
|
||||
$table->data = $data;
|
||||
echo html_writer::table($table);
|
||||
echo $OUTPUT->paging_bar($cohorts['totalcohorts'], $page, 25, $baseurl);
|
||||
|
||||
if ($manager) {
|
||||
echo $OUTPUT->single_button(new moodle_url('/cohort/edit.php', array('contextid'=>$context->id)), get_string('add'));
|
||||
}
|
||||
|
||||
echo $OUTPUT->footer();
|
||||
|
|
173
cohort/lib.php
173
cohort/lib.php
|
@ -247,9 +247,40 @@ function cohort_get_visible_list($course, $onlyenrolled=true) {
|
|||
return $cohorts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Produces a part of SQL query to filter cohorts by the search string
|
||||
*
|
||||
* Called from {@link cohort_get_cohorts()} and {@link cohort_get_all_cohorts()}
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @param string $search
|
||||
* @return array of two elements - SQL condition and array of unnamed parameters
|
||||
*/
|
||||
function cohort_get_search_query($search) {
|
||||
global $DB;
|
||||
$params = array();
|
||||
if (empty($search)) {
|
||||
// This function should not be called if there is no search string, just in case return dummy query.
|
||||
return array('1=1', $params);
|
||||
}
|
||||
$searchparam = '%' . $DB->sql_like_escape($search) . '%';
|
||||
$conditions = array();
|
||||
$fields = array('name', 'idnumber', 'description');
|
||||
foreach ($fields as $field) {
|
||||
$conditions[] = $DB->sql_like($field, "?", false);
|
||||
$params[] = $searchparam;
|
||||
}
|
||||
$sql = '(' . implode(' OR ', $conditions) . ')';
|
||||
return array($sql, $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the cohorts defined in given context.
|
||||
*
|
||||
* The function does not check user capability to view/manage cohorts in the given context
|
||||
* assuming that it has been already verified.
|
||||
*
|
||||
* @param int $contextid
|
||||
* @param int $page number of the current page
|
||||
* @param int $perpage items per page
|
||||
|
@ -259,29 +290,137 @@ function cohort_get_visible_list($course, $onlyenrolled=true) {
|
|||
function cohort_get_cohorts($contextid, $page = 0, $perpage = 25, $search = '') {
|
||||
global $DB;
|
||||
|
||||
// Add some additional sensible conditions
|
||||
$tests = array('contextid = ?');
|
||||
$params = array($contextid);
|
||||
|
||||
if (!empty($search)) {
|
||||
$conditions = array('name', 'idnumber', 'description');
|
||||
$searchparam = '%' . $DB->sql_like_escape($search) . '%';
|
||||
foreach ($conditions as $key=>$condition) {
|
||||
$conditions[$key] = $DB->sql_like($condition, "?", false);
|
||||
$params[] = $searchparam;
|
||||
}
|
||||
$tests[] = '(' . implode(' OR ', $conditions) . ')';
|
||||
}
|
||||
$wherecondition = implode(' AND ', $tests);
|
||||
|
||||
$fields = "SELECT *";
|
||||
$countfields = "SELECT COUNT(1)";
|
||||
$sql = " FROM {cohort}
|
||||
WHERE $wherecondition";
|
||||
WHERE contextid = ?";
|
||||
$params = array($contextid);
|
||||
$order = " ORDER BY name ASC, idnumber ASC";
|
||||
$allcohorts = $DB->count_records('cohort', array('contextid'=>$contextid));
|
||||
|
||||
if (!empty($search)) {
|
||||
list($searchcondition, $searchparams) = cohort_get_search_query($search);
|
||||
$sql .= ' AND ' . $searchcondition;
|
||||
$params = array_merge($params, $searchparams);
|
||||
}
|
||||
|
||||
$totalcohorts = $allcohorts = $DB->count_records('cohort', array('contextid' => $contextid));
|
||||
if (!empty($search)) {
|
||||
$totalcohorts = $DB->count_records_sql($countfields . $sql, $params);
|
||||
}
|
||||
$cohorts = $DB->get_records_sql($fields . $sql . $order, $params, $page*$perpage, $perpage);
|
||||
|
||||
return array('totalcohorts' => $totalcohorts, 'cohorts' => $cohorts, 'allcohorts' => $allcohorts);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the cohorts defined anywhere in system.
|
||||
*
|
||||
* The function assumes that user capability to view/manage cohorts on system level
|
||||
* has already been verified. This function only checks if such capabilities have been
|
||||
* revoked in child (categories) contexts.
|
||||
*
|
||||
* @param int $page number of the current page
|
||||
* @param int $perpage items per page
|
||||
* @param string $search search string
|
||||
* @return array Array(totalcohorts => int, cohorts => array, allcohorts => int)
|
||||
*/
|
||||
function cohort_get_all_cohorts($page = 0, $perpage = 25, $search = '') {
|
||||
global $DB;
|
||||
|
||||
$fields = "SELECT c.*, ".context_helper::get_preload_record_columns_sql('ctx');
|
||||
$countfields = "SELECT COUNT(*)";
|
||||
$sql = " FROM {cohort} c
|
||||
JOIN {context} ctx ON ctx.id = c.contextid ";
|
||||
$params = array();
|
||||
$wheresql = '';
|
||||
|
||||
if ($excludedcontexts = cohort_get_invisible_contexts()) {
|
||||
list($excludedsql, $excludedparams) = $DB->get_in_or_equal($excludedcontexts, SQL_PARAMS_QM, null, false);
|
||||
$wheresql = ' WHERE c.contextid '.$excludedsql;
|
||||
$params = array_merge($params, $excludedparams);
|
||||
}
|
||||
|
||||
$totalcohorts = $allcohorts = $DB->count_records_sql($countfields . $sql . $wheresql, $params);
|
||||
|
||||
if (!empty($search)) {
|
||||
list($searchcondition, $searchparams) = cohort_get_search_query($search);
|
||||
$wheresql .= ($wheresql ? ' AND ' : ' WHERE ') . $searchcondition;
|
||||
$params = array_merge($params, $searchparams);
|
||||
$totalcohorts = $DB->count_records_sql($countfields . $sql . $wheresql, $params);
|
||||
}
|
||||
|
||||
$order = " ORDER BY c.name ASC, c.idnumber ASC";
|
||||
$cohorts = $DB->get_records_sql($fields . $sql . $wheresql . $order, $params, $page*$perpage, $perpage);
|
||||
|
||||
// Preload used contexts, they will be used to check view/manage/assign capabilities and display categories names.
|
||||
foreach (array_keys($cohorts) as $key) {
|
||||
context_helper::preload_from_record($cohorts[$key]);
|
||||
}
|
||||
|
||||
return array('totalcohorts' => $totalcohorts, 'cohorts' => $cohorts, 'allcohorts' => $allcohorts);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns list of contexts where cohorts are present but current user does not have capability to view/manage them.
|
||||
*
|
||||
* This function is called from {@link cohort_get_all_cohorts()} to ensure correct pagination in rare cases when user
|
||||
* is revoked capability in child contexts. It assumes that user's capability to view/manage cohorts on system
|
||||
* level has already been verified.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @return array array of context ids
|
||||
*/
|
||||
function cohort_get_invisible_contexts() {
|
||||
global $DB;
|
||||
if (is_siteadmin()) {
|
||||
// Shortcut, admin can do anything and can not be prohibited from any context.
|
||||
return array();
|
||||
}
|
||||
$records = $DB->get_recordset_sql("SELECT DISTINCT ctx.id, ".context_helper::get_preload_record_columns_sql('ctx')." ".
|
||||
"FROM {context} ctx JOIN {cohort} c ON ctx.id = c.contextid ");
|
||||
$excludedcontexts = array();
|
||||
foreach ($records as $ctx) {
|
||||
context_helper::preload_from_record($ctx);
|
||||
if (!has_any_capability(array('moodle/cohort:manage', 'moodle/cohort:view'), context::instance_by_id($ctx->id))) {
|
||||
$excludedcontexts[] = $ctx->id;
|
||||
}
|
||||
}
|
||||
return $excludedcontexts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns navigation controls (tabtree) to be displayed on cohort management pages
|
||||
*
|
||||
* @param context $context system or category context where cohorts controls are about to be displayed
|
||||
* @param moodle_url $currenturl
|
||||
* @return null|renderable
|
||||
*/
|
||||
function cohort_edit_controls(context $context, moodle_url $currenturl) {
|
||||
$tabs = array();
|
||||
$currenttab = 'view';
|
||||
$viewurl = new moodle_url('/cohort/index.php', array('contextid' => $context->id));
|
||||
if (($searchquery = $currenturl->get_param('search'))) {
|
||||
$viewurl->param('search', $searchquery);
|
||||
}
|
||||
if ($context->contextlevel == CONTEXT_SYSTEM) {
|
||||
$tabs[] = new tabobject('view', new moodle_url($viewurl, array('showall' => 0)), get_string('systemcohorts', 'cohort'));
|
||||
$tabs[] = new tabobject('viewall', new moodle_url($viewurl, array('showall' => 1)), get_string('allcohorts', 'cohort'));
|
||||
if ($currenturl->get_param('showall')) {
|
||||
$currenttab = 'viewall';
|
||||
}
|
||||
} else {
|
||||
$tabs[] = new tabobject('view', $viewurl, get_string('cohorts', 'cohort'));
|
||||
}
|
||||
if (has_capability('moodle/cohort:manage', $context)) {
|
||||
$addurl = new moodle_url('/cohort/edit.php', array('contextid' => $context->id));
|
||||
$tabs[] = new tabobject('addcohort', $addurl, get_string('addcohort', 'cohort'));
|
||||
if ($currenturl->get_path() === $addurl->get_path() && !$currenturl->param('id')) {
|
||||
$currenttab = 'addcohort';
|
||||
}
|
||||
}
|
||||
if (count($tabs) > 1) {
|
||||
return new tabtree($tabs, $currenttab);
|
||||
}
|
||||
return null;
|
||||
}
|
|
@ -13,7 +13,7 @@ Feature: Add cohorts of users
|
|||
| user4 | Forth | User | forth@user.com |
|
||||
And I log in as "admin"
|
||||
And I navigate to "Cohorts" node in "Site administration > Users > Accounts"
|
||||
And I press "Add"
|
||||
And I follow "Add new cohort"
|
||||
And I set the following fields to these values:
|
||||
| Name | Test cohort name |
|
||||
| Context | System |
|
||||
|
|
67
cohort/tests/behat/view_cohorts.feature
Normal file
67
cohort/tests/behat/view_cohorts.feature
Normal file
|
@ -0,0 +1,67 @@
|
|||
@core @core_cohort
|
||||
Feature: View cohort list
|
||||
In order to operate with cohorts
|
||||
As an admin or manager
|
||||
I need to be able to view the list of cohorts in the system
|
||||
|
||||
Background:
|
||||
Given the following "categories" exist:
|
||||
| name | category | idnumber |
|
||||
| Cat 1 | 0 | CAT1 |
|
||||
| Cat 2 | 0 | CAT2 |
|
||||
| Cat 3 | CAT1 | CAT3 |
|
||||
And the following "cohorts" exist:
|
||||
| name | idnumber |
|
||||
| System cohort | CH0 |
|
||||
And the following "cohorts" exist:
|
||||
| name | idnumber | contextlevel | reference |
|
||||
| Cohort in category 1 | CH1 | Category | CAT1 |
|
||||
| Cohort in category 2 | CH2 | Category | CAT2 |
|
||||
| Cohort in category 3 | CH3 | Category | CAT3 |
|
||||
Given the following "users" exist:
|
||||
| username | firstname | lastname | email |
|
||||
| user1 | First | User | first@user.com |
|
||||
| user2 | Second | User | second@user.com |
|
||||
And the following "role assigns" exist:
|
||||
| user | role | contextlevel | reference |
|
||||
| user1 | manager | System | |
|
||||
| user2 | manager | Category | CAT1 |
|
||||
|
||||
@javascript
|
||||
Scenario: Admin can see system cohorts and all cohorts
|
||||
When I log in as "admin"
|
||||
And I navigate to "Cohorts" node in "Site administration > Users > Accounts"
|
||||
Then I should see "System cohort"
|
||||
And I should not see "Cohort in category"
|
||||
And I follow "All cohorts"
|
||||
And I should see "System cohort"
|
||||
And I should see "Cohort in category 1"
|
||||
And I should see "Cohort in category 2"
|
||||
And I should see "Cohort in category 3"
|
||||
And I log out
|
||||
|
||||
@javascript
|
||||
Scenario: Manager can see system cohorts and all cohorts
|
||||
When I log in as "user1"
|
||||
And I navigate to "Cohorts" node in "Site administration > Users > Accounts"
|
||||
Then I should see "System cohort"
|
||||
And I should not see "Cohort in category"
|
||||
And I follow "All cohorts"
|
||||
And I should see "System cohort"
|
||||
And I should see "Cohort in category 1"
|
||||
And I should see "Cohort in category 2"
|
||||
And I should see "Cohort in category 3"
|
||||
And I log out
|
||||
|
||||
@javascript
|
||||
Scenario: Manager in category can see cohorts in the category
|
||||
When I log in as "user2"
|
||||
And I follow "Courses"
|
||||
And I follow "Cat 1"
|
||||
And I follow "Cohorts"
|
||||
And I should not see "All cohorts"
|
||||
And I should not see "System cohort"
|
||||
And I should see "Cohort in category 1"
|
||||
And I should not see "Cohort in category 2"
|
||||
And I should not see "Cohort in category 3"
|
||||
And I log out
|
|
@ -473,5 +473,74 @@ class core_cohort_cohortlib_testcase extends advanced_testcase {
|
|||
$this->assertEquals(0, $result['totalcohorts']);
|
||||
$this->assertEquals(array(), $result['cohorts']);
|
||||
$this->assertEquals(3, $result['allcohorts']);
|
||||
|
||||
$result = cohort_get_cohorts(context_system::instance()->id);
|
||||
$this->assertEquals(1, $result['totalcohorts']);
|
||||
$this->assertEquals(array($cohort4->id=>$cohort4), $result['cohorts']);
|
||||
$this->assertEquals(1, $result['allcohorts']);
|
||||
}
|
||||
|
||||
public function test_cohort_get_all_cohorts() {
|
||||
global $DB;
|
||||
|
||||
$this->resetAfterTest();
|
||||
|
||||
$category1 = $this->getDataGenerator()->create_category();
|
||||
$category2 = $this->getDataGenerator()->create_category();
|
||||
|
||||
$cohort1 = $this->getDataGenerator()->create_cohort(array('contextid'=>context_coursecat::instance($category1->id)->id, 'name'=>'aaagrrryyy', 'idnumber'=>'','description'=>''));
|
||||
$cohort2 = $this->getDataGenerator()->create_cohort(array('contextid'=>context_coursecat::instance($category1->id)->id, 'name'=>'bbb', 'idnumber'=>'', 'description'=>'yyybrrr'));
|
||||
$cohort3 = $this->getDataGenerator()->create_cohort(array('contextid'=>context_coursecat::instance($category2->id)->id, 'name'=>'ccc', 'idnumber'=>'xxarrrghyyy', 'description'=>'po_us'));
|
||||
$cohort4 = $this->getDataGenerator()->create_cohort(array('contextid'=>context_system::instance()->id));
|
||||
|
||||
// Get list of all cohorts as admin.
|
||||
$this->setAdminUser();
|
||||
|
||||
$result = cohort_get_all_cohorts(0, 100, '');
|
||||
$this->assertEquals(4, $result['totalcohorts']);
|
||||
$this->assertEquals(array($cohort1->id=>$cohort1, $cohort2->id=>$cohort2, $cohort3->id=>$cohort3, $cohort4->id=>$cohort4), $result['cohorts']);
|
||||
$this->assertEquals(4, $result['allcohorts']);
|
||||
|
||||
$result = cohort_get_all_cohorts(0, 100, 'grrr');
|
||||
$this->assertEquals(1, $result['totalcohorts']);
|
||||
$this->assertEquals(array($cohort1->id=>$cohort1), $result['cohorts']);
|
||||
$this->assertEquals(4, $result['allcohorts']);
|
||||
|
||||
// Get list of all cohorts as manager who has capability everywhere.
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
$managerrole = $DB->get_record('role', array('shortname' => 'manager'));
|
||||
role_assign($managerrole->id, $user->id, context_system::instance()->id);
|
||||
$this->setUser($user);
|
||||
|
||||
$result = cohort_get_all_cohorts(0, 100, '');
|
||||
$this->assertEquals(4, $result['totalcohorts']);
|
||||
$this->assertEquals(array($cohort1->id=>$cohort1, $cohort2->id=>$cohort2, $cohort3->id=>$cohort3, $cohort4->id=>$cohort4), $result['cohorts']);
|
||||
$this->assertEquals(4, $result['allcohorts']);
|
||||
|
||||
$result = cohort_get_all_cohorts(0, 100, 'grrr');
|
||||
$this->assertEquals(1, $result['totalcohorts']);
|
||||
$this->assertEquals(array($cohort1->id=>$cohort1), $result['cohorts']);
|
||||
$this->assertEquals(4, $result['allcohorts']);
|
||||
|
||||
// Get list of all cohorts as manager who has capability everywhere except category2.
|
||||
$context2 = context_coursecat::instance($category2->id);
|
||||
role_change_permission($managerrole->id, $context2, 'moodle/cohort:view', CAP_PROHIBIT);
|
||||
role_change_permission($managerrole->id, $context2, 'moodle/cohort:manage', CAP_PROHIBIT);
|
||||
$this->assertFalse(has_any_capability(array('moodle/cohort:view', 'moodle/cohort:manage'), $context2));
|
||||
|
||||
$result = cohort_get_all_cohorts(0, 100, '');
|
||||
$this->assertEquals(3, $result['totalcohorts']);
|
||||
$this->assertEquals(array($cohort1->id=>$cohort1, $cohort2->id=>$cohort2, $cohort4->id=>$cohort4), $result['cohorts']);
|
||||
$this->assertEquals(3, $result['allcohorts']);
|
||||
|
||||
$result = cohort_get_all_cohorts(0, 100, 'grrr');
|
||||
$this->assertEquals(1, $result['totalcohorts']);
|
||||
$this->assertEquals(array($cohort1->id=>$cohort1), $result['cohorts']);
|
||||
$this->assertEquals(3, $result['allcohorts']);
|
||||
|
||||
$result = cohort_get_cohorts(context_coursecat::instance($category1->id)->id, 1, 1, 'yyy');
|
||||
$this->assertEquals(2, $result['totalcohorts']);
|
||||
$this->assertEquals(array($cohort2->id=>$cohort2), $result['cohorts']);
|
||||
$this->assertEquals(2, $result['allcohorts']);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
*/
|
||||
|
||||
$string['addcohort'] = 'Add new cohort';
|
||||
$string['allcohorts'] = 'All cohorts';
|
||||
$string['anycohort'] = 'Any';
|
||||
$string['assign'] = 'Assign';
|
||||
$string['assignto'] = 'Cohort \'{$a}\' members';
|
||||
|
@ -59,6 +60,7 @@ $string['potusers'] = 'Potential users';
|
|||
$string['potusersmatching'] = 'Potential matching users';
|
||||
$string['removeuserwarning'] = 'Removing users from a cohort may result in unenrolling of users from multiple courses which includes deleting of user settings, grades, group membership and other user information from affected courses.';
|
||||
$string['selectfromcohort'] = 'Select members from cohort';
|
||||
$string['systemcohorts'] = 'System cohorts';
|
||||
$string['unknowncohort'] = 'Unknown cohort ({$a})!';
|
||||
$string['useradded'] = 'User added to cohort "{$a}"';
|
||||
$string['search'] = 'Search';
|
||||
|
|
|
@ -5156,7 +5156,7 @@ abstract class context extends stdClass implements IteratorAggregate {
|
|||
* @return void (modifies $rec)
|
||||
*/
|
||||
protected static function preload_from_record(stdClass $rec) {
|
||||
if (empty($rec->ctxid) or empty($rec->ctxlevel) or empty($rec->ctxinstance) or empty($rec->ctxpath) or empty($rec->ctxdepth)) {
|
||||
if (empty($rec->ctxid) or empty($rec->ctxlevel) or !isset($rec->ctxinstance) or empty($rec->ctxpath) or empty($rec->ctxdepth)) {
|
||||
// $rec does not have enough data, passed here repeatedly or context does not exist yet
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue