MDL-44342 airnotifier: Added support for the new workflow of registering devices

And also for request access keys to Airnotifier
This commit is contained in:
Juan Leyva 2014-03-24 11:48:00 +01:00
parent 08ca1a5bfd
commit 3570f5e287
15 changed files with 539 additions and 463 deletions

View File

@ -0,0 +1,198 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Airnotifier manager class
*
* @package message_airnotifier
* @category external
* @copyright 2012 Jerome Mouneyrac <jerome@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 2.7
*/
/**
* Airnotifier helper manager class
*
* @copyright 2012 Jerome Mouneyrac <jerome@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class message_airnotifier_manager {
/**
* Include the relevant javascript and language strings for the device
* toolbox YUI module
*
* @return bool
*/
public function include_device_ajax() {
global $PAGE, $CFG;
if (!$CFG->enableajax) {
return false;
}
$config = new stdClass();
// The URL to use for resource changes.
if (!isset($config->resturl)) {
$config->resturl = '/message/output/airnotifier/rest.php';
}
// Any additional parameters which need to be included on page submission.
if (!isset($config->pageparams)) {
$config->pageparams = array();
}
// Include toolboxes.
$PAGE->requires->yui_module('moodle-message_airnotifier-toolboxes', 'M.message.init_device_toolbox', array(array(
'ajaxurl' => $config->resturl,
'config' => $config,
))
);
// Required strings for the javascript.
$PAGE->requires->strings_for_js(array('deletecheckdevicename'), 'message_airnotifier');
$PAGE->requires->strings_for_js(array('show', 'hide'), 'moodle');
return true;
}
/**
* Return the user devices for a specific app.
*
* @param string $appname the app name .
* @param int $userid if empty take the current user.
* @return array all the devices
*/
public function get_user_devices($appname, $userid = null) {
global $USER, $DB;
if (empty($userid)) {
$userid = $USER->id;
}
$devices = array();
$params = array('appid' => $appname, 'userid' => $userid);
// First, we look all the devices registered for this user in the Moodle core.
// We are going to allow only ios devices (since these are the ones that supports PUSH notifications).
if ($userdevices = $DB->get_records('user_devices', $params)) {
foreach ($userdevices as $device) {
if (core_text::strtolower($device->platform) == 'ios') {
// Check if the device is known by airnotifier.
if (!$airnotifierdev = $DB->get_record('message_airnotifier_devices', array('userdeviceid' => $device->id))) {
// We have to create the device token in airnotifier.
if (! $this->create_token($device->pushid)) {
continue;
}
$airnotifierdev = new stdClass;
$airnotifierdev->userdeviceid = $device->id;
$airnotifierdev->enable = 1;
$airnotifierdev->id = $DB->insert_record('message_airnotifier_devices', $airnotifierdev);
}
$device->id = $airnotifierdev->id;
$device->enable = $airnotifierdev->enable;
$devices[] = $device;
}
}
}
return $devices;
}
/**
* Request and access key to Airnotifier
*
* @return mixed The access key or false in case of error
*/
public function request_accesskey() {
global $CFG, $USER;
require_once($CFG->libdir . '/filelib.php');
// Sending the request access key request to Airnotifier.
$serverurl = $CFG->airnotifierurl . ':' . $CFG->airnotifierport . '/accesskeys/';
// We use an APP Key "none", it can be anything.
$header = array('Accept: application/json', 'X-AN-APP-NAME: ' . $CFG->airnotifierappname,
'X-AN-APP-KEY: none');
$curl = new curl();
$curl->setHeader($header);
// Site ids are stored as secrets in md5 in the Moodle public hub.
$params = array(
'url' => $CFG->wwwroot,
'siteid' => md5($CFG->siteidentifier),
'contact' => $USER->email,
'description' => $CFG->wwwroot
);
$resp = $curl->post($serverurl, $params);
if ($key = json_decode($resp, true)) {
if (!empty($key['accesskey'])) {
return $key['accesskey'];
}
}
return false;
}
/**
* Create a device token in the Airnotifier instance
* @param string $token The token to be created
* @return bool True if all was right
*/
private function create_token($token) {
global $CFG;
if (!$this->is_system_configured()) {
return false;
}
require_once($CFG->libdir . '/filelib.php');
$serverurl = $CFG->airnotifierurl . ':' . $CFG->airnotifierport . '/tokens/' . $token;
$header = array('Accept: application/json', 'X-AN-APP-NAME: ' . $CFG->airnotifierappname,
'X-AN-APP-KEY: ' . $CFG->airnotifieraccesskey);
$curl = new curl;
$curl->setHeader($header);
$params = array();
$resp = $curl->post($serverurl, $params);
if ($resp = json_decode($resp, true)) {
if (!empty($resp['status'])) {
return $resp['status'] == 'ok' || $resp['status'] == 'token exists';
}
}
return false;
}
/**
* Tests whether the airnotifier settings have been configured
* @return boolean true if airnotifier is configured
*/
public function is_system_configured() {
global $CFG;
return (!empty($CFG->airnotifierurl) && !empty($CFG->airnotifierport) &&
!empty($CFG->airnotifieraccesskey) && !empty($CFG->airnotifierappname) &&
!empty($CFG->airnotifiermobileappname));
}
}

View File

@ -1,5 +1,4 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
@ -27,12 +26,13 @@
* Install the Airnotifier message processor
*/
function xmldb_message_airnotifier_install() {
global $DB;
global $CFG, $DB;
$result = true;
$provider = new stdClass();
$provider->name = 'airnotifier';
$DB->insert_record('message_processors', $provider);
return $result;
}

View File

