-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWebPartsReceiver.cs
139 lines (115 loc) · 5.15 KB
/
WebPartsReceiver.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using CsvHelper.Configuration;
using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.WebParts;
using SharePointRunner.SDK;
namespace SharePointRunner.LauncherV1
{
/// <summary>
/// Page informations
/// </summary>
public class PageInfo
{
public string SiteUrl { get; set; } = string.Empty;
public string SiteTitle { get; set; } = string.Empty;
public string PageUrl { get; set; } = string.Empty;
public string PageName { get; set; } = string.Empty;
public int WebPartCount { get; set; } = 0;
public PageInfo(Web web, ListItem listItem, LimitedWebPartManager webPartManager)
{
SiteUrl = web.Url;
SiteTitle = web.Title;
PageUrl = listItem["FileRef"]?.ToString();
PageName = listItem["FileLeafRef"]?.ToString();
WebPartCount = webPartManager.WebParts.Count;
}
}
/// <summary>
/// CSV mapping
/// </summary>
internal class PageInfoMap : ClassMap<PageInfo>
{
/// <summary>
/// Constructor
/// </summary>
public PageInfoMap()
{
Map(m => m.SiteUrl);
Map(m => m.SiteTitle);
Map(m => m.PageUrl);
Map(m => m.PageName);
Map(m => m.WebPartCount);
}
}
public class WebPartsReceiver : Receiver
{
private CsvWriterWrapper<PageInfo, PageInfoMap> webPartsFileWriter;
private IEnumerable<ListItem> LoadItems(List list, string viewXml, List<string> viewFields, params Expression<Func<ListItem, object>>[] properties)
{
// Used to resolve 'the query expression is not supported' error loading item with FieldValues...
// http://www.manvir.net/invalidqueryexpressionexception-the-query-expression-is-not-supported/
CamlQuery query = new CamlQuery();
query.ViewXml = viewXml;
ListItemCollection items = list.GetItems(query);
List<Expression<Func<ListItem, object>>> listItemExpressions = new List<Expression<Func<ListItem, object>>>(properties);
foreach (string viewField in viewFields)
{
Expression<Func<ListItem, object>> retrieveFiedlDataExpresion = item => item[viewField];
listItemExpressions.Add(retrieveFiedlDataExpresion);
}
IEnumerable<ListItem> resultData = list.Context.LoadQuery(items.Include(listItemExpressions.ToArray()));
list.Context.ExecuteQuery();
return resultData;
}
public override void OnSiteCollectionRunningStart(Site site, Web rootWeb)
{
rootWeb.Context.Load(rootWeb,
w => w.Title);
rootWeb.Context.ExecuteQuery();
string webPartsFileName = $"AuditWebParts-{rootWeb.Title}-{DateTime.Now.ToString("yyyy-MM-dd HH,mm,ss")}.csv";
webPartsFileWriter = new CsvWriterWrapper<PageInfo, PageInfoMap>(webPartsFileName);
}
public override void OnSiteRunningStart(Web web)
{
web.Context.Load(web,
w => w.Title,
w => w.Url,
w => w.Lists.Include(
l => l.RootFolder.ServerRelativeUrl));
web.Context.ExecuteQuery();
List pages = web.Lists.FirstOrDefault(l => l.RootFolder.ServerRelativeUrl.Equals($"{web.ServerRelativeUrl}/Pages", StringComparison.InvariantCultureIgnoreCase));
if (pages == null)
{
pages = web.Lists.FirstOrDefault(l => l.RootFolder.ServerRelativeUrl.Equals($"{web.ServerRelativeUrl}/SitePages", StringComparison.InvariantCultureIgnoreCase));
}
if (pages != null)
{
web.Context.Load(pages);
web.Context.ExecuteQuery();
string viewXml = "<View Scope='RecursiveAll'><Query><Where><And><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value></Eq><Eq><FieldRef Name='File_x0020_Type' /><Value Type='text'>aspx</Value></Eq></And></Where></Query></View>";
List<string> viewFields = new List<string>()
{
"FileRef",
"FileLeafRef"
};
IEnumerable<ListItem> items = LoadItems(pages, viewXml, viewFields, li => li.File.Exists, li => li.FileSystemObjectType);
foreach (ListItem item in items)
{
if (item.FileSystemObjectType == FileSystemObjectType.File && item.File.Exists)
{
LimitedWebPartManager webPartManager = item.File.GetLimitedWebPartManager(PersonalizationScope.Shared);
web.Context.Load(webPartManager,
wpm => wpm.WebParts);
web.Context.ExecuteQuery();
PageInfo pageInfo = new PageInfo(web, item, webPartManager);
// Write CSV
webPartsFileWriter.WriteRecord(pageInfo);
}
}
}
}
}
}