Workflow code examples using TOM.NET
This topic contains a number of code samples for programmatically working with workflow using the TOM.NET API.
Basic code header
To provide some context, here is the class definition for a class that could contain the methods below.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tridion.ContentManager.CommunicationManagement;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.Security;
using Tridion.ContentManager.Workflow;
namespace MyOrganization.ContentManager.Tests
{
public class CodeSample
{
Session _Session = new Session("User_Name");
// Methods below go here.
}
}
Creating a Task
The following code creates a Task, a simple Workflow Process based on the predefined Task Process Definition.
public ProcessInstance CreateTask(Publication publication, TcmUri userId)
{
Trustee assignee = (Trustee) _Session.GetObject(userId);
StartWorkflowInstruction instruction = new StartWorkflowInstruction(_Session)
{
ProcessInstanceTitle = "Title of the Task",
ActivityTitle = "Title of the First Activity in the Task",
Assignee = assignee
};
return publication.StartWorkflow(instruction);
}
Creating a Process Instance
This first method creates a Process Instance based on a Process Definition as a part of starting the Workflow Process.
public ProcessInstance CreateProcessInstanceMethod1(TcmUri processDefinitionId)
{
ProcessDefinition processDefinition =
(ProcessDefinition) _Session.GetObject(processDefinitionId);
Publication publication = (Publication) processDefinition.ContextRepository;
StartWorkflowInstruction instruction = new StartWorkflowInstruction(_Session)
{
ProcessDefinition = processDefinition,
ProcessInstanceTitle = "Title of the Process Instance",
// Optional: if unspecified, the name of the Activity Definition is used.
ActivityTitle = "Title of the First Activity"
};
return publication.StartWorkflow(instruction);
}
Creating a Process Instance with Subjects
The following code creates a Process Instance and adds Subjects to it on the fly.
public ProcessInstance CreateProcessInstanceWithSubjects(TcmUri processDefinitionId, params IWorkflowItem[] itemsToAdd)
{
ProcessDefinition processDefinition =
(ProcessDefinition) _Session.GetObject(processDefinitionId);
Publication publication = (Publication) processDefinition.ContextRepository;
StartWorkflowInstruction instruction = new StartWorkflowInstruction(_Session)
{
ProcessDefinition = processDefinition,
ProcessInstanceTitle = "Title of the Process Instance",
// Optional: if unspecified, the name of the Activity Definition is used.
ActivityTitle = "Title of the First Activity"
};
foreach(var workflowItem in itemsToAdd)
{
instruction.Subjects.Add(workflowItem);
}
return publication.StartWorkflow(instruction);
}
Adding items to workflow
The following code adds an array of items (Subjects) to a specific Activity Instance.
public void AddItemsToWorkflow(TcmUri activityInstanceId, params IWorkflowItem[] itemsToAdd)
{
ActivityInstance activityInstance =
(ActivityInstance) _Session.GetObject(activityInstanceId);
foreach (var workflowItem in itemsToAdd)
{
workflowItem.AddToWorkflow(activityInstance);
}
}
Removing items from workflow
The following code removes items from workflow.
public void RemoveItemsFromWorkflow(params IWorkflowItem[] itemsToRemove)
{
foreach (var workflowItem in itemsToRemove)
{
workflowItem.RemoveFromWorkflow();
}
}
Setting the title of an Activity
This code dynamically sets the title of the first and of the next Activity in a Process.
public void SetTitleOfActivityInstance(TcmUri processDefinitionId)
{
ProcessDefinition processDefinition = (ProcessDefinition) _Session.GetObject(processDefinitionId);
Publication publication = (Publication) processDefinition.ContextRepository;
// To set the Activity Instance Title of the first Activity of the Process
StartWorkflowInstruction instruction = new StartWorkflowInstruction(_Session)
{
ProcessDefinition = processDefinition,
ProcessInstanceTitle = "Title of the Process Instance",
// Optional: if unspecified, the name of the Activity Definition is used.
ActivityTitle = "Title of the First Activity"
};
ProcessInstance processInstance = publication.StartWorkflow(instruction);
// To set the title of the intermediate Activity of the Process
ActivityInstance activityInstance = (ActivityInstance) processInstance.Activities.First();
activityInstance.Finish(new ActivityFinish("Activity Finish Message", _Session.User, _Session)
{
NextActivityTitle = "Next Activity Instance Title"
});
}
Creating a Process Definition with Activity constraints
The following code sets constraints on some of the Activities in a Process Definition.
public TridionProcessDefinition
CreateProcessDefinitionWithActivityConstraints(TcmUri publicationId,
string title,
bool hasSnapshot,
ApprovalStatus approvalStatus1 = null,
ApprovalStatus approvalStatus2 = null,
TcmUri assigneeId = null,
bool AllowOverrideDueDate1 = true,
uint PerformingTimeout1 = 0U,
bool AllowOverrideDueDate2 = true,
uint PerformingTimeout2 = 0)
{
Publication publication = new Publication(publicationId, _Session);
TridionActivityDefinition step2 = new TridionActivityDefinition(publication)
{
Title = "Step 2",
ActivityType = ActivityType.Normal,
Description = "This is the second and final step of the Process",
AllowOverrideDueDate = AllowOverrideDueDate2,
PerformingTimeout = PerformingTimeout2
ActivityConstraints = ActivityConstraints.DenyAddRemoveWorkItem
};
if (approvalStatus2 != null)
{
step2.FinishApprovalStatus = approvalStatus2;
}
TridionActivityDefinition step1 = new TridionActivityDefinition(publication)
{
Title = "Step 1",
ActivityType = ActivityType.Normal,
Description = "This is the first step of the Process",
Assignee = (Trustee) _Session.GetObject(assigneeId),
ActivityConstraints = ActivityConstraints.DenySubjectEditing | ActivityConstraints.DenyBundleMetadataEditing,
AllowOverrideDueDate = AllowOverrideDueDate1,
PerformingTimeout = PerformingTimeout1,
NextActivityDefinitions =
{
step2
}
};
if (approvalStatus1 != null)
{
step1.FinishApprovalStatus = approvalStatus1;
}
TridionProcessDefinition processDefinition =
new TridionProcessDefinition(_Session, publicationId)
{
Title = title,
ActivityDefinitions = new List<TridionActivityDefinition>
{
step1,
step2
}
};
processDefinition.Save();
return processDefinition;
}