Skip to content

Commit

Permalink
MDL-39063 badges: Improve external backpack usability and workflow
Browse files Browse the repository at this point in the history
  • Loading branch information
Yuliya Bozhko committed Apr 15, 2013
1 parent 9aae755 commit e280531
Show file tree
Hide file tree
Showing 17 changed files with 500 additions and 267 deletions.
9 changes: 8 additions & 1 deletion admin/settings/badges.php
Expand Up @@ -70,7 +70,14 @@
new admin_externalpage('managebadges',
new lang_string('managebadges', 'badges'),
new moodle_url($CFG->wwwroot . '/badges/index.php', array('type' => BADGE_TYPE_SITE)),
array('moodle/badges:viewawarded')
array(
'moodle/badges:viewawarded',
'moodle/badges:createbadge',
'moodle/badges:awardbadge',
'moodle/badges:configuremessages',
'moodle/badges:configuredetails',
'moodle/badges:deletebadge'
)
)
);

Expand Down
2 changes: 1 addition & 1 deletion badges/action.php
Expand Up @@ -125,7 +125,7 @@
} else {
$awards = $badge->review_all_criteria();
$returnurl->param('awards', $awards);
}
}
redirect($returnurl);
}

Expand Down
100 changes: 68 additions & 32 deletions badges/backpack_form.php
Expand Up @@ -42,69 +42,105 @@ public function definition() {
global $USER;
$mform = $this->_form;

$mform->addElement('header', 'backpackheader', get_string('backpackdetails', 'badges'));
$mform->addElement('header', 'backpackheader', get_string('backpackconnection', 'badges'));
$mform->addHelpButton('backpackheader', 'backpackconnection', 'badges');
$mform->addElement('static', 'url', get_string('url'), 'http://backpack.openbadges.org');
$status = html_writer::tag('span', get_string('notconnected', 'badges'), array('class' => 'notconnected'));
$mform->addElement('static', 'status', get_string('status'), $status);

$mform->addElement('text', 'email', get_string('email'), array('size' => '50'));
$mform->setDefault('email', $USER->email);
$mform->setType('email', PARAM_EMAIL);
$mform->setType('email', PARAM_RAW);
$mform->addRule('email', get_string('required'), 'required', null , 'client');
$mform->addRule('email', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
$mform->addHelpButton('email', 'backpackemail', 'badges');

$mform->addElement('hidden', 'userid', $USER->id);
$mform->setType('userid', PARAM_INT);

$mform->addElement('hidden', 'backpackurl', 'http://backpack.openbadges.org');
$mform->setType('backpackurl', PARAM_URL);

$this->add_action_buttons();
$this->add_action_buttons(true, get_string('connect', 'badges'));
}

/**
* Validates form data
*/
public function validation($data, $files) {
global $DB;
$errors = parent::validation($data, $files);

if (!validate_email($data['email'])) {
$errors['email'] = get_string('invalidemail');
} else {
$check = new stdClass();
$check->backpackurl = $data['backpackurl'];
$check->email = $data['email'];

$bp = new OpenBadgesBackpackHandler($check);
$request = $bp->curl_request('user');
if (isset($request->status) && $request->status == 'missing') {
$errors['email'] = get_string('error:nosuchuser', 'badges');
}
}
return $errors;
}
}

