Technical Release Notes

You are here:

Technical Release Notes

While we make a huge effort to not break things during updates, when something can't be avoided we will document it here.

McKinley 9.0

Note
With Rock McKinley v9 (v1.9.0) you must use Visual Studio 2017 with the latest Roslyn compilers to compile Rock. This may effect your CI environments so please explore this as soon as possible. See commits aa3601d, f1159a1, and 9cd03b8 for more details.

McKinley 8.0

Check-in

  • Some changes were made to support different time zones on campuses.
  • The way labels are sent to the printers when printing over the network have been changed to support extended characters.
  • Minor changes were made to the Windows check-in client to provide extended character support.
  • We added a new Check-in 'AttendanceOccurrence' table and moved the GroupId, LocationId, ScheduleId, SundayDate and DidNotOccur from 'Attendance' to 'AttendanceOccurrence'. As a result, any custom SQL queries you have that reference these fields will be effected. For example, this:
    SELECT ...
    FROM   [Attendance] AS a
    INNER JOIN [Group] g ON a.GroupId = g.Id
    will need to change to something like:
    SELECT ...
    FROM   [Attendance] AS a
    INNER JOIN [AttendanceOccurrence] o ON o.Id = a.OccurrenceId
    INNER JOIN [Group] g ON a.GroupId = g.Id
    Also Lava such as this: {% attendance where:'GroupId == "24"' %} or this {% attendance.GroupId %} will need to change to something like this: {% attendanceoccurrence where:'GroupId == "24"' %} and this {% attendanceoccurrence.GroupId %}

Caching

  • Rock’s caching engine was completely re-written. This cleaned up a lot of inconsistencies in the API and implemented several new features (cache tags and the new cache lava block). This level of change is sure to bring up several issues (the first caching engine took 2-3 major releases to iron out all of invalidation issues).
  • Cache Tags – See documentation
  • Lava Caching Block – See http://rockrms.com/lava Version Specific Features
  • Group History – See documentation.
  • Notes – Major updates here. Please check that all the places you use notes are still functioning correctly. Then start playing with some of the new features: watches and approvals.
  • New Homepage Block – Start adding sample content the way you might use it in production.
  • Persisted Data Views
  • Signals – See documentation.
  • Please verify all plugins that you have written.

Code Updates

Below is a list of all the code changes made in Rock 8.0 that may potentially affect custom code and/or plugins.

  • Rock.Web.UI.Cache.* setters are now private on *Cache objects (NOTE: The cache is read only so setting a value into cache never really makes sense anyhow.)
  • property Rock.Model.Attendance.Group made obsolete and removed setter. Use Occurrence.Group instead.
  • property Rock.Model.Attendance.IsValid removed.
  • property Rock.Model.Attendance.Location made obsolete and removed setter. Use Occurrence.Location instead.
  • property Rock.Model.Attendance.Schedule made obsolete removed setter. Use Occurrence.Schedule instead.
  • property Rock.Model.Attendance.SundayDate made obsolete and removed setter. Use Occurrence.SundayDate instead.
  • property Rock.Model.HistoryItem.Changes removed, use PersonHistoryChangeList and GroupMemberHistoryChangeList instead.
  • property Rock.SystemGuid.DefinedType.PROTECT_MY_MINISTRY_PACKAGES changed to Rock.SystemGuid.DefinedType.BACKGROUND_CHECK_TYPES as part of adding Checkr background check support.

The following properties were removed from the Rock.Model.Group class:

  • AddUserAccountsDuringSync
  • ExitSystemEmail
  • ExitSystemEmailId
  • SyncDataView
  • SyncDataViewId
  • WelcomeSystemEmail
  • WelcomeSystemEmailId

These properties were all moved to a new Rock.Model.GroupSync class to support role-specific group syncing.

McKinley 7.0

If you are using the SendGrid Email Transport update the plugin from the RockShop immediately after upgrading to Rock v7.

