private void DeleteRelatedItems(ContentTypeDependencies dependencies) { if (dependencies.Applications.Length > 0) { Logger.LogMessage("Deleting applications..."); foreach (var node in dependencies.Applications.Select(Node.LoadNode).Where(n => n != null)) { node.ForceDelete(); } Logger.LogMessage("Ok."); } if (dependencies.ContentTemplates.Length > 0) { Logger.LogMessage("Deleting content templates..."); foreach (var node in dependencies.ContentTemplates.Select(Node.LoadNode).Where(n => n != null)) { node.ForceDelete(); } Logger.LogMessage("Ok."); } if (dependencies.ContentViews.Length > 0) { Logger.LogMessage("Deleting content views..."); foreach (var node in dependencies.ContentViews.Select(Node.LoadNode).Where(n => n != null)) { node.ForceDelete(); } Logger.LogMessage("Ok."); } }
internal ContentTypeDependencies GetDependencies(string[] rootTypeNames) { var typeNames = new List <string>(); var inheritedTypeNames = new List <string>(); foreach (var rootTypeName in rootTypeNames) { var typeSubtreeQuery = ContentQuery.CreateQuery(ContentRepository.SafeQueries.InTree, QuerySettings.AdminSettings, ContentType.GetByName(rootTypeName).Path); var typeSubtreeResult = typeSubtreeQuery.Execute(); typeNames.AddRange(typeSubtreeResult.Nodes.Select(n => n.Name)); inheritedTypeNames.AddRange(typeNames.Except(rootTypeNames)); } var relatedFolders = GetRelatedFolders(typeNames); var contentInstancesCount = ContentQuery.CreateQuery( ContentRepository.SafeQueries.TypeIsCountOnly, QuerySettings.AdminSettings, new object[] { rootTypeNames }).Execute().Count - relatedFolders.ContentTemplates.Select(p => ContentQuery.Query( ContentRepository.SafeQueries.InTreeAndTypeIsCountOnly, QuerySettings.AdminSettings, p, typeNames).Count).Sum(); var PDP = Providers.Instance.DataProvider.GetExtension <IPackagingDataProviderExtension>(); var result = new ContentTypeDependencies { ContentTypeNames = rootTypeNames, // +InTree:[currentContentType.Path] InheritedTypeNames = inheritedTypeNames.ToArray(), // +TypeIs:[name] InstanceCount = contentInstancesCount, // ContentType/AllowedChildTypes: "Folder,File" PermittingContentTypes = GetContentTypesWhereTheyAreAllowed(typeNames), // ContentType/Fields/Field/Configuration/AllowedTypes/Type: "Folder" PermittingFieldSettings = GetContentTypesWhereTheyAreAllowedInReferenceField(typeNames), // ContentMetaData/Fields/AllowedChildTypes: "Folder File" PermittingContentCollection = PDP.GetContentPathsWhereTheyAreAllowedChildren(typeNames), Applications = relatedFolders.Applications, ContentTemplates = relatedFolders.ContentTemplates, ContentViews = relatedFolders.ContentViews }; return(result); }
internal ContentTypeDependencies GetDependencies(ContentType currentContentType) { var name = currentContentType.Name; var typeSubtreeQuery = ContentQuery.CreateQuery(ContentRepository.SafeQueries.InTree, QuerySettings.AdminSettings, currentContentType.Path); var typeSubtreeResult = typeSubtreeQuery.Execute(); var typeNames = typeSubtreeResult.Nodes.Select(n => n.Name).ToArray(); var inheritedTypeNames = typeNames.Where(s => s != name).ToArray(); var relatedFolders = GetRelatedFolders(typeNames); var contentInstancesCount = ContentQuery.CreateQuery(ContentRepository.SafeQueries.TypeIsCountOnly, QuerySettings.AdminSettings, name).Execute().Count - relatedFolders.ContentTemplates.Select(p => ContentQuery.Query(ContentRepository.SafeQueries.InTreeAndTypeIsCountOnly, QuerySettings.AdminSettings, p, typeNames).Count).Sum(); var result = new ContentTypeDependencies { ContentTypeName = name, // +InTree:[currentContentType.Path] InheritedTypeNames = inheritedTypeNames, // +TypeIs:[name] InstanceCount = contentInstancesCount, // ContentType/AllowedChildTypes: "Folder,File" PermittingContentTypes = GetContentTypesWhereTheyAreAllowed(typeNames), // ContentType/Fields/Field/Configuration/AllowedTypes/Type: "Folder" PermittingFieldSettings = GetContentTypesWhereTheyAreAllowedInReferenceField(typeNames), // ContentMetaData/Fields/AllowedChildTypes: "Folder File" PermittingContentCollection = GetContentPathsWhereTheyAreAllowedChildren(typeNames), Applications = relatedFolders.Applications, ContentTemplates = relatedFolders.ContentTemplates, ContentViews = relatedFolders.ContentViews }; return(result); }
private void RemoveAllowedTypes(ContentTypeDependencies dependencies) { Logger.LogMessage("Remove from allowed types:"); var names = dependencies.InheritedTypeNames.ToList(); names.AddRange(dependencies.ContentTypeNames); var ns = EditContentType.NamespacePrefix; if (dependencies.PermittingContentTypes.Length + dependencies.PermittingFieldSettings.Length > 0) { foreach (var contentType in ContentType.GetContentTypes()) { var changed = false; var xml = new XmlDocument(); xml.Load(contentType.Binary.GetStream()); var nsmgr = EditContentType.GetNamespaceManager(xml); var allowedChildTypesElement = (XmlElement)xml.SelectSingleNode($"/{ns}:ContentType/{ns}:AllowedChildTypes", nsmgr); if (allowedChildTypesElement != null) { var oldList = allowedChildTypesElement.InnerText.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); var newList = oldList.Except(names).ToArray(); if (oldList.Length != newList.Length) { changed = true; Logger.LogMessage($" {contentType.Name}"); allowedChildTypesElement.InnerText = string.Join(",", newList); } } foreach (XmlElement refFieldElement in xml.SelectNodes($"//{ns}:Field[@type='Reference']", nsmgr)) { var elementsToDelete = new List <XmlElement>(); var oldAllowedTypes = refFieldElement.SelectNodes($"{ns}:Configuration/{ns}:AllowedTypes/{ns}:Type", nsmgr); foreach (XmlElement typeElement in oldAllowedTypes) { if (names.Contains(typeElement.InnerText)) { elementsToDelete.Add(typeElement); } } if (elementsToDelete.Any()) { var fieldName = refFieldElement.Attributes["name"].Value; Logger.LogMessage($" {contentType.Name}.{fieldName}"); changed = true; } foreach (var element in elementsToDelete) { element.ParentNode.RemoveChild(element); } } if (changed) { ContentTypeInstaller.InstallContentType(xml.OuterXml); } } } if (dependencies.PermittingContentCollection.Count > 0) { foreach (var item in dependencies.PermittingContentCollection) { Logger.LogMessage($" {item.Key}"); var content = Content.Load(item.Key); if (content != null) { if (content.ContentHandler is GenericContent gc) { var newList = new List <ContentType>(); var oldList = gc.AllowedChildTypes.ToList(); foreach (var ct in oldList) { if (!names.Contains(ct.Name)) { newList.Add(ct); } } gc.AllowedChildTypes = newList; gc.Save(); } } } } }
private void PrintDependencies(ContentTypeDependencies dependencies) { var names = dependencies.InheritedTypeNames.ToList(); names.AddRange(dependencies.ContentTypeNames); var inheritedTypeNames = dependencies.InheritedTypeNames; Logger.LogMessage(" Dependencies: "); Logger.LogMessage(" Inherited types: "); Logger.LogMessage(" " + (inheritedTypeNames.Length == 0 ? "There is no related item." : string.Join(", ", inheritedTypeNames))); Logger.LogMessage(string.Empty); Logger.LogMessage(" Content instances: " + dependencies.InstanceCount); Logger.LogMessage(string.Empty); Logger.LogMessage(" Relations: "); if (dependencies.Applications.Length > 0) { Logger.LogMessage(" Applications: "); foreach (var path in dependencies.Applications) { Logger.LogMessage($" {path}"); } Logger.LogMessage(string.Empty); } if (dependencies.ContentTemplates.Length > 0) { Logger.LogMessage(" Content templates: "); foreach (var path in dependencies.ContentTemplates) { Logger.LogMessage($" {path}"); } Logger.LogMessage(string.Empty); } if (dependencies.ContentViews.Length > 0) { Logger.LogMessage(" Content views: "); foreach (var path in dependencies.ContentViews) { Logger.LogMessage($" {path}"); } Logger.LogMessage(string.Empty); } if (dependencies.PermittingContentTypes.Length > 0) { Logger.LogMessage(" Remaining allowed child types in other content types after deletion:"); foreach (var contentType in dependencies.PermittingContentTypes) { var remaining = string.Join(", ", contentType.AllowedChildTypeNames.Except(names).ToArray()); remaining = remaining.Length == 0 ? "[empty]" : remaining; Logger.LogMessage($" {contentType.Name}: {remaining}"); } Logger.LogMessage(string.Empty); } if (dependencies.PermittingFieldSettings.Length > 0) { Logger.LogMessage(" Remaining allowed child types in reference fields after deletion:"); foreach (var fieldSetting in dependencies.PermittingFieldSettings) { var remaining = string.Join(", ", fieldSetting.AllowedTypes.Except(names).ToArray()); remaining = remaining.Length == 0 ? "[empty]" : remaining; Logger.LogMessage($" {fieldSetting.Owner.Name}.{fieldSetting.Name}: {remaining}"); } Logger.LogMessage(string.Empty); } if (dependencies.PermittingContentCollection.Count > 0) { Logger.LogMessage(" Remaining allowed child types in content after deletion:"); foreach (var item in dependencies.PermittingContentCollection) { var remaining = string.Join(", ", item.Value.Split(' ').Except(names).ToArray()); Logger.LogMessage($" {item.Key}: {(remaining.Length == 0 ? "[empty]" : remaining)}"); } Logger.LogMessage(string.Empty); } }