@ -1,25 +1,18 @@
<?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="message/output/airnotifier/db" VERSION="20120706" COMMENT="XMLDB file for airnotifier Moodle tables"
<XMLDB PATH="message/output/airnotifier/db" VERSION="20140129" COMMENT="XMLDB file for Moodle message/output/airnotifier"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../../lib/xmldb/xmldb.xsd"
>
<TABLES>
<TABLE NAME="airnotifier_user_devices" COMMENT="Mobile devices associated to users">
<TABLE NAME="message_airnotifier_devices" COMMENT="Store information about the devices registered in Airnotifier for PUSH notifications">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true" NEXT="appname"/>
<FIELD NAME="appname" TYPE="char" LENGTH="100" NOTNULL="false" SEQUENCE="false" COMMENT="The name of the app: mymoodle, ..." PREVIOUS="id" NEXT="devicename"/>
<FIELD NAME="devicename" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="For example Jerome's iPhone" PREVIOUS="appname" NEXT="devicetype"/>
<FIELD NAME="devicetype" TYPE="char" LENGTH="100" NOTNULL="false" SEQUENCE="false" COMMENT="For example iPhone 4S, Google Nexus..." PREVIOUS="devicename" NEXT="deviceos"/>
<FIELD NAME="deviceos" TYPE="char" LENGTH="100" NOTNULL="false" SEQUENCE="false" COMMENT="For example ios, android..." PREVIOUS="devicetype" NEXT="deviceosversion"/>
<FIELD NAME="deviceosversion" TYPE="char" LENGTH="100" NOTNULL="false" SEQUENCE="false" COMMENT="5.1, 2.3.3..." PREVIOUS="deviceos" NEXT="devicebrand"/>
<FIELD NAME="devicebrand" TYPE="char" LENGTH="100" NOTNULL="false" SEQUENCE="false" COMMENT="Apple, Samsung..." PREVIOUS="deviceosversion" NEXT="devicenotificationtoken"/>
<FIELD NAME="devicenotificationtoken" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="Apple give one token per device/app to be able to send push notification to the device." PREVIOUS="devicebrand" NEXT="deviceuid"/>
<FIELD NAME="deviceuid" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="A unique ID to identify the device. Freedom for the client to send whatever he wants and the plugin to manage them in concordance." PREVIOUS="devicenotificationtoken" NEXT="userid"/>
<FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="the user owning the device" PREVIOUS="deviceuid" NEXT="enable"/>
<FIELD NAME="enable" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="1" SEQUENCE="false" COMMENT="the user can disable on of his/her device." PREVIOUS="userid"/>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
<FIELD NAME="userdeviceid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="The user device id in the user_devices table"/>
<FIELD NAME="enable" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="1" SEQUENCE="false" COMMENT="The user can enable/disable his devices"/>
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
<KEY NAME="userdeviceid" TYPE="foreign-unique" FIELDS="userdeviceid" REFTABLE="user_devices" REFFIELDS="id"/>
</KEYS>
</TABLE>
</TABLES>

View File

