private Tuple <bool, string, string> LoadAndAddSyntexFile(Web web, Microsoft.SharePoint.Client.File syntexFile, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo, PnPMonitoredScope scope) { var baseUri = new Uri(web.Url); syntexFile.EnsureProperty(p => p.ServerRelativePath); var fullUri = new Uri(baseUri, syntexFile.ServerRelativePath.DecodedUrl); var folderPath = Uri.UnescapeDataString(fullUri.Segments.Take(fullUri.Segments.Length - 1).ToArray().Aggregate((i, x) => i + x).TrimEnd('/')); var fileName = Uri.UnescapeDataString(fullUri.Segments[fullUri.Segments.Length - 1]); var templateFolderPath = folderPath.Substring(web.ServerRelativeUrl.Length).TrimStart("/".ToCharArray()); // Avoid duplicate file entries var fileAlreadyExported = template.Files.Where(p => p.Folder.Equals(templateFolderPath, StringComparison.CurrentCultureIgnoreCase) && p.Src.Equals(fileName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault(); if (fileAlreadyExported == null) { // Add a File to the template template.Files.Add(new Model.File() { Folder = templateFolderPath, Src = $"{templateFolderPath}/{fileName}", Overwrite = true, Level = (Model.FileLevel)Enum.Parse(typeof(Model.FileLevel), syntexFile.Level.ToString()) }); // Export the file PersistFile(web, creationInfo, scope, folderPath, fileName); return(new Tuple <bool, string, string>(true, templateFolderPath, fileName)); } return(new Tuple <bool, string, string>(false, templateFolderPath, fileName)); }
private void ExtractFile(Microsoft.SharePoint.Client.File file, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo, PnPMonitoredScope scope) { var url = file.ServerRelativeUrl; try { var listItem = file.EnsureProperty(f => f.ListItemAllFields); if (listItem != null && listItem.FieldValues != null) { if (listItem.FieldValues.ContainsKey("WikiField") && listItem.FieldValues["WikiField"] != null) { ExtractWikiPage(file, template, scope, listItem); } else { if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION)) { // Not a wikipage template = GetFileContents(template, file, creationInfo, scope); } else { scope.LogWarning("Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}", web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION); } } } } catch (ServerException ex) { if (ex.ServerErrorCode != -2146232832) { throw; } else { if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION)) { // Page does not belong to a list, extract the file as is template = GetFileContents(template, file, creationInfo, scope); /*if (template.WebSettings == null) * { * template.WebSettings = new WebSettings(); * } * template.WebSettings.WelcomePage = homepageUrl;*/ } else { scope.LogWarning("Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}", web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION); } } } // return template; }
// private ProvisioningTemplate GetFileContents(Web web, ProvisioningTemplate template, string welcomePageUrl, ProvisioningTemplateCreationInformation creationInfo, PnPMonitoredScope scope) //# private ProvisioningTemplate GetFileContents(ProvisioningTemplate template, Microsoft.SharePoint.Client.File file, ProvisioningTemplateCreationInformation creationInfo, PnPMonitoredScope scope) { var listItem = file.EnsureProperty(p => p.ListItemAllFields); var fileUrl = file.ServerRelativeUrl; var folderPath = fileUrl.Substring(0, fileUrl.LastIndexOf("/")); var homeFile = new OfficeDevPnP.Core.Framework.Provisioning.Model.File() { Folder = folderPath.TokenizeUrl(web.Url), Src = file.ServerRelativeUrl, Overwrite = true, }; // Add field values to file if (listItem != null && listItem.FieldValues != null) { homeFile.Properties = listItem.ToProvisioningValues(); } // Add WebParts to file, if it is a page. if (System.IO.Path.GetExtension(file.ServerRelativeUrl) == ".aspx") { var webParts = web.GetWebParts(file.ServerRelativeUrl); foreach (var webPart in webParts) { var webPartxml = TokenizeWebPartXml(web, web.GetWebPartXml(webPart.Id, file.ServerRelativeUrl)); var newWp = new OfficeDevPnP.Core.Framework.Provisioning.Model.WebPart() { Title = webPart.WebPart.Title, Row = (uint)webPart.WebPart.ZoneIndex, Order = (uint)webPart.WebPart.ZoneIndex, Contents = webPartxml }; #if !SP2016 // As long as we've no CSOM library that has the ZoneID we can't use the version check as things don't compile... if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION)) { newWp.Zone = webPart.ZoneId; } #endif homeFile.WebParts.Add(newWp); } } template.Files.Add(homeFile); creationInfo.PersistFile(folderPath, file.Name, web, scope); return(template); }
public Model.File RetrieveFieldValues(Web web, Microsoft.SharePoint.Client.File file, Model.File modelFile) { ListItem listItem = null; try { listItem = file.EnsureProperty(f => f.ListItemAllFields); } catch { } if (listItem != null) { modelFile.Properties = listItem.ToProvisioningValues(); } return(modelFile); }
public override TokenParser ProvisionObjects(Web web, ProvisioningTemplate template, TokenParser parser, ProvisioningTemplateApplyingInformation applyingInformation) { using (var scope = new PnPMonitoredScope(this.Name)) { var context = web.Context as ClientContext; web.EnsureProperties(w => w.ServerRelativeUrl, w => w.RootFolder.WelcomePage); // Check if this is not a noscript site as we're not allowed to update some properties bool isNoScriptSite = web.IsNoScriptSite(); foreach (var page in template.Pages) { var url = parser.ParseString(page.Url); if (!url.ToLower().StartsWith(web.ServerRelativeUrl.ToLower())) { url = UrlUtility.Combine(web.ServerRelativeUrl, url); } var exists = true; Microsoft.SharePoint.Client.File file = null; try { file = web.GetFileByServerRelativeUrl(url); web.Context.Load(file); web.Context.ExecuteQueryRetry(); } catch (ServerException ex) { if (ex.ServerErrorTypeName == "System.IO.FileNotFoundException") { exists = false; } } if (exists) { if (page.Overwrite) { try { scope.LogDebug(CoreResources.Provisioning_ObjectHandlers_Pages_Overwriting_existing_page__0_, url); // determine url of current home page string welcomePageUrl = web.RootFolder.WelcomePage; string welcomePageServerRelativeUrl = welcomePageUrl != null ? UrlUtility.Combine(web.ServerRelativeUrl, web.RootFolder.WelcomePage) : null; bool overwriteWelcomePage = string.Equals(url, welcomePageServerRelativeUrl, StringComparison.InvariantCultureIgnoreCase); // temporarily reset home page so we can delete it if (overwriteWelcomePage) { web.SetHomePage(string.Empty); } file.DeleteObject(); web.Context.ExecuteQueryRetry(); web.AddWikiPageByUrl(url); if (page.Layout == WikiPageLayout.Custom) { web.AddLayoutToWikiPage(WikiPageLayout.OneColumn, url); } else { web.AddLayoutToWikiPage(page.Layout, url); } if (overwriteWelcomePage) { // restore welcome page to previous value web.SetHomePage(welcomePageUrl); } } catch (Exception ex) { scope.LogError(CoreResources.Provisioning_ObjectHandlers_Pages_Overwriting_existing_page__0__failed___1_____2_, url, ex.Message, ex.StackTrace); } } } else { try { scope.LogDebug(CoreResources.Provisioning_ObjectHandlers_Pages_Creating_new_page__0_, url); web.AddWikiPageByUrl(url); if (page.Layout == WikiPageLayout.Custom) { web.AddLayoutToWikiPage(WikiPageLayout.OneColumn, url); } else { web.AddLayoutToWikiPage(page.Layout, url); } } catch (Exception ex) { scope.LogError(CoreResources.Provisioning_ObjectHandlers_Pages_Creating_new_page__0__failed___1_____2_, url, ex.Message, ex.StackTrace); } } #pragma warning disable 618 if (page.WelcomePage) #pragma warning restore 618 { web.RootFolder.EnsureProperty(p => p.ServerRelativeUrl); var rootFolderRelativeUrl = url.Substring(web.RootFolder.ServerRelativeUrl.Length); web.SetHomePage(rootFolderRelativeUrl); } #if !SP2013 bool webPartsNeedLocalization = false; #endif if (page.WebParts != null && page.WebParts.Any()) { if (!isNoScriptSite) { var existingWebParts = web.GetWebParts(url); foreach (var webPart in page.WebParts) { if (existingWebParts.FirstOrDefault(w => w.WebPart.Title == parser.ParseString(webPart.Title)) == null) { WebPartEntity wpEntity = new WebPartEntity { WebPartTitle = parser.ParseString(webPart.Title), WebPartXml = parser.ParseXmlStringWebpart(webPart.Contents.Trim(new[] { '\n', ' ' }), web) }; var wpd = web.AddWebPartToWikiPage(url, wpEntity, (int)webPart.Row, (int)webPart.Column, false); #if !SP2013 if (webPart.Title.ContainsResourceToken()) { // update data based on where it was added - needed in order to localize wp title wpd.EnsureProperties(w => w.ZoneId, w => w.WebPart, w => w.WebPart.Properties); webPart.Zone = wpd.ZoneId; webPart.Order = (uint)wpd.WebPart.ZoneIndex; webPartsNeedLocalization = true; } #endif } } // Remove any existing WebPartIdToken tokens in the parser that were added by other pages. They won't apply to this page, // and they'll cause issues if this page contains web parts with the same name as web parts on other pages. parser.Tokens.RemoveAll(t => t is WebPartIdToken); var allWebParts = web.GetWebParts(url); foreach (var webpart in allWebParts) { parser.AddToken(new WebPartIdToken(web, webpart.WebPart.Title, webpart.Id)); } } else { scope.LogWarning(CoreResources.Provisioning_ObjectHandlers_Pages_SkipAddingWebParts, page.Url); } } #if !SP2013 if (webPartsNeedLocalization) { page.LocalizeWebParts(web, parser, scope); } #endif file = web.GetFileByServerRelativeUrl(url); file.EnsureProperty(f => f.ListItemAllFields); if (page.Fields.Any()) { var item = file.ListItemAllFields; foreach (var fieldValue in page.Fields) { item[fieldValue.Key] = parser.ParseString(fieldValue.Value); } item.Update(); web.Context.ExecuteQueryRetry(); } if (page.Security != null && page.Security.RoleAssignments.Count != 0) { web.Context.Load(file.ListItemAllFields); web.Context.ExecuteQueryRetry(); file.ListItemAllFields.SetSecurity(parser, page.Security, WriteMessage); } } } return(parser); }
internal Model.File RetrieveFieldValues(Web web, Microsoft.SharePoint.Client.File file, Model.File modelFile) { ListItem listItem = null; try { listItem = file.EnsureProperty(f => f.ListItemAllFields); } catch { } if (listItem != null) { var list = listItem.ParentList; var fields = list.Fields; web.Context.Load(fields, fs => fs.IncludeWithDefaultProperties(f => f.TypeAsString, f => f.InternalName, f => f.Title)); web.Context.ExecuteQueryRetry(); var fieldValues = listItem.FieldValues; var fieldValuesAsText = listItem.EnsureProperty(li => li.FieldValuesAsText).FieldValues; var fieldstoExclude = new[] { "ID", "GUID", "Author", "Editor", "FileLeafRef", "FileRef", "File_x0020_Type", "Modified_x0020_By", "Created_x0020_By", "Created", "Modified", "FileDirRef", "Last_x0020_Modified", "Created_x0020_Date", "File_x0020_Size", "FSObjType", "IsCheckedoutToLocal", "ScopeId", "UniqueId", "VirusStatus", "_Level", "_IsCurrentVersion", "ItemChildCount", "FolderChildCount", "SMLastModifiedDate", "owshiddenversion", "_UIVersion", "_UIVersionString", "Order", "WorkflowVersion", "DocConcurrencyNumber", "ParentUniqueId", "CheckedOutUserId", "SyncClientId", "CheckedOutTitle", "SMTotalSize", "SMTotalFileStreamSize", "SMTotalFileCount", "ParentVersionString", "ParentLeafName", "SortBehavior", "StreamHash", "TaxCatchAll", "TaxCatchAllLabel", "_ModerationStatus", //"HtmlDesignAssociated", //"HtmlDesignStatusAndPreview", //"MetaInfo", }; foreach (var fieldValue in fieldValues.Where(f => !fieldstoExclude.Contains(f.Key))) { if (fieldValue.Value != null && !string.IsNullOrEmpty(fieldValue.Value.ToString())) { var field = fields.FirstOrDefault(fs => fs.InternalName == fieldValue.Key); string value = string.Empty; switch (field.TypeAsString) { case "URL": value = Tokenize(fieldValuesAsText[fieldValue.Key], web.Url); break; case "User": var fieldUserValue = fieldValue.Value as Microsoft.SharePoint.Client.FieldUserValue; if (fieldUserValue != null) { #if !CLIENTSDKV15 value = fieldUserValue.Email; #else value = fieldUserValue.LookupValue; #endif } break; case "LookupMulti": case "TaxonomyFieldType": case "TaxonomyFieldTypeMulti": var internalFieldValue = fieldValue.Value as Microsoft.SharePoint.Client.FieldLookupValue[]; if (internalFieldValue != null) { value = Tokenize(JsonUtility.Serialize(internalFieldValue), web.Url); } break; case "ContentTypeIdFieldType": default: value = Tokenize(fieldValue.Value.ToString(), web.Url); break; } if (fieldValue.Key == "ContentTypeId") { // Replace the content typeid with a token var ct = list.GetContentTypeById(value); if (ct != null) { value = string.Format("{{contenttypeid:{0}}}", ct.Name); } } // We process real values only if (value != null && !String.IsNullOrEmpty(value) && value != "[]") { modelFile.Properties.Add(fieldValue.Key, value); } } } } return(modelFile); }
private Model.File RetrieveFieldValues(Web web, File file, Model.File homeFile) { var listItem = file.EnsureProperty(f => f.ListItemAllFields); var list = listItem.ParentList; var fields = list.Fields; web.Context.Load(fields, fs => fs.IncludeWithDefaultProperties(f => f.TypeAsString, f => f.InternalName, f => f.Title)); web.Context.ExecuteQueryRetry(); var fieldValues = listItem.FieldValues; var fieldValuesAsText = listItem.EnsureProperty(li => li.FieldValuesAsText).FieldValues; var fieldstoExclude = new[] { "ID", "GUID", "Author", "Editor", "FileLeafRef", "FileRef", "File_x0020_Type", "Modified_x0020_By", "Created_x0020_By", "Created", "Modified", "FileDirRef", "Last_x0020_Modified", "Created_x0020_Date", "File_x0020_Size", "FSObjType", "IsCheckedoutToLocal", "ScopeId", "UniqueId", "VirusStatus", "_Level", "_IsCurrentVersion", "ItemChildCount", "FolderChildCount", "SMLastModifiedDate", "owshiddenversion", "_UIVersion", "_UIVersionString", "Order", "WorkflowVersion", "DocConcurrencyNumber", "ParentUniqueId", "CheckedOutUserId", "SyncClientId", "CheckedOutTitle", "SMTotalSize", "SMTotalFileStreamSize", "SMTotalFileCount", "ParentVersionString", "ParentLeafName", "SortBehavior", "_ModerationStatus" }; foreach (var fieldValue in fieldValues.Where(f => !fieldstoExclude.Contains(f.Key))) { if (fieldValue.Value != null && !string.IsNullOrEmpty(fieldValue.Value.ToString())) { var field = fields.FirstOrDefault(fs => fs.InternalName == fieldValue.Key); string value = string.Empty; if (field.TypeAsString == "URL") { value = Tokenize(fieldValuesAsText[fieldValue.Key], web.Url); } else { value = Tokenize(fieldValue.Value.ToString(), web.Url); } if (fieldValue.Key == "ContentTypeId") { // Replace the content typeid with a token var ct = list.GetContentTypeById(value); if (ct != null) { value = string.Format("{{contenttypeid:{0}}}", ct.Name); } } homeFile.Properties.Add(fieldValue.Key, value); } } return homeFile; }
private Model.File RetrieveFieldValues(Web web, File file, Model.File homeFile) { var listItem = file.EnsureProperty(f => f.ListItemAllFields); var list = listItem.ParentList; var fields = list.Fields; web.Context.Load(fields, fs => fs.IncludeWithDefaultProperties(f => f.TypeAsString, f => f.InternalName, f => f.Title)); web.Context.ExecuteQueryRetry(); var fieldValues = listItem.FieldValues; var fieldValuesAsText = listItem.EnsureProperty(li => li.FieldValuesAsText).FieldValues; var fieldstoExclude = new[] { "ID", "GUID", "Author", "Editor", "FileLeafRef", "FileRef", "File_x0020_Type", "Modified_x0020_By", "Created_x0020_By", "Created", "Modified", "FileDirRef", "Last_x0020_Modified", "Created_x0020_Date", "File_x0020_Size", "FSObjType", "IsCheckedoutToLocal", "ScopeId", "UniqueId", "VirusStatus", "_Level", "_IsCurrentVersion", "ItemChildCount", "FolderChildCount", "SMLastModifiedDate", "owshiddenversion", "_UIVersion", "_UIVersionString", "Order", "WorkflowVersion", "DocConcurrencyNumber", "ParentUniqueId", "CheckedOutUserId", "SyncClientId", "CheckedOutTitle", "SMTotalSize", "SMTotalFileStreamSize", "SMTotalFileCount", "ParentVersionString", "ParentLeafName", "SortBehavior", "_ModerationStatus" }; foreach (var fieldValue in fieldValues.Where(f => !fieldstoExclude.Contains(f.Key))) { if (fieldValue.Value != null && !string.IsNullOrEmpty(fieldValue.Value.ToString())) { var field = fields.FirstOrDefault(fs => fs.InternalName == fieldValue.Key); string value = string.Empty; if (field.TypeAsString == "URL") { value = Tokenize(fieldValuesAsText[fieldValue.Key], web.Url); } else { value = Tokenize(fieldValue.Value.ToString(), web.Url); } if (fieldValue.Key == "ContentTypeId") { // Replace the content typeid with a token var ct = list.GetContentTypeById(value); if (ct != null) { value = string.Format("{{contenttypeid:{0}}}", ct.Name); } } homeFile.Properties.Add(fieldValue.Key, value); } } return(homeFile); }
public override TokenParser ProvisionObjects(Web web, ProvisioningTemplate template, TokenParser parser, ProvisioningTemplateApplyingInformation applyingInformation) { using (var scope = new PnPMonitoredScope(this.Name)) { var context = web.Context as ClientContext; web.EnsureProperties(w => w.ServerRelativeUrl, w => w.RootFolder.WelcomePage); foreach (var page in template.Pages) { var url = parser.ParseString(page.Url); if (!url.ToLower().StartsWith(web.ServerRelativeUrl.ToLower())) { url = UrlUtility.Combine(web.ServerRelativeUrl, url); } var exists = true; Microsoft.SharePoint.Client.File file = null; try { file = web.GetFileByServerRelativeUrl(url); web.Context.Load(file); web.Context.ExecuteQuery(); } catch (ServerException ex) { if (ex.ServerErrorTypeName == "System.IO.FileNotFoundException") { exists = false; } } if (exists) { if (page.Overwrite) { try { scope.LogDebug(CoreResources.Provisioning_ObjectHandlers_Pages_Overwriting_existing_page__0_, url); if (page.WelcomePage && url.Contains(web.RootFolder.WelcomePage)) { web.SetHomePage(string.Empty); } file.DeleteObject(); web.Context.ExecuteQueryRetry(); web.AddWikiPageByUrl(url); if (page.Layout == WikiPageLayout.Custom) { web.AddLayoutToWikiPage(WikiPageLayout.OneColumn, url); } else { web.AddLayoutToWikiPage(page.Layout, url); } } catch (Exception ex) { scope.LogError(CoreResources.Provisioning_ObjectHandlers_Pages_Overwriting_existing_page__0__failed___1_____2_, url, ex.Message, ex.StackTrace); } } } else { try { scope.LogDebug(CoreResources.Provisioning_ObjectHandlers_Pages_Creating_new_page__0_, url); web.AddWikiPageByUrl(url); if (page.Layout == WikiPageLayout.Custom) { web.AddLayoutToWikiPage(WikiPageLayout.OneColumn, url); } else { web.AddLayoutToWikiPage(page.Layout, url); } } catch (Exception ex) { scope.LogError(CoreResources.Provisioning_ObjectHandlers_Pages_Creating_new_page__0__failed___1_____2_, url, ex.Message, ex.StackTrace); } } if (page.WelcomePage) { web.RootFolder.EnsureProperty(p => p.ServerRelativeUrl); var rootFolderRelativeUrl = url.Substring(web.RootFolder.ServerRelativeUrl.Length); web.SetHomePage(rootFolderRelativeUrl); } if (page.WebParts != null & page.WebParts.Any()) { var existingWebParts = web.GetWebParts(url); foreach (var webpart in page.WebParts) { if (existingWebParts.FirstOrDefault(w => w.WebPart.Title == webpart.Title) == null) { WebPartEntity wpEntity = new WebPartEntity(); wpEntity.WebPartTitle = webpart.Title; wpEntity.WebPartXml = parser.ParseString(webpart.Contents.Trim(new[] { '\n', ' ' })); web.AddWebPartToWikiPage(url, wpEntity, (int)webpart.Row, (int)webpart.Column, false); } } var allWebParts = web.GetWebParts(url); foreach (var webpart in allWebParts) { parser.AddToken(new WebPartIdToken(web, webpart.WebPart.Title, webpart.Id)); } } file = web.GetFileByServerRelativeUrl(url); file.EnsureProperty(f => f.ListItemAllFields); if (page.Fields.Any()) { var item = file.ListItemAllFields; foreach (var fieldValue in page.Fields) { item[fieldValue.Key] = parser.ParseString(fieldValue.Value); } item.Update(); web.Context.ExecuteQueryRetry(); } if (page.Security != null && page.Security.RoleAssignments.Count != 0) { web.Context.Load(file.ListItemAllFields); web.Context.ExecuteQuery(); file.ListItemAllFields.SetSecurity(parser, page.Security); } } } return(parser); }