From b3eef7755f8acc51df891095634f802e2073c690 Mon Sep 17 00:00:00 2001 From: "wgtm.peters" Date: Thu, 6 Mar 2014 11:24:19 +0100 Subject: [PATCH] #20686 Workflow useractivity and user is approved activity. Adds workflow activities for IUserEventHandler events Work Item: 20686 --- .../Orchard.Users/Activities/UserActivity.cs | 130 ++++++++++++++++++ .../Activities/UserIsApprovedActivity.cs | 56 ++++++++ .../Handlers/WorkflowUserEventHandler.cs | 69 ++++++++++ .../Modules/Orchard.Users/Module.txt | 5 + .../Orchard.Users/Orchard.Users.csproj | 8 ++ 5 files changed, 268 insertions(+) create mode 100644 src/Orchard.Web/Modules/Orchard.Users/Activities/UserActivity.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Users/Activities/UserIsApprovedActivity.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Users/Handlers/WorkflowUserEventHandler.cs diff --git a/src/Orchard.Web/Modules/Orchard.Users/Activities/UserActivity.cs b/src/Orchard.Web/Modules/Orchard.Users/Activities/UserActivity.cs new file mode 100644 index 000000000..8243ebe1f --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Users/Activities/UserActivity.cs @@ -0,0 +1,130 @@ +using System.Collections.Generic; +using Orchard.Environment.Extensions; +using Orchard.Localization; +using Orchard.Workflows.Models; +using Orchard.Workflows.Services; + +namespace Orchard.Users.Activities { + public abstract class UserActivity : Event { + public Localizer T { get; set; } + + public override bool CanStartWorkflow { + get { return true; } + } + + public override bool CanExecute(WorkflowContext workflowContext, ActivityContext activityContext) { + return true; + } + + public override IEnumerable GetPossibleOutcomes(WorkflowContext workflowContext, ActivityContext activityContext) { + return new[] {T("Done")}; + } + + public override IEnumerable Execute(WorkflowContext workflowContext, ActivityContext activityContext) { + yield return T("Done"); + } + + public override LocalizedString Category { + get { return T("Events"); } + } + } + + [OrchardFeature("Orchard.Users.Workflows")] + public class UserCreatingActivity : UserActivity { + public override string Name { + get { return "UserCreating"; } + } + + public override LocalizedString Description { + get { return T("User is creating."); } + } + } + + [OrchardFeature("Orchard.Users.Workflows")] + public class UserCreatedActivity : UserActivity { + public override string Name { + get { return "UserCreated"; } + } + + public override LocalizedString Description { + get { return T("User is created."); } + } + } + + [OrchardFeature("Orchard.Users.Workflows")] + public class UserLoggedInActivity : UserActivity { + public override string Name { + get { return "UserLoggedIn"; } + } + + public override LocalizedString Description { + get { return T("User is logged in."); } + } + } + + [OrchardFeature("Orchard.Users.Workflows")] + public class UserLoggedOutActivity : UserActivity { + public override string Name { + get { return "UserLoggedOut"; } + } + + public override LocalizedString Description { + get { return T("User is logged out."); } + } + } + + [OrchardFeature("Orchard.Users.Workflows")] + public class UserAccessDeniedActivity : UserActivity { + public override string Name { + get { return "UserAccessDenied"; } + } + + public override LocalizedString Description { + get { return T("User access is denied."); } + } + } + + [OrchardFeature("Orchard.Users.Workflows")] + public class UserChangedPasswordActivity : UserActivity { + public override string Name { + get { return "UserChangedPassword"; } + } + + public override LocalizedString Description { + get { return T("User changed password."); } + } + } + + [OrchardFeature("Orchard.Users.Workflows")] + public class UserSentChallengeEmailActivity : UserActivity { + public override string Name { + get { return "UserSentChallengeEmail"; } + } + + public override LocalizedString Description { + get { return T("User send challenge email."); } + } + } + + [OrchardFeature("Orchard.Users.Workflows")] + public class UserConfirmedEmailActivity : UserActivity { + public override string Name { + get { return "UserConfirmedEmail"; } + } + + public override LocalizedString Description { + get { return T("User confirmed email."); } + } + } + + [OrchardFeature("Orchard.Users.Workflows")] + public class UserApprovedActivity : UserActivity { + public override string Name { + get { return "UserApproved"; } + } + + public override LocalizedString Description { + get { return T("User is approved."); } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Users/Activities/UserIsApprovedActivity.cs b/src/Orchard.Web/Modules/Orchard.Users/Activities/UserIsApprovedActivity.cs new file mode 100644 index 000000000..eaea6a475 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Users/Activities/UserIsApprovedActivity.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; +using Orchard.ContentManagement; +using Orchard.Environment.Extensions; +using Orchard.Localization; +using Orchard.Users.Models; +using Orchard.Workflows.Models; + +namespace Orchard.Users.Activities { + [OrchardFeature("Orchard.Users.Workflows")] + public class UserIsApprovedActivity : Workflows.Services.Task { + private readonly IWorkContextAccessor _workContextAccessor; + + public UserIsApprovedActivity(IWorkContextAccessor workContextAccessor) { + _workContextAccessor = workContextAccessor; + T = NullLocalizer.Instance; + } + + public Localizer T { get; set; } + + public override string Name { + get { return "UserIsApproved"; } + } + + public override LocalizedString Category { + get { return T("Conditions"); } + } + + public override LocalizedString Description { + get { return T("Whether the current user is approved or not."); } + } + + public override IEnumerable GetPossibleOutcomes(WorkflowContext workflowContext, ActivityContext activityContext) { + return new[] {T("Yes"), T("No")}; + } + + public override bool CanExecute(WorkflowContext workflowContext, ActivityContext activityContext) { + return true; + } + + public override IEnumerable Execute(WorkflowContext workflowContext, ActivityContext activityContext) { + if (UserIsApproved(activityContext)) { + yield return T("Yes"); + } + + yield return T("No"); + } + + private bool UserIsApproved(ActivityContext context) { + // checking if user is in an accepted role + var workContext = _workContextAccessor.GetContext(); + var user = workContext.CurrentUser; + if (user == null) return false; + return user.As().RegistrationStatus == UserStatus.Approved; + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Users/Handlers/WorkflowUserEventHandler.cs b/src/Orchard.Web/Modules/Orchard.Users/Handlers/WorkflowUserEventHandler.cs new file mode 100644 index 000000000..08fd48905 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Users/Handlers/WorkflowUserEventHandler.cs @@ -0,0 +1,69 @@ +using System.Collections.Generic; +using Orchard.Environment.Extensions; +using Orchard.Users.Events; +using Orchard.Workflows.Services; + +namespace Orchard.Users.Handlers { + [OrchardFeature("Orchard.Users.Workflows")] + public class WorkflowUserEventHandler : IUserEventHandler { + private IWorkflowManager workflowManager; + + public WorkflowUserEventHandler(IWorkflowManager workflowManager) { + this.workflowManager = workflowManager; + } + + public void Creating(UserContext context) { + workflowManager.TriggerEvent("UserCreating", + context.User, + () => new Dictionary {{"User", context}}); + } + + public void Created(UserContext context) { + workflowManager.TriggerEvent("UserCreated", + context.User, + () => new Dictionary {{"User", context}}); + } + + public void LoggedIn(Security.IUser user) { + workflowManager.TriggerEvent("UserLoggedIn", + user, + () => new Dictionary {{"User", user}}); + } + + public void LoggedOut(Security.IUser user) { + workflowManager.TriggerEvent("UserLoggedOut", + user, + () => new Dictionary {{"User", user}}); + } + + public void AccessDenied(Security.IUser user) { + workflowManager.TriggerEvent("UserAccessDenied", + user, + () => new Dictionary {{"User", user}}); + } + + public void ChangedPassword(Security.IUser user) { + workflowManager.TriggerEvent("UserChangedPassword", + user, + () => new Dictionary {{"User", user}}); + } + + public void SentChallengeEmail(Security.IUser user) { + workflowManager.TriggerEvent("UserSentChallengeEmail", + user, + () => new Dictionary {{"User", user}}); + } + + public void ConfirmedEmail(Security.IUser user) { + workflowManager.TriggerEvent("UserConfirmedEmail", + user, + () => new Dictionary {{"User", user}}); + } + + public void Approved(Security.IUser user) { + workflowManager.TriggerEvent("UserApproved", + user, + () => new Dictionary {{"User", user}}); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Users/Module.txt b/src/Orchard.Web/Modules/Orchard.Users/Module.txt index ed8fbaf86..730322793 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Module.txt +++ b/src/Orchard.Web/Modules/Orchard.Users/Module.txt @@ -10,3 +10,8 @@ Features: Description: Standard users. Category: Core Dependencies: Settings + Orchard.Users.Workflows: + Name: Users Workflows Activities + Description: Provides User based Workflow Activites. + Category: Workflows + Dependencies: Orchard.Workflows diff --git a/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj b/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj index 4c3a7b9f9..23f3ce213 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj +++ b/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj @@ -71,10 +71,13 @@ + + + @@ -125,6 +128,10 @@ {9916839C-39FC-4CEB-A5AF-89CA7E87119F} Orchard.Core + + {7059493C-8251-4764-9C1E-2368B8B485BC} + Orchard.Workflows + @@ -168,6 +175,7 @@ + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)