321 lines
11 KiB
Perl
321 lines
11 KiB
Perl
package WebGUI::Mailing::Admin;
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Carp 'confess';
|
|
|
|
use WebGUI::Asset;
|
|
use WebGUI::AdminConsole;
|
|
|
|
# prevent sub redef warnings
|
|
#require WebGUI::Mailing;
|
|
|
|
#----------------------------------------------------------------------------
|
|
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;
|
|
|
|
return $self->session->setting->get('newsletterReturnDomain') ? 1 : 0;
|
|
}
|
|
|
|
#----------------------------------------------------------------------------
|
|
sub getAdminConsole {
|
|
my $self = shift;
|
|
my $session = $self->session;
|
|
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' ) ) if $isAdmin;
|
|
$ac->addSubmenuItem( $url->page( 'newsletter=bounce;func=bounceReport' ), $i18n->get( 'bounce scores' ) );
|
|
|
|
return $ac;
|
|
}
|
|
|
|
#----------------------------------------------------------------------------
|
|
sub getMailables {
|
|
my $self = shift;
|
|
|
|
return WebGUI::Asset->getRoot( $self->session )->getLineage( ['descendants'], {
|
|
returnObjects => 1,
|
|
whereClause => 'assetData.assetId in (select distinct assetId from assetAspectMailable)',
|
|
} );
|
|
}
|
|
|
|
#----------------------------------------------------------------------------
|
|
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;
|
|
my $session = shift || confess 'No session passed';
|
|
|
|
bless { _session => $session }, $class;
|
|
}
|
|
|
|
#----------------------------------------------------------------------------
|
|
sub session {
|
|
return (shift)->{ _session };
|
|
}
|
|
|
|
#----------------------------------------------------------------------------
|
|
sub www_createMailing {
|
|
my $self = shift;
|
|
my $session = $self->session;
|
|
my $form = $session->form;
|
|
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
|
|
|
|
return $session->privilege->insufficient unless $self->canManage;
|
|
|
|
my $assetId = $form->guid( 'assetId' );
|
|
my $issueId = $form->guid( 'issueId' );
|
|
|
|
# Sanity check: does assetId exist?
|
|
my $asset = WebGUI::Asset->newByDynamicClass( $session, $assetId )
|
|
|| return "Error: Asset [$assetId] could not be instanciated";
|
|
|
|
# Sanity check: is asset mailable?
|
|
unless ( $asset->isa( 'WebGUI::AssetAspect::Mailable' ) ) {
|
|
return "Error: Asset [$assetId] is not Mailable";
|
|
}
|
|
|
|
# Sanity check: does issue exist?
|
|
my $issue = WebGUI::Asset->newByDynamicClass( $session, $issueId )
|
|
|| return "Error: issue [$issueId] for asset [$assetId] could not be instanciated.";
|
|
|
|
# All ok, create mailing.
|
|
require WebGUI::Mailing;
|
|
my $mailing = WebGUI::Mailing->create( $session, {
|
|
assetId => $assetId,
|
|
issueId => $issueId,
|
|
state => 'idle',
|
|
} );
|
|
|
|
my $f = $mailing->getEditForm;
|
|
$f->hidden(
|
|
name => 'newsletter',
|
|
value => 'manage',
|
|
);
|
|
$f->hidden(
|
|
name => 'func',
|
|
value => 'createMailingSave',
|
|
);
|
|
$f->hidden(
|
|
name => 'assetId',
|
|
value => $assetId,
|
|
);
|
|
$f->hidden(
|
|
name => 'issueId',
|
|
value => $issueId,
|
|
);
|
|
|
|
my $output = $mailing->renderInConsole( $f->print, $i18n->get('configure mailing') );
|
|
$mailing->delete;
|
|
|
|
return $output;
|
|
}
|
|
|
|
#----------------------------------------------------------------------------
|
|
sub www_createMailingSave {
|
|
my $self = shift;
|
|
my $session = $self->session;
|
|
my $form = $session->form;
|
|
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
|
|
|
|
return $session->privilege->insufficient unless $self->canManage;
|
|
|
|
my $assetId = $form->guid( 'assetId' );
|
|
my $issueId = $form->guid( 'issueId' );
|
|
|
|
# Sanity check: does assetId exist?
|
|
my $asset = WebGUI::Asset->newByDynamicClass( $session, $assetId )
|
|
|| return "Error: Asset [$assetId] could not be instanciated";
|
|
|
|
# Sanity check: is asset mailable?
|
|
unless ( $asset->isa( 'WebGUI::AssetAspect::Mailable' ) ) {
|
|
return "Error: Asset [$assetId] is not Mailable";
|
|
}
|
|
|
|
# Sanity check: does issue exist?
|
|
my $issue = WebGUI::Asset->newByDynamicClass( $session, $issueId )
|
|
|| return "Error: issue [$issueId] for asset [$assetId] could not be instanciated.";
|
|
|
|
# All ok, create mailing.
|
|
require WebGUI::Mailing;
|
|
my $mailing = WebGUI::Mailing->create( $session, {
|
|
assetId => $assetId,
|
|
issueId => $issueId,
|
|
state => 'idle',
|
|
} );
|
|
|
|
return $mailing->www_editSave;
|
|
}
|
|
|
|
#----------------------------------------------------------------------------
|
|
sub www_settings {
|
|
my $self = shift;
|
|
my $session = $self->session;
|
|
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',
|
|
value => 'manage',
|
|
);
|
|
$f->hidden(
|
|
name => 'func',
|
|
value => 'settingsSave',
|
|
);
|
|
$f->text(
|
|
name => 'newsletterReturnDomain',
|
|
value => $setting->get( 'newsletterReturnDomain' ),
|
|
label => $i18n->get( 'newsletter domain name' ),
|
|
);
|
|
$f->integer(
|
|
name => 'newsletterBounceScoreThreshold',
|
|
value => $setting->get( 'newsletterBounceScoreThreshold' ),
|
|
label => $i18n->get( 'bounce score threshold' ),
|
|
);
|
|
$f->template(
|
|
name => 'mailingManagerTemplateId',
|
|
value => $setting->get( 'mailingManagerTemplateId' ),
|
|
defaultValue => 'FTfNhWI8KJOwLzFUl5rYeQ',
|
|
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' ) );
|
|
|
|
}
|
|
|
|
#----------------------------------------------------------------------------
|
|
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;
|
|
}
|
|
|
|
#----------------------------------------------------------------------------
|
|
sub www_view {
|
|
my $self = shift;
|
|
my $session = $self->session;
|
|
my $url = $session->url;
|
|
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;
|
|
|
|
my @newsletterLoop;
|
|
foreach my $asset ( @{ $mailableAssets } ) {
|
|
my $assetId = $asset->getId;
|
|
|
|
my @issues;
|
|
foreach my $issue ( @{ $asset->getIssues } ) {
|
|
my $issueId = $issue->getId;
|
|
|
|
my @mailings;
|
|
require WebGUI::Mailing;
|
|
my $it = WebGUI::Mailing->getAllIterator( $session, { sequenceKeyValue => $issueId } );
|
|
while ( my $mailing = $it->() ) {
|
|
push @mailings, $mailing->getViewVars;
|
|
};
|
|
|
|
push @issues, {
|
|
%{ $issue->get },
|
|
url => $issue->getUrl,
|
|
createMailingUrl => $url->page("newsletter=manage;func=createMailing;assetId=$assetId;issueId=$issueId"),
|
|
editUrl => $issue->getUrl( 'func=edit' ),
|
|
mailing_loop => \@mailings,
|
|
};
|
|
}
|
|
|
|
push @newsletterLoop, {
|
|
%{ $asset->get },
|
|
url => $asset->getUrl,
|
|
editUrl => $asset->getUrl( 'func=edit' ),
|
|
issue_loop => \@issues,
|
|
issueCount => scalar( @issues ),
|
|
};
|
|
}
|
|
|
|
my $var = { newsletter_loop => \@newsletterLoop };
|
|
|
|
my $template = WebGUI::Asset::Template->new( $session, $setting->get('mailingManagerTemplateId') );
|
|
return $self->getAdminConsole->render( $template->process( $var ), $i18n->get( 'manage mailings' ) );
|
|
}
|
|
|
|
1;
|
|
|