Code snippet to create a Tasks list and associate it with a Parallel Approval workflow in a Pages library
The requirement to write this code was, After export/import, workflow modification for approvers was failing. Approvers were not able to perform the Approval workflow operations and then we tested that if we create a new Tasks list and modify the existing Approval workflow association then everything starts working so we needed a code which can do this operation for whole site collection.
Following code snippet will create a Tasks list with name “MS Tasks” and associate it with a Parallel Approval workflow in a “Pages” library in root site as well as in all the sub sites.
1: using System;
2: using System.Collections.Generic;
3: using System.ComponentModel;
4: using System.Data;
5: using System.Drawing;
6: using System.Linq;
7: using System.Text;
8: using System.Windows.Forms;
9: using Microsoft.SharePoint;
10: using Microsoft.SharePoint.Publishing;
11: using Microsoft.SharePoint.Workflow;
12:
13: namespace WorkflowAssoc
14: {
15: public partial class Form1 : Form
16: {
17: public Form1()
18: {
19: InitializeComponent();
20: }
21:
22:
23: private void button1_Click(object sender, EventArgs e)
24: {
25: using (SPSite site = new SPSite(textBox1.Text.Trim()))
26: {
27: using (SPWeb web = site.OpenWeb())
28: {
29: //executing for root site
30: WorkflowModification(web);
31:
32: //executing for all subsites
33: foreach (SPWeb subweb in web.Webs)
34: {
35: WorkflowModification(subweb);
36: }
37: }
38: }
39:
40: MessageBox.Show("Done!");
41: }
42:
43: private void WorkflowModification(SPWeb web)
44: {
45: bool checkTasks = true;
46: bool checkPages = true;
47: SPList pages;
48: SPWorkflowAssociation WFCol;
49: SPList tasks;
50:
51: //making sure Pages list is available.
52: foreach (SPList list in web.Lists)
53: {
54: if (list.Title == "Pages")
55: {
56: checkPages = false;
57: }
58: }
59:
60: //making sure Tasks list is not available.
61: foreach (SPList list in web.Lists)
62: {
63: if (list.Title == "MS Tasks")
64: {
65: checkTasks = false;
66: }
67: }
68:
69: //execute only if Tasks list not available and Pages list is available
70: if (checkTasks && !checkPages)
71: {
72: //creating a Tasks list
73: web.Lists.Add("MS Tasks", "MS Tasks List", SPListTemplateType.Tasks);
74:
75: //getting an object of Pages list
76: pages = web.Lists["Pages"];
77:
78: //getting an object of Tasks list and setting it in workflow association
79: tasks = web.Lists["MS Tasks"];
80:
81: //getting an object of "Parallel Approval" workflow
82: //this is the only workflow available so first index
83: for (int i = 0; i < pages.WorkflowAssociations.Count; i++)
84: {
85: WFCol = pages.WorkflowAssociations[i];
86:
87: //setting up Tasks list
88: WFCol.SetTaskList(tasks);
89: WFCol.TaskListTitle = "MS Tasks";
90:
91: //updating the workflow association
92: pages.UpdateWorkflowAssociation(WFCol);
93:
94: //clearing the objects
95: WFCol = null;
96: }
97: tasks = null;
98: pages = null;
99: }
100: }
101: }
102: }
:: Please note that I would have just uploaded my initial code and you might want to consider proper optimization of the code and disposal of objects properly. I might not have updated the latest code here.