Fixed bug where generate mailing would generate two mailings before even saving the form.

This commit is contained in:
Martin Kamerbeek 2011-06-15 04:56:23 +02:00
parent ed0398a2c0
commit 87139a7498
2 changed files with 113 additions and 45 deletions

View file

@ -40,7 +40,7 @@ sub cancel {
); );
}; };
$self->update( { $self->update( {
state => 'idle', state => 'idle',
sendDate => undef, sendDate => undef,
} ); } );
@ -65,7 +65,7 @@ sub crud_definition {
assetId => { assetId => {
fieldType => 'guid', fieldType => 'guid',
}, },
issueId => { issueId => {
fieldType => 'guid', fieldType => 'guid',
}, },
@ -83,7 +83,7 @@ sub crud_definition {
}, },
); );
$definition->{ properties } = { $definition->{ properties } = {
%{ $definition->{ properties } || {} }, %{ $definition->{ properties } || {} },
%properties, %properties,
}; };
@ -94,7 +94,7 @@ sub crud_definition {
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
sub delete { sub delete {
my $self = shift; my $self = shift;
$self->deleteQueuedEmails; $self->deleteQueuedEmails;
return $self->SUPER::delete; return $self->SUPER::delete;
@ -103,12 +103,12 @@ sub delete {
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
sub deleteQueuedEmails { sub deleteQueuedEmails {
my $self = shift; my $self = shift;
my $it = $self->getQueuedEmailIterator; my $it = $self->getQueuedEmailIterator;
while ( my $email = $it->() ) { while ( my $email = $it->() ) {
$email->delete; $email->delete;
} }
$it = $self->getQueuedTestEmailIterator; $it = $self->getQueuedTestEmailIterator;
while ( my $email = $it->() ) { while ( my $email = $it->() ) {
$email->delete; $email->delete;
@ -180,8 +180,8 @@ sub getStatusLine {
my $self = shift; my $self = shift;
my $db = $self->session->db; my $db = $self->session->db;
my $sth = $db->read( my $sth = $db->read(
'select status, isTest, count( status ) as cnt from Mailing_email where mailingId=? group by status,isTest', 'select status, isTest, count( status ) as cnt from Mailing_email where mailingId=? group by status,isTest',
[ [
$self->getId, $self->getId,
], ],
@ -260,7 +260,7 @@ sub queue {
$state, $state,
); );
}; };
$self->queueEmails( $self->getAsset->getRecipients ); $self->queueEmails( $self->getAsset->getRecipients );
$self->update( { $self->update( {
@ -285,7 +285,7 @@ sub queueEmails {
recipientEmail => undef, recipientEmail => undef,
isTest => 0, isTest => 0,
} ); } );
} }
return; return;
@ -334,7 +334,7 @@ sub send {
$state, $state,
); );
}; };
$self->update( { state => 'sending' } ); $self->update( { state => 'sending' } );
my $complete = $self->sendQueuedEmails( $timeLimit ); my $complete = $self->sendQueuedEmails( $timeLimit );
@ -361,7 +361,7 @@ sub sendQueuedEmails {
$email->send; $email->send;
} }
return 1; return 1;
} }
@ -380,7 +380,7 @@ sub www_cancel {
$i18n->get('cancel mailing success'), $i18n->get('cancel mailing success'),
$i18n->get('cancel mailing'), $i18n->get('cancel mailing'),
); );
} }
else { else {
return $self->renderInConsole( return $self->renderInConsole(
$i18n->get('cancel mailing failure'), $i18n->get('cancel mailing failure'),
@ -415,13 +415,13 @@ sub www_delete {
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
sub www_edit { sub www_edit {
my $self = shift; my $self = shift;
my $session = $self->session; my $session = $self->session;
my $i18n = WebGUI::International->new( $session, 'MailingManager' ); my $i18n = WebGUI::International->new( $session, 'MailingManager' );
return $session->privilege->insufficient unless $self->admin->canManage; return $session->privilege->insufficient unless $self->admin->canManage;
my $f = WebGUI::HTMLForm->new( $session ); my $f = $self->getEditForm;
$f->hidden( $f->hidden(
name => 'newsletter', name => 'newsletter',
value => 'mailing', value => 'mailing',
@ -435,6 +435,16 @@ sub www_edit {
value => $self->getId, value => $self->getId,
); );
return $self->renderInConsole( $f->print, $i18n->get('configure mailing') );
}
#----------------------------------------------------------------------------
sub getEditForm {
my $self = shift;
my $session = $self->session;
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
my $f = WebGUI::HTMLForm->new( $session );
my %fields = %{ $self->getAsset->getMailingProperties( $self ) }; my %fields = %{ $self->getAsset->getMailingProperties( $self ) };
my $configuration = $self->get('configuration') || {}; my $configuration = $self->get('configuration') || {};
while ( my( $name, $properties ) = each %fields ) { while ( my( $name, $properties ) = each %fields ) {
@ -444,7 +454,7 @@ sub www_edit {
my $formField = WebGUI::Form::DynamicField->new( $session, %{ $properties } ); my $formField = WebGUI::Form::DynamicField->new( $session, %{ $properties } );
my $element = $formField->toHtml; # Works around a bug in WG::Form::Template in < 7.9.8 my $element = $formField->toHtml; # Works around a bug in WG::Form::Template in < 7.9.8
my $readonly = $formField->getValueAsHtml; # where getValueAsHtml wouldn't set the correct options hashref my $readonly = $formField->getValueAsHtml; # where getValueAsHtml wouldn't set the correct options hashref
my $html = $self->admin->canOverride || $properties->{ managerCanEdit } my $html = $self->admin->canOverride || $properties->{ managerCanEdit }
? $element ? $element
: $readonly : $readonly
@ -458,12 +468,12 @@ sub www_edit {
$f->submit( value => $i18n->get( 'generate mailing' ) ); $f->submit( value => $i18n->get( 'generate mailing' ) );
my $cancelUrl = $session->url->page( 'newsletter=manage' ); my $cancelUrl = $session->url->page( 'newsletter=manage' );
$f->button( $f->button(
value => $i18n->get( 'cancel' ), value => $i18n->get( 'cancel' ),
extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"}, extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"},
); );
return $self->renderInConsole( $f->print, $i18n->get('configure mailing') ); return $f;
} }
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
@ -486,7 +496,7 @@ sub www_previewEmail {
my $session = $self->session; my $session = $self->session;
my ( $form, $url ) = $session->quick( 'form', 'url' ); my ( $form, $url ) = $session->quick( 'form', 'url' );
my $i18n = WebGUI::International->new( $session, 'MailingManager' ); my $i18n = WebGUI::International->new( $session, 'MailingManager' );
return $session->privilege->insufficient unless $self->admin->canManage; return $session->privilege->insufficient unless $self->admin->canManage;
my $asset = $self->getAsset; my $asset = $self->getAsset;
@ -494,7 +504,7 @@ sub www_previewEmail {
my $manageUrl = $url->page('newsletter=manage'); my $manageUrl = $url->page('newsletter=manage');
my $subject = $asset->getSubject( $self->get('configuration') ); my $subject = $asset->getSubject( $self->get('configuration') );
my $userSelection = my $userSelection =
qq{ qq{
<p><a href="$manageUrl">Terug naar de mailing manager.</a></p> <p><a href="$manageUrl">Terug naar de mailing manager.</a></p>
<label for="acElem">Kies een gebruiker:</label> <label for="acElem">Kies een gebruiker:</label>
@ -516,11 +526,11 @@ sub www_previewEmail {
} }
</style> </style>
<!-- Individual YUI CSS files --> <!-- Individual YUI CSS files -->
<link rel="stylesheet" type="text/css" href="/extras/yui/build/autocomplete/assets/skins/sam/autocomplete.css"> <link rel="stylesheet" type="text/css" href="/extras/yui/build/autocomplete/assets/skins/sam/autocomplete.css">
<!-- Individual YUI JS files --> <!-- Individual YUI JS files -->
<script type="text/javascript" src="/extras/yui/build/yahoo-dom-event/yahoo-dom-event.js"></script> <script type="text/javascript" src="/extras/yui/build/yahoo-dom-event/yahoo-dom-event.js"></script>
<script type="text/javascript" src="/extras/yui/build/datasource/datasource-min.js"></script> <script type="text/javascript" src="/extras/yui/build/datasource/datasource-min.js"></script>
<script type="text/javascript" src="/extras/yui/build/autocomplete/autocomplete-min.js"></script> <script type="text/javascript" src="/extras/yui/build/autocomplete/autocomplete-min.js"></script>
<script type="text/javascript"> <script type="text/javascript">
$js $js
@ -544,8 +554,8 @@ sub getAutoCompleteJS {
my $contentBase = $url->page( "newsletter=mailing;func=previewContent;id=".$self->getId ); my $contentBase = $url->page( "newsletter=mailing;func=previewContent;id=".$self->getId );
my $data = to_json( [ my $data = to_json( [
map { { map { {
id => $_->getId, id => $_->getId,
name => $_->username . " (" . $_->get('email') . ")", name => $_->username . " (" . $_->get('email') . ")",
} } } }
grep { defined $_ } grep { defined $_ }
@ -594,7 +604,7 @@ sub www_editSave {
return $session->privilege->insufficient unless $self->admin->canManage; return $session->privilege->insufficient unless $self->admin->canManage;
my %fields = %{ $self->getAsset->getMailingProperties( $self ) }; my %fields = %{ $self->getAsset->getMailingProperties( $self ) };
my $configuration = {}; my $configuration = {};
while ( my( $name, $properties ) = each %fields ) { while ( my( $name, $properties ) = each %fields ) {
if ( $self->admin->canOverride || $properties->{ managerCanEdit } ) { if ( $self->admin->canOverride || $properties->{ managerCanEdit } ) {
my $value = $form->process( $name, $properties->{ fieldType }, $properties->{ defaultValue } ); my $value = $form->process( $name, $properties->{ fieldType }, $properties->{ defaultValue } );
@ -605,7 +615,7 @@ sub www_editSave {
$configuration->{ $name } = $properties->{ defaultValue } || $properties->{ value }; $configuration->{ $name } = $properties->{ defaultValue } || $properties->{ value };
} }
} }
#### TODO: Add error checking and required fields? #### TODO: Add error checking and required fields?
$self->update( { configuration => $configuration } ); $self->update( { configuration => $configuration } );
@ -644,7 +654,7 @@ sub www_sendBatch {
extras => qq{class="forwardButton"}, extras => qq{class="forwardButton"},
); );
my $cancelUrl = $session->url->page( 'newsletter=manage' ); my $cancelUrl = $session->url->page( 'newsletter=manage' );
$f->button( $f->button(
value => $i18n->get( 'cancel' ), value => $i18n->get( 'cancel' ),
extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"}, extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"},
); );
@ -687,13 +697,13 @@ sub www_sendBatchConfirm {
my $scheduled = $form->dateTime( 'sendDate' ); my $scheduled = $form->dateTime( 'sendDate' );
return $self->www_sendBatch unless $scheduled; return $self->www_sendBatch unless $scheduled;
my $asset = WebGUI::Asset->newByDynamicClass( $session, $self->get('assetId') ); my $asset = WebGUI::Asset->newByDynamicClass( $session, $self->get('assetId') );
croak "Cannot instaciate asset " . $self->get('assetId') unless $asset; croak "Cannot instaciate asset " . $self->get('assetId') unless $asset;
$self->schedule( $scheduled ); $self->schedule( $scheduled );
return $self->renderInConsole( return $self->renderInConsole(
sprintf( $i18n->get('schedule mailing success'), sprintf( $i18n->get('schedule mailing success'),
$session->datetime->epochToHuman( $scheduled ), $session->datetime->epochToHuman( $scheduled ),
$session->url->page('newsletter=manage'), $session->url->page('newsletter=manage'),
@ -747,12 +757,12 @@ sub www_sendTestEmails {
multiple=> 1, multiple=> 1,
options => \%options, options => \%options,
); );
$f->submit( $f->submit(
value => $i18n->get('send test mails'), value => $i18n->get('send test mails'),
extras => qq{class="forwardButton"}, extras => qq{class="forwardButton"},
); );
my $cancelUrl = $session->url->page( 'newsletter=manage' ); my $cancelUrl = $session->url->page( 'newsletter=manage' );
$f->button( $f->button(
value => $i18n->get( 'cancel' ), value => $i18n->get( 'cancel' ),
extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"}, extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"},
); );
@ -774,7 +784,7 @@ sub www_sendTestEmailsConfirm {
$self->queueTestEmails( $to, \@userIds ); $self->queueTestEmails( $to, \@userIds );
return $self->renderInConsole( return $self->renderInConsole(
sprintf( $i18n->get('send test mail success'), sprintf( $i18n->get('send test mail success'),
scalar( @userIds ), scalar( @userIds ),
$to, $to,

View file

@ -96,9 +96,10 @@ sub www_createMailing {
my $self = shift; my $self = shift;
my $session = $self->session; my $session = $self->session;
my $form = $session->form; my $form = $session->form;
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
return $session->privilege->insufficient unless $self->canManage; return $session->privilege->insufficient unless $self->canManage;
my $assetId = $form->guid( 'assetId' ); my $assetId = $form->guid( 'assetId' );
my $issueId = $form->guid( 'issueId' ); my $issueId = $form->guid( 'issueId' );
@ -117,13 +118,70 @@ sub www_createMailing {
# All ok, create mailing. # All ok, create mailing.
require WebGUI::Mailing; require WebGUI::Mailing;
my $mailing = WebGUI::Mailing->create( $session, { my $mailing = WebGUI::Mailing->create( $session, {
assetId => $assetId, assetId => $assetId,
issueId => $issueId, issueId => $issueId,
state => 'idle', state => 'idle',
} ); } );
return $mailing->www_edit; 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;
} }
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
@ -193,7 +251,7 @@ sub www_settingsSave {
my $session = $self->session; my $session = $self->session;
return $session->privilege->insufficient unless $self->isAdmin; return $session->privilege->insufficient unless $self->isAdmin;
my ($setting, $form) = $session->quick( 'setting', 'form' ); my ($setting, $form) = $session->quick( 'setting', 'form' );
$setting->set( 'newsletterReturnDomain', $form->get('newsletterReturnDomain') ); $setting->set( 'newsletterReturnDomain', $form->get('newsletterReturnDomain') );
@ -215,7 +273,7 @@ sub www_view {
my $i18n = WebGUI::International->new( $session, 'MailingManager' ); my $i18n = WebGUI::International->new( $session, 'MailingManager' );
return $session->privilege->insufficient unless $self->canManage; return $session->privilege->insufficient unless $self->canManage;
return $self->www_settings unless $self->configurationComplete; return $self->www_settings unless $self->configurationComplete;
my $mailableAssets = $self->getMailables; my $mailableAssets = $self->getMailables;
@ -235,14 +293,14 @@ sub www_view {
push @mailings, $mailing->getViewVars; push @mailings, $mailing->getViewVars;
}; };
push @issues, { push @issues, {
%{ $issue->get }, %{ $issue->get },
url => $issue->getUrl, url => $issue->getUrl,
createMailingUrl => $url->page("newsletter=manage;func=createMailing;assetId=$assetId;issueId=$issueId"), createMailingUrl => $url->page("newsletter=manage;func=createMailing;assetId=$assetId;issueId=$issueId"),
editUrl => $issue->getUrl( 'func=edit' ), editUrl => $issue->getUrl( 'func=edit' ),
mailing_loop => \@mailings, mailing_loop => \@mailings,
}; };
} }
push @newsletterLoop, { push @newsletterLoop, {
%{ $asset->get }, %{ $asset->get },