Thanks, Paulo, and I'm sorry, this was my fault. My app was indeed using has_page_change_permission(). It wasn't a problem with django-cms. Another change in django-cms caused the exception in my app to change to something else, but ultimately I resolved my problems by removing usage of has_page_change_permission() and fixing usage of remove features (cms_app.py to cms_apps.py and cms_toolbar.py to cms_toolbars.py).
One possible improvement for django-cms could be the release notes regarding how to upgrade for the permissions changes:
http://docs.django-cms.org/en/latest/upgrade/3.4.html#permissionsI've attached a diff of the change I made to my app and maybe you can tell me if it's correct. In particular, I couldn't tell the reason for both the Page.has_change_permission() method and the cms.utils.page_permissions.user_can_change_page() function. Since the former calls the latter, I can't see why the latter is needed.
page.has_change_permission(self.request.user)
seems simpler to me than (equivalent I think):
page_permissions.user_can_change_page(request.user, page=page)
Thanks!