/**
* Form to select backpack group options.
* Form to select backpack collections.
*
*/
class edit_backpack_group_form extends moodleform {
class edit_collections_form extends moodleform {

/**
* Defines the form
*/
public function definition() {
global $USER;
$mform = $this->_form;
$data = $this->_customdata['data'];
$groups = $this->_customdata['groups'];
$uid = $this->_customdata['backpackuid'];

$selet = array();
foreach ($groups as $group) {
$select[$group->groupId] = $group->name;
$email = $this->_customdata['email'];
$bid = $this->_customdata['backpackid'];
$selected = $this->_customdata['selected'];

if (isset($this->_customdata['groups'])) {
$groups = $this->_customdata['groups'];
$nogroups = null;
} else {
$groups = null;
$nogroups = $this->_customdata['nogroups'];
}

$mform->addElement('header', 'groupheader', get_string('backpackdetails', 'badges'));
$mform->addElement('header', 'backpackheader', get_string('backpackconnection', 'badges'));
$mform->addHelpButton('backpackheader', 'backpackconnection', 'badges');
$mform->addElement('static', 'url', get_string('url'), 'http://backpack.openbadges.org');

$mform->addElement('text', 'email', get_string('email'), array('size' => '50'));
$mform->setType('email', PARAM_EMAIL);
$mform->setDefault('email', $data->email);
$mform->freeze(array('email'));

$mform->addElement('select', 'backpackgid', get_string('selectgroup', 'badges'), $select);
$mform->addRule('backpackgid', get_string('required'), 'required', null , 'client');
if (isset($data->backpackgid)) {
$mform->setDefault('backpackgid', $data->backpackgid);
$status = html_writer::tag('span', get_string('connected', 'badges'), array('class' => 'connected'));
$mform->addElement('static', 'status', get_string('status'), $status);
$mform->addElement('static', 'email', get_string('email'), $email);
$mform->addHelpButton('email', 'backpackemail', 'badges');
$mform->addElement('submit', 'disconnect', get_string('disconnect', 'badges'));

$mform->addElement('header', 'collectionheader', get_string('backpackimport', 'badges'));
$mform->addHelpButton('collectionheader', 'backpackimport', 'badges');

if (!empty($groups)) {
$mform->addElement('static', 'selectgroup', '', get_string('selectgroup_start', 'badges'));
foreach ($groups as $group) {
$name = $group->name . ' (' . $group->badges . ')';
$mform->addElement('advcheckbox', 'group[' . $group->groupId . ']', null, $name, array('group' => 1), array(false, $group->groupId));
if (in_array($group->groupId, $selected)) {
$mform->setDefault('group[' . $group->groupId . ']', $group->groupId);
}
}
$mform->addElement('static', 'selectgroup', '', get_string('selectgroup_end', 'badges'));
} else {
$mform->addElement('static', 'selectgroup', '', $nogroups);
}

$mform->addElement('hidden', 'userid', $data->userid);
$mform->setType('userid', PARAM_INT);

$mform->addElement('hidden', 'backpackurl', 'http://backpack.openbadges.org');
$mform->setType('backpackurl', PARAM_URL);

$mform->addElement('hidden', 'backpackuid', $uid);
$mform->setType('backpackuid', PARAM_INT);
$mform->addElement('hidden', 'backpackid', $bid);
$mform->setType('backpackid', PARAM_INT);

$this->add_action_buttons();
}
}
}
15 changes: 9 additions & 6 deletions badges/edit_form.php
Expand Up @@ -83,8 +83,7 @@ public function definition() {
if (isset($CFG->badges_defaultissuercontact)) {
$mform->setDefault('issuercontact', $CFG->badges_defaultissuercontact);
}
$mform->setType('issuercontact', PARAM_EMAIL);
$mform->addRule('issuercontact', get_string('invalidemail', 'moodle'), 'email', null, 'client', true);
$mform->setType('issuercontact', PARAM_RAW);
$mform->addHelpButton('issuercontact', 'contact', 'badges');

$mform->addElement('header', 'issuancedetails', get_string('issuancedetails', 'badges'));
Expand Down Expand Up @@ -163,6 +162,10 @@ public function validation($data, $files) {
global $DB;
$errors = parent::validation($data, $files);

if (!empty($data['issuercontact']) && !validate_email($data['issuercontact'])) {
$errors['issuercontact'] = get_string('invalidemail');
}

if ($data['expiry'] == 2 && $data['expireperiod'] <= 0) {
$errors['expirydategr'] = get_string('error:invalidexpireperiod', 'badges');
}
Expand All @@ -173,11 +176,11 @@ public function validation($data, $files) {

// Check for duplicate badge names.
if ($data['action'] == 'new') {
$duplicate = $DB->record_exists_select('badge', 'name = :name',
array('name' => $data['name']));
$duplicate = $DB->record_exists_select('badge', 'name = :name AND status != :deleted',
array('name' => $data['name'], 'deleted' => BADGE_STATUS_ARCHIVED));
} else {
$duplicate = $DB->record_exists_select('badge', 'name = :name AND id != :badgeid',
array('name' => $data['name'], 'badgeid' => $data['id']));
$duplicate = $DB->record_exists_select('badge', 'name = :name AND id != :badgeid AND status != :deleted',
array('name' => $data['name'], 'badgeid' => $data['id'], 'deleted' => BADGE_STATUS_ARCHIVED));
}

if ($duplicate) {
Expand Down
8 changes: 7 additions & 1 deletion badges/index.php
Expand Up @@ -87,7 +87,13 @@
);
}

if (!has_capability('moodle/badges:awardbadge', $PAGE->context)) {
if (!has_any_capability(array(
'moodle/badges:viewawarded',
'moodle/badges:createbadge',
'moodle/badges:awardbadge',
'moodle/badges:configuremessages',
'moodle/badges:configuredetails',
'moodle/badges:deletebadge'), $PAGE->context)) {
redirect($CFG->wwwroot);
}

Expand Down
15 changes: 6 additions & 9 deletions badges/lib/backpacklib.php
Expand Up @@ -36,28 +36,26 @@ class OpenBadgesBackpackHandler {
private $backpack;
private $email;
private $backpackuid = 0;
private $backpackgid = 0;

public function __construct($record) {
$this->backpack = $record->backpackurl;
$this->email = $record->email;
$this->backpackuid = isset($record->backpackuid) ? $record->backpackuid : 0;
$this->backpackgid = isset($record->backpackgid) ? $record->backpackgid : 0;
}

public function curl_request($action) {
public function curl_request($action, $collection = null) {
$curl = new curl();

switch($action) {
case 'user':
$url = $this->backpack."/displayer/convert/email";
$url = $this->backpack . "/displayer/convert/email";
$param = array('email' => $this->email);
break;
case 'groups':
$url = $this->backpack . '/displayer/' . $this->backpackuid . '/groups.json';
break;
case 'badges':
$url = $this->backpack . '/displayer/' . $this->backpackuid . '/group/'. $this->backpackgid . '.json';
$url = $this->backpack . '/displayer/' . $this->backpackuid . '/group/' . $collection . '.json';
break;
}

Expand Down Expand Up @@ -86,11 +84,10 @@ private function check_status($status) {
'message' => get_string('error:nosuchuser', 'badges')
);
return $response;
break;
}
}

public function get_groups() {
public function get_collections() {
$json = $this->curl_request('user', $this->email);
if (isset($json->status)) {
if ($json->status != 'okay') {
Expand All @@ -102,13 +99,13 @@ public function get_groups() {
}
}

public function get_badges() {
public function get_badges($collection) {
$json = $this->curl_request('user', $this->email);
if (isset($json->status)) {
if ($json->status != 'okay') {
return $this->check_status($json->status);
} else {
return $this->curl_request('badges');
return $this->curl_request('badges', $collection);
}
}
}
Expand Down

0 comments on commit e280531

Please sign in to comment.