From 36a51a17a3861902ef6c93677e645fbd6fa15f2d Mon Sep 17 00:00:00 2001 From: Martin Kamerbeek Date: Fri, 4 Jun 2010 15:17:26 +0200 Subject: [PATCH] Add distinction between mailing managers and admins. --- lib/WebGUI/AssetAspect/Mailable.pm | 1 + lib/WebGUI/Mailing.pm | 60 ++++++++++++++++---- lib/WebGUI/Mailing/Admin.pm | 68 ++++++++++++++++++++++- lib/WebGUI/i18n/Dutch/MailingManager.pm | 9 +++ lib/WebGUI/i18n/English/MailingManager.pm | 9 +++ sbin/install_newsletter.pl | 28 ++++++---- 6 files changed, 152 insertions(+), 23 deletions(-) diff --git a/lib/WebGUI/AssetAspect/Mailable.pm b/lib/WebGUI/AssetAspect/Mailable.pm index b54a013..7e2d9d2 100644 --- a/lib/WebGUI/AssetAspect/Mailable.pm +++ b/lib/WebGUI/AssetAspect/Mailable.pm @@ -72,6 +72,7 @@ sub getMailingProperties { subject => { fieldType => 'text', label => $i18n->get( 'subject' ), + defaultValue=> $self->getTitle, }, styleTemplateId => { fieldType => 'template', diff --git a/lib/WebGUI/Mailing.pm b/lib/WebGUI/Mailing.pm index d11967b..0882a79 100644 --- a/lib/WebGUI/Mailing.pm +++ b/lib/WebGUI/Mailing.pm @@ -9,6 +9,13 @@ use JSON qw{ to_json }; use base 'WebGUI::Crud'; +#---------------------------------------------------------------------------- +sub admin { + my $self = shift; + + return WebGUI::Mailing::Admin->new( $self->session ); +} + #---------------------------------------------------------------------------- sub canCancel { my $self = shift; @@ -333,6 +340,8 @@ sub www_cancel { my $session = $self->session; my $i18n = WebGUI::International->new( $session, 'MailingManager' ); + return $session->privilege->insufficient unless $self->admin->canManage; + if ( $self->canCancel ) { $self->cancel; @@ -356,6 +365,8 @@ sub www_delete { my $self = shift; my $session = $self->session; + return $session->privilege->insufficient unless $self->admin->canManage; + $self->delete; return WebGUI::Mailing::Admin->new($session)->www_view; @@ -367,6 +378,8 @@ sub www_edit { my $session = $self->session; my $i18n = WebGUI::International->new( $session, 'MailingManager' ); + return $session->privilege->insufficient unless $self->admin->canManage; + my $f = WebGUI::HTMLForm->new( $session ); $f->hidden( name => 'newsletter', @@ -384,22 +397,33 @@ sub www_edit { my %fields = %{ $self->getAsset->getMailingProperties }; my $configuration = $self->get('configuration') || {}; while ( my( $name, $properties ) = each %fields ) { - $f->dynamicField( - name => $name, - %{ $properties }, - value => $configuration->{ $name }, + $properties->{ name } = $name; + $properties->{ value } = $configuration->{ $name } if exists $properties->{ value }; + + my $formField = WebGUI::Form::DynamicField->new( $session, %{ $properties } ); + my $html = $self->admin->canOverride + ? $formField->toHtml + : $formField->getValueAsHtml + ; + + $f->readOnly( + label => $properties->{ label }, + value => $html, ); } $f->submit; - return WebGUI::Mailing::Admin->new($session)->getAdminConsole->render( $f->print, $i18n->get('configure mailing') ); + return $self->renderInConsole( $f->print, $i18n->get('configure mailing') ); } #---------------------------------------------------------------------------- sub www_previewContent { my $self = shift; - my $form = $self->session->form; + my $session = $self->session; + my $form = $session->form; + + return $session->privilege->insufficient unless $self->admin->canManage; my $issueId = $self->get('issueId'); my $userId = $form->get('userId'); @@ -414,6 +438,8 @@ sub www_previewEmail { my ( $form, $url ) = $session->quick( 'form', 'url' ); my $i18n = WebGUI::International->new( $session, 'MailingManager' ); + return $session->privilege->insufficient unless $self->admin->canManage; + my $asset = $self->getAsset; my $manageUrl = $url->page('newsletter=manage'); @@ -516,12 +542,19 @@ sub www_editSave { my $session = $self->session; my $form = $session->form; + return $session->privilege->insufficient unless $self->admin->canManage; + my %fields = %{ $self->getAsset->getMailingProperties }; my $configuration = {}; - while ( my( $name, $properties ) = each %fields ) { - my $value = $form->process( $name, $properties->{ fieldType }, $properties->{ defaultValue } ); + if ( $self->admin->canOverride ) { + while ( my( $name, $properties ) = each %fields ) { + my $value = $form->process( $name, $properties->{ fieldType }, $properties->{ defaultValue } ); - $configuration->{ $name } = $value; + $configuration->{ $name } = $value; + } + } + else { + $configuration = \%fields; } #### TODO: Add error checking and required fields? @@ -536,6 +569,8 @@ sub www_sendBatch { my $session = $self->session; my $i18n = WebGUI::International->new( $session, 'MailingManager' ); + return $session->privilege->insufficient unless $self->admin->canManage; + my $f = WebGUI::HTMLForm->new( $session ); $f->hidden( name => 'newsletter', @@ -596,6 +631,8 @@ sub www_sendBatchConfirm { my $form = $session->form; my $i18n = WebGUI::International->new( $session, 'MailingManager' ); + return $session->privilege->insufficient unless $self->admin->canManage; + my $scheduled = $form->dateTime( 'sendDate' ); return $self->www_sendBatch unless $scheduled; @@ -620,7 +657,8 @@ sub www_sendTestEmails { my $session = $self->session; my $i18n = WebGUI::International->new( $session, 'MailingManager' ); - + return $session->privilege->insufficient unless $self->admin->canManage; + my $asset = WebGUI::Asset->newByDynamicClass( $session, $self->get('assetId') ); croak "Cannot instanciate asset " . $self->get('assetId') unless $asset; @@ -678,6 +716,8 @@ sub www_sendTestEmailsConfirm { my $form = $session->form; my $i18n = WebGUI::International->new( $session, 'MailingManager' ); + return $session->privilege->insufficient unless $self->admin->canManage; + my $to = $form->get( 'to' ); my @userIds = $form->selectList( 'userIds' ); diff --git a/lib/WebGUI/Mailing/Admin.pm b/lib/WebGUI/Mailing/Admin.pm index a05fe03..9693e6d 100644 --- a/lib/WebGUI/Mailing/Admin.pm +++ b/lib/WebGUI/Mailing/Admin.pm @@ -7,6 +7,21 @@ use Carp 'confess'; use WebGUI::Asset; use WebGUI::AdminConsole; +#---------------------------------------------------------------------------- +sub canManage { + my $self = shift; + + return $self->isAdmin || $self->isManager; +} + +#---------------------------------------------------------------------------- +sub canOverride { + my $self = shift; + my $setting = $self->session->setting; + + return $self->isAdmin || $setting->get( 'mailingManagersCanOverrideDefault' ) && $self->isManager; +} + #---------------------------------------------------------------------------- sub configurationComplete { my $self = shift; @@ -21,10 +36,12 @@ sub getAdminConsole { my $url = $session->url; my $i18n = WebGUI::International->new( $session, 'MailingManager' ); + my $isAdmin = $self->isAdmin; + my $ac = WebGUI::AdminConsole->new( $session ); $ac->addSubmenuItem( $url->page( 'newsletter=manage' ), $i18n->get( 'manage mailings' ) ); - $ac->addSubmenuItem( $url->page( 'newsletter=manage;func=settings' ), $i18n->get( 'newsletter settings' ) ); + $ac->addSubmenuItem( $url->page( 'newsletter=manage;func=settings' ), $i18n->get( 'newsletter settings' ) ) if $isAdmin; $ac->addSubmenuItem( $url->page( 'newsletter=bounce;func=bounceReport' ), $i18n->get( 'bounce scores' ) ); return $ac; @@ -40,6 +57,24 @@ sub getMailables { } ); } +#---------------------------------------------------------------------------- +sub isAdmin { + my $self = shift; + my $session = $self->session; + my $setting = $session->setting; + + return $session->user->isInGroup( $setting->get('mailingAdminGroupId' ) ); +} + +#---------------------------------------------------------------------------- +sub isManager { + my $self = shift; + my $session = $self->session; + my $setting = $session->setting; + + return $session->user->isInGroup( $setting->get('mailingManagerGroupId' ) ); +} + #---------------------------------------------------------------------------- sub new { my $class = shift; @@ -59,6 +94,8 @@ sub www_createMailing { my $session = $self->session; my $form = $session->form; + return $session->privilege->insufficient unless $self->canManage; + # TODO: test if assetId and issueId are valid. my $assetId = $form->guid( 'assetId' ); my $issueId = $form->guid( 'issueId' ); @@ -79,6 +116,8 @@ sub www_settings { my $setting = $session->setting; my $i18n = WebGUI::International->new( $session, 'MailingManager' ); + return $session->privilege->insufficient unless $self->isAdmin; + my $f = WebGUI::HTMLForm->new( $session ); $f->hidden( name => 'newsletter', @@ -105,6 +144,26 @@ sub www_settings { label => $i18n->get( 'manage mailings template' ), namespace => 'Mailing/Manage', ); + $f->group( + name => 'mailingAdminGroupId', + value => $setting->get( 'mailingAdminGroupId' ), + defaultValue => 3, + label => $i18n->get( 'mailing admin group' ), + excludeGroups => [ 1, 2, 7 ], + ); + $f->group( + name => 'mailingManagerGroupId', + value => $setting->get( 'mailingManagerGroupId' ), + defaultValue => 3, + label => $i18n->get( 'mailing manager group' ), + excludeGroups => [ 1, 2, 7 ], + ); + $f->yesNo( + name => 'mailingManagersCanOverrideDefault', + value => $setting->get( 'mailingManagersCanOverrideDefault' ), + defaultValue => 0, + label => $i18n->get( 'mailing managers can override' ), + ); $f->submit; return $self->getAdminConsole->render($f->print, $i18n->get( 'newsletter settings' ) ); @@ -116,11 +175,16 @@ sub www_settingsSave { my $self = shift; my $session = $self->session; + return $session->privilege->insufficient unless $self->isAdmin; + my ($setting, $form) = $session->quick( 'setting', 'form' ); $setting->set( 'newsletterReturnDomain', $form->get('newsletterReturnDomain') ); $setting->set( 'newsletterBounceScoreThreshold', $form->integer('newsletterBounceScoreThreshold') ); $setting->set( 'mailingManagerTemplateId', $form->template('mailingManagerTemplateId') ); + $setting->set( 'mailingAdminGroupId', $form->group('mailingAdminGroupId') ); + $setting->set( 'mailingManagerGroupId', $form->group('mailingManagerGroupId') ); + $setting->set( 'mailingManagersCanOverrideDefault', $form->yesNo('mailingManagersCanOverrideDefault') ); return $self->www_settings; } @@ -133,6 +197,8 @@ sub www_view { my $setting = $session->setting; my $i18n = WebGUI::International->new( $session, 'MailingManager' ); + return $session->privilege->insufficient unless $self->canManage; + return $self->www_settings unless $self->configurationComplete; my $mailableAssets = $self->getMailables; diff --git a/lib/WebGUI/i18n/Dutch/MailingManager.pm b/lib/WebGUI/i18n/Dutch/MailingManager.pm index 582dff7..635315f 100644 --- a/lib/WebGUI/i18n/Dutch/MailingManager.pm +++ b/lib/WebGUI/i18n/Dutch/MailingManager.pm @@ -87,6 +87,15 @@ our $I18N = { message => 'Mailing beheer sjabloon', }, + 'mailing admin group' => { + message => 'Mailing admins', + }, + 'mailing manager group' => { + message => 'Maling managers', + }, + 'mailing managers can override' => { + message => 'Mogen managers mailing defaults aanpassen?', + }, }; 1; diff --git a/lib/WebGUI/i18n/English/MailingManager.pm b/lib/WebGUI/i18n/English/MailingManager.pm index fee900d..b2add90 100644 --- a/lib/WebGUI/i18n/English/MailingManager.pm +++ b/lib/WebGUI/i18n/English/MailingManager.pm @@ -87,6 +87,15 @@ our $I18N = { message => 'Manage mailings template', }, + 'mailing admin group' => { + message => 'Mailing admins', + }, + 'mailing manager group' => { + message => 'Maling managers', + }, + 'mailing managers can override' => { + message => 'Allow managers to override mailing defaults', + }, }; 1; diff --git a/sbin/install_newsletter.pl b/sbin/install_newsletter.pl index 7de8939..cf9ec95 100644 --- a/sbin/install_newsletter.pl +++ b/sbin/install_newsletter.pl @@ -157,10 +157,10 @@ sub installMailingTables { # Remname tables from a previous (bad) name to a new (good) one. # Must be done before the crudCreateOrUpdate calls to prevent creation of stale tables. my @tables = $db->buildArray( 'show tables' ); - if ( grep { $_ eq 'WGMailing' } @tables ) { + if ( scalar grep { $_ eq 'WGMailing' } @tables ) { $db->write( 'rename table WGMailing to Mailing' ); } - if ( grep { $_ eq 'WGMailing_queue' } @tables ) { + if ( scalar grep { $_ eq 'WGMailing_queue' } @tables ) { $db->write( 'rename table WGMailing_queue to Mailing_email' ); } @@ -180,7 +180,7 @@ sub installNewsletterInAdminConsole { print "\tAdding newsletter admin console section..."; $session->config->set( 'adminConsole/mailable', { - groupSetting => "admins", + groupSetting => "mailingManagerGroupId", icon => "newsletter.gif", title => "Newsletter", uiLevel => 7, @@ -197,14 +197,18 @@ sub installNewsletterSettings { print "\tInstalling newsletter setting slots..."; - $setting->add( 'newsletterReturnDomain', undef ) - unless $setting->has( 'newsletterReturnDomain' ); + my %settings = ( + newsletterReturnDomain => undef, + newsletterBounceScoreThreshold => 0, + mailingManagerTemplateId => 'FTfNhWI8KJOwLzFUl5rYeQ', + mailingAdminGroupId => 3, + mailingManagerGroupId => 3, + mailingManagersCanOverrideDefault => 0, + ); - $setting->add( 'newsletterBounceScoreThreshold', 0 ) - unless $setting->has( 'newsletterBounceScoreThreshold' ); - - $setting->add( 'mailingManagerTemplateId', 'FTfNhWI8KJOwLzFUl5rYeQ' ) - unless $setting->has( 'mailingManagerTemplateId' ); + while ( my ($name, $value) = each %settings ) { + $setting->add( $name => $value ) unless $setting->has( $name ); + } print "Done.\n"; } @@ -221,13 +225,13 @@ sub addPluginsToConfigFile { } ); my @handlers = @{ $session->config->get('contentHandlers') }; - if ( !grep { $_ eq 'WebGUI::Content::NewsletterManager' } @handlers ) { + if ( !scalar grep { $_ eq 'WebGUI::Content::NewsletterManager' } @handlers ) { insert_after_string 'WebGUI::Content::Shop', 'WebGUI::Content::NewsletterManager', @handlers; $session->config->set( 'contentHandlers', \@handlers ); } my @workflows = @{ $session->config->get('workflowActivities/None') }; - if ( !grep { $_ eq 'WebGUI::Workflow::Activity::SendQueuedMailings' } @workflows ) { + if ( !scalar grep { $_ eq 'WebGUI::Workflow::Activity::SendQueuedMailings' } @workflows ) { push @workflows, 'WebGUI::Workflow::Activity::SendQueuedMailings'; $session->config->set( 'workflowActivities/None', \@workflows ); }