Compare commits
2 commits
master
...
bounce_sco
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5418008419 | ||
|
|
dbf935e98b |
20 changed files with 197 additions and 595 deletions
|
|
@ -1,3 +1,3 @@
|
||||||
Mail::DeliveryStatus::BounceParser (v 1.525)
|
Mail::DeliveryStatus::BounceParser
|
||||||
Class::InsideOut (v 1.10)
|
Class::InsideOut
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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( {
|
||||||
|
# } );
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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',
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
BIN
sbin/packages/root_import_personalnewsletter.wgpkg
Normal file
BIN
sbin/packages/root_import_personalnewsletter.wgpkg
Normal file
Binary file not shown.
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue