|
using System; |
|
using System.Linq; |
|
using Telerik.Sitefinity.Blogs.Model; |
|
using Telerik.Sitefinity.Configuration; |
|
using Telerik.Sitefinity.Data; |
|
using Telerik.Sitefinity.Security; |
|
using Telerik.Sitefinity.Security.Claims; |
|
using Telerik.Sitefinity.Security.Configuration; |
|
using Telerik.Sitefinity.Workflow; |
|
using Telerik.Sitefinity.Workflow.Model; |
|
|
|
namespace SitefinityWebApp.CustomWorkflow |
|
{ |
|
public class CustomWorkflowDefinitionResolver : WorkflowDefinitionResolver |
|
{ |
|
#region WorkflowDefinitionResolver logic |
|
public CustomWorkflowDefinitionResolver() |
|
{ |
|
//Dynamically create the workflow definitions |
|
using (new ElevatedModeRegion(workflowManager)) |
|
{ |
|
workflowForRestrictedUsers = CreateWorkflowForRestrictedUsers(); |
|
workflowForBloggers = CreateWorkflowForBloggers(); |
|
} |
|
} |
|
|
|
public override IWorkflowExecutionDefinition ResolveWorkflowExecutionDefinition(IWorkflowResolutionContext context) |
|
{ |
|
var currentIdentity = ClaimsManager.GetCurrentIdentity(); |
|
|
|
if (currentIdentity.Roles.Where(r => r.Name == "RestrictedUsers").Any()) |
|
{ |
|
return workflowForRestrictedUsers; |
|
} |
|
else if (currentIdentity.Roles.Where(r => r.Name == "Bloggers").Any() && context.ContentType == typeof(BlogPost)) |
|
{ |
|
return workflowForBloggers; |
|
} |
|
else if (currentIdentity.Roles.Where(r => r.Name == "SpecialUsers").Any()) |
|
{ |
|
// The default constructor of WorkflowExecutionDefinitionProxy will instantiate |
|
// a simple no-approval-needed workflow. |
|
return WorkflowDefinitionProxy.DefaultWorkflow; |
|
} |
|
else if (currentIdentity.Roles.Where(r => r.Name == "SampleUsers").Any()) |
|
{ |
|
// Get an existing definition |
|
var myWorkflowDefinition = workflowManager.GetWorkflowDefinitions().Where(d => d.Title == "MyWorkflow").FirstOrDefault(); |
|
return new WorkflowDefinitionProxy(myWorkflowDefinition); |
|
} |
|
|
|
return base.ResolveWorkflowExecutionDefinition(context); |
|
} |
|
|
|
public override IWorkflowExecutionDefinition GetWorkflowExecutionDefinition(Guid id) |
|
{ |
|
// Here we need to handle ids of the definitions that we created in memory. |
|
// There is no need to handle the Ids of workflow definitions for SpecialUsers and SampleUsers, because |
|
// they are persisted in the database and the call to the base class will take |
|
// care of them. |
|
if (id == workflowForRestrictedUsers.Id) |
|
{ |
|
return workflowForRestrictedUsers; |
|
} |
|
else if (id == workflowForBloggers.Id) |
|
{ |
|
return workflowForBloggers; |
|
} |
|
else |
|
{ |
|
return base.GetWorkflowExecutionDefinition(id); |
|
} |
|
} |
|
|
|
#endregion |
|
|
|
#region Dynamic Workflow Definitions |
|
|
|
private IWorkflowExecutionDefinition CreateWorkflowForBloggers() |
|
{ |
|
var backendUsersRole = Config.Get<SecurityConfig>().ApplicationRoles[SecurityConstants.AppRoles.BackendUsers]; |
|
|
|
// "Approve" is the only level in 1-step approval process. |
|
var workflowDefinition = workflowManager.CreateWorkflowDefinition(workflowForBloggersId); |
|
workflowDefinition.Title = "1-step workflow for Bloggers"; |
|
workflowDefinition.WorkflowType = WorkflowType.StandardOneStep; |
|
workflowDefinition.AllowAdministratorsToSkipWorkflow = false; |
|
workflowDefinition.AllowPublishersToSkipWorkflow = false; |
|
workflowDefinition.AllowNotes = true; |
|
workflowDefinition.IsActive = true; |
|
|
|
// Levels section |
|
var approvePermission = workflowManager.CreateWorkflowPermission(); |
|
approvePermission.ActionName = "Approve"; |
|
approvePermission.PrincipalType = WorkflowPrincipalType.Role; |
|
approvePermission.PrincipalId = backendUsersRole.Id.ToString(); |
|
approvePermission.PrincipalName = backendUsersRole.Name; |
|
|
|
var level1 = workflowManager.CreateWorkflowLevel(); |
|
level1.ActionName = "Approve"; |
|
level1.Ordinal = 1; |
|
level1.NotifyAdministrators = true; |
|
level1.NotifyApprovers = true; |
|
level1.Permissions.Add(approvePermission); |
|
|
|
workflowDefinition.Levels.Add(level1); |
|
|
|
// Scopes section |
|
var workflowScope1 = workflowManager.CreateWorkflowScope(); |
|
workflowDefinition.Scopes.Add(workflowScope1); |
|
|
|
return new WorkflowDefinitionProxy(workflowDefinition); |
|
} |
|
|
|
private IWorkflowExecutionDefinition CreateWorkflowForRestrictedUsers() |
|
{ |
|
var backendUsersRole = Config.Get<SecurityConfig>().ApplicationRoles[SecurityConstants.AppRoles.BackendUsers]; |
|
|
|
// In 2-level approval the steps are "Approve" and "Publish". |
|
// In 3-level approval the steps are "Review", "Approve" and "Publish". |
|
var workflowDefinition = workflowManager.CreateWorkflowDefinition(workflowForRestrictedUsersId); |
|
workflowDefinition.Title = "2-step workflow for Restricted Users"; |
|
workflowDefinition.WorkflowType = WorkflowType.StandardTwoStep; |
|
workflowDefinition.AllowAdministratorsToSkipWorkflow = false; |
|
workflowDefinition.AllowPublishersToSkipWorkflow = false; |
|
workflowDefinition.AllowNotes = true; |
|
workflowDefinition.IsActive = true; |
|
|
|
// Levels section |
|
// Level 1 - Approve |
|
// Allow everyone in the role "Designers" to approve content. |
|
var approver1 = Config.Get<SecurityConfig>().ApplicationRoles[SecurityConstants.AppRoles.Designers]; |
|
|
|
var approvePermission = workflowManager.CreateWorkflowPermission(); |
|
approvePermission.ActionName = "Approve"; |
|
approvePermission.PrincipalType = WorkflowPrincipalType.Role; |
|
approvePermission.PrincipalId = approver1.Id.ToString(); |
|
approvePermission.PrincipalName = approver1.Name; |
|
|
|
var level1 = workflowManager.CreateWorkflowLevel(); |
|
level1.ActionName = "Approve"; |
|
level1.Ordinal = 1; |
|
level1.NotifyAdministrators = true; |
|
level1.NotifyApprovers = true; |
|
level1.Permissions.Add(approvePermission); |
|
|
|
workflowDefinition.Levels.Add(level1); |
|
|
|
//Level 2 - Publish |
|
var level2 = workflowManager.CreateWorkflowLevel(); |
|
level2.ActionName = "Publish"; |
|
level2.Ordinal = 2; |
|
level2.NotifyAdministrators = true; |
|
level2.NotifyApprovers = true; |
|
|
|
// Allow everyone in the role "Editors" to publish content. |
|
var publisher1 = Config.Get<SecurityConfig>().ApplicationRoles[SecurityConstants.AppRoles.Editors]; |
|
|
|
var publishPermission1 = workflowManager.CreateWorkflowPermission(); |
|
publishPermission1.ActionName = "Publish"; |
|
publishPermission1.PrincipalType = WorkflowPrincipalType.Role; |
|
publishPermission1.PrincipalId = publisher1.Id.ToString(); |
|
publishPermission1.PrincipalName = publisher1.Name; |
|
level2.Permissions.Add(publishPermission1); |
|
|
|
// Allow user "johnsmith" (if exists) to publish content. |
|
var publisher2 = UserManager.FindUser("johnsmith"); |
|
|
|
// In 2-level approval the second step is "Publish" |
|
if (publisher2 != null) |
|
{ |
|
var publishPermission2 = workflowManager.CreateWorkflowPermission(); |
|
publishPermission2.ActionName = "Publish"; |
|
publishPermission2.PrincipalType = WorkflowPrincipalType.User; |
|
publishPermission2.PrincipalId = publisher2.Id.ToString(); |
|
publishPermission2.PrincipalName = publisher2.UserName.ToString(); |
|
level2.Permissions.Add(publishPermission2); |
|
} |
|
|
|
workflowDefinition.Levels.Add(level1); |
|
|
|
// Scopes section |
|
var workflowScope1 = workflowManager.CreateWorkflowScope(); |
|
workflowDefinition.Scopes.Add(workflowScope1); |
|
|
|
return new WorkflowDefinitionProxy(workflowDefinition); |
|
} |
|
|
|
#endregion |
|
|
|
#region Private fields and constants |
|
private WorkflowManager workflowManager = WorkflowManager.GetManager(); |
|
|
|
//Use a randomly generated GUID - we need this to be constant as we'll indetify the workflow definition by it later. |
|
private readonly Guid workflowForRestrictedUsersId = new Guid("D50640C8-0ECB-4CD0-8C7E-2C258235A7AD"); |
|
private readonly IWorkflowExecutionDefinition workflowForRestrictedUsers = null; |
|
|
|
//Use a randomly generated GUID - we need this to be constant as we'll indetify the workflow definition by it later. |
|
private readonly Guid workflowForBloggersId = new Guid("853F0A55-E3D7-4AB2-B590-296D59E175EF"); |
|
private readonly IWorkflowExecutionDefinition workflowForBloggers = null; |
|
#endregion |
|
} |
|
} |