Page view and email activity data has been moved in Rock v7. While we make a huge effort to not break things during updates the transition of this data to new tables may break custom SQL or code that was querying this data from the PageView and/or CommunicationRecipientActivity tables. All of the data has been transitioned to their new home in the Interactions tables so you won't miss a thing. This should impact only a very small number of organizations who have written custom code or SQL against these few tables. Note that since there could be a large amount of data to convert from the old PageView and CommunicationRecipientActivity tables, a Rock Job called 'Move Data from PageViews and Communication Activity to the new Interaction Tables' will run at 4am after v7 is installed. This job could take an hour or so depending on how much data there is.

The external giving blocks have a new 'Give as Business' option which defaults to 'on'. If you don't want your giving blocks to have the 'Give as Business' option, you'll have to change that manually.

There is a new 'Expiring Credit Card Notices' job which is enabled to run at 7:30 AM on the 1st of every month. It can be disabled manually if needed.

The ZebraPhoto lava command was changed to use the R: (DRAM) location due to long term problems with repetitive writing to the E: (Flash) location. Any labels using ZebraPhoto must also change their Recall Graphic (^XG) command to use the R: location too. http://www.rockrms.com/lava/person#zebraphoto

There is a new 'Database Maintenance' job that is enabled to run at 2:30 AM every day by default. If you SQL database already has a maintenance plan, update the 'Database Maintenance' job and/or your SQL Maintenance Plan to do what you want.

Make sure to enable the Google Static Maps API in your Google API Manager dashboard.

A change was made in how group requirement notifications are sent out. Before it would send to all Roles marked 'IsLeader' of the group, with the ability to provide a list of Role Ids to exclude. This has been changed to use the 'Receive Requirements Notifications' property on the Role. If you have setup jobs to send group requirement emails you will want to ensure that you configure the roles you want to receive these emails to have the 'Receive Requirements Notifications' checked.

Staff and Staff-Like roles will be given Edit access to the following group types if those group types do not already have specific 'Edit' roles defined. This is so that staff can add new groups of those types.

  • Serving Teams
  • Small Group Section
  • Small Group
  • General Group
  • Organization Unit

ContentChannelView has been updated to not support legacy Lava syntax for accessing global attributes. To enable this, a new "Enable Legacy Global Attribute Lava" block setting needs to be set to true (which negatively affect performance of this block).

Group Attributes now enforce security. Edit each Group Type in General Settings > Group Types, and make sure to set the security on each of the Group Attributes so they can be edited by the appropriate team.

iScroll.js is now included in the RockLibs.js bundle. If you have a custom blocks (i.e. check-in) that is loading iScroll.js, this is no longer needed.

This release fixes a bug where workflow activities marked as inactive were still being processed. If you have any activities where 'Is Active' is not checked they will no longer run even if you use the 'Activate Workflow Activity' action. This action activates an instance of an activity. The activity type however, must be active for this to occur.

Code Updates

Below is a list of all the code changes made in Rock v7 that may potentially affect custom code and/or plugins.

Classes Removed
  • Rock.Data.Context.CommunicationRecipientActivities
  • Rock.Data.Context.PageViews
  • Rock.Data.Context.PageViewSessions
  • Rock.Data.Context.PageViewUserAgents
  • Rock.Model.CommunicationRecipientActivity
  • Rock.Model.CommunicationRecipientActivityConfiguration
  • Rock.Model.CommunicationRecipientActivityExtensionMethods
  • Rock.Model.CommunicationRecipientActivityService
  • Rock.Model.PageView
  • Rock.Model.PageViewConfiguration
  • Rock.Model.PageViewExtensionMethods
  • Rock.Model.PageViewService
  • Rock.Model.PageViewSession
  • Rock.Model.PageViewSessionConfiguration
  • Rock.Model.PageViewSessionExtensionMethods
  • Rock.Model.PageViewSessionService
  • Rock.Model.PageViewUserAgent
  • Rock.Model.PageViewUserAgentConfiguration
  • Rock.Model.PageViewUserAgentExtensionMethods
  • Rock.Model.PageViewUserAgentService
  • Rock.Rest.Controllers.CommunicationRecipientActivitiesController
  • Rock.Rest.Controllers.PageViewsController
  • Rock.Rest.Controllers.PageViewSessionsController
  • Rock.Rest.Controllers.PageViewUserAgentsController
