/// <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(); } } } }