/// <summary> /// Add new Content Types for Pipeline Designer /// </summary> /// <remarks>Some Content Types are defined in EAV but some only in 2sxc. EAV.VersionUpgrade ensures Content Types are shared across all Apps.</remarks> internal void EnsurePipelineDesignerAttributeSets() { logger.LogStep("06.00.00", "EnsurePipelineDesignerAttributeSets start", false); // Ensure DnnSqlDataSource Configuration var dsrcSqlDataSource = ImportAttributeSet.SystemAttributeSet("|Config ToSic.SexyContent.DataSources.DnnSqlDataSource", "used to configure a DNN SqlDataSource", new List <ImportAttribute> { ImportAttribute.StringAttribute("ContentType", "ContentType", null, true), ImportAttribute.StringAttribute("SelectCommand", "SelectCommand", null, true, rowCount: 10) }); // Collect AttributeSets for use in Import var attributeSets = new List <ImportAttributeSet> { dsrcSqlDataSource }; var import = new Import(Constants.DefaultZoneId, Constants.MetaDataAppId, Settings.InternalUserName); import.RunImport(attributeSets, null); var metaDataCtx = EavDataController.Instance(Constants.DefaultZoneId, Constants.MetaDataAppId); metaDataCtx.AttribSet.GetAttributeSet(dsrcSqlDataSource.StaticName).AlwaysShareConfiguration = true; metaDataCtx.SqlDb.SaveChanges(); // Run EAV Version Upgrade (also ensures Content Type sharing) var eavVersionUpgrade = new VersionUpgrade(Settings.InternalUserName); eavVersionUpgrade.EnsurePipelineDesignerAttributeSets(); logger.LogStep("06.00.00", "EnsurePipelineDesignerAttributeSets done", false); }
/// <summary> /// Import an AttributeSet with all Attributes and AttributeMetaData /// </summary> private void ImportAttributeSet(ImportAttributeSet importAttributeSet) { var destinationSet = _context.AttribSet.GetAttributeSet(importAttributeSet.StaticName); // add new AttributeSet if (destinationSet == null) destinationSet = _context.AttribSet.AddAttributeSet(importAttributeSet.Name, importAttributeSet.Description, importAttributeSet.StaticName, importAttributeSet.Scope, false); else // use/update existing attribute Set { if (destinationSet.UsesConfigurationOfAttributeSet.HasValue) { _importLog.Add(new ImportLogItem(EventLogEntryType.Error, "Not allowed to import/extend an AttributeSet which uses Configuration of another AttributeSet.") { ImportAttributeSet = importAttributeSet }); return; } _importLog.Add(new ImportLogItem(EventLogEntryType.Information, "AttributeSet already exists") { ImportAttributeSet = importAttributeSet }); } destinationSet.AlwaysShareConfiguration = importAttributeSet.AlwaysShareConfiguration; // If a "Ghost"-content type is specified, try to assign that if (!string.IsNullOrEmpty(importAttributeSet.UsesConfigurationOfAttributeSet)) { // Look for a content type with the StaticName, which has no "UsesConfigurationOf..." set (is a master) var ghostAttributeSets = _context.SqlDb.AttributeSets.Where(a => a.StaticName == importAttributeSet.UsesConfigurationOfAttributeSet && a.ChangeLogDeleted == null && a.UsesConfigurationOfAttributeSet == null). OrderBy(a => a.AttributeSetID).ToList(); if (ghostAttributeSets.Count == 0) { _importLog.Add(new ImportLogItem(EventLogEntryType.Warning, "AttributeSet not imported because master set not found: " + importAttributeSet.UsesConfigurationOfAttributeSet) { ImportAttributeSet = importAttributeSet }); return; } // If multiple masters are found, use first and add a warning message if (ghostAttributeSets.Count > 1) _importLog.Add(new ImportLogItem(EventLogEntryType.Warning, "Multiple potential master AttributeSets found for StaticName: " + importAttributeSet.UsesConfigurationOfAttributeSet) { ImportAttributeSet = importAttributeSet }); destinationSet.UsesConfigurationOfAttributeSet = ghostAttributeSets.First().AttributeSetID; } if (destinationSet.AlwaysShareConfiguration) { _context.AttribSet.EnsureSharedAttributeSets(); } _context.SqlDb.SaveChanges(); // append all Attributes foreach (var importAttribute in importAttributeSet.Attributes) { Attribute destinationAttribute; if(!_context.Attributes.Exists(destinationSet.AttributeSetID, importAttribute.StaticName)) { // try to add new Attribute var isTitle = importAttribute == importAttributeSet.TitleAttribute; destinationAttribute = _context.Attributes.AppendAttribute(destinationSet, importAttribute.StaticName, importAttribute.Type, importAttribute.InputType, isTitle, false); } else { _importLog.Add(new ImportLogItem(EventLogEntryType.Warning, "Attribute already exists") { ImportAttribute = importAttribute }); destinationAttribute = destinationSet.AttributesInSets.Single(a => a.Attribute.StaticName == importAttribute.StaticName).Attribute; } var mds = DataSource.GetMetaDataSource(_context.ZoneId, _context.AppId); // Insert AttributeMetaData if (/* isNewAttribute && */ importAttribute.AttributeMetaData != null) { foreach (var entity in importAttribute.AttributeMetaData) { // Validate Entity entity.AssignmentObjectTypeId = Constants.MetadataForField;//.AssignmentObjectTypeIdFieldProperties; // Set KeyNumber if (destinationAttribute.AttributeID == 0) _context.SqlDb.SaveChanges(); entity.KeyNumber = destinationAttribute.AttributeID; var existingEntity = mds.GetAssignedEntities(Constants.MetadataForField, //.AssignmentObjectTypeIdFieldProperties, destinationAttribute.AttributeID, entity.AttributeSetStaticName).FirstOrDefault(); if (existingEntity != null) entity.EntityGuid = existingEntity.EntityGuid; PersistOneImportEntity(entity); } } } // todo: optionally re-order the attributes if (importAttributeSet.SortAttributes) { var attributeList = _context.SqlDb.AttributesInSets .Where(a => a.AttributeSetID == destinationSet.AttributeSetID).ToList(); attributeList = attributeList .OrderBy(a => importAttributeSet.Attributes .IndexOf(importAttributeSet.Attributes .First(ia => ia.StaticName == a.Attribute.StaticName))) .ToList(); _context.Attributes.PersistAttributeSorting(attributeList); } }