From 176938baf5478dbcee8f444f72e08fc5477497c6 Mon Sep 17 00:00:00 2001 From: Martin Kamerbeek Date: Fri, 21 May 2010 16:25:35 +0200 Subject: [PATCH] Adding templatable email confirmation and status messages. --- lib/WebGUI/AssetAspect/Subscriber.pm | 132 +++++++++++++++--- lib/WebGUI/User/SpecialState.pm | 10 ++ sbin/install_newsletter.pl | 4 + .../root_import_personalnewsletter.wgpkg | Bin 1930 -> 2548 bytes 4 files changed, 124 insertions(+), 22 deletions(-) diff --git a/lib/WebGUI/AssetAspect/Subscriber.pm b/lib/WebGUI/AssetAspect/Subscriber.pm index 9d33dc5..803ac1a 100644 --- a/lib/WebGUI/AssetAspect/Subscriber.pm +++ b/lib/WebGUI/AssetAspect/Subscriber.pm @@ -4,6 +4,7 @@ use strict; use warnings; use Class::C3; +use WebGUI::Asset::Template; use WebGUI::Macro; use Tie::IxHash; @@ -39,6 +40,32 @@ sub definition { label => 'Allow anonymous subscription', tab => 'subscription', }, + confirmationEmailSubject => { + fieldType => 'text', + defaultVale => 'Confirm your subscription mutation', + label => 'Confirmation email subject', + tab => 'subscription', + }, + confirmationEmailTemplateId => { + fieldType => 'template', + defaultValue => '4aLemgMrTFhG3eqg57jCpQ', + label => 'Confirmation email template', + namespace => 'Subscriber/ConfirmationEmail', + tab => 'subscription', + }, + noMutationEmailSubject => { + fieldType => 'text', + defaultVale => '(Un)subscribe result', + label => 'No mutation email subject', + tab => 'subscription', + }, + noMutationEmailTemplateId => { + fieldType => 'template', + defaultValue => '', + label => 'No mutation email template', + namespace => 'Subscriber/NoMutationEmail', + tab => 'subscription', + }, ); push( @{ $definition }, { @@ -113,11 +140,6 @@ sub isSubscribed { my $db = $self->session->db; return $user->isInGroup( $self->getSubscriptionGroup->getId ); - -# return $db->quickScalar( 'select 1 from NewsletterCollection_subscriptions where assetId=? and userId=?', [ -# $self->getId, -# $userId, -# ] ); } #---------------------------------------------------------------------------- @@ -165,26 +187,93 @@ sub getSubscriptionGroup { return $group; } +#---------------------------------------------------------------------------- +sub getEmailVars { + my $self = shift; + my $user = shift; + + my $var = {}; + + my $userProperties = $user->get; + while ( my ($key, $value) = each %{ $userProperties } ) { + $var->{ "user_$key" } = $value; + } + $var->{ user_isRegular } = !WebGUI::User::SpecialState->isAdHocUser( $user ); + + my $assetProperties = $self->get; + while ( my ($key, $value) = each %{ $assetProperties } ) { + $var->{ "asset_$key" } = $value; + } + + return $var; +} + #---------------------------------------------------------------------------- sub sendSubscriptionConfirmation { my $self = shift; my $user = shift; my $code = shift; + my $action = shift || 'subscribe'; my $session = $self->session; -# my $user = WebGUI::User->new( $session, $userId ); + my $var = $self->getEmailVars( $user ); my $url = $session->url->getSiteURL . $self->getUrl( "func=confirmSubscription;code=$code" ); + $var->{ confirmUrl } = $url; + $var->{ code } = $code; + $var->{ actionIsSubscribe } = $action eq 'subscribe'; + my $mail = WebGUI::Mail::Send->create( $self->session, { to => $user->get('email'), - subject => 'Confirm your subscription', + subject => $self->get('confirmationEmailSubject'), } ); - $mail->addText( "Click here: $url" ); + + my $templateId = $self->get('confirmationEmailTemplateId'); + my $template = WebGUI::Asset::Template->new( $session, $templateId ); + if ( $template ) { + $mail->addHtml( $template->process( $var ) ); + } + else { + $session->log->error( "Cannot instanciate confirmation email template with id [$templateId]" ); + $mail->addText( "Click here to confirm your (un)subscription: $url" ); + } + $mail->send; return; } +#---------------------------------------------------------------------------- +sub sendNoMutationEmail { + my $self = shift; + my $user = shift; + my $action = shift || 'subscribe'; + my $session = $self->session; + + my $var = $self->getEmailVars( $user ); + $var->{ actionIsSubscribe } = $action eq 'subscribe'; + + my $mail = WebGUI::Mail::Send->create( $self->session, { + to => $user->get('email'), + subject => $self->get('noMutationEmailSubject'), + } ); + + my $templateId = $self->get('noMutationEmailTemplateId'); + my $template = WebGUI::Asset::Template->new( $session, $templateId ); + if ( $template ) { + $mail->addHtml( $template->process( $var ) ); + } + else { + $session->log->error( "Cannot instanciate no mutation email template with id [$templateId]" ); + if ( $action eq 'subscribe' ) { + $mail->addText( "This email address is already subscribed to " . $self->get('title') ); + } + } + + $mail->send; + + return; +} #---------------------------------------------------------------------------- sub subscribe { @@ -195,16 +284,21 @@ sub subscribe { my $db = $self->session->db; if ( $requireConfirm ) { - my $code = $self->session->id->generate; + if ( $user->isInGroup( $self->getSubscriptionGroup->getId ) ) { + $self->sendNoMutationEmail( $user, 'subscribe' ); + } + else { + my $code = $self->session->id->generate; - $db->write( 'replace into NewsletterCollection_subscriptions set assetId=?, userId=?, code=?, confirmed=?', [ - $self->getId, - $user->getId, - $code, - 0, - ] ); + $db->write( 'replace into NewsletterCollection_subscriptions set assetId=?, userId=?, code=?, confirmed=?', [ + $self->getId, + $user->getId, + $code, + 0, + ] ); - $self->sendSubscriptionConfirmation( $user, $code ); + $self->sendSubscriptionConfirmation( $user, $code ); + } } else { $self->getSubscriptionGroup->addUsers( [ $user->getId ] ); @@ -217,15 +311,9 @@ sub subscribe { sub unsubscribe { my $self = shift; my $user = shift || $self->session->user; -# my $db = $self->session->db; $self->getSubscriptionGroup->deleteUsers( [ $user->getId ] ); -# $db->write( 'delete from NewsletterCollection_subscriptions where assetId=? and userId=?', [ -# $self->getId, -# $user->getId, -# ] ); - return; } diff --git a/lib/WebGUI/User/SpecialState.pm b/lib/WebGUI/User/SpecialState.pm index 66bb970..21dbdbf 100644 --- a/lib/WebGUI/User/SpecialState.pm +++ b/lib/WebGUI/User/SpecialState.pm @@ -26,6 +26,16 @@ sub addSpecialState { return; } +sub isAdHocUser { + my $class = shift; + my $user = shift; + + return + $user->username eq $user->getId + && !$user->isEnabled; +} + + sub removeSpecialState { my $self = shift; my $state = shift || croak 'state is required'; diff --git a/sbin/install_newsletter.pl b/sbin/install_newsletter.pl index 3dede98..c6dbb54 100644 --- a/sbin/install_newsletter.pl +++ b/sbin/install_newsletter.pl @@ -60,6 +60,10 @@ sub installSubscriberAspectTable { subscriptionEnabled tinyint(1) not null default 0, alwaysConfirmSubscription tinyint(1) not null default 0, allowAnonymousSubscription tinyint(1) not null default 0, + confirmationEmailTemplateId char(22) binary, + confirmationEmailSubject varchar(255), + noMutationEmailTemplateId char(22) binary, + noMutationEmailSubject varchar(255), primary key( assetId, revisionDate ) ); EOSQL diff --git a/sbin/packages/root_import_personalnewsletter.wgpkg b/sbin/packages/root_import_personalnewsletter.wgpkg index 838af0e72239ba981700c88ae731cc4ae8a4ac64..815eccd2286a3f8901c4c1f7287eb37b0bb1235e 100644 GIT binary patch literal 2548 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 KOu=seJ^%pCc=$*F literal 1930 zcmV;52X*)#iwFP!00000|Ls{@Z`(E$&U1f-=DlpdT-)(2_PhXTmNZ^-aS~_g&=dhJ zF*Xz3KvHp>BL97dq$EK?ZUK7DgkNunBf_r;n$X#CL+JoK@8wY~}|cBa7?c2TsueM$Qn8 z*#Oyh00%2(WXX(?$XE2r*Wkg_$Mk|>+Lv=pX(Q^&2{Z_Jg?K{U3Rnt~2Du^VgB);2W)<1-fzu?H^a zIM!kCj>EUyG15OR1CRIKhtEDFGiAwl=xi8ux3O8J1dDJ;_1!P4>+)1mwZtREbf)6 ztq*^lOb;LTFWe^m z2OCGtGw9(mc9(cv>fV!F&l1%0kE;>~%T{d0u1ed&C_npdtboNG>x*cD1Hif$7X&!+ z%E%>SANVH^!rw*bllarCNJt4FzvUrg5eM*7ym$eD*5g!;74PEd@yYfv!O@hBD8VLAq+3yE=(9d7qV)T*Rwq@$2Eq4*|)3pWh`_{kdKJ92wxeePAzS4_vi z=z)bN5K~NJh>Q^{+)0HoY$A1FLoV?=V zOFV|JV_mY|Hb%N+ZmvQ|Fhppp>%_vc*@5H+Qso>jqfX>v9d*ed^Y<4k9cTSI?=Ev- zzIklq+t`f_q&~EH%<0KH#Fq$eaz6&Ca$CjxdxKQesZ)MBgBCnf67x-9>~xD0VxjOY*!lPqJ8e5)urR=fqgP! zw7R+XIBR_1gW&RX_;ISYtM5`6?zCEZ#Y|y%)&EAN<#u@-R9}m}1vRwS=2r{6THw_J Q|3?e_3no^##Q-J%0OT*LI{*Lx