diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Activities/AssignRoleActivity.cs b/src/Orchard.Web/Modules/Orchard.Workflows/Activities/AssignRoleActivity.cs new file mode 100644 index 000000000..6480209a8 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Activities/AssignRoleActivity.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Orchard.ContentManagement; +using Orchard.Data; +using Orchard.Localization; +using Orchard.Logging; +using Orchard.Roles.Models; +using Orchard.Roles.Services; +using Orchard.Workflows.Models; +using Orchard.Workflows.Services; + +namespace Orchard.Workflows.Activities { + public class AssignRoleActivity : Task { + private readonly IWorkContextAccessor _workContextAccessor; + private readonly IRepository _repository; + private readonly IRoleService _roleService; + + public AssignRoleActivity( + IWorkContextAccessor workContextAccessor, + IRepository repository, + IRoleService roleService) { + _workContextAccessor = workContextAccessor; + _repository = repository; + _roleService = roleService; + T = NullLocalizer.Instance; + Logger = NullLogger.Instance; + } + + public Localizer T { get; set; } + public ILogger Logger { get; set; } + + public override string Name { + get { return "AssignRole"; } + } + + public override LocalizedString Category { + get { return T("User"); } + } + + public override LocalizedString Description { + get { return T("Assign specific roles to the current content item if it's a user."); } + } + + public override string Form { + get { return "SelectRoles"; } + } + + public override IEnumerable GetPossibleOutcomes(WorkflowContext workflowContext, ActivityContext activityContext) { + return new[] {T("Done")}; + } + + public override IEnumerable Execute(WorkflowContext workflowContext, ActivityContext activityContext) { + var user = workflowContext.Content.As(); + + // if the current workflow subject is not a user, use current user + if (user == null) { + user = _workContextAccessor.GetContext().CurrentUser.As(); + } + + var roles = GetRoles(activityContext); + + if (user != null) { + foreach (var role in roles) { + if (!user.Roles.Contains(role)) { + var roleRecord = _roleService.GetRoleByName(role); + if (roleRecord != null) { + _repository.Create(new UserRolesPartRecord {UserId = user.Id, Role = roleRecord}); + } + else { + Logger.Debug("Role not found: {0}", role); + } + } + } + } + + yield return T("Done"); + } + + private IEnumerable GetRoles(ActivityContext context) { + var roles = context.GetState("Roles"); + + if (String.IsNullOrEmpty(roles)) { + return Enumerable.Empty(); + } + + return roles.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()).ToList(); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Activities/UserTaskActivity.cs b/src/Orchard.Web/Modules/Orchard.Workflows/Activities/UserTaskActivity.cs index ebc517223..201b1ffa6 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Activities/UserTaskActivity.cs +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Activities/UserTaskActivity.cs @@ -4,7 +4,6 @@ using System.Linq; using Orchard.ContentManagement; using Orchard.Localization; using Orchard.Roles.Models; -using Orchard.Roles.Services; using Orchard.Security; using Orchard.Workflows.Models; using Orchard.Workflows.Services; @@ -12,13 +11,9 @@ using Orchard.Workflows.Services; namespace Orchard.Workflows.Activities { public class UserTaskActivity : Event { private readonly IWorkContextAccessor _workContextAccessor; - private readonly IRoleService _roleService; - public UserTaskActivity( - IWorkContextAccessor workContextAccessor, - IRoleService roleService) { + public UserTaskActivity(IWorkContextAccessor workContextAccessor) { _workContextAccessor = workContextAccessor; - _roleService = roleService; T = NullLocalizer.Instance; } @@ -41,9 +36,7 @@ namespace Orchard.Workflows.Activities { } public override IEnumerable GetPossibleOutcomes(WorkflowContext workflowContext, ActivityContext activityContext) { - foreach (var action in GetActions(activityContext)) { - yield return T(action); - } + return GetActions(activityContext).Select(action => T(action)); } public override bool CanExecute(WorkflowContext workflowContext, ActivityContext activityContext) { @@ -103,24 +96,24 @@ namespace Orchard.Workflows.Activities { private IEnumerable GetRoles(ActivityContext context) { - string roles = context.GetState("Roles"); + var roles = context.GetState("Roles"); if (String.IsNullOrEmpty(roles)) { return Enumerable.Empty(); } - return roles.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()).ToList(); + return roles.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()).ToList(); } private IEnumerable GetActions(ActivityContext context) { - string actions = context.GetState("Actions"); + var actions = context.GetState("Actions"); if (String.IsNullOrEmpty(actions)) { return Enumerable.Empty(); } - return actions.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()).ToList(); + return actions.Split(new [] {','}, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()).ToList(); } } diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Orchard.Workflows.csproj b/src/Orchard.Web/Modules/Orchard.Workflows/Orchard.Workflows.csproj index d4adb21df..9c021ba79 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Orchard.Workflows.csproj +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Orchard.Workflows.csproj @@ -119,6 +119,7 @@ +