/// <summary>
 /// Determines if the column is a lookup
 /// </summary>
 /// <param name="List"></param>
 /// <param name="ColumnName"></param>
 /// <returns></returns>
 static bool IsUser(SPListDefinition List, string ColumnName)
 {
     foreach (var spc in List.FieldDefinitions
              .Where(sfield => sfield.InternalName.Equals(ColumnName, StringComparison.CurrentCultureIgnoreCase) && sfield.FieldTypeKind == FieldType.User))
     {
         return(true);
     }
     return(false);
 }
 /// <summary>
 /// Determines if the column is a lookup
 /// </summary>
 /// <param name="List"></param>
 /// <param name="ColumnName"></param>
 /// <param name="LookupListName"></param>
 /// <returns></returns>
 static bool IsLookup(SPListDefinition List, string ColumnName, out SPFieldDefinitionModel LookupField)
 {
     LookupField = null;
     foreach (var spc in List.FieldDefinitions
              .Where(sfield => sfield.InternalName.Equals(ColumnName, StringComparison.CurrentCultureIgnoreCase) && sfield.FieldTypeKind == FieldType.Lookup))
     {
         LookupField = spc;
         return(true);
     }
     return(false);
 }
Exemple #3
0
        private SPListDefinition GetSampleLibrary()
        {
            var newList = new SPListDefinition()
            {
                ListName         = "Sample 01 File Upload",
                ListDescription  = "Sample library for uploading files.",
                ListTemplate     = ListTemplateType.GenericList,
                QuickLaunch      = QuickLaunchOptions.On,
                Versioning       = false,
                FieldDefinitions = GetSampleFields()
            };

            return(newList);
        }