Properties Changed
  • Rock.Model.GroupRequirement.GroupId Changed from int to int? (nullable)
  • Rock.Model.PersonAlias.AliasPersonGuid Changed from Guid to Guid? (nullable)
  • Rock.Model.PersonAlias.AliasPersonId Changed from int to int? (nullable)
  • Rock.Model.Tag.EntityTypeId Changed from int to int? (nullable)
Properties Removed
  • Rock.Model.Communication.Medium
  • Rock.Model.Communication.MediumEntityType
  • Rock.Model.Communication.MediumEntityTypeId
  • Rock.Model.CommunicationRecipient.Activities
  • Rock.Model.CommunicationTemplate.Medium
  • Rock.Model.CommunicationTemplate.MediumEntityType
  • Rock.Model.CommunicationTemplate.MediumEntityTypeId
  • Rock.Model.ConnectionOpportunity.GroupMemberRole
  • Rock.Model.ConnectionOpportunity.GroupMemberRoleId
  • Rock.Model.ConnectionOpportunity.GroupMemberStatus
  • Rock.Model.ConnectionOpportunity.GroupType
  • Rock.Model.ConnectionOpportunity.UseAllGroupsOfType
  • Rock.Model.Site.PageViewRetentionPeriodDays
  • Rock.Model.SiteCache.PageViewRetentionPeriodDays
  • Rock.Web.UI.Controls.BirthdayPicker.FromGroupCssClass
  • Rock.Web.UI.Controls.BirthdayPicker.Help
  • Rock.Web.UI.Controls.BirthdayPicker.HelpBlock
  • Rock.Web.UI.Controls.BirthdayPicker.IsValid
  • Rock.Web.UI.Controls.BirthdayPicker.Label
  • Rock.Web.UI.Controls.BirthdayPicker.Required
  • Rock.Web.UI.Controls.BirthdayPicker.RequiredErrorMessage
  • Rock.Web.UI.Controls.BirthdayPicker.RequiredFieldValidator
  • Rock.Web.UI.Controls.BirthdayPicker.SelectedDate
  • Rock.Web.UI.Controls.BirthdayPicker.ValidationGroup
  • Rock.Web.UI.Controls.BirthdayPicker.Warning
  • Rock.Web.UI.Controls.BirthdayPicker.WarningBlock
  • Rock.Web.UI.Controls.Grid.IsExporting
  • Rock.Web.UI.Controls.LiquidField.ParentGrid
  • Rock.Web.UI.Controls.LiquidFieldTemplate.DataFieldInfo
  • Rock.Web.UI.Controls.RockLiteralField.ID
  • Rock.Web.UI.Controls.Communication.Email.MediumData
  • Rock.Web.UI.Controls.Communication.MediumControl.MediumData
  • Rock.Web.UI.Controls.Communication.Sms.MediumData
