Compare commits

..

2 commits

Author SHA1 Message Date
Martin Kamerbeek
5418008419 Allow empty senderIp and default to 127.0.0.1. 2010-11-19 13:23:02 +01:00
Martin Kamerbeek
dbf935e98b Unslow bounce report generation and add some extra info as a bonus! 2010-11-12 18:02:50 +01:00
20 changed files with 197 additions and 595 deletions

View file

@ -1,3 +1,3 @@
Mail::DeliveryStatus::BounceParser (v 1.525) Mail::DeliveryStatus::BounceParser
Class::InsideOut (v 1.10) Class::InsideOut

View file

@ -8,7 +8,7 @@ use Class::C3;
use WebGUI::User::SpecialState; use WebGUI::User::SpecialState;
use base qw{ use base qw{
WebGUI::AssetAspect::Mailable WebGUI::AssetAspect::Mailable
WebGUI::AssetAspect::Subscriber WebGUI::AssetAspect::Subscriber
WebGUI::Asset::Wobject WebGUI::Asset::Wobject
}; };
@ -34,15 +34,8 @@ sub definition {
tab => 'display', tab => 'display',
defaultValue => 1, defaultValue => 1,
}, },
useHoneypot => {
fieldType => 'yesNo',
label => $i18n->get('useHoneypot label'),
hoverHelp => $i18n->get('useHoneypot description'),
tab => 'security',
defaultValue => 1,
},
); );
push @{ $definition }, { push @{ $definition }, {
assetName => $i18n->get('assetName'), assetName => $i18n->get('assetName'),
icon => 'newsletter_collection.gif', icon => 'newsletter_collection.gif',
@ -59,16 +52,12 @@ sub definition {
sub getIssues { sub getIssues {
my $self = shift; my $self = shift;
# Caching of instanciated assets is not for speed, but is requied since prepareView is called on them, and we my $issues = $self->getLineage( [ 'children' ], {
# need them again in that state in getViewVars. returnObjects => 1,
unless ( $self->{ _issues } ) { orderByClause => 'lineage desc',
$self->{ _issues } = $self->getLineage( [ 'children' ], { } );
returnObjects => 1,
orderByClause => 'lineage desc', return $issues;
} );
}
return $self->{ _issues };
} }
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
@ -99,8 +88,7 @@ sub getAssetContent {
my $self = shift; my $self = shift;
my $asset = shift; my $asset = shift;
# Do not call prepareView on $asset here but rather do this in our own prepareView to prevent head tags being $asset->prepareView;
# written to body.
my $content = $asset->view; my $content = $asset->view;
return $content; return $content;
@ -118,11 +106,6 @@ sub prepareView {
$self->{ _viewTemplate } = $template; $self->{ _viewTemplate } = $template;
# Call prepareview on issues here, to prevent head tags ending up in the body.
foreach my $issue ( @{ $self->getIssues } ) {
$issue->prepareView;
}
return; return;
} }
@ -143,11 +126,11 @@ sub getViewVars {
foreach my $issue ( @{ $issues } ) { foreach my $issue ( @{ $issues } ) {
my $issueVar = $issue->get; my $issueVar = $issue->get;
$issueVar->{ url } = $issue->getUrl; $issueVar->{ url } = $issue->getUrl;
my $isRecent = defined $displayIssueId my $isRecent =
? $issue->getId eq $displayIssueId ( !$displayIssueId && $recentCount < $maxRecent )
: $recentCount < $maxRecent || ( $issue->getId eq $displayIssueId )
; ;
if ( $isRecent ) { if ( $isRecent ) {
$issueVar->{ content } = $self->getAssetContent( $issue ); $issueVar->{ content } = $self->getAssetContent( $issue );
@ -174,7 +157,7 @@ sub view {
my $self = shift; my $self = shift;
my $form = $self->session->form; my $form = $self->session->form;
my $var = $self->getViewVars( { my $var = $self->getViewVars( {
displayIssue => $form->guid('displayIssue'), displayIssue => $form->guid('displayIssue'),
} ); } );
@ -182,3 +165,4 @@ sub view {
} }
1; 1;

View file

@ -2,7 +2,7 @@ package WebGUI::AssetAspect::Mailable;
use strict; use strict;
use warnings; use warnings;
use Class::C3; use Class::C3;
use WebGUI::Macro; use WebGUI::Macro;
use Tie::IxHash; use Tie::IxHash;
@ -115,15 +115,13 @@ sub processContentAsUser {
$session->user( { userId => $userId } ); $session->user( { userId => $userId } );
$session->log->preventDebugOutput; $session->log->preventDebugOutput;
my $styleTemplateId = my $styleTemplateId =
$configuration->{ styleTemplateId } $configuration->{ styleTemplateId }
|| $self->get('mailStyleTemplateId') || $self->get('mailStyleTemplateId')
|| $self->get('styleTemplateId'); || $self->get('styleTemplateId');
$session->stow->set( 'mailing_rendering' => 1 );
# Generate email body for this user # Generate email body for this user
my $content = $session->style->process( my $content = $session->style->process(
$self->generateEmailContent( $issueId, $configuration ), $self->generateEmailContent( $issueId, $configuration ),
$styleTemplateId, $styleTemplateId,
); );
@ -131,13 +129,10 @@ sub processContentAsUser {
# Process macros # Process macros
WebGUI::Macro::process( $session, \$content ); WebGUI::Macro::process( $session, \$content );
$session->stow->delete( 'mailing_rendering' );
# Become ourselves again. # Become ourselves again.
$session->user( { userId => $currentUser->getId } ); $session->user( { userId => $currentUser->getId } );
$var->switchAdminOn if $adminOn; $var->switchAdminOn if $adminOn;
return $content; return $content;
} }

View file

@ -12,7 +12,6 @@ use WebGUI::Mail::Send;
use WebGUI::Group; use WebGUI::Group;
use WebGUI::Asset; use WebGUI::Asset;
use WebGUI::Form; use WebGUI::Form;
use WebGUI::Form::Honeypot;
use WebGUI::User::SpecialState; use WebGUI::User::SpecialState;
use WebGUI::International; use WebGUI::International;
use Tie::IxHash; use Tie::IxHash;
@ -88,13 +87,6 @@ sub definition {
namespace => 'Subscriber/NoMutationEmail', namespace => 'Subscriber/NoMutationEmail',
tab => 'subscription', tab => 'subscription',
}, },
confirmMutationTemplateId => {
fieldType => 'template',
defaultValue => 'WUk-wEhGiF8dcEogrJfrfg',
label => $i18n->get( 'confirm mutation template' ),
namespace => 'Subscriber/MutationConfirmation',
tab => 'subscription',
}
); );
push( @{ $definition }, { push( @{ $definition }, {
@ -193,44 +185,6 @@ sub isSubscribed {
} }
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
=head2 appendSubscriptionFormVars
=head3 honeyPot
Part of the form vars are the honeyPot variables. This is a form plugin that
is used in NewsletterCollection.pm to activate the use of a honeypot or not,
in this module, AssetAspect/Subscriber.pm, to check the honeypot and to
display the form values and in i18n.
There are the following form vars:
=head4 subscriptionForm_emailBox
This renders both the emailbox, subscribe/unsubscribe radio buttons and the
honeypot form inputs:
<input id="email_formId" name="email" value="" size="30" maxlength="255" type="text">
<fieldset style="border:none;margin:0;padding:0">
<label>
<input name="action" value="subscribe" id="action1" type="radio">Inschrijven
</label>
<label>
<input name="action" value="unsubscribe" id="action2" type="radio">Uitschrijven
</label>
</fieldset>
<input name="hp_timestamp" value="1540249684" type="hidden">
<input id="d28a72b5e1a47804be42367afaf56b4d_hp" class="honeypot" name="hp_surname" value="" size="30" maxlength="255" type="text">
You can easily make the honeypot input field invisible with some css for
class honeypot.
=head4 form_honeypot
Renders these fields:
<input name="hp_timestamp" value="1540249684" type="hidden">
<input id="d28a72b5e1a47804be42367afaf56b4d_hp" class="honeypot" name="hp_surname" value="" size="30" maxlength="255" type="text">
=head4 form_honeypot_id
Gives you the id for the honeypot input. This makes it easy to create a label:
=cut
sub appendSubscriptionFormVars { sub appendSubscriptionFormVars {
my $self = shift; my $self = shift;
my $var = shift || {}; my $var = shift || {};
@ -242,37 +196,12 @@ sub appendSubscriptionFormVars {
WebGUI::Form::formHeader( $session, { action => $self->getUrl } ) WebGUI::Form::formHeader( $session, { action => $self->getUrl } )
. WebGUI::Form::hidden( $session, { name => 'func', value => 'processSubscription' } ) . WebGUI::Form::hidden( $session, { name => 'func', value => 'processSubscription' } )
; ;
my $formFooter = WebGUI::Form::formFooter( $session );
my $subscribeButton = my $subscribeButton =
$formHeader sprintf '<button type="submit" name="action" value="subscribe">%s</button>', $i18n->get('subscribe');
. WebGUI::Form::hidden( $session, { name => 'action', value => 'subscribe' } )
. WebGUI::Form::submit( $session, { value => $i18n->get('subscribe') } )
. $formFooter
;
my $unsubscribeButton = my $unsubscribeButton =
$formHeader sprintf '<button type="submit" name="action" value="unsubscribe">%s</button>', $i18n->get('unsubscribe');
. WebGUI::Form::hidden( $session, { name => 'action', value => 'unsubscribe' } ) my $emailBox = WebGUI::Form::email( $session, { name => 'email', value => '' } );
. WebGUI::Form::submit( $session, { value => $i18n->get('unsubscribe') } ) my $formFooter = WebGUI::Form::formFooter( $session );
. $formFooter
;
# honeypot is connected to the emailbox, that is displayed on anonymous subscription
# and only if set to useHoneyPot in definition/display
my $honeypot = WebGUI::Form::Honeypot->new( $self->session, { name => 'hp' } );
my $honeypot_form = $self->get('useHoneypot') ? $honeypot->toHtml : '';
my $emailBox =
$formHeader
. WebGUI::Form::email( $session, { name => 'email', value => '' } )
. WebGUI::Form::radioList( $session, {
name => 'action',
options => {
subscribe => $i18n->get('subscribe'),
unsubscribe => $i18n->get('unsubscribe'),
}
} )
. $honeypot_form
. WebGUI::Form::submit( $session )
. $formFooter
;
# Compose default subscription form for current user # Compose default subscription form for current user
my $form = ''; my $form = '';
@ -281,21 +210,19 @@ sub appendSubscriptionFormVars {
$form .= $unsubscribeButton if $self->canUnsubscribe; $form .= $unsubscribeButton if $self->canUnsubscribe;
} }
elsif ( $self->get('allowAnonymousSubscription') ) { elsif ( $self->get('allowAnonymousSubscription') ) {
$form = $emailBox; $form = $emailBox . $subscribeButton . $unsubscribeButton;
} }
# Setup tmpl_vars # Setup tmpl_vars
$var->{ subscriptionForm_form } = $form if $form; $var->{ subscriptionForm_form } = "$formHeader $form $formFooter" if $form;
$var->{ subscriptionForm_header } = $formHeader; $var->{ subscriptionForm_header } = $formHeader;
$var->{ subscriptionForm_footer } = $formFooter; $var->{ subscriptionForm_footer } = $formFooter;
$var->{ subscriptionForm_subscribeButton } = $subscribeButton; $var->{ subscriptionForm_subscribeButton } = $subscribeButton;
$var->{ subscriptionForm_unsubscribeButton } = $unsubscribeButton; $var->{ subscriptionForm_unsubscribeButton } = $unsubscribeButton;
$var->{ subscriptionForm_emailBox } = $emailBox; $var->{ subscrittionForm_emailBox } = $emailBox;
$var->{ user_canSubscribe } = $self->canSubscribe; $var->{ user_canSubscribe } = $self->canSubscribe;
$var->{ user_canUnsubscribe } = $self->canUnsubscribe; $var->{ user_canUnsubscribe } = $self->canUnsubscribe;
$var->{ user_isRegistered } = $session->user->isRegistered; $var->{ user_isRegistered } = $session->user->isRegistered;
$var->{ form_honeypot } = $honeypot->toHtml;
$var->{ form_honeypot_id } = $honeypot->get('id');
return $var; return $var;
} }
@ -395,13 +322,7 @@ sub sendSubscriptionConfirmation {
my $action = shift || 'subscribe'; my $action = shift || 'subscribe';
my $session = $self->session; my $session = $self->session;
my $i18n = WebGUI::International->new( $session, 'AssetAspect_Subscriber' ); my $i18n = WebGUI::International->new( $session, 'AssetAspect_Subscriber' );
=pod
my $honeypot = $session->form->honeypot( 'hp' );
if ( $self->get('useHoneypot') && $honeypot ) {
$session->log->warn( "Honeypot triggered: $honeypot" );
return;
}
=cut
my $var = $self->getEmailVars( $user ); my $var = $self->getEmailVars( $user );
my $url = $session->url->getSiteURL . $self->getUrl( "func=confirmMutation;code=$code" ); my $url = $session->url->getSiteURL . $self->getUrl( "func=confirmMutation;code=$code" );
@ -440,13 +361,7 @@ sub sendNoMutationEmail {
my $action = shift || 'subscribe'; my $action = shift || 'subscribe';
my $session = $self->session; my $session = $self->session;
my $i18n = WebGUI::International->new( $session, 'AssetAspect_Subscriber' ); my $i18n = WebGUI::International->new( $session, 'AssetAspect_Subscriber' );
=pod
my $honeypot = $session->form->honeypot( 'hp' );
if ( $self->get('useHoneypot') && $honeypot ) {
$session->log->warn( "Honeypot triggered: $honeypot" );
return;
}
=cut
my $var = $self->getEmailVars( $user ); my $var = $self->getEmailVars( $user );
$var->{ actionIsSubscribe } = $action eq 'subscribe'; $var->{ actionIsSubscribe } = $action eq 'subscribe';
@ -612,30 +527,21 @@ sub www_confirmMutation {
] ]
); );
my $var = {
message => $i18n->get( 'wrong code' ),
returnUrl => $self->getUrl,
isSuccess => 0,
"is$type" => 1,
};
if ( $userId ) { if ( $userId ) {
$self->logConfirmation( $code ); $self->logConfirmation( $code );
if ( $type eq 'subscribe' ) { if ( $type eq 'subscribe' ) {
$self->getSubscriptionGroup->addUsers( [ $userId ] ); $self->getSubscriptionGroup->addUsers( [ $userId ] );
return $self->processStyle( sprintf $i18n->get( 'subscription successful'), $self->getUrl );
$var->{ message } = sprintf $i18n->get( 'subscription successful'), $self->getUrl;
$var->{ isSuccess } = 1;
} }
elsif ( $type eq 'unsubscribe' ) { elsif ( $type eq 'unsubscribe' ) {
$self->getSubscriptionGroup->deleteUsers( [ $userId ] ); $self->getSubscriptionGroup->deleteUsers( [ $userId ] );
return $self->processStyle( sprintf $i18n->get( 'unsubscription successful' ), $self->getUrl );
$var->{ message } = sprintf $i18n->get( 'unsubscription successful' ), $self->getUrl;
$var->{ isSuccess } = 1;
} }
} }
return $self->processStyle( $self->processTemplate( $var, $self->get('confirmMutationTemplateId') ) ); return $self->processStyle( $i18n->get( 'wrong code' ) );
} }
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
@ -682,12 +588,6 @@ sub www_processSubscription {
my $action = $form->get( 'action' ); my $action = $form->get( 'action' );
return unless $action eq 'subscribe' || $action eq 'unsubscribe'; return unless $action eq 'subscribe' || $action eq 'unsubscribe';
my $honeypot = $session->form->honeypot( 'hp' );
if ( $self->get('useHoneypot') && $honeypot ) {
$session->log->warn( "Honeypot triggered: $honeypot" );
return;
}
if ( $session->user->isRegistered ) { if ( $session->user->isRegistered ) {
if ( $action eq 'subscribe' && $self->canSubscribe ) { if ( $action eq 'subscribe' && $self->canSubscribe ) {
$self->subscribe; $self->subscribe;
@ -742,3 +642,4 @@ sub www_unsubscribe {
} }
1; 1;

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 = $self->getEditForm; my $f = WebGUI::HTMLForm->new( $session );
$f->hidden( $f->hidden(
name => 'newsletter', name => 'newsletter',
value => 'mailing', value => 'mailing',
@ -435,16 +435,6 @@ 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 ) {
@ -454,7 +444,7 @@ sub getEditForm {
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
@ -468,12 +458,12 @@ sub getEditForm {
$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 $f; return $self->renderInConsole( $f->print, $i18n->get('configure mailing') );
} }
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
@ -496,7 +486,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;
@ -504,7 +494,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>
@ -526,11 +516,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
@ -554,8 +544,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 $_ }
@ -604,7 +594,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 } );
@ -615,7 +605,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 } );
@ -654,7 +644,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"},
); );
@ -697,13 +687,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'),
@ -757,12 +747,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"},
); );
@ -784,7 +774,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,10 +96,9 @@ 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' );
@ -118,70 +117,13 @@ 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',
} ); } );
my $f = $mailing->getEditForm; return $mailing->www_edit;
$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;
} }
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
@ -251,7 +193,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') );
@ -273,7 +215,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;
@ -293,14 +235,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 },

