/// <summary> /// Saves a <see cref="Rock.Model.Person">Person's</see> user preference setting by key. /// </summary> /// <param name="person">The <see cref="Rock.Model.Person"/> who the preference value belongs to.</param> /// <param name="key">A <see cref="System.String"/> representing the key (name) of the preference setting.</param> /// <param name="value">The value.</param> public static void SaveUserPreference(Person person, string key, string value) { int?PersonEntityTypeId = Rock.Web.Cache.EntityTypeCache.Read(Person.USER_VALUE_ENTITY).Id; using (var rockContext = new RockContext()) { var attributeService = new Model.AttributeService(rockContext); var attribute = attributeService.Get(PersonEntityTypeId, string.Empty, string.Empty, key); if (attribute == null) { var fieldTypeService = new Model.FieldTypeService(rockContext); var fieldType = FieldTypeCache.Read(Rock.SystemGuid.FieldType.TEXT.AsGuid()); attribute = new Model.Attribute(); attribute.IsSystem = false; attribute.EntityTypeId = PersonEntityTypeId; attribute.EntityTypeQualifierColumn = string.Empty; attribute.EntityTypeQualifierValue = string.Empty; attribute.Key = key; attribute.Name = key; attribute.IconCssClass = string.Empty; attribute.DefaultValue = string.Empty; attribute.IsMultiValue = false; attribute.IsRequired = false; attribute.Description = string.Empty; attribute.FieldTypeId = fieldType.Id; attribute.Order = 0; attributeService.Add(attribute); rockContext.SaveChanges(); } var attributeValueService = new Model.AttributeValueService(rockContext); var attributeValue = attributeValueService.GetByAttributeIdAndEntityId(attribute.Id, person.Id); if (string.IsNullOrWhiteSpace(value)) { // Delete existing value if no existing value if (attributeValue != null) { attributeValueService.Delete(attributeValue); } } else { if (attributeValue == null) { attributeValue = new Model.AttributeValue(); attributeValue.AttributeId = attribute.Id; attributeValue.EntityId = person.Id; attributeValueService.Add(attributeValue); } attributeValue.Value = value; } rockContext.SaveChanges(); } }
/// <summary> /// Uses reflection to find any <see cref="FieldAttribute" /> attributes for the specified type and will create and/or update /// a <see cref="Rock.Model.Attribute" /> record for each attribute defined. /// </summary> /// <param name="type">The type (should be a <see cref="IHasAttributes" /> object.</param> /// <param name="entityTypeId">The entity type id.</param> /// <param name="entityQualifierColumn">The entity qualifier column.</param> /// <param name="entityQualifierValue">The entity qualifier value.</param> /// <param name="currentPersonId">The current person id.</param> /// <returns></returns> public static bool UpdateAttributes(Type type, int?entityTypeId, string entityQualifierColumn, string entityQualifierValue, int?currentPersonId) { bool attributesUpdated = false; List <string> existingKeys = new List <string>(); var blockProperties = new List <FieldAttribute>(); // If a ContextAwareAttribute exists without an EntityType defined, add a property attribute to specify the type int properties = 0; foreach (var customAttribute in type.GetCustomAttributes(typeof(ContextAwareAttribute), true)) { var contextAttribute = (ContextAwareAttribute)customAttribute; if (contextAttribute != null && contextAttribute.EntityType == null) { string propertyKeyName = string.Format("ContextEntityType{0}", properties > 0 ? properties.ToString() : ""); properties++; blockProperties.Add(new EntityTypeFieldAttribute("Entity Type", false, "The type of entity that will provide context for this block", false, "Context", 0, propertyKeyName)); } } // Add any property attributes that were defined for the block foreach (var customAttribute in type.GetCustomAttributes(typeof(FieldAttribute), true)) { blockProperties.Add((FieldAttribute)customAttribute); } // Create any attributes that need to be created var attributeService = new Model.AttributeService(); if (blockProperties.Count > 0) { var attributeQualifierService = new Model.AttributeQualifierService(); var fieldTypeService = new Model.FieldTypeService(); var categoryService = new Model.CategoryService(); foreach (var blockProperty in blockProperties) { attributesUpdated = UpdateAttribute(attributeService, attributeQualifierService, fieldTypeService, categoryService, blockProperty, entityTypeId, entityQualifierColumn, entityQualifierValue, currentPersonId) || attributesUpdated; existingKeys.Add(blockProperty.Key); } } // Remove any old attributes foreach (var a in attributeService.Get(entityTypeId, entityQualifierColumn, entityQualifierValue).ToList()) { if (!existingKeys.Contains(a.Key)) { attributeService.Delete(a, currentPersonId); attributeService.Save(a, currentPersonId); } } return(attributesUpdated); }
/// <summary> /// Saves a <see cref="Rock.Model.Person">Person's</see> user preference setting by key. /// </summary> /// <param name="person">The <see cref="Rock.Model.Person"/> who the preference value belongs to.</param> /// <param name="key">A <see cref="System.String"/> representing the key (name) of the preference setting. </param> /// <param name="values">A list of <see cref="System.String"/> values representing the value of the preference setting.</param> /// <param name="personId">A <see cref="System.Int32"/> representing the Id of the <see cref="Rock.Model.Person"/> saving the setting.</param> public void SaveUserPreference(Person person, string key, List <string> values, int?personId) { int?PersonEntityTypeId = Rock.Web.Cache.EntityTypeCache.Read(Person.USER_VALUE_ENTITY).Id; var attributeService = new Model.AttributeService(); var attribute = attributeService.Get(PersonEntityTypeId, string.Empty, string.Empty, key); if (attribute == null) { var fieldTypeService = new Model.FieldTypeService(); var fieldType = fieldTypeService.GetByGuid(new Guid(Rock.SystemGuid.FieldType.TEXT)); attribute = new Model.Attribute(); attribute.IsSystem = false; attribute.EntityTypeId = PersonEntityTypeId; attribute.EntityTypeQualifierColumn = string.Empty; attribute.EntityTypeQualifierValue = string.Empty; attribute.Key = key; attribute.Name = key; attribute.DefaultValue = string.Empty; attribute.IsMultiValue = false; attribute.IsRequired = false; attribute.Description = string.Empty; attribute.FieldTypeId = fieldType.Id; attribute.Order = 0; attributeService.Add(attribute, personId); attributeService.Save(attribute, personId); } var attributeValueService = new Model.AttributeValueService(); // Delete existing values var attributeValues = attributeValueService.GetByAttributeIdAndEntityId(attribute.Id, person.Id).ToList(); foreach (var attributeValue in attributeValues) { attributeValueService.Delete(attributeValue, personId); attributeValueService.Save(attributeValue, personId); } // Save new values foreach (var value in values.Where(v => !string.IsNullOrWhiteSpace(v))) { var attributeValue = new Model.AttributeValue(); attributeValue.AttributeId = attribute.Id; attributeValue.EntityId = person.Id; attributeValue.Value = value; attributeValueService.Add(attributeValue, personId); attributeValueService.Save(attributeValue, personId); } }
/// <summary> /// Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering. /// </summary> protected override void CreateChildControls() { base.CreateChildControls(); Rock.Model.FieldTypeService fieldTypeService = new Model.FieldTypeService(); var items = fieldTypeService. Queryable(). Select( f => new { f.Id, f.Name } ). OrderBy( f => f.Name ); this.Items.Clear(); foreach ( var item in items ) this.Items.Add( new ListItem( item.Name, item.Id.ToString() ) ); }
/// <summary> /// Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering. /// </summary> protected override void CreateChildControls() { base.CreateChildControls(); Rock.Model.FieldTypeService fieldTypeService = new Model.FieldTypeService(); var items = fieldTypeService. Queryable(). Select(f => new { f.Id, f.Name }). OrderBy(f => f.Name); this.Items.Clear(); foreach (var item in items) { this.Items.Add(new ListItem(item.Name, item.Id.ToString())); } }
/// <summary> /// Saves a <see cref="Rock.Model.Person">Person's</see> user preference setting by key. /// </summary> /// <param name="person">The <see cref="Rock.Model.Person"/> who the preference value belongs to.</param> /// <param name="key">A <see cref="System.String"/> representing the key (name) of the preference setting. </param> /// <param name="values">A list of <see cref="System.String"/> values representing the value of the preference setting.</param> /// <param name="personId">A <see cref="System.Int32"/> representing the Id of the <see cref="Rock.Model.Person"/> saving the setting.</param> public void SaveUserPreference(Person person, string key, List<string> values, int? personId) { int? PersonEntityTypeId = Rock.Web.Cache.EntityTypeCache.Read( Person.USER_VALUE_ENTITY ).Id; var attributeService = new Model.AttributeService(); var attribute = attributeService.Get( PersonEntityTypeId, string.Empty, string.Empty, key ); if ( attribute == null ) { var fieldTypeService = new Model.FieldTypeService(); var fieldType = fieldTypeService.GetByGuid( new Guid( Rock.SystemGuid.FieldType.TEXT ) ); attribute = new Model.Attribute(); attribute.IsSystem = false; attribute.EntityTypeId = PersonEntityTypeId; attribute.EntityTypeQualifierColumn = string.Empty; attribute.EntityTypeQualifierValue = string.Empty; attribute.Key = key; attribute.Name = key; attribute.DefaultValue = string.Empty; attribute.IsMultiValue = false; attribute.IsRequired = false; attribute.Description = string.Empty; attribute.FieldTypeId = fieldType.Id; attribute.Order = 0; attributeService.Add( attribute, personId ); attributeService.Save( attribute, personId ); } var attributeValueService = new Model.AttributeValueService(); // Delete existing values var attributeValues = attributeValueService.GetByAttributeIdAndEntityId( attribute.Id, person.Id ).ToList(); foreach ( var attributeValue in attributeValues ) { attributeValueService.Delete( attributeValue, personId ); attributeValueService.Save( attributeValue, personId ); } // Save new values foreach ( var value in values.Where( v => !string.IsNullOrWhiteSpace( v ) ) ) { var attributeValue = new Model.AttributeValue(); attributeValue.AttributeId = attribute.Id; attributeValue.EntityId = person.Id; attributeValue.Value = value; attributeValueService.Add( attributeValue, personId ); attributeValueService.Save( attributeValue, personId ); } }
/// <summary> /// Adds or Updates a <see cref="Rock.Model.Attribute" /> item for the attribute. /// </summary> /// <param name="property">The property.</param> /// <param name="entityTypeId">The entity type id.</param> /// <param name="entityQualifierColumn">The entity qualifier column.</param> /// <param name="entityQualifierValue">The entity qualifier value.</param> /// <param name="currentPersonId">The current person id.</param> /// <returns></returns> private static bool UpdateAttribute(FieldAttribute property, int?entityTypeId, string entityQualifierColumn, string entityQualifierValue, int?currentPersonId) { bool updated = false; Model.AttributeService attributeService = new Model.AttributeService(); Model.FieldTypeService fieldTypeService = new Model.FieldTypeService(); // Look for an existing attribute record based on the entity, entityQualifierColumn and entityQualifierValue Model.Attribute attribute = attributeService.Get( entityTypeId, entityQualifierColumn, entityQualifierValue, property.Key); if (attribute == null) { // If an existing attribute record doesn't exist, create a new one updated = true; attribute = new Model.Attribute(); attribute.EntityTypeId = entityTypeId; attribute.EntityTypeQualifierColumn = entityQualifierColumn; attribute.EntityTypeQualifierValue = entityQualifierValue; attribute.Key = property.Key; attribute.IsGridColumn = false; } else { // Check to see if the existing attribute record needs to be updated if (attribute.Name != property.Name || attribute.Category != property.Category || attribute.DefaultValue != property.DefaultValue || attribute.Description != property.Description || attribute.Order != property.Order || attribute.FieldType.Assembly != property.FieldTypeAssembly || attribute.FieldType.Class != property.FieldTypeClass || attribute.IsRequired != property.IsRequired) { updated = true; } } if (updated) { // Update the attribute attribute.Name = property.Name; attribute.Category = property.Category; attribute.Description = property.Description; attribute.DefaultValue = property.DefaultValue; attribute.Order = property.Order; attribute.IsRequired = property.IsRequired; // Try to set the field type by searching for an existing field type with the same assembly and class name if (attribute.FieldType == null || attribute.FieldType.Assembly != property.FieldTypeAssembly || attribute.FieldType.Class != property.FieldTypeClass) { attribute.FieldType = fieldTypeService.Queryable().FirstOrDefault(f => f.Assembly == property.FieldTypeAssembly && f.Class == property.FieldTypeClass); } // If this is a new attribute, add it, otherwise remove the exiting one from the cache if (attribute.Id == 0) { attributeService.Add(attribute, currentPersonId); } else { Rock.Web.Cache.AttributeCache.Flush(attribute.Id); } attributeService.Save(attribute, currentPersonId); return(true); } else { return(false); } }
/// <summary> /// Saves the user preferences. /// </summary> /// <param name="person">The person.</param> /// <param name="preferences">The preferences.</param> public static void SaveUserPreferences( Person person, Dictionary<string, string> preferences ) { if ( preferences != null ) { int? personEntityTypeId = Rock.Web.Cache.EntityTypeCache.Read( Person.USER_VALUE_ENTITY ).Id; using ( var rockContext = new RockContext() ) { var attributeService = new Model.AttributeService( rockContext ); var attributes = attributeService .Get( personEntityTypeId, string.Empty, string.Empty ) .Where( a => preferences.Keys.Contains( a.Key ) ) .ToList(); bool wasUpdated = false; foreach ( var attributeKeyValue in preferences ) { var attribute = attributes.FirstOrDefault( a => a.Key == attributeKeyValue.Key ); if ( attribute == null ) { var fieldTypeService = new Model.FieldTypeService( rockContext ); var fieldType = FieldTypeCache.Read( Rock.SystemGuid.FieldType.TEXT.AsGuid() ); attribute = new Model.Attribute(); attribute.IsSystem = false; attribute.EntityTypeId = personEntityTypeId; attribute.EntityTypeQualifierColumn = string.Empty; attribute.EntityTypeQualifierValue = string.Empty; attribute.Key = attributeKeyValue.Key; attribute.Name = attributeKeyValue.Key; attribute.IconCssClass = string.Empty; attribute.DefaultValue = string.Empty; attribute.IsMultiValue = false; attribute.IsRequired = false; attribute.Description = string.Empty; attribute.FieldTypeId = fieldType.Id; attribute.Order = 0; attributeService.Add( attribute ); wasUpdated = true; } } if ( wasUpdated ) { // Save any new attributes rockContext.SaveChanges(); // Requery attributes ( so they all have ids ) attributes = attributeService .Get( personEntityTypeId, string.Empty, string.Empty ) .Where( a => preferences.Keys.Contains( a.Key ) ) .ToList(); } var attributeIds = attributes.Select( a => a.Id ).ToList(); var attributeValueService = new Model.AttributeValueService( rockContext ); var attributeValues = attributeValueService.Queryable( "Attribute" ) .Where( v => attributeIds.Contains( v.AttributeId ) && v.EntityId.HasValue && v.EntityId.Value == person.Id ) .ToList(); wasUpdated = false; foreach ( var attributeKeyValue in preferences ) { if ( string.IsNullOrWhiteSpace( attributeKeyValue.Value ) ) { foreach ( var attributeValue in attributeValues .Where( v => v.Attribute != null && v.Attribute.Key == attributeKeyValue.Key ) .ToList() ) { attributeValueService.Delete( attributeValue ); attributeValues.Remove( attributeValue ); wasUpdated = true; } } else { var attributeValue = attributeValues .Where( v => v.Attribute != null && v.Attribute.Key == attributeKeyValue.Key ) .FirstOrDefault(); if ( attributeValue == null ) { var attribute = attributes .Where( a => a.Key == attributeKeyValue.Key ) .FirstOrDefault(); if ( attribute != null ) { attributeValue = new Model.AttributeValue(); attributeValue.AttributeId = attribute.Id; attributeValue.EntityId = person.Id; attributeValueService.Add( attributeValue ); } } wasUpdated = wasUpdated || ( attributeValue.Value != attributeKeyValue.Value ); attributeValue.Value = attributeKeyValue.Value; } } if ( wasUpdated ) { rockContext.SaveChanges(); } } } }
/// <summary> /// Saves a <see cref="Rock.Model.Person">Person's</see> user preference setting by key and SavesChanges() /// </summary> /// <param name="person">The <see cref="Rock.Model.Person"/> who the preference value belongs to.</param> /// <param name="key">A <see cref="System.String"/> representing the key (name) of the preference setting.</param> /// <param name="value">The value.</param> public static void SaveUserPreference( Person person, string key, string value ) { int? personEntityTypeId = Rock.Web.Cache.EntityTypeCache.Read( Person.USER_VALUE_ENTITY ).Id; using ( var rockContext = new RockContext() ) { var attributeService = new Model.AttributeService( rockContext ); var attribute = attributeService.Get( personEntityTypeId, string.Empty, string.Empty, key ); if ( attribute == null ) { var fieldTypeService = new Model.FieldTypeService( rockContext ); var fieldType = FieldTypeCache.Read( Rock.SystemGuid.FieldType.TEXT.AsGuid() ); attribute = new Model.Attribute(); attribute.IsSystem = false; attribute.EntityTypeId = personEntityTypeId; attribute.EntityTypeQualifierColumn = string.Empty; attribute.EntityTypeQualifierValue = string.Empty; attribute.Key = key; attribute.Name = key; attribute.IconCssClass = string.Empty; attribute.DefaultValue = string.Empty; attribute.IsMultiValue = false; attribute.IsRequired = false; attribute.Description = string.Empty; attribute.FieldTypeId = fieldType.Id; attribute.Order = 0; attributeService.Add( attribute ); rockContext.SaveChanges(); } var attributeValueService = new Model.AttributeValueService( rockContext ); var attributeValue = attributeValueService.GetByAttributeIdAndEntityId( attribute.Id, person.Id ); if ( string.IsNullOrWhiteSpace( value ) ) { // Delete existing value if no existing value if ( attributeValue != null ) { attributeValueService.Delete( attributeValue ); } } else { if ( attributeValue == null ) { attributeValue = new Model.AttributeValue(); attributeValue.AttributeId = attribute.Id; attributeValue.EntityId = person.Id; attributeValueService.Add( attributeValue ); } attributeValue.Value = value; } rockContext.SaveChanges(); } }
/// <summary> /// Adds or Updates a <see cref="Rock.Model.Attribute" /> item for the attribute. /// </summary> /// <param name="attributeService">The attribute service.</param> /// <param name="attributeQualifierService">The attribute qualifier service.</param> /// <param name="fieldTypeService">The field type service.</param> /// <param name="categoryService">The category service.</param> /// <param name="property">The property.</param> /// <param name="entityTypeId">The entity type id.</param> /// <param name="entityQualifierColumn">The entity qualifier column.</param> /// <param name="entityQualifierValue">The entity qualifier value.</param> /// <param name="currentPersonId">The current person id.</param> /// <returns></returns> private static bool UpdateAttribute(Model.AttributeService attributeService, Model.AttributeQualifierService attributeQualifierService, Model.FieldTypeService fieldTypeService, Model.CategoryService categoryService, FieldAttribute property, int?entityTypeId, string entityQualifierColumn, string entityQualifierValue, int?currentPersonId) { bool updated = false; var propertyCategories = property.Category.SplitDelimitedValues(false).ToList(); // Look for an existing attribute record based on the entity, entityQualifierColumn and entityQualifierValue Model.Attribute attribute = attributeService.Get( entityTypeId, entityQualifierColumn, entityQualifierValue, property.Key); if (attribute == null) { // If an existing attribute record doesn't exist, create a new one updated = true; attribute = new Model.Attribute(); attribute.EntityTypeId = entityTypeId; attribute.EntityTypeQualifierColumn = entityQualifierColumn; attribute.EntityTypeQualifierValue = entityQualifierValue; attribute.Key = property.Key; attribute.IsGridColumn = false; } else { // Check to see if the existing attribute record needs to be updated if (attribute.Name != property.Name || attribute.DefaultValue != property.DefaultValue || attribute.Description != property.Description || attribute.Order != property.Order || attribute.FieldType.Assembly != property.FieldTypeAssembly || attribute.FieldType.Class != property.FieldTypeClass || attribute.IsRequired != property.IsRequired) { updated = true; } // Check category else if (attribute.Categories.Select(c => c.Name).Except(propertyCategories).Any() || propertyCategories.Except(attribute.Categories.Select(c => c.Name)).Any()) { updated = true; } // Check the qualifier values else if (attribute.AttributeQualifiers.Select(q => q.Key).Except(property.FieldConfigurationValues.Select(c => c.Key)).Any() || property.FieldConfigurationValues.Select(c => c.Key).Except(attribute.AttributeQualifiers.Select(q => q.Key)).Any()) { updated = true; } else { foreach (var attributeQualifier in attribute.AttributeQualifiers) { if (!property.FieldConfigurationValues.ContainsKey(attributeQualifier.Key) || property.FieldConfigurationValues[attributeQualifier.Key].Value != attributeQualifier.Value) { updated = true; break; } } } } if (updated) { // Update the attribute attribute.Name = property.Name; attribute.Description = property.Description; attribute.DefaultValue = property.DefaultValue; attribute.Order = property.Order; attribute.IsRequired = property.IsRequired; attribute.Categories.Clear(); if (propertyCategories.Any()) { foreach (string propertyCategory in propertyCategories) { int attributeEntityTypeId = EntityTypeCache.Read(typeof(Rock.Model.Attribute)).Id; var category = categoryService.Get(propertyCategory, attributeEntityTypeId, "EntityTypeId", entityTypeId.ToString()).FirstOrDefault(); if (category == null) { category = new Category(); category.Name = propertyCategory; category.EntityTypeId = attributeEntityTypeId; category.EntityTypeQualifierColumn = "EntityTypeId"; category.EntityTypeQualifierValue = entityTypeId.ToString(); category.Order = 0; } attribute.Categories.Add(category); } } foreach (var qualifier in attribute.AttributeQualifiers.ToList()) { attributeQualifierService.Delete(qualifier, currentPersonId); } attribute.AttributeQualifiers.Clear(); foreach (var configValue in property.FieldConfigurationValues) { var qualifier = new Model.AttributeQualifier(); qualifier.Key = configValue.Key; qualifier.Value = configValue.Value.Value; attribute.AttributeQualifiers.Add(qualifier); } // Try to set the field type by searching for an existing field type with the same assembly and class name if (attribute.FieldType == null || attribute.FieldType.Assembly != property.FieldTypeAssembly || attribute.FieldType.Class != property.FieldTypeClass) { attribute.FieldType = fieldTypeService.Queryable().FirstOrDefault(f => f.Assembly == property.FieldTypeAssembly && f.Class == property.FieldTypeClass); } // If this is a new attribute, add it, otherwise remove the exiting one from the cache if (attribute.Id == 0) { attributeService.Add(attribute, currentPersonId); } else { AttributeCache.Flush(attribute.Id); } attributeService.Save(attribute, currentPersonId); return(true); } else { return(false); } }