Add distinction between mailing managers and admins.

This commit is contained in:
Martin Kamerbeek 2010-06-04 15:17:26 +02:00
parent a1d8ab6f70
commit 36a51a17a3
6 changed files with 152 additions and 23 deletions

View file

@ -72,6 +72,7 @@ sub getMailingProperties {
subject => {
fieldType => 'text',
label => $i18n->get( 'subject' ),
defaultValue=> $self->getTitle,
},
styleTemplateId => {
fieldType => 'template',

View file

@ -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' );

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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 );
}