This commit is contained in:
Sam Hemelryk 2013-12-02 10:35:46 +13:00
commit 06ef842707
6 changed files with 117 additions and 20 deletions

View file

@ -51,6 +51,7 @@ $string['discussion'] = 'Discussion';
$string['emailmessages'] = 'Email messages when I am offline';
$string['emailtagline'] = 'This is a copy of a message sent to you at "{$a->sitename}". Go to {$a->url} to reply.';
$string['emptysearchstring'] = 'You must search for something';
$string['enabled'] = 'Enabled';
$string['errorcallingprocessor'] = 'Error calling defined output';
$string['errortranslatingdefault'] = 'Error translating default setting provided by plugin, using system defaults instead.';
$string['forced'] = 'Forced';

View file

@ -57,6 +57,14 @@ function message_send($eventdata) {
//new message ID to return
$messageid = false;
// Fetch default (site) preferences
$defaultpreferences = get_message_output_default_preferences();
$preferencebase = $eventdata->component.'_'.$eventdata->name;
// If message provider is disabled then don't do any processing.
if (!empty($defaultpreferences->{$preferencebase.'_disable'})) {
return $messageid;
}
//TODO: we need to solve problems with database transactions here somehow, for now we just prevent transactions - sorry
$DB->transactions_forbidden();
@ -150,12 +158,9 @@ function message_send($eventdata) {
// Fetch enabled processors
$processors = get_message_processors(true);
// Fetch default (site) preferences
$defaultpreferences = get_message_output_default_preferences();
// Preset variables
$processorlist = array();
$preferencebase = $eventdata->component.'_'.$eventdata->name;
// Fill in the array of processors to be used based on default and user preferences
foreach ($processors as $processor) {
// Skip adding processors for internal user, if processor doesn't support sending message to internal user.

View file

@ -27,6 +27,47 @@ defined('MOODLE_INTERNAL') || die();
class core_messagelib_testcase extends advanced_testcase {
public function test_message_provider_disabled() {
$this->resetAfterTest();
$this->preventResetByRollback();
unset_config('noemailever');
// Disable instantmessage provider.
$disableprovidersetting = 'moodle_instantmessage_disable';
set_config($disableprovidersetting, 1, 'message');
$preferences = get_message_output_default_preferences();
$this->assertTrue($preferences->$disableprovidersetting == 1);
$message = new stdClass();
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = get_admin();
$message->userto = $this->getDataGenerator()->create_user();;
$message->subject = 'message subject 1';
$message->fullmessage = 'message body';
$message->fullmessageformat = FORMAT_MARKDOWN;
$message->fullmessagehtml = '<p>message body</p>';
$message->smallmessage = 'small message';
// Check message is not sent.
$sink = $this->redirectEmails();
$this->assertTrue(phpunit_util::is_redirecting_phpmailer());
message_send($message);
$emails = $sink->get_messages();
$this->assertEmpty($emails);
// Check message is sent.
set_config($disableprovidersetting, 0, 'message');
$preferences = get_message_output_default_preferences();
$this->assertTrue($preferences->$disableprovidersetting == 0);
$sink = $this->redirectEmails();
$this->assertTrue(phpunit_util::is_redirecting_phpmailer());
message_send($message);
$emails = $sink->get_messages();
$email = reset($emails);
$this->assertEquals($email->subject, 'message subject 1');
}
public function test_message_get_providers_for_user() {
global $CFG, $DB;

View file

@ -41,6 +41,15 @@ if (($form = data_submitted()) && confirm_sesskey()) {
// Prepare default message outputs settings
foreach ( $providers as $provider) {
$componentproviderbase = $provider->component.'_'.$provider->name;
$disableprovidersetting = $componentproviderbase.'_disable';
$providerdisabled = false;
if (!isset($form->$disableprovidersetting)) {
$providerdisabled = true;
$preferences[$disableprovidersetting] = 1;
} else {
$preferences[$disableprovidersetting] = 0;
}
foreach (array('permitted', 'loggedin', 'loggedoff') as $setting){
$value = null;
$componentprovidersetting = $componentproviderbase.'_'.$setting;
@ -56,13 +65,13 @@ if (($form = data_submitted()) && confirm_sesskey()) {
}
// Ensure that loggedin loggedoff options are set correctly
// for this permission
if ($value == 'forced') {
$form->{$componentproviderbase.'_loggedin'}[$processor->name] = 1;
$form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 1;
} else if ($value == 'disallowed') {
if (($value == 'disallowed') || $providerdisabled) {
// It might be better to unset them, but I can't figure out why that cause error
$form->{$componentproviderbase.'_loggedin'}[$processor->name] = 0;
$form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 0;
} else if ($value == 'forced') {
$form->{$componentproviderbase.'_loggedin'}[$processor->name] = 1;
$form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 1;
}
// record the site preference
$preferences[$processor->name.'_provider_'.$componentprovidersetting] = $value;

View file

@ -54,6 +54,12 @@ M.core_message.init_defaultoutputs = function(Y) {
// set initial layout
node.simulate("change");
}, this);
Y.all('#defaultmessageoutputs input.messagedisable').each(function(node) {
// Attach event listener
node.on('change', defaultoutputs.changeProviderState);
node.simulate("change");
}, this);
},
changeState : function(e) {
@ -83,6 +89,26 @@ M.core_message.init_defaultoutputs = function(Y) {
node.setAttribute('checked', 1)
}
}, this);
},
changeProviderState : function(e) {
var isenabled = e.target.get('checked') || undefined;
var parentnode = e.target.ancestor('tr');
if (!isenabled) {
parentnode.all('select').each(function(node) {
node.set('value', 'disallowed');
node.setAttribute('disabled', 1);
defaultoutputs.updateCheckboxes(node.ancestor('td'), 1, 0);
}, this);
parentnode.addClass('dimmed_text');
} else {
parentnode.all('select').each(function(node) {
node.removeAttribute('disabled');
node.set('value', 'permitted');
defaultoutputs.updateCheckboxes(node.ancestor('td'), 0, 0);
}, this);
parentnode.removeClass('dimmed_text');
}
}
}

View file

@ -134,6 +134,9 @@ class core_message_renderer extends plugin_renderer_base {
foreach ($processors as $processor) {
$table->head[] = get_string('pluginname', 'message_'.$processor->name);
}
// Add enable/disable to head
$table->head[] = get_string('enabled', 'core_message');
// Generate the matrix of settings for each provider and processor
foreach ($providers as $provider) {
$row = new html_table_row();
@ -143,14 +146,16 @@ class core_message_renderer extends plugin_renderer_base {
// Provider Name
$providername = get_string('messageprovider:'.$provider->name, $provider->component);
$row->cells[] = new html_table_cell($providername);
$providersettingprefix = $provider->component.'_'.$provider->name.'_';
$disableprovidersetting = $providersettingprefix.'disable';
$providerdisabled = !empty($preferences->$disableprovidersetting);
// Settings for each processor
foreach ($processors as $processor) {
$cellcontent = '';
foreach (array('permitted', 'loggedin', 'loggedoff') as $setting) {
// pepare element and preference names
$elementname = $provider->component.'_'.$provider->name.'_'.$setting.'['.$processor->name.']';
$preferencebase = $provider->component.'_'.$provider->name.'_'.$setting;
$elementname = $providersettingprefix.$setting.'['.$processor->name.']';
$preferencebase = $providersettingprefix.$setting;
// prepare language bits
$processorname = get_string('pluginname', 'message_'.$processor->name);
$statename = get_string($setting, 'message');
@ -164,7 +169,9 @@ class core_message_renderer extends plugin_renderer_base {
// determine the current setting or use default
$select = MESSAGE_DEFAULT_PERMITTED;
$preference = $processor->name.'_provider_'.$preferencebase;
if (array_key_exists($preference, $preferences)) {
if ($providerdisabled) {
$select = MESSAGE_DISALLOWED;
} else if (array_key_exists($preference, $preferences)) {
$select = $preferences->{$preference};
}
// dropdown menu
@ -193,6 +200,10 @@ class core_message_renderer extends plugin_renderer_base {
}
$row->cells[] = new html_table_cell($cellcontent);
}
$disableprovider = html_writer::checkbox($disableprovidersetting, 1, !$providerdisabled, '',
array('id' => $disableprovidersetting, 'class' => 'messagedisable'));
$disableprovider = html_writer::tag('div', $disableprovider);
$row->cells[] = new html_table_cell($disableprovider);
$table->data[] = $row;
}
@ -240,6 +251,7 @@ class core_message_renderer extends plugin_renderer_base {
$numprocs = count($processors);
// Display the messaging options table(s)
foreach ($components as $component) {
$provideradded = false;
$table = new html_table();
$table->attributes['class'] = 'generaltable';
$table->data = array();
@ -249,18 +261,18 @@ class core_message_renderer extends plugin_renderer_base {
$componentname = get_string('coresystem');
}
$table->head = array($componentname);
foreach ($readyprocessors as $processor) {
$table->head[] = get_string('pluginname', 'message_'.$processor->name);
}
// Populate the table with rows
foreach ($providers as $provider) {
if( $provider->component != $component) {
$preferencebase = $provider->component.'_'.$provider->name;
// If provider component is not same or provider disabled then don't show.
if (($provider->component != $component) ||
(!empty($defaultpreferences->{$preferencebase.'_disable'}))) {
continue;
}
$preferencebase = $provider->component.'_'.$provider->name;
$provideradded = true;
$headerrow = new html_table_row();
$providername = get_string('messageprovider:'.$provider->name, $provider->component);
$providercell = new html_table_cell($providername);
@ -331,10 +343,13 @@ class core_message_renderer extends plugin_renderer_base {
$table->data[] = $optionrow;
}
}
// Add settings only if provider added for component.
if ($provideradded) {
$output .= html_writer::start_tag('div', array('class' => 'messagesettingcomponent'));
$output .= html_writer::table($table);
$output .= html_writer::end_tag('div');
}
}
$output .= html_writer::end_tag('fieldset');