diff --git a/badges/award.php b/badges/award.php index bf75d0d5785..3d3aba7ec97 100644 --- a/badges/award.php +++ b/badges/award.php @@ -30,6 +30,7 @@ require_once($CFG->dirroot . '/badges/lib/awardlib.php'); $badgeid = required_param('id', PARAM_INT); $role = optional_param('role', 0, PARAM_INT); +$award = optional_param('award', false, PARAM_BOOL); require_login(); @@ -44,6 +45,9 @@ $isadmin = is_siteadmin($USER); $navurl = new moodle_url('/badges/index.php', array('type' => $badge->type)); if ($badge->type == BADGE_TYPE_COURSE) { + if (empty($CFG->badges_allowcoursebadges)) { + print_error('coursebadgesdisabled', 'badges'); + } require_login($badge->courseid); $navurl = new moodle_url('/badges/index.php', array('type' => $badge->type, 'id' => $badge->courseid)); } @@ -72,37 +76,52 @@ if (!$badge->is_active()) { $output = $PAGE->get_renderer('core', 'badges'); // Roles that can award this badge. -$accepted_roles = array_keys($badge->criteria[BADGE_CRITERIA_TYPE_MANUAL]->params); +$acceptedroles = array_keys($badge->criteria[BADGE_CRITERIA_TYPE_MANUAL]->params); -// If site admin, select a role to award a badge. -if ($isadmin) { - list($usertest, $userparams) = $DB->get_in_or_equal($accepted_roles, SQL_PARAMS_NAMED, 'existing', true); +if (count($acceptedroles) > 1) { + // If there is more than one role that can award a badge, prompt user to make a selection. + // If it is an admin, include all accepted roles, otherwise only the ones that current user has in this context. + if ($isadmin) { + $selection = $acceptedroles; + } else { + // Get all the roles that user has and use the ones required by this badge. + $roles = get_user_roles($context, $USER->id); + $roleids = array_map(create_function('$o', 'return $o->roleid;'), $roles); + $selection = array_intersect($acceptedroles, $roleids); + } + list($usertest, $userparams) = $DB->get_in_or_equal($selection, SQL_PARAMS_NAMED, 'existing', true); $options = $DB->get_records_sql('SELECT * FROM {role} WHERE id ' . $usertest, $userparams); foreach ($options as $p) { $select[$p->id] = role_get_name($p); } if (!$role) { + $pageurl = new moodle_url('/badges/award.php', array('id' => $badgeid)); echo $OUTPUT->header(); - echo $OUTPUT->box(get_string('adminaward', 'badges') . $OUTPUT->single_select(new moodle_url($PAGE->url), 'role', $select)); + echo $OUTPUT->box(get_string('selectaward', 'badges') . $OUTPUT->single_select(new moodle_url($pageurl), 'role', $select)); echo $OUTPUT->footer(); die(); } else { + $pageurl = new moodle_url('/badges/award.php', array('id' => $badgeid)); $issuerrole = new stdClass(); $issuerrole->roleid = $role; - $roleselect = get_string('adminaward', 'badges') . $OUTPUT->single_select(new moodle_url($PAGE->url), 'role', $select, $role); + $roleselect = get_string('selectaward', 'badges') . $OUTPUT->single_select(new moodle_url($pageurl), 'role', $select, $role); } } else { - // Current user's role. - $roles = get_user_roles($context, $USER->id); - $issuerrole = array_shift($roles); - if (!isset($issuerrole->roleid) || !in_array($issuerrole->roleid, $accepted_roles)) { + // User has to be an admin or the one with the required role. + $users = get_role_users($acceptedroles[0], $context, false, 'u.id', 'u.id ASC'); + $usersids = array_keys($users); + if (!$isadmin && !in_array($USER->id, $usersids)) { echo $OUTPUT->header(); $rlink = html_writer::link(new moodle_url('recipients.php', array('id' => $badge->id)), get_string('recipients', 'badges')); echo $OUTPUT->notification(get_string('notacceptedrole', 'badges', $rlink)); echo $OUTPUT->footer(); die(); + } else { + $issuerrole = new stdClass(); + $issuerrole->roleid = $acceptedroles[0]; } } + $options = array( 'badgeid' => $badge->id, 'context' => $context, @@ -113,7 +132,7 @@ $existingselector = new badge_existing_users_selector('existingrecipients', $opt $recipientselector = new badge_potential_users_selector('potentialrecipients', $options); $recipientselector->set_existing_recipients($existingselector->find_users('')); -if (optional_param('award', false, PARAM_BOOL) && data_submitted() && has_capability('moodle/badges:awardbadge', $context)) { +if ($award && data_submitted() && has_capability('moodle/badges:awardbadge', $context)) { require_sesskey(); $users = $recipientselector->get_selected_users(); foreach ($users as $user) { @@ -136,7 +155,7 @@ if (optional_param('award', false, PARAM_BOOL) && data_submitted() && has_capabi echo $OUTPUT->header(); echo $OUTPUT->heading($strrecipients); -if ($isadmin) { +if (count($acceptedroles) > 1) { echo $OUTPUT->box($roleselect); } diff --git a/lang/en/badges.php b/lang/en/badges.php index 9d26764589a..a5701206b32 100644 --- a/lang/en/badges.php +++ b/lang/en/badges.php @@ -34,7 +34,6 @@ $string['addcriteriatext'] = 'To start adding criteria, please select one of the $string['addcourse'] = 'Add courses'; $string['addcourse_help'] = 'Select all courses that should be added to this badge requirement. Hold CTRL key to select multiple items.'; $string['addtobackpack'] = 'Add to backpack'; -$string['adminaward'] = 'As a site administrator, you can select a role to award this badge.'; $string['adminonly'] = 'This page is restricted to Site Administrators only'; $string['after'] = 'after the date of issue.'; $string['aggregationmethod'] = 'Aggregation method'; @@ -312,6 +311,7 @@ $string['reviewconfirm'] = '
This action will perform a check if any of the us
Would you like to proceed?
'; $string['save'] = 'Save'; $string['searchname'] = 'Search by name'; +$string['selectaward'] = 'Please select the role you would like to use to award this badge: '; $string['selectgroup_end'] = 'Only public collections are shown, visit your backpack to create more public collections.'; $string['selectgroup_start'] = 'Select collections from your backpack to display on this site:'; $string['selecting'] = 'With selected badges...';