コード例 #1
0
        private ListInstance ProcessListItems(Web web,
                                              List siteList,
                                              ListInstance listInstance,
                                              ProvisioningTemplateCreationInformation creationInfo,
                                              Model.Configuration.Lists.Lists.ExtractListsListsConfiguration extractionConfig,
                                              Model.Configuration.Lists.Lists.ExtractListsQueryConfiguration queryConfig,
                                              Uri baseUri,
                                              ListItemCollection items,
                                              PnPMonitoredScope scope)
        {
            if (!string.IsNullOrEmpty(extractionConfig.KeyColumn))
            {
                listInstance.DataRows.KeyColumn      = extractionConfig.KeyColumn;
                listInstance.DataRows.UpdateBehavior = extractionConfig.UpdateBehavior;
            }

            var itemCount = 1;

            foreach (var item in items)
            {
                WriteSubProgress("List", listInstance.Title, itemCount, items.Count);

                var dataRow = ProcessDataRow(web, siteList, item, listInstance, extractionConfig, queryConfig, baseUri, creationInfo, scope);

                listInstance.DataRows.Add(dataRow);
                itemCount++;
            }
            return(listInstance);
        }
コード例 #2
0
        private ProvisioningTemplate ProcessLibraryItems(Web web,
                                                         List siteList,
                                                         ProvisioningTemplate template,
                                                         ListInstance listInstance,
                                                         Model.Configuration.Lists.Lists.ExtractListsListsConfiguration extractionConfig,
                                                         Model.Configuration.Lists.Lists.ExtractListsQueryConfiguration queryConfig,
                                                         ProvisioningTemplateCreationInformation creationInfo,
                                                         PnPMonitoredScope scope,
                                                         ListItemCollection items,
                                                         Uri baseUri,
                                                         string defaultContentTypeId)
        {
            var itemCount = 1;

            foreach (var item in items)
            {
                switch (item.FileSystemObjectType)
                {
                case FileSystemObjectType.File:
                {
                    //PnP:File
                    ProcessDocumentRow(web, siteList, baseUri, item, listInstance, template, creationInfo, scope, itemCount, items.Count, defaultContentTypeId);
                    break;
                }

                case FileSystemObjectType.Folder:
                {
                    //PnP:Folder
                    ProcessFolderRow(web, item, siteList, listInstance, queryConfig, template, scope);
                    break;
                }

                default:
                {
                    //PnP:DataRow
                    ProcessDataRow(web, siteList, item, listInstance, extractionConfig, queryConfig, baseUri, creationInfo, scope);
                    break;
                }
                }
                itemCount++;
            }
            return(template);
        }