View file

@ -86,77 +86,21 @@ EOSQL
my $sth = $db->read( $sql, [ $windowSize, $windowSize - 1 ] ); my $sth = $db->read( $sql, [ $windowSize, $windowSize - 1 ] );
my $output = '<div class="yui-skin-sam"><div id="tableWrapper"><table id="bounceScoreTable"><thead><tr><th>' my $output = '<table><tr><th>'
. join( '</th><th>', . join( '</th><th>',
$i18n->get('email'), $i18n->get('email'),
$i18n->get('bounce score'), $i18n->get('bounce score'),
$i18n->get('bounce reason'), $i18n->get('bounce reason'),
$i18n->get('bounce message') $i18n->get('bounce message')
) )
. '</th></tr></thead><tbody>'; . '</th></tr>';
while ( my $values = $sth->arrayRef ) { while ( my $values = $sth->arrayRef ) {
$output .= '<tr><td>'. join( '</td><td>', @$values ) . '</td></tr>'; $output .= '<tr><td>'. join( '</td><td>', @$values ) . '</td></tr>';
} }
$output .= '</tbody></table></div></div>'; $output .= '</table>';
$self->addBounceScoreTableJS;
return WebGUI::Mailing::Admin->new( $session )->getAdminConsole->render( $output, $i18n->get( 'bounce scores' ) ); return WebGUI::Mailing::Admin->new( $session )->getAdminConsole->render( $output, $i18n->get( 'bounce scores' ) );
} }
sub addBounceScoreTableJS {
my $self = shift;
my ($style, $url) = $self->session->quick( qw{ style url } );
my $i18n = WebGUI::International->new( $self->session, 'MailingManager' );
my $emailLabel = $i18n->get('email');
my $scoreLabel = $i18n->get('bounce score');
my $reasonLabel = $i18n->get('bounce reason');
my $messageLabel= $i18n->get('bounce message');
my $js = <<EOJS;
<script type="text/javascript">
//<!--
YAHOO.util.Event.onDOMReady( function () {
var columnDefs = [
{ key : "email", label : "$emailLabel", sortable : true },
{ key : "bounceScore", label : "$scoreLabel", sortable : true },
{ key : "bounceReason", label : "$reasonLabel", sortable : true },
{ key : "bounceMessage", label : "$messageLabel", sortable : true }
];
var ds = new YAHOO.util.DataSource( YAHOO.util.Dom.get('bounceScoreTable') );
ds.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
ds.responseSchema = {
fields: [
{ key : 'email' },
{ key : 'bounceScore', parser : 'number' },
{ key : 'bounceReason' },
{ key : 'bounceMessage' }
]
};
var dt = new YAHOO.widget.DataTable( 'tableWrapper', columnDefs, ds, {
sortedBy : {
key : 'bounceScore',
dir : 'desc'
}
} );
} );
//-->
</script>
EOJS
$style->setLink( $url->extras('yui/build/datatable/assets/skins/sam/datatable.css'), { type => 'text/css', rel => 'stylesheet' } );
$style->setScript( $url->extras('yui/build/yahoo-dom-event/yahoo-dom-event.js'), { type => 'text/javascript' } );
$style->setScript( $url->extras('yui/build/element/element-min.js'), { type => 'text/javascript' } );
$style->setScript( $url->extras('yui/build/datasource/datasource-min.js'), { type => 'text/javascript' } );
$style->setScript( $url->extras('yui/build/datatable/datatable-min.js'), { type => 'text/javascript' } );
$style->setRawHeadTags( $js );
return;
}
1; 1;