@ -25,20 +25,19 @@
*/
$functions = array(
'message_airnotifier_add_user_device' => array(
'message_airnotifier_is_system_configured' => array(
'classname' => 'message_airnotifier_external',
'methodname' => 'add_user_device',
'methodname' => 'is_system_configured',
'classpath' => 'message/output/airnotifier/externallib.php',
'description' => 'Add device to user device list',
'type' => 'write',
'description' => 'Check whether the airnotifier settings have been configured',
'type' => 'read',
),
'message_airnotifier_get_access_key' => array(
'message_airnotifier_are_notification_preferences_configured' => array(
'classname' => 'message_airnotifier_external',
'methodname' => 'get_access_key',
'methodname' => 'are_notification_preferences_configured',
'classpath' => 'message/output/airnotifier/externallib.php',
'description' => 'Get the mobile device access key with specified permissions',
'description' => 'Check if the users have notification preferences configured yet',
'type' => 'read',
),
);

View File

@ -1,68 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Upgrade code for airnotifier message processor
*
* @package message_airnotifier
* @copyright 2012 Jerome Mouneyrac
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Upgrade code for the airnotifier message processor
*
* @param int $oldversion The version that we are upgrading from
*/
function xmldb_message_airnotifier_upgrade($oldversion) {
global $CFG, $DB;
$dbman = $DB->get_manager();
if ($oldversion < 2012070500.05) {
// Define table user_devices to be created
$table = new xmldb_table('airnotifier_user_devices');
// Adding fields to table user_devices
$table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
$table->add_field('appname', XMLDB_TYPE_CHAR, '100', null, null, null, null);
$table->add_field('devicename', XMLDB_TYPE_CHAR, '255', null, null, null, null);
$table->add_field('devicetype', XMLDB_TYPE_CHAR, '100', null, null, null, null);
$table->add_field('deviceos', XMLDB_TYPE_CHAR, '100', null, null, null, null);
$table->add_field('deviceosversion', XMLDB_TYPE_CHAR, '100', null, null, null, null);
$table->add_field('devicebrand', XMLDB_TYPE_CHAR, '100', null, null, null, null);
$table->add_field('devicenotificationtoken', XMLDB_TYPE_CHAR, '255', null, null, null, null);
$table->add_field('deviceuid', XMLDB_TYPE_CHAR, '255', null, null, null, null);
$table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('enable', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '1');
// Adding keys to table user_devices
$table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
// Conditionally launch create table for user_devices
if (!$dbman->table_exists($table)) {
$dbman->create_table($table);
}
// Main savepoint reached
upgrade_plugin_savepoint(true, 2012070500.05);
}
return true;
}

View File

@ -15,136 +15,163 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* external API for airnotifier web services
* External functions
*
* @package message_airnotifier
* @category external
* @copyright 2012 Jerome Mouneyrac <jerome@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 2.4
* @since Moodle 2.7
*/
/**
* External API for airnotifier web services
*
* @package message_airnotifier
* @category external
* @copyright 2012 Jerome Mouneyrac <jerome@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 2.7
*/
class message_airnotifier_external extends external_api {
/**
* Returns description of add_user_device() parameters
* Returns description of method parameters
*
* @return external_function_parameters
* @since Moodle 2.4
* @since Moodle 2.7
*/
public static function add_user_device_parameters() {
public static function is_system_configured_parameters() {
return new external_function_parameters(
array()
);
}
/**
* Tests whether the airnotifier settings have been configured
*
* @since Moodle 2.7
*/
public static function is_system_configured() {
$manager = new message_airnotifier_manager();
return (int) $manager->is_system_configured();
}
/**
* Returns description of method result value
*
* @return external_single_structure
* @since Moodle 2.7
*/
public static function is_system_configured_returns() {
return new external_value( PARAM_INT, '0 if the system is not configured, 1 otherwise');
}
/**
* Returns description of method parameters
*
* @since Moodle 2.7
*/
public static function are_notification_preferences_configured_parameters() {
return new external_function_parameters(
array('device' => new external_single_structure(
array(
'appname' => new external_value( PARAM_TEXT, 'the app name'),
'devicename' => new external_value( PARAM_TEXT, 'Device name: "Jerome\'s iPhone"', VALUE_OPTIONAL),
'devicetype' => new external_value( PARAM_TEXT, 'iPhone 3GS, Google Nexus S, ...', VALUE_OPTIONAL),
'deviceos' => new external_value( PARAM_TEXT, 'iOS, Android, ...', VALUE_OPTIONAL),
'deviceosversion' => new external_value( PARAM_TEXT, 'OS version number', VALUE_OPTIONAL),
'devicebrand' => new external_value( PARAM_TEXT, 'the device brand (Apple, Samsung, ...)', VALUE_OPTIONAL),
'devicenotificationtoken' => new external_value( PARAM_RAW, 'the device token used to send notification for the specified app'),
'deviceuid' => new external_value( PARAM_RAW, 'the device unique device id if it exists', VALUE_OPTIONAL),
), 'the device information - Important: type, os, osversion and brand will be saved in lowercase for fast searching'
)
));
'userids' => new external_multiple_structure(new external_value(PARAM_INT, 'user ID')),
)
);
}
/**
* Add a device to the user device list
* Check if the users have notification preferences configured for the airnotifier plugin
*
* @param array $device
* @return int device id
* @since Moodle 2.4
* @param array $userids Array of user ids
* @since Moodle 2.7
*/
public static function add_user_device($device) {
global $USER, $CFG;
public static function are_notification_preferences_configured($userids) {
global $CFG, $USER, $DB;
$params = self::validate_parameters(self::add_user_device_parameters(),
array('device'=>$device));
require_once($CFG->dirroot . '/message/lib.php');
$params = self::validate_parameters(self::are_notification_preferences_configured_parameters(),
array('userids' => $userids));
// Ensure the current user is allowed to run this function
$context = context_user::instance($USER->id);
self::validate_context($context);
require_capability('message/airnotifier:managedevice', $context);
list($sqluserids, $params) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED);
$uselect = ', ' . context_helper::get_preload_record_columns_sql('ctx');
$ujoin = "LEFT JOIN {context} ctx ON (ctx.instanceid = u.id AND ctx.contextlevel = :contextlevel)";
$params['contextlevel'] = CONTEXT_USER;
$usersql = "SELECT u.* $uselect
FROM {user} u $ujoin
WHERE u.id $sqluserids";
$users = $DB->get_recordset_sql($usersql, $params);
$device['userid'] = $USER->id;
$result = array();
$hasuserupdatecap = has_capability('moodle/user:update', context_system::instance());
foreach ($users as $user) {
require_once($CFG->dirroot . "/message/output/airnotifier/lib.php");
$airnotifiermanager = new airnotifier_manager();
$device['id'] = $airnotifiermanager->add_user_device($device);
$currentuser = ($user->id == $USER->id);
return $device['id'];
}
if ($currentuser or $hasuserupdatecap) {
/**
* Returns description of add_user_device() result value
*
* @return external_single_structure
* @since Moodle 2.4
*/
public static function add_user_device_returns() {
return new external_value( PARAM_INT, 'Device id in the Moodle database');
}
if (!empty($user->deleted)) {
$result['warnings'][] = "User $user->id was deleted";
continue;
}
/**
* Returns description of get_access_key() parameters
*
* @return external_function_parameters
* @since Moodle 2.4
*/
public static function get_access_key_parameters() {
return new external_function_parameters(
array('permissions' => new external_multiple_structure(
new external_value( PARAM_ALPHA, 'the permission'),
'Allowed permissions: createtoken (not yet implemented: deletetoken, accessobjects,
sendnotification, sendbroadcast)',
VALUE_DEFAULT, array()
)
));
}
$preferences = array();
$preferences['userid'] = $user->id;
$preferences['configured'] = 0;
/**
* Get access key with specified permissions
*
* @param array $permissions the permission that the access key should
* @return string access key
* @since Moodle 2.4
*/
public static function get_access_key($permissions = array()) {
global $CFG;
// Now we get for all the providers and all the states
// the user preferences to check if at least one is enabled for airnotifier plugin.
$providers = message_get_providers_for_user($user->id);
foreach ($providers as $provider) {
foreach (array('loggedin', 'loggedoff') as $state) {
$prefname = 'message_provider_'.$provider->component.'_'.$provider->name.'_'.$state;
$linepref = get_user_preferences($prefname, '', $user->id);
if ($linepref == '') {
continue;
}
$lineprefarray = explode(',', $linepref);
$params = self::validate_parameters(self::get_access_key_parameters(),
array('permissions'=>$permissions));
foreach ($lineprefarray as $pref) {
if ($pref == 'airnotifier') {
$preferences['configured'] = 1;
break 2;
}
}
}
}
// Check that user can use the requested permission.
foreach ($params['permissions'] as $perm) {
switch ($perm) {
case 'createtoken':
// Any mobile device / user should have this permission.
// No need to check anything for this permission.
break;
default:
throw new moodle_exception('permissionnotimplemented');
break;
$result['users'][] = $preferences;
} else if (!$hasuserupdatecap) {
$result['warnings'][] = "You don't have permissions for view user $user->id preferences";
}
}
$users->close();
// Look for access key that have exactly the same permissions.
// TODO: This mobile device access key should be retrieve by web service from
// moodle.org or airnotifer when the admin enables mobile on Moodle.
$accesskey = $CFG->airnotifierdeviceaccesskey;
return $accesskey;
return $result;
}
/**
* Returns description of add_user_device() result value
* Returns description of method result value
*
* @return external_single_structure
* @since Moodle 2.4
* @since Moodle 2.7
*/
public static function get_access_key_returns() {
return new external_value( PARAM_ALPHANUMEXT, 'access key');
public static function are_notification_preferences_configured_returns() {
return new external_single_structure(
array(
'users' => new external_multiple_structure(
new external_single_structure(
array (
'userid' => new external_value(PARAM_INT, 'userid id'),
'configured' => new external_value(PARAM_INT, '1 is the user preferences have been configured and 0 if not')
)
),
'list of preferences by user'),
'warnings' => new external_warnings()
)
);
}
}
}

View File

@ -1,5 +1,4 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
@ -19,25 +18,29 @@
* Strings for component 'message_airnotifier', language 'en'
*
* @package message_airnotifier
* @copyright 2012 Jerome mouneyrac
* @copyright 2012 Jerome Mouneyrac
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
$string['airnotifieraccesskey'] = 'Airnotifier access key';
$string['airnotifierappname'] = 'Airnotifier app name';
$string['airnotifierdeviceaccesskey'] = 'Airnotifier device access key';
$string['airnotifiermobileappname'] = 'Mobile app name';
$string['airnotifierport'] = 'Airnotifier port';
$string['airnotifierurl'] = 'Airnotifier URL';
$string['configairnotifierurl'] = 'The server url to connect to to send push notifications.';
$string['configairnotifierport'] = 'The port to use when connecting to the airnotifier server.';
$string['configairnotifieraccesskey'] = 'The access key to use when connecting to the airnotifier server.';
$string['configairnotifierappname'] = 'The app name where Airnotifier will send notification.';
$string['configairnotifierdeviceaccesskey'] = 'The access key used by mobile devices when connecting to the airnotifier server.';
$string['configairnotifierappname'] = 'The app name identifier in Airnotifier.';
$string['configairnotifiermobileappname'] = 'The Mobile app unique identifier (usually something like com.moodle.moodlemobile).';
$string['deletecheckdevicename'] = 'Delete your device: {$a->name}';
$string['deletedevice'] = 'Delete the device. Note that it will not forbid an app to register it again. If the device keep reappearing, disable it.';
$string['deletedevice'] = 'Delete the device. Note that an app can register the device again. If the device keeps reappearing, disable it.';
$string['devicetoken'] = 'Device token';
$string['nodevices'] = 'No registered devices. Devices are automatically registered when you allow a Moodle iOS app to receive push notifications.';
$string['errorretrievingkey'] = 'An error occurred while retrieving key. Your Moodle site must be registered with Moodle.org to use this service. You may need to re-register to update your details there.';
$string['keyretrievedsuccessfully'] = 'Key retrieved successfully';
$string['nodevices'] = 'No registered devices. Devices will automatically register after you allow a Moodle iOS app to receive push notifications.';
$string['notconfigured'] = 'The Airnotifier server hasn\'t been configured so Airnotifier messages cannot be sent';
$string['pluginname'] = 'iPhone/iPad';
$string['pluginname'] = 'Mobile notifications';
$string['sitemustberegistered'] = 'In order to use the public Airnotifier instance you must register your site with Moodle.org';
$string['showhide'] = 'Enable/disable the device.';
$string['requestaccesskey'] = 'Request access key';
$string['unknowndevice'] = 'Unknown device';

View File

@ -1,139 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Airnotifier related functions
*
* @package message_airnotifier
* @category external
* @copyright 2012 Jerome Mouneyrac <jerome@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 2.4
*/
class airnotifier_manager {
/**
* Include the relevant javascript and language strings for the device
* toolbox YUI module
*
* @return bool
*/
function include_device_ajax() {
global $PAGE, $CFG;
if (!$CFG->enableajax) {
return false;
}
$config = new stdClass();
// The URL to use for resource changes
if (!isset($config->resturl)) {
$config->resturl = '/message/output/airnotifier/rest.php';
}
// Any additional parameters which need to be included on page submission
if (!isset($config->pageparams)) {
$config->pageparams = array();
}
// Include toolboxes
$PAGE->requires->yui_module('moodle-message_airnotifier-toolboxes', 'M.message.init_device_toolbox', array(array(
'ajaxurl' => $config->resturl,
'config' => $config,
))
);
// Required strings for the javascript
$PAGE->requires->strings_for_js(array('deletecheckdevicename'), 'message_airnotifier');
$PAGE->requires->strings_for_js(array('show','hide'), 'moodle');
return true;
}
/**
* Add device to the user device list.
*
* @param object $device
* @param int $userid if empty take the current user
* @return int device id (in Moodle database)
*/
public function add_user_device($device, $userid = null) {
global $DB, $USER;
if (empty($user)) {
$userid = $USER->id;
}
$device = (object) $device;
// Check if the device token already exist - Note that we look for user in case several users use the same device
$existingdevice = $DB->get_record('airnotifier_user_devices', array('appname' => $device->appname,
'devicenotificationtoken' => $device->devicenotificationtoken, 'userid' => $userid));
// trim the data (some field should be in lowercase to make the search on them quickly)
$attributstolower = array('devicetype', 'deviceos', 'deviceosversion', 'devicebrand');
if ($existingdevice) {
foreach ($device as $attributname => $value) {
if (in_array($attributname, $attributstolower)) {
$existingdevice->{$attributname} = strtolower($value);
} else {
$existingdevice->{$attributname} = $value;
}
}
} else {
foreach ($attributstolower as $attribut) {
if (!empty($device->{$attribut})) {
$device->{$attribut} = strtolower($device->{$attribut});
}
}
}
if ($existingdevice) {
$DB->update_record('airnotifier_user_devices', $existingdevice);
return $existingdevice->id;
} else {
return $DB->insert_record('airnotifier_user_devices', $device);
}
}
/**
* Return the user devices for a specific app.
*
* @param string $appname the app name .
* @param int $userid if empty take the current user.
* @param int $enabled if 1 returned only enabled devices, if 0 only disabled devices, if null all devices.
* @return array all the devices
*/
public function get_user_devices($appname, $userid = null, $enabled = null) {
global $USER, $DB;
if (empty($userid)) {
$userid = $USER->id;
}
$params = array('appname' => $appname, 'userid' => $userid);
if ($enabled !== null) {
$params['enable'] = $enabled;
}
return $DB->get_records('airnotifier_user_devices', $params);
}
}
?>

View File

@ -1,5 +1,4 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
@ -15,12 +14,21 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Airnotifier message processor to send messages to the APNS provider: airnotfier. (https://github.com/dongsheng/airnotifier)
*
* @package message_airnotifier
* @category external
* @copyright 2012 Jerome Mouneyrac <jerome@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 2.7
*/
require_once($CFG->dirroot . '/message/output/lib.php');
require_once($CFG->dirroot . '/message/output/airnotifier/lib.php');
/**
* Airnotifier message processor to send messages to the APNS provider: airnotfier.
* (https://github.com/dongsheng/airnotifier)
* Message processor class
*
* @package message_airnotifier
* @copyright 2012 Jerome Mouneyrac
@ -34,66 +42,76 @@ class message_output_airnotifier extends message_output {
* @param stdClass $eventdata the event data submitted by the message sender plus $eventdata->savedmessageid
* @return true if ok, false if error
*/
function send_message($eventdata) {
public function send_message($eventdata) {
global $CFG;
if (!empty($CFG->noemailever)) {
// hidden setting for development sites, set in config.php if needed
// Hidden setting for development sites, set in config.php if needed.
debugging('$CFG->noemailever active, no airnotifier message sent.', DEBUG_MINIMAL);
return true;
}
// skip any messaging suspended and deleted users
if ($eventdata->userto->auth === 'nologin' or $eventdata->userto->suspended or
$eventdata->userto->deleted) {
// Skip any messaging suspended and deleted users.
if ($eventdata->userto->auth === 'nologin' or
$eventdata->userto->suspended or
$eventdata->userto->deleted) {
return true;
}
// Site id, to map with Moodle Mobile stored sites.
$siteid = md5($CFG->wwwroot . $eventdata->userto->username);
// Mandatory notification data that need to be sent in the payload. They have variable length.
// We need to take them in consideration to calculate the maximum message size.
$notificationdata = array("urlparams" => $eventdata->urlparams, "id" => $eventdata->savedmessageid,
"type" => $eventdata->component . '_' . $eventdata->name, "userfrom" => fullname($eventdata->userfrom));
$notificationdata = array(
"site" => $siteid,
"type" => $eventdata->component . '_' . $eventdata->name,
"userfrom" => fullname($eventdata->userfrom));
// Calculate the size of the message knowing Apple payload must be lower than 256 bytes.
// Airnotifier using few bytes of the payload, we must limit our message to even less characters.
$maxmsgsize = 205 - strlen(json_encode($notificationdata));
$message = $eventdata->smallmessage;
// If the message size is too big make it shorter
if (strlen($message) >= $maxmsgsize) {
$maxmsgsize = 205 - core_text::strlen(json_encode($notificationdata));
$message = s($eventdata->smallmessage);
// If the message size is too big make it shorter.
if (core_text::strlen($message) >= $maxmsgsize) {
// Cut the message to the maximum possible size. -4 for the the ending 3 dots (...).
$message = substr($message, 0 , $maxmsgsize - 4);
$message = core_text::substr($message, 0 , $maxmsgsize - 4);
// We need to check when the message is "escaped" then the message is not too long.
$encodedmsgsize = strlen(json_encode($message));
$encodedmsgsize = core_text::strlen(json_encode($message));
if ($encodedmsgsize > $maxmsgsize) {
$totalescapedchar = $encodedmsgsize - strlen($message);
// Cut the message to the maximum possible size (taking the escaped character in account)
$message = substr($message, 0 , $maxmsgsize - 4 - $totalescapedchar);
$totalescapedchar = $encodedmsgsize - core_text::strlen($message);
// Cut the message to the maximum possible size (taking the escaped character in account).
$message = core_text::substr($message, 0 , $maxmsgsize - 4 - $totalescapedchar);
}
$message = $message . '...';
}
// We are sending to message to all devices
$airnotifiermanager = new airnotifier_manager();
$devicetokens = $airnotifiermanager->get_user_devices($CFG->airnotifierappname, $eventdata->userto->id, true);
// We are sending to message to all devices.
$airnotifiermanager = new message_airnotifier_manager();
$devicetokens = $airnotifiermanager->get_user_devices($CFG->airnotifiermobileappname, $eventdata->userto->id);
foreach ($devicetokens as $devicetoken) {
// Sending the message to the device
if (!$devicetoken->enable) {
continue;
}
// Sending the message to the device.
$serverurl = $CFG->airnotifierurl . ':' . $CFG->airnotifierport . '/notification/';
$header = array('Accept: application/json', 'X-AN-APP-NAME: ' . $CFG->airnotifierappname,
'X-AN-APP-KEY: ' . $CFG->airnotifieraccesskey);
$curl = new curl;
$curl->setHeader($header);
$params = array('alert' => $message,
'date' => $eventdata->timecreated,
'urlparams' => json_encode($eventdata->urlparams),
'type' => $eventdata->component . '_' . $eventdata->name,
'userfrom' => fullname($eventdata->userfrom),
'id' => $eventdata->savedmessageid,
'token' => $devicetoken->devicenotificationtoken);
$params = array(
'alert' => $message,
'date' => $eventdata->timecreated,
'site' => $siteid,
'type' => $eventdata->component . '_' . $eventdata->name,
'userfrom' => fullname($eventdata->userfrom),
'token' => $devicetoken->pushid);
$resp = $curl->post($serverurl, $params);
}
@ -105,7 +123,7 @@ class message_output_airnotifier extends message_output {
*
* @param array $preferences An array of user preferences
*/
function config_form($preferences) {
public function config_form($preferences) {
global $CFG, $OUTPUT, $USER, $PAGE;
if (!$this->is_system_configured()) {
@ -114,8 +132,8 @@ class message_output_airnotifier extends message_output {
$PAGE->requires->css('/message/output/airnotifier/style.css');
$airnotifiermanager = new airnotifier_manager();
$devicetokens = $airnotifiermanager->get_user_devices($CFG->airnotifierappname, $USER->id);
$airnotifiermanager = new message_airnotifier_manager();
$devicetokens = $airnotifiermanager->get_user_devices($CFG->airnotifiermobileappname, $USER->id);
if (!empty($devicetokens)) {
$output = '';
@ -131,23 +149,19 @@ class message_output_airnotifier extends message_output {
}
$hideshowicon = $OUTPUT->pix_icon($hideshowiconname, get_string('showhide', 'message_airnotifier'));
$deleteicon = $OUTPUT->pix_icon('t/delete', get_string('deletedevice', 'message_airnotifier'));
$devicename = empty($devicetoken->devicename) ? get_string('unknowndevice', 'message_airnotifier') : s($devicetoken->devicename);
$name = "{$devicetoken->name} {$devicetoken->model} {$devicetoken->platform} {$devicetoken->version}";
$hideurl = new moodle_url('message/output/airnotifier/action.php',
array('hide' => !$devicetoken->enable, 'deviceid' => $devicetoken->id,
'sesskey' => sesskey()));
$deleteurl = new moodle_url('message/output/airnotifier/action.php',
array('delete' => true, 'deviceid' => $devicetoken->id,
'sesskey' => sesskey()));
$output .= html_writer::start_tag('li', array('id' => $devicetoken->id, 'class' => 'airnotifierdevice ' . $dimmed)) . "\n";
$output .= html_writer::label($devicename, 'deviceid-' . $devicetoken->id, array('class' => 'devicelabel ')) . ' ' .
html_writer::link($hideurl, $hideshowicon, array('class' => 'hidedevice', 'alt' => 'show/hide')) . '' .
html_writer::link($deleteurl, $deleteicon, array('class' => 'deletedevice', 'alt' => 'delete')) . "\n";
$output .= html_writer::start_tag('li', array('id' => $devicetoken->id,
'class' => 'airnotifierdevice ' . $dimmed)) . "\n";
$output .= html_writer::label($name, 'deviceid-' . $devicetoken->id, array('class' => 'devicelabel ')) . ' ' .
html_writer::link($hideurl, $hideshowicon, array('class' => 'hidedevice', 'alt' => 'show/hide')) . "\n";
$output .= html_writer::end_tag('li') . "\n";
}
// Include the AJAX script to automatically trigger the action
// Include the AJAX script to automatically trigger the action.
$airnotifiermanager->include_device_ajax();
$output = html_writer::tag('ul', $output, array('id' => 'airnotifierdevices'));
@ -164,10 +178,8 @@ class message_output_airnotifier extends message_output {
* @param stdClass $form preferences form class
* @param array $preferences preferences array
*/
function process_form($form, &$preferences) {
if (isset($form->airnotifier_devicetoken) && !empty($form->airnotifier_devicetoken)) {
$preferences['message_processor_airnotifier_devicetoken'] = $form->airnotifier_devicetoken;
}
public function process_form($form, &$preferences) {
return true;
}
/**
@ -176,20 +188,17 @@ class message_output_airnotifier extends message_output {
* @param array $preferences preferences array
* @param int $userid the user id
*/
function load_data(&$preferences, $userid) {
$preferences->airnotifier_devicetoken =
get_user_preferences('message_processor_airnotifier_devicetoken', '', $userid);
public function load_data(&$preferences, $userid) {
return true;
}
/**
* Tests whether the airnotifier settings have been configured
* @return boolean true if airnotifier is configured
*/
function is_system_configured() {
global $CFG;
return (!empty($CFG->airnotifierurl) && !empty($CFG->airnotifierport) &&
!empty($CFG->airnotifieraccesskey) && !empty($CFG->airnotifierdeviceaccesskey) &&
!empty($CFG->airnotifierappname));
public function is_system_configured() {
$airnotifiermanager = new message_airnotifier_manager();
return $airnotifiermanager->is_system_configured();
}
}

View File

@ -0,0 +1,77 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Request access key to AirNotifier
*
* @package message_airnotifier
* @copyright 2012 Jerome Mouneyrac
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require('../../../config.php');
require_once($CFG->dirroot . '/' . $CFG->admin . '/registration/lib.php');
define('AIRNOTIFIER_PUBLICURL', 'http://messages.moodle.net');
$PAGE->set_url(new moodle_url('/message/output/airnotifier/requestaccesskey.php'));
$PAGE->set_context(context_system::instance());
require_login();
require_capability('moodle/site:config', context_system::instance());
$strheading = get_string('requestaccesskey', 'message_airnotifier');
$PAGE->navbar->add(get_string('administrationsite'));
$PAGE->navbar->add(get_string('plugins', 'admin'));
$PAGE->navbar->add(get_string('messageoutputs', 'message'));
$returl = new moodle_url('/admin/settings.php', array('section' => 'messagesettingairnotifier'));
$PAGE->navbar->add(get_string('pluginname', 'message_airnotifier'), $returl);
$PAGE->navbar->add($strheading);
$PAGE->set_heading($strheading);
$PAGE->set_title($strheading);
$msg = "";
// If we are requesting a key to the official message system, verify first that this site is registered.
// This check is also done in Airnotifier.
if (strpos($CFG->airnotifierurl, AIRNOTIFIER_PUBLICURL) !== false ) {
$registrationmanager = new registration_manager();
if (!$registrationmanager->get_registeredhub(HUB_MOODLEORGHUBURL)) {
$msg = get_string('sitemustberegistered', 'message_airnotifier');
$msg .= $OUTPUT->continue_button($returl);
echo $OUTPUT->header();
echo $OUTPUT->box($msg, 'generalbox');
echo $OUTPUT->footer();
die;
}
}
$manager = new message_airnotifier_manager();
if ($key = $manager->request_accesskey()) {
set_config('airnotifieraccesskey', $key);
$msg = get_string('keyretrievedsuccessfully', 'message_airnotifier');
} else {
$msg = get_string('errorretrievingkey', 'message_airnotifier');
}
$msg .= $OUTPUT->continue_button($returl);
echo $OUTPUT->header();
echo $OUTPUT->box($msg, 'generalbox ');
echo $OUTPUT->footer();

View File

@ -1,5 +1,4 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
@ -23,50 +22,29 @@
* @package message_airnotifier
*/
if (!defined('AJAX_SCRIPT')) {
define('AJAX_SCRIPT', true);
}
define('AJAX_SCRIPT', true);
require_once(dirname(__FILE__) . '/../../../config.php');
require_once($CFG->dirroot.'/message/output/airnotifier/lib.php');
// Initialise ALL the incoming parameters here, up front.
$field = optional_param('field', '', PARAM_ALPHA);
$id = required_param('id', PARAM_INT);
$pageaction = optional_param('action', '', PARAM_ALPHA); // Used to simulate a DELETE command
$enable = required_param('enable', PARAM_BOOL);
require_login();
require_sesskey();
$usercontext = context_user::instance($USER->id);
$PAGE->set_url('/message/output/airnotifier/rest.php');
$PAGE->set_context($usercontext);
require_login();
require_sesskey();
echo $OUTPUT->header(); // send headers
require_capability('message/airnotifier:managedevice', $usercontext);
// OK, now let's process the parameters and do stuff
// MDL-10221 the DELETE method is not allowed on some web servers, so we simulate it with the action URL param
$requestmethod = $_SERVER['REQUEST_METHOD'];
if ($pageaction == 'DELETE') {
$requestmethod = 'DELETE';
}
echo $OUTPUT->header();
$device = $DB->get_record('airnotifier_user_devices', array('id' => $id), '*', MUST_EXIST);
$device = $DB->get_record('message_airnotifier_devices', array('id' => $id), '*', MUST_EXIST);
$airnotifiermanager = new airnotifier_manager();
$device->enable = required_param('enable', PARAM_BOOL);
$DB->update_record('message_airnotifier_devices', $device);
switch($requestmethod) {
case 'POST':
switch ($field) {
case 'enable':
require_capability('message/airnotifier:managedevice', $usercontext);
$device->enable = required_param('enable', PARAM_BOOL);
$DB->update_record('airnotifier_user_devices', $device);
break;
}
break;
case 'DELETE':
require_capability('message/airnotifier:managedevice', $usercontext);
$DB->delete_records('airnotifier_user_devices', array('id' => $id));
break;
}

View File

@ -1,5 +1,4 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
@ -19,27 +18,30 @@
* Airnotifier configuration page
*
* @package message_airnotifier
* @copyright 2012 Jerome Mouneyrac
* @copyright 2012 Jerome Mouneyrac, 2014 Juan Leyva
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die;
if ($ADMIN->fulltree) {
//TODO: It will be better for these settings to be automatically retrieved by web service from moodle.org when enabling mobile.
// The processor should be enabled by the same enable mobile setting.
// The processor should be enabled by the same enable mobile setting.
$settings->add(new admin_setting_configtext('airnotifierurl',
get_string('airnotifierurl', 'message_airnotifier'),
get_string('configairnotifierurl', 'message_airnotifier'), 'http://notify.moodle.net', PARAM_URL));
get_string('configairnotifierurl', 'message_airnotifier'), 'http://messages.moodle.net', PARAM_URL));
$settings->add(new admin_setting_configtext('airnotifierport',
get_string('airnotifierport', 'message_airnotifier'),
get_string('configairnotifierport', 'message_airnotifier'), '8801', PARAM_INT));
$settings->add(new admin_setting_configtext('airnotifieraccesskey',
get_string('airnotifieraccesskey', 'message_airnotifier'),
get_string('configairnotifieraccesskey', 'message_airnotifier'), '34220428981805c610cacc22aa6635fb', PARAM_ALPHANUMEXT));
$settings->add(new admin_setting_configtext('airnotifierdeviceaccesskey',
get_string('airnotifierdeviceaccesskey', 'message_airnotifier'),
get_string('configairnotifierdeviceaccesskey', 'message_airnotifier'), 'e6b15c1ac0606980c46f87c476c9f28e', PARAM_ALPHANUMEXT));
get_string('configairnotifierport', 'message_airnotifier'), '80', PARAM_INT));
$settings->add(new admin_setting_configtext('airnotifiermobileappname',
get_string('airnotifiermobileappname', 'message_airnotifier'),
get_string('configairnotifiermobileappname', 'message_airnotifier'), 'com.moodle.moodlemobile', PARAM_TEXT));
$settings->add(new admin_setting_configtext('airnotifierappname',
get_string('airnotifierappname', 'message_airnotifier'),
get_string('configairnotifierappname', 'message_airnotifier'), 'moodlehtml5app', PARAM_TEXT));
get_string('configairnotifierappname', 'message_airnotifier'), 'commoodlemoodlemobile', PARAM_TEXT));
$settings->add(new admin_setting_configtext('airnotifieraccesskey',
get_string('airnotifieraccesskey', 'message_airnotifier'),
get_string('configairnotifieraccesskey', 'message_airnotifier'), '', PARAM_ALPHANUMEXT));
$url = new moodle_url('/message/output/airnotifier/requestaccesskey.php');
$link = html_writer::link($url, get_string('requestaccesskey', 'message_airnotifier'));
$settings->add(new admin_setting_heading('requestaccesskey', '', $link));
}

View File

@ -19,7 +19,7 @@
package message_airnotifier
category css
copyright 2012 Jerome Mouneyrac
copyright 2012/2014 Jerome Mouneyrac / Juan Leyva
license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

View File

@ -1,5 +1,4 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
@ -24,6 +23,6 @@
*/
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2012070500.05; // The current plugin version (Date: YYYYMMDDXX)
$plugin->requires = 2012110101.01; // Requires this Moodle version
$plugin->component = 'message_airnotifier'; // Full name of the plugin (used for diagnostics)
$plugin->version = 2014012800; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2013111800; // Requires this Moodle version.
$plugin->component = 'message_airnotifier'; // Full name of the plugin (used for diagnostics).

View File

@ -3,7 +3,7 @@ YUI.add('moodle-message_airnotifier-toolboxes', function(Y) {
'pix':"i/loading_small",
'component':'moodle'
};
// The CSS selectors we use
// The CSS selectors we use.
var CSS = {
AIRNOTIFIERCONTENT : 'fieldset#messageprocessor_airnotifier',
HIDEDEVICE : 'a.hidedevice',
@ -36,14 +36,13 @@ YUI.add('moodle-message_airnotifier-toolboxes', function(Y) {
*/
replace_button : function(toolboxtarget, selector, callback, cursor) {
if (!cursor) {
// Set the default cursor type to pointer to match the
// anchor
// Set the default cursor type to pointer to match the anchor.
cursor = 'pointer';
}
var button = Y.one(toolboxtarget).all(selector)
.setStyle('cursor', cursor);
// on isn't chainable and will return an event
// On isn't chainable and will return an event.
button.on('click', callback, this);
return button;
@ -70,10 +69,9 @@ YUI.add('moodle-message_airnotifier-toolboxes', function(Y) {
value = 0;
}
// Change the UI
// Change the UI.
element.toggleClass(toggle_class);
// We need to toggle dimming on the description too
// element.all(CSS.CONTENTAFTERLINK).toggleClass(CSS.DIMMEDTEXT);
// We need to toggle dimming on the description too element.all(CSS.CONTENTAFTERLINK).toggleClass(CSS.DIMMEDTEXT);.
var newstring = M.util.get_string(status, 'moodle');
hideicon.setAttrs({
'alt' : newstring,
@ -81,7 +79,7 @@ YUI.add('moodle-message_airnotifier-toolboxes', function(Y) {
'src' : M.util.image_url('t/' + status)
});
button.set('title', newstring);
button.set('className', 'editing_'+status);
button.set('className', 'editing_' + status);
return value;
},
@ -98,7 +96,7 @@ YUI.add('moodle-message_airnotifier-toolboxes', function(Y) {
if (!data) {
data = {};
}
// Handle any variables which we must pass back through to
// Handle any variables which we must pass back through to.
var pageparams = this.get('config').pageparams;
for (varname in pageparams) {
data[varname] = pageparams[varname];
@ -108,7 +106,7 @@ YUI.add('moodle-message_airnotifier-toolboxes', function(Y) {
var uri = M.cfg.wwwroot + this.get('ajaxurl');
// Define the configuration to send with the request
// Define the configuration to send with the request.
var responsetext = [];
var config = {
method: 'POST',
@ -138,7 +136,7 @@ YUI.add('moodle-message_airnotifier-toolboxes', function(Y) {
sync: true
}
// Apply optional config
// Apply optional config.
if (optionalconfig) {
for (varname in optionalconfig) {
config[varname] = optionalconfig[varname];
@ -149,7 +147,7 @@ YUI.add('moodle-message_airnotifier-toolboxes', function(Y) {
statusspinner.show();
}
// Send the request
// Send the request.
Y.io(uri, config);
return responsetext;
},
@ -205,31 +203,31 @@ YUI.add('moodle-message_airnotifier-toolboxes', function(Y) {
Y.all(baseselector).each(this._setup_for_device, this);
},
_setup_for_device : function(toolboxtarget) {
// Delete
// Delete.
this.replace_button(toolboxtarget, CSS.DELETEDEVICE, this.delete_device);
// Show/Hide
// Show/Hide.
var showhide = this.replace_button(toolboxtarget, CSS.HIDEDEVICE, this.toggle_hide_device);
},
delete_device : function(e) {
// Prevent the default button action
// Prevent the default button action.
e.preventDefault();
// Get the element we're working on
// Get the element we're working on.
var element = e.target.ancestor(CSS.DEVICELI);
var confirmstring = '';
var plugindata = {
name : element.one('*').getHTML() //get the label
name : element.one('*').getHTML() // Get the label.
}
confirmstring = M.util.get_string('deletecheckdevicename', 'message_airnotifier', plugindata);
// Confirm element removal
// Confirm element removal.
if (!confirm(confirmstring)) {
return false;
}
// Actually remove the element
// Actually remove the element.
element.remove();
var data = {
'class' : 'device',
@ -239,17 +237,17 @@ YUI.add('moodle-message_airnotifier-toolboxes', function(Y) {
this.send_request(data);
},
toggle_hide_device : function(e) {
// Prevent the default button action
// Prevent the default button action.
e.preventDefault();
// Get the element we're working on
// Get the element we're working on.
var element = e.target.ancestor(CSS.DEVICELI);
var button = e.target.ancestor('a', true);
var value = this.toggle_hide_device_ui(button);
// Send the request
// Send the request.
var data = {
'field' : 'enable',
'enable' : value,