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; 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_edit; } #---------------------------------------------------------------------------- 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;