コード例 #3
0
        private Model.DataRow ProcessDataRow(Web web, List siteList, ListItem item, ListInstance listInstance, Model.Configuration.Lists.Lists.ExtractListsListsConfiguration extractionConfig, Model.Configuration.Lists.Lists.ExtractListsQueryConfiguration queryConfig, Uri baseUri, ProvisioningTemplateCreationInformation creationInfo, PnPMonitoredScope scope)
        {
            var dataRow             = new Model.DataRow();
            var filteredFieldValues = item.FieldValues.ToList();

            if (queryConfig != null && queryConfig.ViewFields != null && queryConfig.ViewFields.Count > 0)
            {
                filteredFieldValues = item.FieldValues.Where(f => queryConfig.ViewFields.Contains(f.Key)).ToList();
            }
            if (queryConfig != null && queryConfig.IncludeAttachments)
            {
                filteredFieldValues = filteredFieldValues.Where(f => !f.Key.Equals("Attachments", StringComparison.InvariantCultureIgnoreCase)).ToList();
            }
            foreach (var fieldValue in filteredFieldValues)
            {
                var value = item.FieldValuesAsText[fieldValue.Key];
                var skip  = extractionConfig.SkipEmptyFields && string.IsNullOrEmpty(value);
                if (!skip)
                {
                    dataRow.Values.Add(fieldValue.Key, TokenizeValue(web, siteList.Fields.FirstOrDefault(f => f.InternalName == fieldValue.Key).TypeAsString, fieldValue, value));
                }
            }
            if (queryConfig != null && queryConfig.IncludeAttachments && siteList.EnableAttachments && (bool)item["Attachments"])
            {
#if !SP2013 && !SP2016
                item.Context.Load(item, i => i.AttachmentFiles.Include(a => a.FileName, a => a.FileNameAsPath, a => a.ServerRelativePath));
#else
                item.Context.Load(item, i => i.AttachmentFiles.Include(a => a.FileName, a => a.FileName, a => a.ServerRelativeUrl));
#endif
                item.Context.ExecuteQueryRetry();
                foreach (var attachmentFile in item.AttachmentFiles)
                {
#if !SP2013 && !SP2016
                    var fullUri = new Uri(baseUri, attachmentFile.ServerRelativePath.DecodedUrl);
#else
                    var fullUri = new Uri(baseUri, attachmentFile.ServerRelativeUrl);
#endif
                    var folderPath   = HttpUtility.UrlDecode(fullUri.Segments.Take(fullUri.Segments.Count() - 1).ToArray().Aggregate((i, x) => i + x).TrimEnd('/'));
                    var targetFolder = $"ListData/SITE_{web.Id.ToString("N")}/LIST_{siteList.Id.ToString("N")}/Attachments/{item.Id}";
                    dataRow.Attachments.Add(new Model.SharePoint.InformationArchitecture.DataRowAttachment()
                    {
#if !SP2013 && !SP2016
                        Name = attachmentFile.FileNameAsPath.DecodedUrl,
                        Src  = $"{targetFolder}/{attachmentFile.FileNameAsPath.DecodedUrl}"
#else
                        Name = attachmentFile.FileName,
                        Src  = $"{targetFolder}/{attachmentFile.FileName}"
#endif
                    });
コード例 #4
0
        private void ProcessFolderRow(Web web, ListItem listItem, List siteList, ListInstance listInstance, Model.Configuration.Lists.Lists.ExtractListsQueryConfiguration queryConfig, ProvisioningTemplate template, PnPMonitoredScope scope)
        {
            listItem.EnsureProperties(it => it.ParentList.RootFolder.ServerRelativeUrl);
            string serverRelativeListUrl = listItem.ParentList.RootFolder.ServerRelativeUrl;
            string folderPath            = listItem.FieldValuesAsText["FileRef"].Substring(serverRelativeListUrl.Length).TrimStart(new char[] { '/' });

            if (!string.IsNullOrWhiteSpace(folderPath))
            {
                //listItem.EnsureProperties(it => it.Folder.UniqueId);
                string[]     folderSegments = folderPath.Split('/');
                Model.Folder pnpFolder      = null;
                for (int i = 0; i < folderSegments.Length; i++)
                {
                    if (i == 0)
                    {
                        pnpFolder = listInstance.Folders.FirstOrDefault(f => f.Name.Equals(folderSegments[i], StringComparison.CurrentCultureIgnoreCase));
                        if (pnpFolder == null)
                        {
                            string pathToCurrentFolder = string.Format("{0}/{1}", serverRelativeListUrl, string.Join("/", folderSegments.Take(i + 1)));
                            pnpFolder = ExtractFolderSettings(web, siteList, pathToCurrentFolder, scope, queryConfig);
                            listInstance.Folders.Add(pnpFolder);
                        }
                    }
                    else
                    {
                        var childFolder = pnpFolder.Folders.FirstOrDefault(f => f.Name.Equals(folderSegments[i], StringComparison.CurrentCultureIgnoreCase));
                        if (childFolder == null)
                        {
                            string pathToCurrentFolder = string.Format("{0}/{1}", serverRelativeListUrl, string.Join("/", folderSegments.Take(i + 1)));
                            childFolder = ExtractFolderSettings(web, siteList, pathToCurrentFolder, scope, queryConfig);
                            pnpFolder.Folders.Add(childFolder);
                        }
                        pnpFolder = childFolder;
                    }
                }
            }
        }
コード例 #5
0
        public Model.Folder ExtractFolderSettings(Web web, List siteList, string serverRelativePathToFolder, PnPMonitoredScope scope, Model.Configuration.Lists.Lists.ExtractListsQueryConfiguration queryConfig)
        {
            Model.Folder pnpFolder = null;
            try
            {
                Microsoft.SharePoint.Client.Folder spFolder = web.GetFolderByServerRelativeUrl(serverRelativePathToFolder);
                web.Context.Load(spFolder,
                                 f => f.Name,
                                 f => f.ServerRelativeUrl,
                                 f => f.Properties,
                                 f => f.ListItemAllFields,
                                 f => f.ListItemAllFields.RoleAssignments,
                                 f => f.ListItemAllFields.RoleAssignments.Include(r => r.Member, r => r.RoleDefinitionBindings),
                                 f => f.ListItemAllFields.HasUniqueRoleAssignments,
                                 f => f.ListItemAllFields.ParentList,
                                 f => f.ListItemAllFields.ContentType.StringId);
                web.Context.Load(web,
                                 w => w.AssociatedOwnerGroup,
                                 w => w.AssociatedMemberGroup,
                                 w => w.AssociatedVisitorGroup,
                                 w => w.Title,
                                 w => w.Url,
                                 w => w.RoleDefinitions.Include(r => r.RoleTypeKind, r => r.Name),
                                 w => w.ContentTypes.Include(c => c.Id, c => c.Name, c => c.StringId));
                web.Context.ExecuteQueryRetry();

                pnpFolder = new Model.Folder(spFolder.Name);

                //export PnPFolder Properties
                if (spFolder.Properties.FieldValues.Any())
                {
                    foreach (var propKey in spFolder.Properties.FieldValues.Keys.Where(k => !k.StartsWith("vti_") && !k.StartsWith("docset_")))
                    {
                        pnpFolder.PropertyBagEntries.Add(new PropertyBagEntry()
                        {
                            Key = propKey, Value = spFolder.Properties.FieldValues[propKey].ToString()
                        });
                    }
                }

                //export PnPFolder FieldValues
                if (spFolder.ListItemAllFields.FieldValues.Any())
                {
                    var list = spFolder.ListItemAllFields.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 = spFolder.ListItemAllFields.FieldValues;

                    var fieldValuesAsText = spFolder.ListItemAllFields.EnsureProperty(li => li.FieldValuesAsText).FieldValues;

                    #region //**** get correct Content Type
                    string ctId = string.Empty;
                    foreach (var ct in web.ContentTypes.OrderByDescending(c => c.StringId.Length))
                    {
                        if (spFolder.ListItemAllFields.ContentType.StringId.StartsWith(ct.StringId))
                        {
                            pnpFolder.ContentTypeID = ct.StringId;
                            break;
                        }
                    }
                    #endregion //**** get correct Content Type

                    var filteredFieldValues = fieldValues.ToList();
                    if (queryConfig != null && queryConfig.ViewFields != null && queryConfig.ViewFields.Count > 0)
                    {
                        filteredFieldValues = fieldValues.Where(f => queryConfig.ViewFields.Contains(f.Key)).ToList();
                    }
                    foreach (var fieldValue in filteredFieldValues)
                    {
                        if (fieldValue.Value != null && !string.IsNullOrEmpty(fieldValue.Value.ToString()))
                        {
                            var    field = siteList.Fields.FirstOrDefault(fs => fs.InternalName == fieldValue.Key);
                            string value = string.Empty;

                            //ignore read only fields
                            if (!field.ReadOnlyField || WriteableReadOnlyField.Contains(field.InternalName.ToLower()))
                            {
                                value = TokenizeValue(web, field.TypeAsString, fieldValue, fieldValuesAsText[field.InternalName]);
                            }

                            if (fieldValue.Key.Equals("ContentTypeId", StringComparison.InvariantCultureIgnoreCase) || fieldValue.Key.Equals("Attachments", StringComparison.InvariantCultureIgnoreCase))
                            {
                                value = null; //ignore here since already in dataRow
                            }

                            if (fieldValue.Key.Equals("HTML_x0020_File_x0020_Type", StringComparison.CurrentCultureIgnoreCase) &&
                                fieldValuesAsText["HTML_x0020_File_x0020_Type"] == "OneNote.Notebook")
                            {
                                pnpFolder.Properties.Add("File_x0020_Type", "OneNote.Notebook");
                                pnpFolder.Properties.Add(fieldValue.Key, "OneNote.Notebook");
                                value = null;
                            }

                            // We process real values only
                            if (!string.IsNullOrWhiteSpace(value) && value != "[]")
                            {
                                pnpFolder.Properties.Add(fieldValue.Key, value);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                scope.LogError(ex, "Extract of Folder {0} failed", serverRelativePathToFolder);
            }
            return(pnpFolder);
        }
コード例 #6
0
        private ListItemCollectionPosition RetrieveItems(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo, PnPMonitoredScope scope, List siteList, Model.Configuration.Lists.Lists.ExtractListsListsConfiguration extractionConfiguration, CamlQuery camlQuery, Model.Configuration.Lists.Lists.ExtractListsQueryConfiguration queryConfig, ListInstance listInstance, string defaultContentTypeId)
        {
            var items = siteList.GetItems(camlQuery);

            siteList.Context.Load(items, i => i.IncludeWithDefaultProperties(li => li.FieldValuesAsText), i => i.ListItemCollectionPosition);
            if (queryConfig != null && queryConfig.ViewFields != null && queryConfig.ViewFields.Count > 0)
            {
                foreach (var viewField in queryConfig.ViewFields)
                {
                    if (siteList.Fields.FirstOrDefault(f => f.InternalName == viewField) != null)
                    {
                        siteList.Context.Load(items, i => i.Include(li => li[viewField]));
                    }
                }
            }
            siteList.Context.ExecuteQueryRetry();
            var baseUri = new Uri(web.Url);

            if (siteList.BaseType == BaseType.DocumentLibrary)
            {
                ProcessLibraryItems(web, siteList, template, listInstance, extractionConfiguration, queryConfig, creationInfo, scope, items, baseUri, defaultContentTypeId);
            }
            else
            {
                ProcessListItems(web, siteList, listInstance, creationInfo, extractionConfiguration, queryConfig, baseUri, items, scope);
            }
            return(items.ListItemCollectionPosition);
        }
コード例 #7
0
        public override ProvisioningTemplate ExtractObjects(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo)
        {
            using (var scope = new PnPMonitoredScope(this.Name))
            {
                var lists = web.Lists;
                web.EnsureProperties(w => w.ServerRelativeUrl, w => w.Url, w => w.Id);
                web.Context.Load(lists,
                                 lc => lc.IncludeWithDefaultProperties(
                                     l => l.RootFolder.ServerRelativeUrl,
                                     l => l.EnableAttachments,
                                     l => l.ContentTypes,
                                     l => l.Fields.IncludeWithDefaultProperties(
                                         f => f.Id,
                                         f => f.Title,
                                         f => f.TypeAsString,
                                         f => f.ReadOnlyField,
                                         f => f.Hidden,
                                         f => f.InternalName,
                                         f => f.DefaultValue,
                                         f => f.Required))
                                 );
                web.Context.ExecuteQueryRetry();

                var allLists = new List <List>();

                var listsToProcess = lists.AsEnumerable().Where(l => l.Hidden == false || l.Hidden == creationInfo.IncludeHiddenLists).ToArray();
                foreach (var siteList in listsToProcess)
                {
                    if (ShouldNotExtractList(creationInfo, siteList))
                    {
                        continue;
                    }
                    var       extractionConfig = creationInfo.ExtractConfiguration.Lists.Lists.FirstOrDefault(e => e.Title.Equals(siteList.Title) || siteList.RootFolder.ServerRelativeUrl.EndsWith(e.Title, StringComparison.InvariantCultureIgnoreCase));
                    CamlQuery camlQuery        = CamlQuery.CreateAllItemsQuery();
                    Model.Configuration.Lists.Lists.ExtractListsQueryConfiguration queryConfig = null;
                    if (extractionConfig.Query != null)
                    {
                        queryConfig = extractionConfig.Query;

                        camlQuery = new CamlQuery();

                        if (string.IsNullOrEmpty(queryConfig.CamlQuery))
                        {
                            queryConfig.CamlQuery = "<Order><FieldRef Name='ID' /></Order>";
                        }
                        string viewXml = $"<View Scope=\"RecursiveAll\"><Query>{queryConfig.CamlQuery}</Query>";
                        if (queryConfig.IncludeAttachments && siteList.EnableAttachments)
                        {
                            if (queryConfig.ViewFields == null)
                            {
                                queryConfig.ViewFields = new List <string>();
                            }
                            else if (!queryConfig.ViewFields.Contains("Attachments"))
                            {
                                queryConfig.ViewFields.Add("Attachments");
                            }
                        }
                        if (queryConfig.ViewFields != null && queryConfig.ViewFields.Count > 0)
                        {
                            viewXml += "<ViewFields>";
                            foreach (var viewField in queryConfig.ViewFields)
                            {
                                viewXml += $"<FieldRef Name='{viewField}' />";
                            }

                            viewXml += "</ViewFields>";
                        }
                        if (queryConfig.RowLimit > 0 || queryConfig.PageSize > 0)
                        {
                            viewXml += $"<RowLimit{(queryConfig.PageSize > 0 ? " Paged=\"TRUE\"" : "")}>{(queryConfig.PageSize > 0 ? queryConfig.PageSize : queryConfig.RowLimit)}</RowLimit>";
                        }
                        viewXml          += "</View>";
                        camlQuery.ViewXml = viewXml;
                    }

                    var listInstance = template.Lists.FirstOrDefault(l => siteList.RootFolder.ServerRelativeUrl.Equals(UrlUtility.Combine(web.ServerRelativeUrl, l.Url)));
                    if (listInstance != null)
                    {
                        do
                        {
                            camlQuery.ListItemCollectionPosition = RetrieveItems(web, template, creationInfo, scope, siteList, extractionConfig, camlQuery, queryConfig, listInstance, siteList.ContentTypes[0].Id.StringValue);
                        } while (camlQuery.ListItemCollectionPosition != null);
                    }
                }
            }
            return(template);
        }