Exemple #4
0
        private SPListDefinition GetSampleLibrary()
        {
            var newList = new SPListDefinition()
            {
                ListName         = "Sample Version History",
                ListDescription  = "Sample Version History for demonstrating version history and append changes.",
                ListTemplate     = ListTemplateType.GenericList,
                QuickLaunch      = QuickLaunchOptions.On,
                Versioning       = true,
                FieldDefinitions = GetSampleFields()
            };

            return(newList);
        }
        /// <summary>
        /// Provision a list to the specified web using the list definition
        /// </summary>
        /// <param name="web">Client Context web</param>
        /// <param name="listDef">Hydrated list definition from JSON or Object</param>
        /// <param name="loggerVerbose">TODO: convert to static logger</param>
        /// <param name="loggerWarning">TODO: convert to static logger</param>
        /// <param name="loggerError">TODO: convert to static logger</param>
        /// <param name="SiteGroups">Collection of provisioned SharePoint group for field definitions</param>
        /// <param name="JsonFilePath">(OPTIONAL) file path to JSON folder</param>
        public static void CreateListFromDefinition(this Web web, SPListDefinition listDef, Action <string, string[]> loggerVerbose, Action <string, string[]> loggerWarning, Action <Exception, string, string[]> loggerError, List <SPGroupDefinitionModel> SiteGroups = null, string JsonFilePath = null)
        {
            var webContext = web.Context;

            var siteColumns           = new List <SPFieldDefinitionModel>();
            var afterProvisionChanges = false;

            // Content Type
            var listName        = listDef.ListName;
            var listDescription = listDef.ListDescription;


            // check to see if Picture library named Photos already exists
            ListCollection     allLists   = web.Lists;
            IEnumerable <List> foundLists = webContext.LoadQuery(allLists.Where(list => list.Title == listName)
                                                                 .Include(arl => arl.Title, arl => arl.Id, arl => arl.ContentTypes, ol => ol.RootFolder, ol => ol.EnableVersioning, ol => ol.EnableFolderCreation, ol => ol.ContentTypesEnabled));

            webContext.ExecuteQueryRetry();

            List listToProvision = foundLists.FirstOrDefault();

            if (listToProvision == null)
            {
                ListCreationInformation listToProvisionInfo = listDef.ToCreationObject();
                listToProvision = web.Lists.Add(listToProvisionInfo);
                webContext.Load(listToProvision, arl => arl.Title, arl => arl.Id, arl => arl.ContentTypes, ol => ol.RootFolder, ol => ol.EnableVersioning, ol => ol.EnableFolderCreation, ol => ol.ContentTypesEnabled);
                webContext.ExecuteQuery();
            }

            if (listDef.Versioning && !listToProvision.EnableVersioning)
            {
                afterProvisionChanges            = true;
                listToProvision.EnableVersioning = true;
                if (listDef.ListTemplate == ListTemplateType.DocumentLibrary)
                {
                    listToProvision.EnableMinorVersions = true;
                }
            }

            if (listDef.ContentTypeEnabled && !listToProvision.ContentTypesEnabled)
            {
                afterProvisionChanges = true;
                listToProvision.ContentTypesEnabled = true;
            }

            if (listDef.EnableFolderCreation && !listToProvision.EnableFolderCreation)
            {
                afterProvisionChanges = true;
                listToProvision.EnableFolderCreation = true;
            }

            if (afterProvisionChanges)
            {
                listToProvision.Update();
                webContext.Load(listToProvision);
                webContext.ExecuteQueryRetry();
            }

            webContext.Load(listToProvision, arl => arl.Title, arl => arl.Id, arl => arl.ContentTypes, ol => ol.RootFolder, ol => ol.EnableVersioning, ol => ol.EnableFolderCreation, ol => ol.ContentTypesEnabled);
            webContext.ExecuteQuery();

            if (listDef.ContentTypeEnabled && listDef.HasContentTypes)
            {
                foreach (var contentDef in listDef.ContentTypes)
                {
                    if (!listToProvision.ContentTypeExistsByName(contentDef.Name))
                    {
                        var ctypeInfo         = contentDef.ToCreationObject();
                        var accessContentType = listToProvision.ContentTypes.Add(ctypeInfo);
                        listToProvision.Update();
                        webContext.Load(accessContentType, tycp => tycp.Id, tycp => tycp.Name);
                        webContext.ExecuteQueryRetry();

                        if (contentDef.DefaultContentType)
                        {
                            listToProvision.SetDefaultContentTypeToList(accessContentType);
                        }
                    }
                }
            }


            // Site Columns
            foreach (var fieldDef in listDef.FieldDefinitions)
            {
                var column = listToProvision.CreateListColumn(fieldDef, loggerVerbose, loggerWarning, SiteGroups, JsonFilePath);
                if (column == null)
                {
                    loggerWarning("Failed to create column {0}.", new string[] { fieldDef.InternalName });
                }
                else
                {
                    siteColumns.Add(new SPFieldDefinitionModel()
                    {
                        InternalName = column.InternalName,
                        DisplayName  = column.Title,
                        FieldGuid    = column.Id
                    });
                }
            }

            if (listDef.ContentTypeEnabled && listDef.HasContentTypes)
            {
                foreach (var contentDef in listDef.ContentTypes)
                {
                    var contentTypeName    = contentDef.Name;
                    var accessContentTypes = listToProvision.ContentTypes;
                    IEnumerable <ContentType> allContentTypes = webContext.LoadQuery(accessContentTypes.Where(f => f.Name == contentTypeName).Include(tcyp => tcyp.Id, tcyp => tcyp.Name));
                    webContext.ExecuteQueryRetry();

                    if (allContentTypes != null)
                    {
                        var accessContentType = allContentTypes.FirstOrDefault();
                        foreach (var fieldInternalName in contentDef.FieldLinkRefs)
                        {
                            var column = siteColumns.FirstOrDefault(f => f.InternalName == fieldInternalName);
                            if (column != null)
                            {
                                var fieldLinks = accessContentType.FieldLinks;
                                webContext.Load(fieldLinks, cf => cf.Include(inc => inc.Id, inc => inc.Name));
                                webContext.ExecuteQueryRetry();

                                var convertedInternalName = column.DisplayNameMasked;
                                if (!fieldLinks.Any(a => a.Name == column.InternalName || a.Name == convertedInternalName))
                                {
                                    loggerVerbose("Content Type {0} Adding Field {1}", new string[] { contentTypeName, column.InternalName });
                                    var siteColumn = listToProvision.GetFieldById <Field>(column.FieldGuid);
                                    webContext.ExecuteQueryRetry();

                                    var flink = new FieldLinkCreationInformation();
                                    flink.Field = siteColumn;
                                    var flinkstub = accessContentType.FieldLinks.Add(flink);
                                    //if(fieldDef.Required) flinkstub.Required = fieldDef.Required;
                                    accessContentType.Update(false);
                                    webContext.ExecuteQueryRetry();
                                }
                            }
                            else
                            {
                                loggerWarning("Failed to create column {0}.", new string[] { fieldInternalName });
                            }
                        }
                    }
                }
            }


            // Views
            if (listDef.Views != null && listDef.Views.Count() > 0)
            {
                ViewCollection views = listToProvision.Views;
                webContext.Load(views, f => f.Include(inc => inc.Id, inc => inc.Hidden, inc => inc.Title, inc => inc.DefaultView));
                webContext.ExecuteQueryRetry();

                foreach (var viewDef in listDef.Views)
                {
                    try
                    {
                        if (views.Any(v => v.Title.Equals(viewDef.Title, StringComparison.CurrentCultureIgnoreCase)))
                        {
                            loggerVerbose("View {0} found in list {1}", new string[] { viewDef.Title, listName });
                            continue;
                        }

                        var view = listToProvision.CreateView(viewDef.InternalName, viewDef.ViewCamlType, viewDef.FieldRefName, viewDef.RowLimit, viewDef.DefaultView, viewDef.QueryXml, viewDef.PersonalView, viewDef.PagedView);
                        webContext.Load(view, v => v.Title, v => v.Id, v => v.ServerRelativeUrl);
                        webContext.ExecuteQueryRetry();

                        view.Title = viewDef.Title;
                        if (viewDef.HasJsLink)
                        {
                            view.JSLink = viewDef.JsLink;
                        }
                        view.Update();
                        webContext.ExecuteQueryRetry();
                    }
                    catch (Exception ex)
                    {
                        loggerError(ex, "Failed to create view {0} with XML:{1}", new string[] { viewDef.Title, viewDef.QueryXml });
                    }
                }
            }

            // List Data upload
            if (listDef.ListItems != null && listDef.ListItems.Count() > 0)
            {
                foreach (var listItem in listDef.ListItems)
                {
                    // Process the record into the notification email list
                    var itemCreateInfo = new ListItemCreationInformation();

                    var newSPListItem = listToProvision.AddItem(itemCreateInfo);
                    newSPListItem["Title"] = listItem.Title;
                    foreach (var listItemData in listItem.ColumnValues)
                    {
                        newSPListItem[listItemData.FieldName] = listItemData.FieldValue;
                    }

                    newSPListItem.Update();
                    webContext.ExecuteQueryRetry();
                }
            }
        }
