From 3e29e2ed652f0546150da30d5eaca94ded3adc44 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 2 Dec 2010 15:46:33 -0800 Subject: [PATCH] Improving e-mail templates and settings for users registration --HG-- branch : dev --- .../Controllers/AccountControllerTests.cs | 1 + .../Controllers/AccountController.cs | 4 +-- .../Handlers/UserMessagesAlteration.cs | 25 ++++++++++++++++--- .../Modules/Orchard.Users/Migrations.cs | 3 +++ .../Models/RegistrationSettingsPart.cs | 15 +++++++++++ .../Models/RegistrationSettingsPartRecord.cs | 8 ++++++ .../Services/MembershipService.cs | 15 ++++++++--- .../Orchard.Users/Views/Admin/Index.cshtml | 6 ++--- .../Parts/Users.RegistrationSettings.cshtml | 22 ++++++++++++---- 9 files changed, 82 insertions(+), 17 deletions(-) diff --git a/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs b/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs index e9b6c83bb..9e35a845a 100644 --- a/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs +++ b/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs @@ -191,6 +191,7 @@ namespace Orchard.Tests.Modules.Users.Controllers { registrationSettings.UsersCanRegister = true; registrationSettings.UsersAreModerated = true; registrationSettings.NotifyModeration = true; + registrationSettings.NotificationsRecipients = "admin"; _container.Resolve().GetContext().CurrentSite.As().SuperUser = "admin"; _session.Flush(); diff --git a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs index d6337e8e5..5491cf92f 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs @@ -263,8 +263,8 @@ namespace Orchard.Users.Controllers { return View(); } - public ActionResult ChallengeEmail(string token) { - var user = _userService.ValidateChallenge(token); + public ActionResult ChallengeEmail(string nonce) { + var user = _userService.ValidateChallenge(nonce); if ( user != null ) { _authenticationService.SignIn(user, false /* createPersistentCookie */); diff --git a/src/Orchard.Web/Modules/Orchard.Users/Handlers/UserMessagesAlteration.cs b/src/Orchard.Web/Modules/Orchard.Users/Handlers/UserMessagesAlteration.cs index 19c84262e..5cde4ed1c 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Handlers/UserMessagesAlteration.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Handlers/UserMessagesAlteration.cs @@ -1,15 +1,19 @@ -using Orchard.Localization; +using System; +using Orchard.Localization; using Orchard.Messaging.Events; using Orchard.Messaging.Models; using Orchard.ContentManagement; +using Orchard.Settings; using Orchard.Users.Models; namespace Orchard.Users.Handlers { public class UserMessagesAlteration : IMessageEventHandler { private readonly IContentManager _contentManager; + private readonly ISiteService _siteService; - public UserMessagesAlteration(IContentManager contentManager) { + public UserMessagesAlteration(IContentManager contentManager, ISiteService siteService) { _contentManager = contentManager; + _siteService = siteService; T = NullLocalizer.Instance; } @@ -30,8 +34,15 @@ namespace Orchard.Users.Handlers { } if (context.Type == MessageTypes.Validation) { - context.MailMessage.Subject = T("User account validation").Text; - context.MailMessage.Body = T("Dear {0}, please click here to validate you email address.", recipient.UserName, context.Properties["ChallengeUrl"]).Text; + var registeredWebsite = _siteService.GetSiteSettings().As().ValidateEmailRegisteredWebsite; + var contactEmail = _siteService.GetSiteSettings().As().ValidateEmailContactEMail; + context.MailMessage.Subject = T("Verification E-Mail").Text; + context.MailMessage.Body = + T("Thank you for registering with {0}.


Final Step
To verify that you own this e-mail address, please click the following link:
{1}

Troubleshooting:
If clicking on the link above does not work, try the following:

Select and copy the entire link.
Open a browser window and paste the link in the address bar.
Click Go or, on your keyboard, press Enter or Return.", registeredWebsite, context.Properties["ChallengeUrl"]).Text; + + if (!String.IsNullOrWhiteSpace(contactEmail)) { + context.MailMessage.Body += T("

If you continue to have access problems or want to report other issues, please Contact Us.", contactEmail).Text; + } } if (context.Type == MessageTypes.LostPassword) { @@ -39,6 +50,12 @@ namespace Orchard.Users.Handlers { context.MailMessage.Body = T("Dear {0}, please click here to change your password.", recipient.UserName, context.Properties["LostPasswordUrl"]).Text; } + FormatEmailBody(context); + } + + private static void FormatEmailBody(MessageContext context) { + context.MailMessage.Body = "

" + context.MailMessage.Body; + context.MailMessage.Body += "

"; } public void Sent(MessageContext context) { diff --git a/src/Orchard.Web/Modules/Orchard.Users/Migrations.cs b/src/Orchard.Web/Modules/Orchard.Users/Migrations.cs index fecbac8a4..4175a2dc5 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Migrations.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Migrations.cs @@ -24,8 +24,11 @@ namespace Orchard.Users { .ContentPartRecord() .Column("UsersCanRegister", c => c.WithDefault(false)) .Column("UsersMustValidateEmail", c => c.WithDefault(false)) + .Column("ValidateEmailRegisteredWebsite", c => c.WithLength(255)) + .Column("ValidateEmailContactEMail", c => c.WithLength(255)) .Column("UsersAreModerated", c => c.WithDefault(false)) .Column("NotifyModeration", c => c.WithDefault(false)) + .Column("NotificationsRecipients", c => c.Unlimited()) .Column("EnableLostPassword", c => c.WithDefault(false)) ); diff --git a/src/Orchard.Web/Modules/Orchard.Users/Models/RegistrationSettingsPart.cs b/src/Orchard.Web/Modules/Orchard.Users/Models/RegistrationSettingsPart.cs index b81af213d..711997a4b 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Models/RegistrationSettingsPart.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Models/RegistrationSettingsPart.cs @@ -13,6 +13,16 @@ namespace Orchard.Users.Models { set { Record.UsersMustValidateEmail = value; } } + public string ValidateEmailRegisteredWebsite { + get { return Record.ValidateEmailRegisteredWebsite; } + set { Record.ValidateEmailRegisteredWebsite = value; } + } + + public string ValidateEmailContactEMail { + get { return Record.ValidateEmailContactEMail; } + set { Record.ValidateEmailContactEMail = value; } + } + public bool UsersAreModerated { get { return Record.UsersAreModerated; } set { Record.UsersAreModerated = value; } @@ -23,6 +33,11 @@ namespace Orchard.Users.Models { set { Record.NotifyModeration = value; } } + public string NotificationsRecipients { + get { return Record.NotificationsRecipients; } + set { Record.NotificationsRecipients = value; } + } + public bool EnableLostPassword { get { return Record.EnableLostPassword; } set { Record.EnableLostPassword = value; } diff --git a/src/Orchard.Web/Modules/Orchard.Users/Models/RegistrationSettingsPartRecord.cs b/src/Orchard.Web/Modules/Orchard.Users/Models/RegistrationSettingsPartRecord.cs index ee6a5efea..fcc3e86c9 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Models/RegistrationSettingsPartRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Models/RegistrationSettingsPartRecord.cs @@ -1,11 +1,19 @@ +using System.ComponentModel.DataAnnotations; using Orchard.ContentManagement.Records; namespace Orchard.Users.Models { public class RegistrationSettingsPartRecord : ContentPartRecord { public virtual bool UsersCanRegister { get; set; } public virtual bool UsersMustValidateEmail { get; set; } + [StringLength(255)] + public virtual string ValidateEmailRegisteredWebsite { get; set; } + [StringLength(255)] + public virtual string ValidateEmailContactEMail { get; set; } + public virtual bool UsersAreModerated { get; set; } public virtual bool NotifyModeration { get; set; } + public virtual string NotificationsRecipients { get; set; } + public virtual bool EnableLostPassword { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs b/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs index 13fe5349a..19e0c0b4a 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs @@ -81,9 +81,18 @@ namespace Orchard.Users.Services { } if ( registrationSettings != null && registrationSettings.UsersAreModerated && registrationSettings.NotifyModeration && !createUserParams.IsApproved ) { - var superUser = GetUser(_orchardServices.WorkContext.CurrentSite.SuperUser); - if(superUser != null) - _messageManager.Send(superUser.ContentItem.Record, MessageTypes.Moderation, "email"); + var usernames = String.IsNullOrWhiteSpace(registrationSettings.NotificationsRecipients) + ? new string[0] + : registrationSettings.NotificationsRecipients.Split(new[] {',', ' '}, StringSplitOptions.RemoveEmptyEntries); + + foreach ( var userName in usernames ) { + if (String.IsNullOrWhiteSpace(userName)) { + continue; + } + var recipient = GetUser(userName); + if (recipient != null) + _messageManager.Send(recipient.ContentItem.Record, MessageTypes.Moderation, "email"); + } } return user; diff --git a/src/Orchard.Web/Modules/Orchard.Users/Views/Admin/Index.cshtml b/src/Orchard.Web/Modules/Orchard.Users/Views/Admin/Index.cshtml index 0d827da2b..684d319a4 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Users/Views/Admin/Index.cshtml @@ -22,11 +22,11 @@ @foreach (var row in Model.Rows) { - @if(row.UserPart.RegistrationStatus == UserStatus.Approved) { + @if(row.UserPart.RegistrationStatus == UserStatus.Approved && row.UserPart.EmailStatus == UserStatus.Approved) { @T( } else { - @T( + @T( } @Html.ActionLink(row.UserPart.UserName, "Edit", new { row.UserPart.Id }) @@ -42,7 +42,7 @@ @Html.ActionLink(T("Disable").ToString(), "Moderate", new { row.UserPart.Id }) } @if ( row.UserPart.EmailStatus == UserStatus.Pending ) { | - @Html.ActionLink(T("Challenge Email").ToString(), "SendChallengeEmail", new { row.UserPart.Id }) + @Html.ActionLink(T("Send challenge E-mail").ToString(), "SendChallengeEmail", new { row.UserPart.Id }) } diff --git a/src/Orchard.Web/Modules/Orchard.Users/Views/EditorTemplates/Parts/Users.RegistrationSettings.cshtml b/src/Orchard.Web/Modules/Orchard.Users/Views/EditorTemplates/Parts/Users.RegistrationSettings.cshtml index 6c8230863..8c9d4c568 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Views/EditorTemplates/Parts/Users.RegistrationSettings.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Users/Views/EditorTemplates/Parts/Users.RegistrationSettings.cshtml @@ -5,26 +5,38 @@
@Html.EditorFor(m => m.UsersCanRegister) - @Html.ValidationMessage("UsersCanRegister", "*")
@Html.EditorFor(m => m.EnableLostPassword) - @Html.ValidationMessage("EnableLostPassword", "*")
@Html.EditorFor(m => m.UsersMustValidateEmail) - @Html.ValidationMessage("UsersMustValidateEmail", "*") +
+
+ + @Html.TextBoxFor(m => m.ValidateEmailRegisteredWebsite, new { @class = "textMedium" } ) + @Html.ValidationMessage("ValidateEmailRegisteredWebsite", "*") + @T("The name of your website as it will appear in the verification e-mail.") + + + @Html.TextBoxFor(m => m.ValidateEmailContactEMail, new { @class = "textMedium" } ) + @Html.ValidationMessage("ValidateEmailContactEMail", "*") + @T("The e-mail address displayed in the verification e-mail for a Contact Us link. Leave empty for no link.")
@Html.EditorFor(m => m.UsersAreModerated) - @Html.ValidationMessage("UsersAreModerated", "*")
@Html.EditorFor(m => m.NotifyModeration) - @Html.ValidationMessage("NotifyModeration", "*")
+
+ + @Html.TextBoxFor(m => m.NotificationsRecipients, new { @class = "textMedium" } ) + @Html.ValidationMessage("NotificationsRecipients", "*") + @T("The usernames to send the notifications to (e.g., \"admin, user1, ...\").") +
\ No newline at end of file