View file

@ -54,7 +54,7 @@ sub crud_definition {
}, },
); );
$definition->{ properties } = { $definition->{ properties } = {
%{ $definition->{ properties } || {} }, %{ $definition->{ properties } || {} },
%properties, %properties,
}; };
@ -128,19 +128,20 @@ sub absolutifyURIs {
my $tb = HTML::TreeBuilder->new; my $tb = HTML::TreeBuilder->new;
my $root = $tb->parse( $content ); my $root = $tb->parse( $content );
foreach my $link ( @{ $root->extract_links } ) { foreach my $link ( @{ $root->extract_links } ) {
my ($uri, $element, $attr, $tag) = @{ $link }; my ($uri, $element, $attr, $tag) = @{ $link };
if ( $uri !~ m{ ^ (?: [a-z]+:// | \# | mailto: ) }xmsi ) {
my $new = if ( $uri !~ m{ ^ [a-z]+:// }xmsi ) {
my $new =
( $uri =~ m{ ^ / }xmsi ) # Is url absolute? ( $uri =~ m{ ^ / }xmsi ) # Is url absolute?
? $siteUrl . $uri ? $siteUrl . $uri
: $siteUrl . $pageUrl . '/' . $uri : $siteUrl . $pageUrl . '/' . $uri
; ;
# replace attribute # replace attribute
$element->attr( $attr, $new ); $element->attr( $attr, $new );
} }
} }
return $tb->as_HTML; return $tb->as_HTML;
} }
@ -166,7 +167,7 @@ sub send {
#### TODO: Error checking #### TODO: Error checking
my $mailing = $self->getMailing; my $mailing = $self->getMailing;
unless ( $mailing ) { unless ( $mailing ) {
$session->log->error( 'Cannot send because getMailing doesn\'t return one.' ); $session->log->error( 'Cannot send because getMailing doesn\'t return one.' );
return; return;
} }
@ -192,7 +193,7 @@ sub send {
# Check bounce score # Check bounce score
my $bounceScoreOk = WebGUI::Mailing::Bounce->new( $session )->bounceScoreOk( $to ); my $bounceScoreOk = WebGUI::Mailing::Bounce->new( $session )->bounceScoreOk( $to );
if ( !$self->get( 'isTest' ) && !$bounceScoreOk ) { if ( !$self->get( 'isTest' ) && !$bounceScoreOk ) {
$self->update( { $self->update( {
status => 'skipped', status => 'skipped',
sendDate => time, sendDate => time,
errorMessage => "Bounce score for $to too high", errorMessage => "Bounce score for $to too high",
@ -227,14 +228,14 @@ sub send {
} }
} }
# And send it. # And send it.
my $success = $mail->send; my $success = $mail->send;
if ( $success ne '1' ) { if ( $success ne '1' ) {
$self->error( "Mail couldn't be sent by WebGUI::Mail::Send" ); $self->error( "Mail couldn't be sent by WebGUI::Mail::Send" );
} }
else { else {
$self->update( { $self->update( {
status => 'sent', status => 'sent',
sendDate => time, sendDate => time,
sentTo => $to, sentTo => $to,

View file

@ -15,15 +15,12 @@ sub getAvailableMailings {
my $self = shift; my $self = shift;
my $session = $self->session; my $session = $self->session;
my $mailingIds = $self->get( 'includeMailings' ); my $availableMailings = WebGUI::Asset->getRoot( $session )->getLineage( ['descendants'], {
returnObjects => 1,
isa => 'WebGUI::Asset::Wobject::NewsletterCollection',
} );
my @mailings = return $availableMailings;
grep { defined $_ }
map { WebGUI::Asset->newByDynamicClass( $session, $_ ) }
ref $mailingIds eq 'ARRAY' ? @{ $mailingIds } : $mailingIds
;
return \@mailings;
} }
#------------------------------------------------------------------- #-------------------------------------------------------------------
@ -34,7 +31,7 @@ sub apply {
my $subscribeTo = { my $subscribeTo = {
map { $_ => 1 } @{ $self->getConfigurationData->{ subscribeMailings } || [] } map { $_ => 1 } @{ $self->getConfigurationData->{ subscribeMailings } || [] }
}; };
my $availableMailings = $self->getAvailableMailings; my $availableMailings = $self->getAvailableMailings;
my $sendNotification = 0; my $sendNotification = 0;
@ -52,32 +49,22 @@ sub apply {
return; return;
} }
#------------------------------------------------------------------- ##-------------------------------------------------------------------
sub crud_definition { #sub crud_definition {
my $class = shift; # my $class = shift;
my $session = shift; # my $session = shift;
my $definition = $class->SUPER::crud_definition( $session ); # my $definition = $class->SUPER::crud_definition( $session );
my $i18n = WebGUI::International->new( $session, 'RegistrationStep_MailingSubscribe' ); # my $i18n = WebGUI::International->new( $session, 'Registration_Step_Homepage' );
#
tie my %mailings, 'Tie::IxHash', ( #
map { $_->getId => $_->getTitle } # $definition->{ dynamic }->{ urlStorageField } = {
@{ # fieldType => 'selectBox',
WebGUI::Asset->getRoot( $session )->getLineage( ['descendants'], { # label => 'Store homepage url in field',
returnObjects => 1, # options => \%profileFields,
isa => 'WebGUI::Asset::Wobject::NewsletterCollection', # };
} ) #
} # return $definition;
); #}
$definition->{ dynamic }->{ includeMailings } = {
fieldType => 'checkList',
label => $i18n->get('Include newsletters'),
options => \%mailings,
vertical => 1,
};
return $definition;
}
#------------------------------------------------------------------- #-------------------------------------------------------------------
sub getSummaryTemplateVars { sub getSummaryTemplateVars {
@ -90,7 +77,7 @@ sub getSummaryTemplateVars {
# Fetch preferred homepage url # Fetch preferred homepage url
my $mailings = $self->getConfigurationData->{ subscribeMailings }; my $mailings = $self->getConfigurationData->{ subscribeMailings };
my @assets = my @assets =
grep { defined $_ } grep { defined $_ }
map { WebGUI::Asset->newByDynamicClass( $session, $_ ) } map { WebGUI::Asset->newByDynamicClass( $session, $_ ) }
@{ $mailings }; @{ $mailings };
@ -102,12 +89,12 @@ sub getSummaryTemplateVars {
# Setup tmpl_var # Setup tmpl_var
my $var = { my $var = {
field_loop => \@fields, field_loop => \@fields,
category_label => $self->get('title'), category_label => $self->get('title'),
category_edit_url => $self->changeStepDataUrl, category_edit_url => $self->changeStepDataUrl,
}; };
return ( $var ); return ( $var );
} }
#------------------------------------------------------------------- #-------------------------------------------------------------------
@ -132,7 +119,7 @@ sub getViewVars {
} }
else { else {
# The step hasn't been done yet. # The step hasn't been done yet.
@subscribeMailings = map { $_->getId } grep { $_->isSubscribed( $user ) } @{ $availableMailings }; @subscribeMailings = grep { $_->isSubscribed( $user ) } @{ $availableMailings };
} }
# Create lookup table # Create lookup table
@ -184,7 +171,10 @@ sub updateFromFormPost {
my $self = shift; my $self = shift;
my $session = $self->session; my $session = $self->session;
return $self->SUPER::updateFromFormPost; $self->SUPER::updateFromFormPost;
# $self->update( {
# } );
} }
#------------------------------------------------------------------- #-------------------------------------------------------------------

View file

@ -3,7 +3,7 @@ package WebGUI::i18n::Dutch::AssetAspect_Subscriber;
use strict; use strict;
our $I18N = { our $I18N = {
'Subscription group' => { 'Subscription group' => {
message => 'Abonnee groep', message => 'Abonnee groep',
}, },
'Enable subscription' => { 'Enable subscription' => {
@ -24,7 +24,7 @@ our $I18N = {
'confirmation email template' => { 'confirmation email template' => {
message => 'Verificatie email: sjabloon', message => 'Verificatie email: sjabloon',
}, },
'no mutation subject' => { 'no mutation subject' => {
message => 'Geen wijziging email: onderwerp', message => 'Geen wijziging email: onderwerp',
}, },
'no mutation template' => { 'no mutation template' => {
@ -52,19 +52,16 @@ our $I18N = {
'anonnymous not allowed' => { 'anonnymous not allowed' => {
message => 'Anonieme inschrijvingen zijn niet toegestaan. Log in om in- of uit te schrijven.', message => 'Anonieme inschrijvingen zijn niet toegestaan. Log in om in- of uit te schrijven.',
}, },
'subscription successful' => { 'subscription successful' => {
message => 'Uw inschrijving is geslaagd.', message => 'Uw inschrijving is geslaagd. <a href="%s">Terug naar de site</a>',
}, },
'unsubscription successful' => { 'unsubscription successful' => {
message => 'Uw uitschrijving is geslaagd.', message => 'Uw uitschrijving is geslaagd. <a href="%s">Terug naar de site</a>',
}, },
'wrong code' => { 'wrong code' => {
message => 'De verificatiecode in de link is onbekend, al gebruikt of verlopen. Als u zich wilt in- of uitschrijven probeer dit dan opnieuw of neem contact op met de websitebeheerders.', message => 'De verificatiecode in de link is onbekend, al gebruikt of verlopen. Als u zich wilt in- of uitschrijven probeer dit dan opnieuw of neem contact op met de websitebeheerders.',
}, },
'confirm mutation template' => {
message => 'Mutatie bevestigings template',
},
}; };
1; 1;

View file

@ -6,26 +6,14 @@ our $I18N = {
assetName => { assetName => {
message => 'Nieuwsbrief collectie', message => 'Nieuwsbrief collectie',
}, },
'subscribe' => {
message => 'inschrijven',
},
'unsubscribe' => {
message => 'uitschrijven',
},
'template' => { 'template' => {
message => 'Sjabloon', message => 'Sjabloon',
}, },
'number of recent issues' => { 'number of recent issues' => {
message => 'Aantal recente nieuwsbrieven', message => 'Aantal recente uitgaven',
}, },
'useHoneypot label' => {
message => q|Gebruik honeypot|,
lastUpdated => 0,
},
'useHoneypot description' => {
message => q|Gebruik honeypot om spam te voorkomen.|,
lastUpdated => 0,
},
}; };
1; 1;

View file

@ -4,13 +4,10 @@ use strict;
our $I18N = { our $I18N = {
'Subscribe to mailings' => { 'Subscribe to mailings' => {
message => 'Ontvang deze nieuwsbrief', message => 'Abonneren op nieuwsbrieven',
}, },
'Subscribe to this mailing' => { 'Subscribe to this mailing' => {
message => 'Ontvang deze nieuwsbrief', message => 'Abonneer op deze nieuwsbrief',
},
'Include newsletters' => {
message => 'Selecteerbare nieuwsbrieven',
}, },
}; };

View file

@ -3,7 +3,7 @@ package WebGUI::i18n::English::AssetAspect_Subscriber;
use strict; use strict;
our $I18N = { our $I18N = {
'Subscription group' => { 'Subscription group' => {
message => 'Subscription group', message => 'Subscription group',
}, },
'Enable subscription' => { 'Enable subscription' => {
@ -24,7 +24,7 @@ our $I18N = {
'confirmation email template' => { 'confirmation email template' => {
message => 'Confirmation email template', message => 'Confirmation email template',
}, },
'no mutation subject' => { 'no mutation subject' => {
message => 'No mutation email subject', message => 'No mutation email subject',
}, },
'no mutation template' => { 'no mutation template' => {
@ -34,6 +34,7 @@ our $I18N = {
message => 'Subscription', message => 'Subscription',
}, },
'subscribe' => { 'subscribe' => {
message => 'Subscribe', message => 'Subscribe',
}, },
@ -51,20 +52,17 @@ our $I18N = {
'anonnymous not allowed' => { 'anonnymous not allowed' => {
message => 'Anonymous subscription is not allowed. Please log in to (un)subscribe', message => 'Anonymous subscription is not allowed. Please log in to (un)subscribe',
}, },
'subscription successful' => { 'subscription successful' => {
message => 'You are succesfully subscribed.', message => 'You are succesfully subscribed. <a href="%s">Back to site</a>',
}, },
'unsubscription successful' => { 'unsubscription successful' => {
message => 'You are succesfully unsubscribed.', message => 'You are succesfully unsubscribed. <a href="%s">Back to site</a>',
}, },
'wrong code' => { 'wrong code' => {
message => 'The verification code you supplied is either unknown, already used or expired. Please try again to (un)subscribe or contact the site administrators.', message => 'The verification code you supplied is either unknown, already used or expired. Please try again to (un)subscribe or contact the site administrators.',
}, },
'confirm mutation template' => {
message => 'Mutation confirmation template',
},
}; };
1; 1;

View file

@ -18,14 +18,7 @@ our $I18N = {
'number of recent issues' => { 'number of recent issues' => {
message => 'Number of recent issues', message => 'Number of recent issues',
}, },
'useHoneypot label' => {
message => q|Use honeypot|,
lastUpdated => 0,
},
'useHoneypot description' => {
message => q|Use honeypot to verify humanity.|,
lastUpdated => 0,
},
}; };
1; 1;

View file

@ -9,9 +9,6 @@ our $I18N = {
'Subscribe to this mailing' => { 'Subscribe to this mailing' => {
message => 'Subscribe to this mailing', message => 'Subscribe to this mailing',
}, },
'Include newsletters' => {
message => 'Include newsletters',
},
}; };
1; 1;

View file

@ -1,7 +1,7 @@
#!/usr/bin/env perl #!/usr/bin/env perl
$|++; # disable output buffering $|++; # disable output buffering
our ($webguiRoot, $configFile, $state, $emailFile, $groupId, $existingUsersGroupId ); our ($webguiRoot, $configFile, $state, $emailFile, $groupId );
BEGIN { BEGIN {
$webguiRoot = ".."; $webguiRoot = "..";
@ -15,16 +15,12 @@ use WebGUI::Session;
use WebGUI::User; use WebGUI::User;
use WebGUI::User::SpecialState; use WebGUI::User::SpecialState;
# Set default value
$existingUsersGroupId = '';
# Get parameters here, including $help # Get parameters here, including $help
GetOptions( GetOptions(
'configFile=s' => \$configFile, 'configFile=s' => \$configFile,
'groupId=s' => \$groupId, 'groupId=s' => \$groupId,
'existingUsersGroupId=s' => \$existingUsersGroupId, 'state=s' => \$state,
'state=s' => \$state, 'emailFile=s' => \$emailFile,
'emailFile=s' => \$emailFile,
); );
my $session = start( $webguiRoot, $configFile ); my $session = start( $webguiRoot, $configFile );
@ -44,24 +40,18 @@ while ( my $email = <$fh> ) {
my $user = WebGUI::User->newByEmail( $session, $email ); my $user = WebGUI::User->newByEmail( $session, $email );
if ( $user ) { if ( $user ) {
print "\tEmail already has account. Skipping.\n"; print "\tEmail already has account. Skipping.\n";
if ( $existingUsersGroupId ) {
print "\tAdding user to group $existingUsersGroupId\n";
$user->addToGroups( [ $existingUsersGroupId ] );
}
else {
print "\tAdding user to group $groupId\n";
$user->addToGroups( [ $groupId ] );
}
} }
else { else {
print "\tEmail has no account, creating special state $state.\n"; print "\tEmail has no account, creating special state $state.\n";
$user = WebGUI::User::SpecialState->create( $session ); $user = WebGUI::User::SpecialState->create( $session );
$user->update( { email => $email } ); $user->update( { email => $email } );
$user->addSpecialState( $state ); $user->addSpecialState( $state );
print "\tAdding user to group $groupId\n";
$user->addToGroups( [ $groupId ] );
} }
print "\tAdding user to group $groupId\n";
$user->addToGroups( [ $groupId ] );
} }
print "Done\n\n"; print "Done\n\n";
@ -130,22 +120,6 @@ The WebGUI config file to use. Only the file name needs to be specified,
since it will be looked up inside WebGUI's configuration directory. since it will be looked up inside WebGUI's configuration directory.
This parameter is required. This parameter is required.
=item B<--groupId>
Add users to this group. If no existingUsersGroupId is given, all users, both new and existing users, are added to this group. If the --existingUsersGroupId is given, new users are added to this group, existing users are added to the existingUsersGroupId.
=item B<--existingUsersGroupId>
Add existing users to this group.
=item B<--state>
Set the so called specialState for this user. For all users disabeled accounts are created. SpecialState accounts can be transformed into regular accounts using the webgui_registration content handler. The special states are crm or Subscriber, for a user added via the crm or a newsletter subscription respectively.
=item B<--emailFile>
A text file with an emailadress on every line.
=item B<--help> =item B<--help>
Shows a short summary and usage Shows a short summary and usage
@ -158,7 +132,7 @@ Shows this document
=head1 AUTHOR =head1 AUTHOR
Copyright 2010-2011 United Knowledge B.V. Copyright 2001-2009 Plain Black Corporation.
=cut =cut

View file

@ -34,77 +34,9 @@ renamespaceTemplates( $session );
addSpecialStateTable( $session ); addSpecialStateTable( $session );
addListNameColumn( $session ); addListNameColumn( $session );
addRegistrationSteps( $session ); addRegistrationSteps( $session );
addConfirmationTemplateColumn( $session );
addSentToIndex( $session ); addSentToIndex( $session );
addUseHoneypotColumn( $session );
addDefaultsToNotNullColumns( $session );
finish($session); finish($session);
#-------------------------------------------------------------------------------
sub addDefaultsToNotNullColumns {
my $session = shift;
my $db = $session->db;
print "\tAdding defaults to not null columns...";
$db->write('ALTER TABLE `assetAspectMailable` ALTER COLUMN `assetId` SET DEFAULT "";');
$db->write('ALTER TABLE `assetAspectMailable` ALTER COLUMN `revisionDate` SET DEFAULT 0;');
$db->write('ALTER TABLE `assetAspectMailable` ALTER COLUMN `mailStyleTemplateId` SET DEFAULT "";');
$db->write('ALTER TABLE `assetAspectSubscriber` ALTER COLUMN `assetId` SET DEFAULT "";');
$db->write('ALTER TABLE `assetAspectSubscriber` ALTER COLUMN `revisionDate` SET DEFAULT 0;');
$db->write('ALTER TABLE `assetAspectSubscriber` ALTER COLUMN `subscriptionEnabled` SET DEFAULT 0;');
$db->write('ALTER TABLE `assetAspectSubscriber` ALTER COLUMN `revisionDate` SET DEFAULT 0;');
$db->write('ALTER TABLE `assetAspectSubscriber` ALTER COLUMN `revisionDate` SET DEFAULT 0;');
$db->write('ALTER TABLE `assetAspectSubscriber_log` ALTER COLUMN `assetId` SET DEFAULT "";');
$db->write('ALTER TABLE `assetAspectSubscriber_log` ALTER COLUMN `requestIp` SET DEFAULT "";');
$db->write('ALTER TABLE `assetAspectSubscriber_log` ALTER COLUMN `userId` SET DEFAULT "";');
$db->write('ALTER TABLE `assetAspectSubscriber_log` ALTER COLUMN `email` SET DEFAULT "";');
$db->write('ALTER TABLE `assetAspectSubscriber_log` ALTER COLUMN `type` SET DEFAULT "";');
$db->write('ALTER TABLE `assetAspectSubscriber_log` ALTER COLUMN `anonymous` SET DEFAULT 0;');
$db->write('ALTER TABLE `Mailing` ALTER COLUMN `mailingId` SET DEFAULT "";');
$db->write('ALTER TABLE `Mailing` ALTER COLUMN `configuration` SET DEFAULT "";');
$db->write('ALTER TABLE `Mailing` ALTER COLUMN `assetId` SET DEFAULT "";');
$db->write('ALTER TABLE `Mailing` ALTER COLUMN `sendDate` SET DEFAULT 0;');
$db->write('ALTER TABLE `Mailing` ALTER COLUMN `issueId` SET DEFAULT "";');
$db->write('ALTER TABLE `Mailing_email` ALTER COLUMN `mailId` SET DEFAULT "";');
print "Done.\n";
}
#-------------------------------------------------------------------------------
sub addConfirmationTemplateColumn {
my $session = shift;
my $db = $session->db;
print "\tAdding column for mutation confirmation template...";
my $hasColumn = $db->quickScalar( 'show columns from assetAspectSubscriber where Field = ?', [
'confirmMutationTemplateId',
] );
unless ( $hasColumn ) {
$db->write(
'alter table assetAspectSubscriber add column confirmMutationTemplateId char(22) binary not null default ?',
[
'WUk-wEhGiF8dcEogrJfrfg',
]
);
$db->write(
'update assetAspectSubscriber set confirmMutationTemplateId=? where confirmMutationTemplateId is null',
[
'WUk-wEhGiF8dcEogrJfrfg',
]
);
}
print "Done.\n";
}
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
sub addSentToIndex { sub addSentToIndex {
@ -144,9 +76,9 @@ sub installMailableAspectTable {
$session->db->write(<<EOSQL); $session->db->write(<<EOSQL);
create table if not exists assetAspectMailable ( create table if not exists assetAspectMailable (
assetId char(22) binary not null default '', assetId char(22) binary not null,
revisionDate bigint(20) not null default 0, revisionDate bigint(20) not null,
mailStyleTemplateId char(22) binary not null default '', mailStyleTemplateId char(22) binary not null,
primary key( assetId, revisionDate ) primary key( assetId, revisionDate )
); );
EOSQL EOSQL
@ -161,33 +93,33 @@ sub installSubscriberAspectTable {
$session->db->write(<<EOSQL); $session->db->write(<<EOSQL);
create table if not exists assetAspectSubscriber ( create table if not exists assetAspectSubscriber (
assetId char(22) binary not null default '', assetId char(22) binary not null,
revisionDate bigint(20) not null default 0, revisionDate bigint(20) not null,
subscriptionGroupId char(22) binary, subscriptionGroupId char(22) binary,
subscriptionEnabled tinyint(1) not null default 0, subscriptionEnabled tinyint(1) not null default 0,
alwaysConfirmSubscription tinyint(1) not null default 0, alwaysConfirmSubscription tinyint(1) not null default 0,
allowAnonymousSubscription tinyint(1) not null default 0, allowAnonymousSubscription tinyint(1) not null default 0,
confirmationRequiredTemplateId char(22) binary, confirmationRequiredTemplateId char(22) binary,
confirmationEmailTemplateId char(22) binary, confirmationEmailTemplateId char(22) binary,
confirmationEmailSubject varchar(255), confirmationEmailSubject varchar(255),
noMutationEmailTemplateId char(22) binary, noMutationEmailTemplateId char(22) binary,
noMutationEmailSubject varchar(255), noMutationEmailSubject varchar(255),
primary key( assetId, revisionDate ) primary key( assetId, revisionDate )
); );
EOSQL EOSQL
$session->db->write(<<EOSQL2); $session->db->write(<<EOSQL2);
create table if not exists assetAspectSubscriber_log ( create table if not exists assetAspectSubscriber_log (
assetId char(22) binary not null default '', assetId char(22) binary not null,
requestIp char(15) not null default '', requestIp char(15) not null,
requestDate bigint(20) not null default 0, requestDate bigint(20) not null,
confirmationIp char(15), confirmationIp char(15),
confirmationDate bigint(20), confirmationDate bigint(20),
userId char(22) binary not null default '', userId char(22) binary not null,
email varchar(255) not null default '', email varchar(255) not null,
type char(30) not null default '', type char(30) not null,
anonymous tinyint(1) not null default 0, anonymous tinyint(1) not null,
confirmed tinyint(1) not null default 0, confirmed tinyint(1) default 0,
code char(22) default null code char(22) default null
); );
EOSQL2 EOSQL2
@ -202,9 +134,8 @@ sub installNewsletterCollection {
$session->db->write(<<EOSQL); $session->db->write(<<EOSQL);
create table if not exists NewsletterCollection ( create table if not exists NewsletterCollection (
assetId char(22) binary not null default '', assetId char(22) binary not null,
revisionDate bigint(20) not null default 0, revisionDate bigint(20) not null,
useHoneypot tinyint(1) not null default 0,
primary key( assetId, revisionDate ) primary key( assetId, revisionDate )
); );
EOSQL EOSQL
@ -219,7 +150,7 @@ sub addTemplateColumnToNewsletterCollection {
print "\tAdding view template column to NewletterCollection..."; print "\tAdding view template column to NewletterCollection...";
my $hasColumn = $db->quickScalar( 'show columns from NewsletterCollection where Field=?', [ 'viewTemplateId' ] ); my $hasColumn = $db->quickScalar( 'show columns from NewsletterCollection where Field=?', [ 'viewTemplateId' ] );
unless ( $hasColumn ) { unless ( $hasColumn ) {
$db->write( 'alter table NewsletterCollection add column viewTemplateId char(22) binary not null default ?', [ $db->write( 'alter table NewsletterCollection add column viewTemplateId char(22) binary not null default ?', [
'aYVYFpofaYvmRYoHwl3x4w' 'aYVYFpofaYvmRYoHwl3x4w'
@ -239,7 +170,7 @@ sub addRecentColumnToNewsletterCollection {
print "\tAdding recent issues column to NewletterCollection..."; print "\tAdding recent issues column to NewletterCollection...";
my $hasColumn = $db->quickScalar( 'show columns from NewsletterCollection where Field=?', [ 'recentIssueCount' ] ); my $hasColumn = $db->quickScalar( 'show columns from NewsletterCollection where Field=?', [ 'recentIssueCount' ] );
unless ( $hasColumn ) { unless ( $hasColumn ) {
$db->write( 'alter table NewsletterCollection add column recentIssueCount int(3) not null default ?', [ $db->write( 'alter table NewsletterCollection add column recentIssueCount int(3) not null default ?', [
1, 1,
@ -298,7 +229,7 @@ sub installNewsletterInAdminConsole {
sub installNewsletterSettings { sub installNewsletterSettings {
my $session = shift; my $session = shift;
my $setting = $session->setting; my $setting = $session->setting;
print "\tInstalling newsletter setting slots..."; print "\tInstalling newsletter setting slots...";
my %settings = ( my %settings = (
@ -323,11 +254,11 @@ sub addPluginsToConfigFile {
my $config = $session->config; my $config = $session->config;
print "\tAdding plugins to config file..."; print "\tAdding plugins to config file...";
$config->set( 'assets/WebGUI::Asset::Wobject::NewsletterCollection', { $config->set( 'assets/WebGUI::Asset::Wobject::NewsletterCollection', {
category => 'basic', category => 'basic',
} ); } );
my @handlers = @{ $session->config->get('contentHandlers') }; my @handlers = @{ $session->config->get('contentHandlers') };
if ( !scalar grep { $_ eq 'WebGUI::Content::NewsletterManager' } @handlers ) { if ( !scalar grep { $_ eq 'WebGUI::Content::NewsletterManager' } @handlers ) {
insert_after_string 'WebGUI::Content::Shop', 'WebGUI::Content::NewsletterManager', @handlers; insert_after_string 'WebGUI::Content::Shop', 'WebGUI::Content::NewsletterManager', @handlers;
@ -339,7 +270,7 @@ sub addPluginsToConfigFile {
push @workflows, 'WebGUI::Workflow::Activity::SendQueuedMailings'; push @workflows, 'WebGUI::Workflow::Activity::SendQueuedMailings';
$session->config->set( 'workflowActivities/None', \@workflows ); $session->config->set( 'workflowActivities/None', \@workflows );
} }
print "Done.\n"; print "Done.\n";
} }
@ -367,8 +298,8 @@ sub addSpecialStateTable {
$session->db->write( <<EOSQL ); $session->db->write( <<EOSQL );
create table if not exists users_specialState ( create table if not exists users_specialState (
userId char(22) binary not null default '', userId char(22) binary not null,
specialState char(30) not null default '', specialState char(30) not null,
primary key ( userId, specialState ) primary key ( userId, specialState )
) )
EOSQL EOSQL
@ -381,63 +312,43 @@ sub addRegistrationSteps {
my $session = shift; my $session = shift;
print "\tAdding MailingSubscribe Registration Step to config..."; print "\tAdding MailingSubscribe Registration Step to config...";
my %steps = map { $_ => 1 } @{ $session->config->get( 'registrationSteps' ) || [] }; my %steps = map { $_ => 1 } @{ $session->config->get( 'registrationSteps' ) || [] };
$steps{ 'WebGUI::Registration::Step::MailingSubscribe' } = 1; $steps{ 'WebGUI::Registration::Step::MailingSubscribe' } = 1;
$session->config->set( 'registrationSteps', [ keys %steps ] ); $session->config->set( 'registrationSteps', [ keys %steps ] );
print "Done.\n"; print "Done.\n";
} }
#----------------------------------------------------------------------------
sub addUseHoneypotColumn {
my $session = shift;
my $db = $session->db;
print "\tAdding useHoneypot column...";
my @columns = $db->buildArray( 'show columns from NewsletterCollection' );
if ( ! grep { $_ eq 'useHoneypot' } @columns ) {
$db->write( 'alter table NewsletterCollection add column useHoneypot tinyint(1) default 0' );
$db->write( 'update NewsletterCollection set useHoneypot = 0 where useHoneypot is null' );
print "Done\n";
}
else {
print "Skipping\n";
}
}
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
sub start { sub start {
my $webguiRoot = shift; my $webguiRoot = shift;
my $configFile = shift; my $configFile = shift;
my $session = WebGUI::Session->open($webguiRoot,$configFile); my $session = WebGUI::Session->open($webguiRoot,$configFile);
$session->user({userId=>3}); $session->user({userId=>3});
## If your script is adding or changing content you need these lines, otherwise leave them commented ## If your script is adding or changing content you need these lines, otherwise leave them commented
# #
# my $versionTag = WebGUI::VersionTag->getWorking($session); # my $versionTag = WebGUI::VersionTag->getWorking($session);
# $versionTag->set({name => 'Name Your Tag'}); # $versionTag->set({name => 'Name Your Tag'});
# #
## ##
return $session; return $session;
} }
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
sub finish { sub finish {
my $session = shift; my $session = shift;
## If your script is adding or changing content you need these lines, otherwise leave them commented ## If your script is adding or changing content you need these lines, otherwise leave them commented
# #
# my $versionTag = WebGUI::VersionTag->getWorking($session); # my $versionTag = WebGUI::VersionTag->getWorking($session);
# $versionTag->commit; # $versionTag->commit;
## ##
$session->var->end; $session->var->end;
$session->close; $session->close;
} }

View file

@ -1,10 +1,9 @@
#!/usr/bin/perl #!/data/wre/prereqs/bin/perl
BEGIN { BEGIN {
unshift @INC, qw( unshift @INC, qw(
/data/custom/webgui_newsletter/lib /data/custom/webgui_newsletter/lib
/data/WebGUI/lib /data/WebGUI/lib
/data/custom/customlib_honeypot/lib
); );
} }
@ -18,9 +17,9 @@ use WebGUI::Config;
use Getopt::Long; use Getopt::Long;
use Readonly; use Readonly;
Readonly my $WRONG_USAGE => 64; Readonly my $WRONG_USAGE => 64;
Readonly my $DATA_ERROR => 65; Readonly my $DATA_ERROR => 65;
Readonly my $NO_SUCH_USER => 67; Readonly my $NO_SUCH_USER => 67;
Readonly my $UNKNOWN_HOST => 68; Readonly my $UNKNOWN_HOST => 68;
Readonly my $CONFIG_ERROR => 78; Readonly my $CONFIG_ERROR => 78;
@ -43,7 +42,7 @@ my $webguiRoot = '/data/WebGUI';
closeSession( $session ); closeSession( $session );
} }
else { else {
warn "Not a valid command [$command]."; warn "Not a valid command [$command].";
exit( $NO_SUCH_USER ); exit( $NO_SUCH_USER );
#die "Not a valid command [$command]."; #die "Not a valid command [$command].";
} }
@ -100,3 +99,4 @@ sub closeSession {
$session->close; $session->close;
} }

Binary file not shown.