Exemple #6
0
        /// <summary>
        /// Generate a portable JSON object from the List Template
        /// </summary>
        /// <param name="context">Client Context web</param>
        /// <param name="hostWeb">Client Context web</param>
        /// <param name="list">Hydrated SharePoint list Object</param>
        /// <param name="ExpandObjects">true - enumerate fields, views, content types</param>
        /// <param name="logger">Logger implementation for Verbose/Exception handling</param>
        /// <param name="skiptypes">Collection of field types to be used as a filter statement</param>
        /// <param name="siteGroups">Collection of hostWeb groups</param>
        /// <returns></returns>
        public static SPListDefinition GetListDefinition(this ClientContext context, Web hostWeb, List list, bool ExpandObjects, ITraceLogger logger, IEnumerable <FieldType> skiptypes, IEnumerable <Microsoft.SharePoint.Client.Group> siteGroups = null)
        {
            logger.LogInformation("Processing Web list {0}", list.Title);

            if (!hostWeb.IsPropertyAvailable(ctx => ctx.ServerRelativeUrl))
            {
                hostWeb.Context.Load(hostWeb, ctx => ctx.ServerRelativeUrl);
                hostWeb.Context.ExecuteQueryRetry();
            }

            list.EnsureProperties(
                lctx => lctx.Id,
                lctx => lctx.Title,
                lctx => lctx.Description,
                lctx => lctx.DefaultViewUrl,
                lctx => lctx.OnQuickLaunch,
                lctx => lctx.BaseTemplate,
                lctx => lctx.BaseType,
                lctx => lctx.CrawlNonDefaultViews,
                lctx => lctx.Created,
                lctx => lctx.ContentTypesEnabled,
                lctx => lctx.CreatablesInfo,
                lctx => lctx.EnableFolderCreation,
                lctx => lctx.EnableModeration,
                lctx => lctx.EnableVersioning,
                lctx => lctx.Hidden,
                lctx => lctx.IsApplicationList,
                lctx => lctx.IsCatalog,
                lctx => lctx.IsSiteAssetsLibrary,
                lctx => lctx.IsPrivate,
                lctx => lctx.IsSystemList,
                lctx => lctx.RootFolder.ServerRelativeUrl,
                lctx => lctx.SchemaXml,
                lctx => lctx.LastItemModifiedDate,
                lctx => lctx.LastItemUserModifiedDate,
                lctx => lctx.ListExperienceOptions,
                lctx => lctx.TemplateFeatureId);

            var weburl           = hostWeb.ServerRelativeUrl.EnsureTrailingSlashLowered();
            var listTemplateType = list.GetListTemplateType();

            var listdefinition = new SPListDefinition()
            {
                Id                       = list.Id,
                ListName                 = list.Title,
                ListDescription          = list.Description,
                ServerRelativeUrl        = list.DefaultViewUrl,
                BaseTemplate             = list.BaseTemplate,
                ListTemplate             = listTemplateType,
                Created                  = list.Created,
                LastItemModifiedDate     = list.LastItemModifiedDate,
                LastItemUserModifiedDate = list.LastItemUserModifiedDate,
                QuickLaunch              = list.OnQuickLaunch ? QuickLaunchOptions.On : QuickLaunchOptions.Off,
                ContentTypeEnabled       = list.ContentTypesEnabled,
                EnableFolderCreation     = list.EnableFolderCreation,
                Hidden                   = list.Hidden,
                IsApplicationList        = list.IsApplicationList,
                IsCatalog                = list.IsCatalog,
                IsSiteAssetsLibrary      = list.IsSiteAssetsLibrary,
                IsPrivate                = list.IsPrivate,
                IsSystemList             = list.IsSystemList
            };

            if (ExpandObjects)
            {
                var contentTypesFieldset = new List <dynamic>();
                var definitionListFields = new List <SPFieldDefinitionModel>();
                var listurl = TokenHelper.EnsureTrailingSlash(list.RootFolder.ServerRelativeUrl);

                // content types
                var listContentType = list.Context.LoadQuery(list.ContentTypes
                                                             .Include(
                                                                 ict => ict.Id,
                                                                 ict => ict.Group,
                                                                 ict => ict.Description,
                                                                 ict => ict.Name,
                                                                 ict => ict.Hidden,
                                                                 ict => ict.JSLink,
                                                                 ict => ict.FieldLinks,
                                                                 ict => ict.Fields));

                // list fields
                var listFields = list.Context.LoadQuery(list.Fields.Where(wf => wf.ReadOnlyField == false && wf.Hidden == false)
                                                        .Include(
                                                            fctx => fctx.Id,
                                                            fctx => fctx.AutoIndexed,
                                                            fctx => fctx.CanBeDeleted,
                                                            fctx => fctx.DefaultFormula,
                                                            fctx => fctx.DefaultValue,
                                                            fctx => fctx.Group,
                                                            fctx => fctx.Description,
                                                            fctx => fctx.EnforceUniqueValues,
                                                            fctx => fctx.FieldTypeKind,
                                                            fctx => fctx.Filterable,
                                                            fctx => fctx.FromBaseType,
                                                            fctx => fctx.Hidden,
                                                            fctx => fctx.Indexed,
                                                            fctx => fctx.InternalName,
                                                            fctx => fctx.JSLink,
                                                            fctx => fctx.NoCrawl,
                                                            fctx => fctx.ReadOnlyField,
                                                            fctx => fctx.Required,
                                                            fctx => fctx.SchemaXml,
                                                            fctx => fctx.Scope,
                                                            fctx => fctx.Title
                                                            ));

                // list views
                var listViews = list.Context.LoadQuery(list.Views
                                                       .Include(
                                                           lvt => lvt.Title,
                                                           lvt => lvt.DefaultView,
                                                           lvt => lvt.ServerRelativeUrl,
                                                           lvt => lvt.Id,
                                                           lvt => lvt.Aggregations,
                                                           lvt => lvt.AggregationsStatus,
                                                           lvt => lvt.BaseViewId,
                                                           lvt => lvt.Hidden,
                                                           lvt => lvt.ImageUrl,
                                                           lvt => lvt.JSLink,
                                                           lvt => lvt.HtmlSchemaXml,
                                                           lvt => lvt.ListViewXml,
                                                           lvt => lvt.MobileDefaultView,
                                                           lvt => lvt.ModerationType,
                                                           lvt => lvt.OrderedView,
                                                           lvt => lvt.Paged,
                                                           lvt => lvt.PageRenderType,
                                                           lvt => lvt.PersonalView,
                                                           lvt => lvt.ReadOnlyView,
                                                           lvt => lvt.Scope,
                                                           lvt => lvt.RowLimit,
                                                           lvt => lvt.StyleId,
                                                           lvt => lvt.TabularView,
                                                           lvt => lvt.Threaded,
                                                           lvt => lvt.Toolbar,
                                                           lvt => lvt.ToolbarTemplateName,
                                                           lvt => lvt.ViewFields,
                                                           lvt => lvt.ViewJoins,
                                                           lvt => lvt.ViewQuery,
                                                           lvt => lvt.ViewType,
                                                           lvt => lvt.ViewProjectedFields,
                                                           lvt => lvt.Method
                                                           ));

                list.Context.ExecuteQueryRetry();


                if (listContentType != null && listContentType.Any())
                {
                    listdefinition.ContentTypes = new List <SPContentTypeDefinition>();
                    foreach (var contenttype in listContentType)
                    {
                        logger.LogInformation("Processing list {0} content type {1}", list.Title, contenttype.Name);

                        var ctypemodel = new SPContentTypeDefinition()
                        {
                            Inherits         = true,
                            ContentTypeId    = contenttype.Id.StringValue,
                            ContentTypeGroup = contenttype.Group,
                            Description      = contenttype.Description,
                            Name             = contenttype.Name,
                            Hidden           = contenttype.Hidden,
                            JSLink           = contenttype.JSLink
                        };

                        if (contenttype.FieldLinks.Any())
                        {
                            ctypemodel.FieldLinks = new List <SPFieldLinkDefinitionModel>();
                            foreach (var cfieldlink in contenttype.FieldLinks)
                            {
                                ctypemodel.FieldLinks.Add(new SPFieldLinkDefinitionModel()
                                {
                                    Id       = cfieldlink.Id,
                                    Name     = cfieldlink.Name,
                                    Hidden   = cfieldlink.Hidden,
                                    Required = cfieldlink.Required
                                });

                                contentTypesFieldset.Add(new { ctypeid = contenttype.Id.StringValue, name = cfieldlink.Name });
                            }
                        }

                        if (contenttype.Fields.Any())
                        {
                            foreach (var cfield in contenttype.Fields.Where(cf => !ctypemodel.FieldLinks.Any(fl => fl.Name == cf.InternalName)))
                            {
                                ctypemodel.FieldLinks.Add(new SPFieldLinkDefinitionModel()
                                {
                                    Id       = cfield.Id,
                                    Name     = cfield.InternalName,
                                    Hidden   = cfield.Hidden,
                                    Required = cfield.Required
                                });
                            }
                        }

                        listdefinition.ContentTypes.Add(ctypemodel);
                    }
                }


                if (listFields != null && listFields.Any())
                {
                    var filteredListFields = listFields.Where(lf => !skiptypes.Any(st => lf.FieldTypeKind == st)).ToList();
                    logger.LogWarning("Processing list {0} found {1} fields to be processed", list.Title, filteredListFields.Count());

                    foreach (Field listField in listFields)
                    {
                        logger.LogInformation("Processing list {0} field {1}", list.Title, listField.InternalName);

                        try
                        {
                            var fieldXml = listField.SchemaXml;
                            if (!string.IsNullOrEmpty(fieldXml))
                            {
                                var xdoc      = XDocument.Parse(fieldXml, LoadOptions.PreserveWhitespace);
                                var xField    = xdoc.Element("Field");
                                var xSourceID = xField.Attribute("SourceID");
                                //if (xSourceID != null && xSourceID.Value.IndexOf(ConstantsXmlNamespaces.SharePointNS.NamespaceName, StringComparison.CurrentCultureIgnoreCase) < 0)
                                //{
                                //    continue; // skip processing an OOTB field
                                //}
                                var customField = context.RetrieveField(listField, logger, siteGroups, xField);
                                if (xSourceID != null)
                                {
                                    customField.SourceID = xSourceID.Value;
                                }
                                definitionListFields.Add(customField);

                                if (customField.FieldTypeKind == FieldType.Lookup)
                                {
                                    listdefinition.ListDependency.Add(customField.LookupListName);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            logger.LogError(ex, "Failed to parse field {0} MSG:{1}", listField.InternalName, ex.Message);
                        }
                    }

                    listdefinition.FieldDefinitions = definitionListFields;
                }


                if (listViews != null && listViews.Any())
                {
                    listdefinition.InternalViews = new List <SPViewDefinitionModel>();
                    listdefinition.Views         = new List <SPViewDefinitionModel>();

                    foreach (var view in listViews)
                    {
                        logger.LogInformation("Processing list {0} view {1}", list.Title, view.Title);

                        var vinternal = (view.ServerRelativeUrl.IndexOf(listurl, StringComparison.CurrentCultureIgnoreCase) == -1);

                        ViewType viewCamlType = InfrastructureAsCode.Core.Extensions.ListExtensions.TryGetViewType(view.ViewType);

                        var viewmodel = new SPViewDefinitionModel()
                        {
                            Id                 = view.Id,
                            Title              = view.Title,
                            DefaultView        = view.DefaultView,
                            FieldRefName       = new List <string>(),
                            Aggregations       = view.Aggregations,
                            AggregationsStatus = view.AggregationsStatus,
                            BaseViewId         = view.BaseViewId,
                            Hidden             = view.Hidden,
                            ImageUrl           = view.ImageUrl,
                            Toolbar            = view.Toolbar,
                            ListViewXml        = view.ListViewXml,
                            MobileDefaultView  = view.MobileDefaultView,
                            ModerationType     = view.ModerationType,
                            OrderedView        = view.OrderedView,
                            Paged              = view.Paged,
                            PageRenderType     = view.PageRenderType,
                            PersonalView       = view.PersonalView,
                            ReadOnlyView       = view.ReadOnlyView,
                            Scope              = view.Scope,
                            RowLimit           = view.RowLimit,
                            StyleId            = view.StyleId,
                            TabularView        = view.TabularView,
                            Threaded           = view.Threaded,
                            ViewJoins          = view.ViewJoins,
                            ViewQuery          = view.ViewQuery,
                            ViewCamlType       = viewCamlType
                        };

                        if (vinternal)
                        {
                            viewmodel.SitePage     = view.ServerRelativeUrl.Replace(weburl, "");
                            viewmodel.InternalView = true;
                        }
                        else
                        {
                            viewmodel.InternalName = view.ServerRelativeUrl.Replace(listurl, "").Replace(".aspx", "");
                        }

                        if (view.ViewFields != null && view.ViewFields.Any())
                        {
                            foreach (var vfields in view.ViewFields)
                            {
                                viewmodel.FieldRefName.Add(vfields);
                            }
                        }

                        if (view.JSLink != null && view.JSLink.Any())
                        {
                            var vjslinks = view.JSLink.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
                            if (vjslinks != null && !vjslinks.Any(jl => jl == "clienttemplates.js"))
                            {
                                viewmodel.JsLinkFiles = new List <string>();
                                foreach (var vjslink in vjslinks)
                                {
                                    viewmodel.JsLinkFiles.Add(vjslink);
                                }
                            }
                        }

                        if (view.Hidden)
                        {
                            listdefinition.InternalViews.Add(viewmodel);
                        }
                        else
                        {
                            listdefinition.Views.Add(viewmodel);
                        }
                    }
                }
            }

            return(listdefinition);
        }
Exemple #7
0
        /// <summary>
        /// Provision a list to the specified web using the list definition
        /// </summary>
        /// <param name="web">Client Context web</param>
        /// <param name="listDefinition">Hydrated list definition from JSON or Object</param>
        /// <param name="provisionerChoices">(OPTIONAL) deserialized choices from JSON</param>
        public static List CreateListFromDefinition(this Web web, SPListDefinition listDefinition, List <SiteProvisionerFieldChoiceModel> provisionerChoices = null)
        {
            var webContext = web.Context;

            var siteColumns           = new List <SPFieldDefinitionModel>();
            var afterProvisionChanges = false;

            // Content Type
            var listName        = listDefinition.ListName;
            var listDescription = listDefinition.ListDescription;


            // check to see if Picture library named Photos already exists
            ListCollection     allLists   = web.Lists;
            IEnumerable <List> foundLists = webContext.LoadQuery(allLists.Where(list => list.Title == listName)
                                                                 .Include(arl => arl.Title, arl => arl.Id, arl => arl.ContentTypes, ol => ol.RootFolder, ol => ol.EnableVersioning, ol => ol.EnableFolderCreation, ol => ol.ContentTypesEnabled));

            webContext.ExecuteQueryRetry();

            List listToProvision = foundLists.FirstOrDefault();

            if (listToProvision == null)
            {
                ListCreationInformation listToProvisionInfo = listDefinition.ToCreationObject();
                listToProvision = web.Lists.Add(listToProvisionInfo);
                webContext.Load(listToProvision, arl => arl.Title, arl => arl.Id, arl => arl.ContentTypes, ol => ol.RootFolder, ol => ol.EnableVersioning, ol => ol.EnableFolderCreation, ol => ol.ContentTypesEnabled);
                webContext.ExecuteQuery();
            }

            if (listDefinition.Versioning && !listToProvision.EnableVersioning)
            {
                afterProvisionChanges            = true;
                listToProvision.EnableVersioning = true;
                if (listDefinition.ListTemplate == ListTemplateType.DocumentLibrary)
                {
                    listToProvision.EnableMinorVersions = true;
                }
            }

            if (listDefinition.ContentTypeEnabled && !listToProvision.ContentTypesEnabled)
            {
                afterProvisionChanges = true;
                listToProvision.ContentTypesEnabled = true;
            }

            if (listDefinition.EnableFolderCreation && !listToProvision.EnableFolderCreation)
            {
                afterProvisionChanges = true;
                listToProvision.EnableFolderCreation = true;
            }

            if (afterProvisionChanges)
            {
                listToProvision.Update();
                webContext.Load(listToProvision);
                webContext.ExecuteQueryRetry();
            }

            webContext.Load(listToProvision, arl => arl.Title, arl => arl.Id, arl => arl.ContentTypes, ol => ol.RootFolder, ol => ol.EnableVersioning, ol => ol.EnableFolderCreation, ol => ol.ContentTypesEnabled);
            webContext.ExecuteQueryRetry();


            return(listToProvision);
        }
Exemple #8
0
        private IList <SPListDefinition> ProcessList(Web _web)
        {
            var model = new List <SPListDefinition>();

            // ********** Process Lists
            ListCollection _lists = _web.Lists;

            _web.Context.Load(_lists,
                              spp => spp.Include(
                                  sppi => sppi.Id,
                                  sppi => sppi.Title,
                                  sppi => sppi.RootFolder.ServerRelativeUrl,
                                  sppi => sppi.HasUniqueRoleAssignments,
                                  sppi => sppi.BaseTemplate,
                                  sppi => sppi.Hidden,
                                  sppi => sppi.IsSystemList,
                                  sppi => sppi.IsPrivate,
                                  sppi => sppi.IsApplicationList,
                                  sppi => sppi.IsCatalog,
                                  sppi => sppi.IsSiteAssetsLibrary));

            _web.Context.ExecuteQueryRetry();

            var docLibEnumValue = Convert.ToInt32(Microsoft.SharePoint.Client.ListTemplateType.DocumentLibrary);

            // Restrict to natural lists or custom lists
            foreach (List _list in _lists.Where(sppi
                                                => !sppi.IsSystemList &&
                                                !sppi.IsApplicationList &&
                                                sppi.BaseTemplate != docLibEnumValue))
            {
                var hasListFound = false;
                var listContext  = _list.Context;
                LogVerbose("Enumerating List {0} URL:{1}", _list.Title, _list.RootFolder.ServerRelativeUrl);

                try
                {
                    listContext.Load(_list,
                                     lssp => lssp.Id,
                                     lssp => lssp.Title,
                                     lssp => lssp.HasUniqueRoleAssignments,
                                     lssp => lssp.Title,
                                     lssp => lssp.Hidden,
                                     lssp => lssp.IsSystemList,
                                     lssp => lssp.IsPrivate,
                                     lssp => lssp.IsApplicationList,
                                     lssp => lssp.IsCatalog,
                                     lssp => lssp.IsSiteAssetsLibrary,
                                     lssp => lssp.RootFolder.ServerRelativeUrl,
                                     lssp => lssp.ContentTypes.Include(
                                         lcnt => lcnt.Id,
                                         lcnt => lcnt.Name,
                                         lcnt => lcnt.StringId,
                                         lcnt => lcnt.Description,
                                         lcnt => lcnt.DocumentTemplate,
                                         lcnt => lcnt.Group,
                                         lcnt => lcnt.Hidden,
                                         lcnt => lcnt.JSLink,
                                         lcnt => lcnt.SchemaXml,
                                         lcnt => lcnt.Scope,
                                         lcnt => lcnt.FieldLinks.Include(
                                             lcntlnk => lcntlnk.Id,
                                             lcntlnk => lcntlnk.Name,
                                             lcntlnk => lcntlnk.Hidden,
                                             lcntlnk => lcntlnk.Required
                                             ),
                                         lcnt => lcnt.Fields.Include(
                                             lcntfld => lcntfld.FieldTypeKind,
                                             lcntfld => lcntfld.InternalName,
                                             lcntfld => lcntfld.Id,
                                             lcntfld => lcntfld.Group,
                                             lcntfld => lcntfld.Title,
                                             lcntfld => lcntfld.Hidden,
                                             lcntfld => lcntfld.Description,
                                             lcntfld => lcntfld.JSLink,
                                             lcntfld => lcntfld.Indexed,
                                             lcntfld => lcntfld.Required,
                                             lcntfld => lcntfld.SchemaXml)),
                                     lssp => lssp.Fields.Include(
                                         lcntfld => lcntfld.FieldTypeKind,
                                         lcntfld => lcntfld.InternalName,
                                         lcntfld => lcntfld.Id,
                                         lcntfld => lcntfld.Group,
                                         lcntfld => lcntfld.Title,
                                         lcntfld => lcntfld.Hidden,
                                         lcntfld => lcntfld.Description,
                                         lcntfld => lcntfld.JSLink,
                                         lcntfld => lcntfld.Indexed,
                                         lcntfld => lcntfld.Required,
                                         lcntfld => lcntfld.SchemaXml));
                    listContext.ExecuteQueryRetry();

                    var listModel = new SPListDefinition()
                    {
                        Id = _list.Id,
                        HasUniquePermission = _list.HasUniqueRoleAssignments,
                        ListName            = _list.Title,
                        ServerRelativeUrl   = _list.RootFolder.ServerRelativeUrl,
                        Hidden              = _list.Hidden,
                        IsSystemList        = _list.IsSystemList,
                        IsPrivate           = _list.IsPrivate,
                        IsApplicationList   = _list.IsApplicationList,
                        IsCatalog           = _list.IsCatalog,
                        IsSiteAssetsLibrary = _list.IsSiteAssetsLibrary
                    };

                    /* Process Fields */
                    try
                    {
                        foreach (var _fields in _list.Fields)
                        {
                            if (string.IsNullOrEmpty(FieldColumnName) ||
                                _fields.Title.Equals(FieldColumnName, StringComparison.InvariantCultureIgnoreCase))
                            {
                                hasListFound = true;

                                listModel.FieldDefinitions.Add(new SPFieldDefinitionModel()
                                {
                                    FieldTypeKind = _fields.FieldTypeKind,
                                    InternalName  = _fields.InternalName,
                                    FieldGuid     = _fields.Id,
                                    GroupName     = _fields.Group,
                                    Title         = _fields.Title,
                                    HiddenField   = _fields.Hidden,
                                    Description   = _fields.Description,
                                    JSLink        = _fields.JSLink,
                                    FieldIndexed  = _fields.Indexed,
                                    Required      = _fields.Required,
                                    SchemaXml     = _fields.SchemaXml
                                });
                            }
                        }
                        ;
                    }
                    catch (Exception e)
                    {
                        LogError(e, "Failed to retrieve site owners {0}", _web.Url);
                    }

                    foreach (var _ctypes in _list.ContentTypes)
                    {
                        var cmodel = new SPContentTypeDefinition()
                        {
                            ContentTypeId    = _ctypes.StringId,
                            Name             = _ctypes.Name,
                            Description      = _ctypes.Description,
                            DocumentTemplate = _ctypes.DocumentTemplate,
                            ContentTypeGroup = _ctypes.Group,
                            Hidden           = _ctypes.Hidden,
                            JSLink           = _ctypes.JSLink,
                            Scope            = _ctypes.Scope
                        };

                        foreach (var _ctypeFields in _ctypes.FieldLinks)
                        {
                            if (string.IsNullOrEmpty(FieldColumnName) ||
                                _ctypeFields.Name.Equals(FieldColumnName, StringComparison.InvariantCultureIgnoreCase))
                            {
                                cmodel.FieldLinks.Add(new SPFieldLinkDefinitionModel()
                                {
                                    Name     = _ctypeFields.Name,
                                    Id       = _ctypeFields.Id,
                                    Hidden   = _ctypeFields.Hidden,
                                    Required = _ctypeFields.Required
                                });
                            }
                        }

                        if (cmodel.FieldLinks.Any())
                        {
                            hasListFound = true;
                            listModel.ContentTypes.Add(cmodel);
                        }
                    }

                    if (hasListFound)
                    {
                        model.Add(listModel);
                    }
                }
                catch (Exception e)
                {
                    LogError(e, "Failed in ProcessList");
                }
            }
            return(model);
        }