Methods Changed
  • Rock.Attribute.SiteFieldAttribute(string name = "Site", string description = "", bool required = True, string defaultSiteId = "", string category = "", int order = 0, string key, bool shorteningSitesOnly = False) Last parameter of constructor was added
  • Rock.Lava.RockFilters.Append(object input, object string) Second parameter was changed from string to object
  • Rock.Model.FinancialTransaction(PreSaveChanges(DbContext dbContext, DbEntityEntry entry) Last parameter was changed from "EntityState state" to "DbEntityEntry entry"
  • Rock.Model.FinancialTransactionImage(PreSaveChanges(DbContext dbContext, DbEntityEntry entry) Last parameter was changed from "EntityState state" to "DbEntityEntry entry"
  • Rock.Model.Report.GetQueryable(Type entityType, Dictionary entityFields, Dictionary attributes, Dictionary selectComponents, SortProperty sortProperty, int? databaseTimeoutSeconds, out List`1& errorMessages, out DbContext& reportDbContext) "dataViewFilterOverrides" parameter was removed, and "reportDbContext" parameter was added
  • Rock.Reporting.ReportingHelper.BindGrid.BindGrid(Report report, Grid gReport, Person currentPerson, int? databaseTimeoutSeconds, bool isCommunication, out String& errorMessage) "dataViewFilterOverrides" parameter was removed, and "isCommunication" parameter was added
  • Rock.Reporting.DataFilter.GroupMember.GroupMemberAttributesFilter.GetSelection(Type entityType, Control[] controls, FilterMode filterMode) Last "filterMode" parameter was added
  • Rock.Reporting.DataFilter.GroupMember.GroupMemberAttributesFilter.RenderControls(Type entityType, FilterField filterControl, HtmlTextWriter writer, Control[] controls, FilterMode filterMode) Last "filterMode" parameter was added
  • Rock.Rest.Controllers.CategoriesController.GetChildren(int id, int rootCategoryId = 0, bool getCategorizedItems = False, int entityTypeId = 0, string entityQualifier, string entityQualifierValue, bool showUnnamedEntityItems = True, bool showCategoriesThatHaveNoChildren = True, string includedCategoryIds, string excludedCategoryIds, string defaultIconCssClass, bool includeInactiveItems = True) Last "IncludeInactiveItems" parameter was added
  • Rock.Rest.Controllers.GroupsController.GetChildren(int id, int rootGroupId = 0, bool limitToSecurityRoleGroups = False, string includedGroupTypeIds = "", string excludedGroupTypeIds = "", bool includeInactiveGroups = False, GetCountsType countsType = 0, int campusId = 0, bool includeNoCampus = False) Last two parameters ("campusId" and "includeNoCampus") were added
  • Rock.Rest.Controllers.LavaController.RenderTemplate(string template, string additionalMergeObjects) Last "additionalMergeObjects" parameter was added
  • Rock.Rest.Controllers.TaggedItemsController. Delete(int entityTypeId, int ownerId, Guid entityGuid, string name, string entityQualifier, string entityQualifierValue, Nullable categoryGuid, bool? includeInactive) Last four parameters ("entityQualifier", "entityQualifierValue", "categoryGuid", and "includeInactive") were added
  • Rock.Rest.Controllers.TaggedItemsController. Post(int entityTypeId, int ownerId, Guid entityGuid, string name, string entityQualifier, string entityQualifierValue, Nullable categoryGuid, bool? includeInactive) Last four parameters ("entityQualifier", "entityQualifierValue", "categoryGuid", and "includeInactive") were added
Methods Removed
  • Rock.Communication.Medium.Email.ProcessHtmlBody(Communication communication, GlobalAttributesCache globalAttributes, Dictionary mergeObjects, Person currentPersonOverride)
  • Rock.Communication.Medium.Email.ProcessTextBody(Communication communication, GlobalAttributesCache globalAttributes, Dictionary mergeObjects, Person currentPersonOverride)
  • Rock.Communication.Medium.Email.Send(Communication communication)
  • Rock.Communication.Medium.SMS.Send(Communication communication)
  • Rock.Field.Types.MarkdownFieldType.FormatValueAsHtml(Control parentControl, string value, Dictionary configurationValues, bool condensed = False)
  • Rock.Field.Types.MemoFieldType.FormatValueAsHtml(Control parentControl, string value, Dictionary configurationValues, bool condensed = False)
  • Rock.Field.Types.RangeSliderFieldType.FormatValueAsHtml(Control parentControl, string value, Dictionary configurationValues, bool condensed = False)
  • Rock.Web.UI.Controls.BirthdayPicker.RenderBaseControl(HtmlTextWriter writer)
  • Rock.Web.UI.Controls.BirthdayPicker.RenderControl(HtmlTextWriter writer)
  • Rock.Web.UI.Controls.LiquidField.Intitialize(bool sortingEnabled, Control control)
  • Rock.Web.UI.Controls.LiquidFieldTemplate.InstantiateIn(Control container)
  • Rock.Web.UI.Controls.MarkdownEditor.OnInit(EventArgs e)
  • Rock.Web.UI.Controls.MarkdownEditor.RenderBaseControl(HtmlTextWriter writer)
  • Rock.Rest.Controllers.TaggedItemsController.AddRoutes(RouteCollection routes)
  • Rock.Rest.Controllers.TaggedItemsController.Delete(int entityTypeId, int ownerId, Guid entityGuid, string name, string entityQualifier)
  • Rock.Rest.Controllers.TaggedItemsController.Delete(int entityTypeId, int ownerId, Guid entityGuid, string name, string entityQualifier, string entityQualifierValue)
  • Rock.Rest.Controllers.TaggedItemsController.Post(int entityTypeId, int ownerId, Guid entityGuid, string name, string entityQualifier)
  • Rock.Rest.Controllers.TaggedItemsController.Post(int entityTypeId, int ownerId, Guid entityGuid, string name, string entityQualifier, string entityQualifierValue)

McKinley 6.0

This release fixes a bug where workflow activities marked as inactive were still being processed. If you have any activities where 'Is Active' is not checked they will no longer run even if you use the 'Activate Workflow Activity' action. This action activates an instance of an activity. The activity type however, must be active for this to occur.
  • Rock now requires Microsoft .NET Framework 4.5.2 or greater on the hosting server. This framework version was released by Microsoft on May 5th, 2014. You will need to upgrade hosting server in order to proceed with the next update.
  • The Rock project now requires Visual Studio 2015 due to some C# 6.0 dependencies.

McKinley 5.0

  • Rock now requires ASP.Net 4.5.2
  • Check-in
    • The Rock.CheckIn.CheckInBlock now has a CurrentCheckinType/CurrentCheckinTypeId and the Rock.CheckIn.CheckInState class has a CheckinType/CheckinTypeId that is used (required) by various Workflow actions.
  • Person
    • Several Rock.Model.Person.GetPhotoUrl(...) methods were deprecated. Use GetPersonPhotoUrl(...) instead.
  • Web Sites
    • Rock will now auto compile your custom theme's .less files into .css files. Add a .nocompile to the theme's 'Styles' folder to disable auto-compile for a theme.

McKinley 4.0

People without birth date will no longer be able to check-in to groups that have an age range requirement. This behavior can be changed by editing the 'Unattended Check-in' workflow, selecting the 'Person Search' activity, then the 'Filter Groups By Age' action, and un-checking the new 'Age Required' option.

Only members of the 'RSR - Data Integrity Worker' will be able to complete person merges. Everyone else will only be able to request merges (new functionality). This can be modified by adding other security roles to have edit access to the merge block.

Security was adjusted on the Website Ads and Bulletin Content Channels to give the 'RSR - Staff Worker' and 'RSR - Staff Like Worker' View/Edit rights.

  • Requires SQL 2012 (or Azure SQL V12) or greater
  • a Change to GatewayComponent effecting custom finance gateways
  • Rock.Model.Person.IsDeceased - Property will no longer be nullable. Any code that references .HasValue (or expects the property to be nullable) will need to change.
  • Financial Gateway
    • Rock.Financial.GatewayComponent.AddScheduledPayment()- Added additional FinancialGateway parameter
    • Rock.Financial.GatewayComponent.Authorize() - added additional FinancialGateway parameter
    • Rock.Financial.GatewayComponent.BatchTimeOffset - Removed property ( Is now a property of new FinancialGateway model )
    • Rock.Financial.GatewayComponent.Charge() - added additional FinancialGateway parameter
    • Rock.Financial.GatewayComponent.GetPayments() - added additional FinancialGateway parameter
    • Rock.Financial.TestGateway.AddScheduledPayment()- Added additional FinancialGateway parameter
    • Rock.Financial.TestGateway.Charge() - added additional FinancialGateway parameter
    • Rock.Financial.TestGateway.GetPayments() - added additional FinancialGateway parameter
    • Rock.Model.FinancialPersonSavedAccount.GatewayEntityType - Removed property ( use FinancialGateway property instead )
    • Rock.Model.FinancialPersonSavedAccount.GatewayEntityTypeId - Removed property ( use FinancialGatewayId property instead )
    • Rock.Model.FinancialScheduledTransaction.GatewayEntityType - Removed property ( use FinancialGateway property instead )
    • Rock.Model.FinancialScheduledTransaction.GatewayEntityTypeId - Removed property ( use FinancialGatewayId property instead )
    • Rock.Model.FinancialScheduledTransactionService.ProcessPayments() - Added additional FinancialGateway parameter
    • Rock.Model.FinancialTransaction.GatewayEntityType - Removed property ( use FinancialGateway property instead )
    • Rock.Model.FinancialTransaction.GatewayEntityTypeId - Removed property ( use FinancialGatewayId property instead )
  • Rock.Model.AttendanceSummaryData (Removed)
  • Rock.Model.BinaryFileType.PreferredColorDepth - Property returns new 'ColorDepth' enumeration instead of removed 'PreferredColorDepth' enumeration
  • Rock.Model.BinaryFileType.PreferredFormat - Property returns new 'Format' enumeration instead of removed 'PreferredFormat' enumeration
  • Rock.Model.BinaryFileType.PreferredResolution - Property returns new 'Resolution' enumeration instead of removed 'PreferredResolution' enumeration
  • Rock.Model.GroupService.GetNavigationChildren() - Added additional IncludeInactiveGroups parameter
  • Rock.Model.PreferredColorDepth - Removed ( use ColorDepth instead )
  • Rock.Model.PreferredFormat - Removed ( use Format instead )
  • Rock.Model.PreferredResolution - Removed ( use Resolution instead )
  • Rock.Model.ScheduleService.GetGroupOccurrences() - Added FromDateTime, ToDateTime, LocationId, and ScheduleId paramters
  • Rock.Reporting.EntityField - Parameterless constructor removed, added FieldType paramter to second constructor
  • Rock.SystemGuid.Page.PLUGIN_MANAGER - removed
  • Rock.SystemGuid.Page.PLUGIN_SETTINGS - removed
  • Rock.Web.UI.Controls.Grid.MergePageRoute - removed ( MergeTemplatePageRoute property added )
  • Rock.Web.UI.Controls.GridActions.MergeClick - removed ( MergeTemplateClick handler added )

McKinley 3.0

Heads Up! We've added several new features to groups to support the attendance and group finder features. The update will modify some of the settings to the 'Small Group' group type. If you've modified or are using this group type you'll want to read through these changes below. The update will do the following...
  1. Update the Small Group type to make it use the new 'simple' schedule option (day of week + meeting time).
  2. Add a new group attribute of Topic that links to a defined type.
  3. Take all the existing text topics and create defined values out of them, then match them to the groups (basically wire up all the current text based topics as defined values)
  4. Delete the existing text topic group attribute.
  5. If you do NOT have any small groups in the database we will delete the meeting time attribute from the small group type (otherwise we'll leave it for you to delete since you'll probably need it to set the new meeting time value).
  • Rock.Workflow.Action.SetAttributeToEntity was renamed to Rock.Workflow.Action.SetAttributeFromEntity
  • Person.BirthDate property became readonly - this was due to change to allow people to enter partial birthdates (month and day with no year). Use SetBirthDate to set the full birthdate and use Person.BirthMonth, Person.BirthDay if partial.
  • Storage Provider changes
    • a storage provider will now provide the path to the resource via the GetPath() method and GetUrl() will provide a URL to the resource. GenerateUrl() is no longer used.
    • BinaryContentStream ?
    • GetContentStream() method is responsible to obtain a stream of the item resource.
  • Binary Files Methods/Objects changes:
    • BinaryFile.Data became BinaryFile.DatabaseData.
    • BinaryFile.ContentStream now uses the StorageProvider's GetContentStream() to get the stream of the content.
    • BinaryFileData.ContentStream (virtual) was removed and the BinaryFile.ContentStream should now be used to get a stream to the resource.
  • The "Unknown" value was removed from the Marital Status DefinedType and records with that ID were given a NULL MaritalStatusValueId.

Release Notes

The regular release notes detail changes that are important to admins and users.

Rock Versions