diff --git a/last_commit.txt b/last_commit.txt index 04677a4efe..375bba61d6 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,480 +1,356 @@ -Repository: plone.app.multilingual +Repository: plone.app.upgrade Branch: refs/heads/master -Date: 2017-12-12T11:57:50+02:00 -Author: Asko Soukka (datakurre) -Commit: https://github.com/plone/plone.app.multilingual/commit/a9371792b67a21b433f7529eed1f99159113fc3f +Date: 2017-12-13T10:30:57-05:00 +Author: David Glick (davisagli) +Commit: https://github.com/plone/plone.app.upgrade/commit/50f8a31000ba8f52692b0c239ed241f768370112 -Fix issue where rendering translation menu did write on get when translations were enabled on site with existing content +Avoid triggering user login migration Files changed: -M src/plone/app/multilingual/browser/menu.py +M CHANGES.rst +M plone/app/upgrade/v50/betas.py +M plone/app/upgrade/v50/configure.zcml -diff --git a/src/plone/app/multilingual/browser/menu.py b/src/plone/app/multilingual/browser/menu.py -index 62fc31d5..a7517263 100644 ---- a/src/plone/app/multilingual/browser/menu.py -+++ b/src/plone/app/multilingual/browser/menu.py -@@ -15,9 +15,10 @@ - from Products.CMFPlone.interfaces import ILanguage - from plone.app.multilingual.interfaces import IMultiLanguageExtraOptionsSchema - from plone.app.multilingual.interfaces import IPloneAppMultilingualInstalled -+from plone.app.multilingual.interfaces import ITG -+from plone.app.multilingual.interfaces import ITranslatable - from plone.app.multilingual.interfaces import ITranslationManager - from plone.app.multilingual.interfaces import LANGUAGE_INDEPENDENT --from plone.app.multilingual.interfaces import ITranslatable - from plone.app.multilingual.permissions import ManageTranslations - from plone.memoize import view - from plone.registry.interfaces import IRegistry -@@ -62,7 +63,7 @@ def getMenuItems(self, context, request): - ) - content_translated = translated_languages(content) - content_untranslated = untranslated_languages(content) -- content_translation_group = ITranslationManager(content).tg -+ content_translation_group = ITG(content, '') - if not ITranslatable.providedBy(content): - content = None +diff --git a/CHANGES.rst b/CHANGES.rst +index 3c47c194..272b3448 100644 +--- a/CHANGES.rst ++++ b/CHANGES.rst +@@ -18,6 +18,10 @@ Bug fixes: + Fixes https://github.com/plone/Products.CMFPlone/issues/2238 + [pbauer] -@@ -80,7 +81,7 @@ def getMenuItems(self, context, request): - ) - folder_translated = translated_languages(folder) - folder_untranslated = untranslated_languages(folder) -- folder_translation_group = ITranslationManager(folder).tg -+ folder_translation_group = ITG(folder, '') - else: - folder_url = '' - folder_language = '' - - -Repository: plone.app.multilingual - - -Branch: refs/heads/master -Date: 2017-12-12T11:57:54+02:00 -Author: Asko Soukka (datakurre) -Commit: https://github.com/plone/plone.app.multilingual/commit/9d7d8caa7c07b7df05980991f5b088f701b88cdb - -Fix issues where rendering universal link failed when context did not have translation information yet - -Files changed: -M src/plone/app/multilingual/browser/menu.py - -diff --git a/src/plone/app/multilingual/browser/menu.py b/src/plone/app/multilingual/browser/menu.py -index a7517263..4a97268f 100644 ---- a/src/plone/app/multilingual/browser/menu.py -+++ b/src/plone/app/multilingual/browser/menu.py -@@ -232,26 +232,27 @@ def getMenuItems(self, context, request): - "submenu": None, - }) - # Universal link -- results_folder.append({ -- "title": _( -- u"universal_link", -- default=u"Universal link" -- ), -- "description": _( -- u"description_universal_link", -- default=u"Universal link to the content in user's preferred language" # noqa -- ), -- "action": "%s/@@multilingual-universal-link/%s" % ( -- site_url, folder_translation_group), -- "selected": False, -- "icon": None, -- "extra": { -- "id": "_universal_folder_link", -- "separator": None, -- "class": "" -- }, -- "submenu": None, -- }) -+ if folder_translation_group: -+ results_folder.append({ -+ "title": _( -+ u"universal_link", -+ default=u"Universal link" -+ ), -+ "description": _( -+ u"description_universal_link", -+ default=u"Universal link to the content in user's preferred language" # noqa -+ ), -+ "action": "%s/@@multilingual-universal-link/%s" % ( -+ site_url, folder_translation_group), -+ "selected": False, -+ "icon": None, -+ "extra": { -+ "id": "_universal_folder_link", -+ "separator": None, -+ "class": "" -+ }, -+ "submenu": None, -+ }) ++- Avoid triggering an unnecessary migration of user logins ++ when the use_email_as_login setting is migrated to portal_registry. ++ [davisagli] ++ + + 2.0.9 (2017-11-26) + ------------------ +diff --git a/plone/app/upgrade/v50/betas.py b/plone/app/upgrade/v50/betas.py +index 2ece1ce8..ce1af4d8 100644 +--- a/plone/app/upgrade/v50/betas.py ++++ b/plone/app/upgrade/v50/betas.py +@@ -167,8 +167,18 @@ def _get_enable_self_reg(): + settings.enable_user_folders = pmembership.getMemberareaCreationFlag() + settings.allow_anon_views_about = site_properties.getProperty( + 'allowAnonymousViewAbout', False) ++ ++ # suppress migrating login names while setting use_email_as_login to existing value ++ from Products.CMFPlone.controlpanel import events ++ migrate_to_email_login = events.migrate_to_email_login ++ migrate_from_email_login = events.migrate_from_email_login ++ events.migrate_to_email_login = lambda x: None ++ events.migrate_to_email_login = lambda x: None + settings.use_email_as_login = site_properties.getProperty( + 'use_email_as_login', False) ++ events.migrate_to_email_login = migrate_to_email_login ++ events.migrate_from_email_login = migrate_from_email_login ++ + settings.use_uuid_as_userid = site_properties.getProperty( + 'use_uuid_as_userid', False) - if results_folder: - # Folder translation separator -@@ -396,26 +397,27 @@ def getMenuItems(self, context, request): - "submenu": None, - }) - # Universal link -- results_content.append({ -- "title": _( -- u"universal_link", -- default=u"Universal link" -- ), -- "description": _( -- u"description_universal_link", -- default=u"Universal link to the content in user's preferred language" # noqa -- ), -- "action": "%s/@@multilingual-universal-link/%s" % ( -- site_url, content_translation_group), -- "selected": False, -- "icon": None, -- "extra": { -- "id": "_universal_link", -- "separator": None, -- "class": "" -- }, -- "submenu": None, -- }) -+ if content_translation_group: -+ results_content.append({ -+ "title": _( -+ u"universal_link", -+ default=u"Universal link" -+ ), -+ "description": _( -+ u"description_universal_link", -+ default=u"Universal link to the content in user's preferred language" # noqa -+ ), -+ "action": "%s/@@multilingual-universal-link/%s" % ( -+ site_url, content_translation_group), -+ "selected": False, -+ "icon": None, -+ "extra": { -+ "id": "_universal_link", -+ "separator": None, -+ "class": "" -+ }, -+ "submenu": None, -+ }) +diff --git a/plone/app/upgrade/v50/configure.zcml b/plone/app/upgrade/v50/configure.zcml +index a6ddf604..5e19c679 100644 +--- a/plone/app/upgrade/v50/configure.zcml ++++ b/plone/app/upgrade/v50/configure.zcml +@@ -158,7 +158,7 @@ + /> - if results_folder and results_content: - # Item translations separator + -Repository: plone.app.multilingual +Repository: plone.app.upgrade Branch: refs/heads/master -Date: 2017-12-12T11:57:54+02:00 -Author: Asko Soukka (datakurre) -Commit: https://github.com/plone/plone.app.multilingual/commit/f7885a0dc0617490b3c90b873d548b9df54996a1 +Date: 2017-12-13T16:12:00-05:00 +Author: David Glick (davisagli) +Commit: https://github.com/plone/plone.app.upgrade/commit/ef22eb12418b3edd8a336d3fc41501b06f47cb84 -Fix edge case ValueError raised frm DX translatable subscriber when no translations were available +Merge remote-tracking branch 'origin/master' into davisagli-suppress-login-migration Files changed: -M src/plone/app/multilingual/dx/subscriber.py +M CHANGES.rst +M plone/app/upgrade/v50/alphas.py +M plone/app/upgrade/v50/final.py +M plone/app/upgrade/v51/betas.py +M setup.py -diff --git a/src/plone/app/multilingual/dx/subscriber.py b/src/plone/app/multilingual/dx/subscriber.py -index 44f45fc3..1255ad27 100644 ---- a/src/plone/app/multilingual/dx/subscriber.py -+++ b/src/plone/app/multilingual/dx/subscriber.py -@@ -103,7 +103,8 @@ def get_all_translations(self, content): - """Return all translations excluding the just modified content""" - content_lang = queryAdapter(content, ILanguage).get_language() - translations = ITranslationManager(content).get_translated_languages() -- translations.remove(content_lang) -+ while content_lang in translations: -+ translations.remove(content_lang) - return translations +diff --git a/CHANGES.rst b/CHANGES.rst +index 272b3448..a33d2ca0 100644 +--- a/CHANGES.rst ++++ b/CHANGES.rst +@@ -1,7 +1,7 @@ + Changelog + ========= +-2.0.10 (unreleased) ++2.0.11 (unreleased) + ------------------- - - -Repository: plone.app.multilingual - - -Branch: refs/heads/master -Date: 2017-12-12T11:57:55+02:00 -Author: Asko Soukka (datakurre) -Commit: https://github.com/plone/plone.app.multilingual/commit/5813cce77c595b4574e153e9e188145c3bafd2ad - -Fix to only execute DX multilingual subscriber when multilingual in installed - -Files changed: -M src/plone/app/multilingual/dx/subscriber.py - -diff --git a/src/plone/app/multilingual/dx/subscriber.py b/src/plone/app/multilingual/dx/subscriber.py -index 1255ad27..7856832f 100644 ---- a/src/plone/app/multilingual/dx/subscriber.py -+++ b/src/plone/app/multilingual/dx/subscriber.py -@@ -8,6 +8,7 @@ - from Products.CMFPlone.interfaces import ILanguage - from plone.app.multilingual.interfaces import ILanguageIndependentFieldsManager - from plone.app.multilingual.interfaces import IMultiLanguageExtraOptionsSchema -+from plone.app.multilingual.interfaces import IPloneAppMultilingualInstalled - from plone.app.multilingual.interfaces import ITranslationManager - from plone.dexterity.interfaces import IDexterityFTI - from plone.registry.interfaces import IRegistry -@@ -26,6 +27,10 @@ class LanguageIndependentModifier(object): - def __call__(self, content, event): - """Called by the event system.""" - request = getattr(event.object, 'REQUEST', getRequest()) + Breaking changes: +@@ -14,6 +14,19 @@ New features: + + Bug fixes: + ++- Log progress and ignore bad catalog entries while updating catalog metadata. ++ [davisagli] ++ ++- Disable CSRF protection when replacing keyring. ++ This fixes running specific upgrade steps via the portal_setup UI. ++ [davisagli] ++ + -+ if not IPloneAppMultilingualInstalled.providedBy(request): -+ return ++2.0.10 (2017-12-13) ++------------------- + - translation_info = getattr(request, 'translation_info', {}) ++Bug fixes: ++ + - Unregister import_steps that were moved to post_handlers. + Fixes https://github.com/plone/Products.CMFPlone/issues/2238 + [pbauer] +diff --git a/plone/app/upgrade/v50/alphas.py b/plone/app/upgrade/v50/alphas.py +index 8f594cba..87c9a20b 100644 +--- a/plone/app/upgrade/v50/alphas.py ++++ b/plone/app/upgrade/v50/alphas.py +@@ -18,10 +18,13 @@ + from plone.keyring.interfaces import IKeyManager + from plone.keyring.keymanager import KeyManager + from plone.keyring.keyring import Keyring ++from plone.protect.interfaces import IDisableCSRFProtection + from plone.registry.interfaces import IRegistry + from zope.component import getSiteManager + from zope.component import getUtility + from zope.component.hooks import getSite ++from zope.globalrequest import getRequest ++from zope.interface import alsoProvides + from zope.schema.interfaces import ConstraintNotSatisfied + + try: +@@ -206,6 +209,13 @@ def upgrade_keyring(context): + obj = KeyManager() + sm.registerUtility(aq_base(obj), IKeyManager, '') + ++ # disable CSRF protection which will fail due to ++ # using different secrets than when the authenticator ++ # was generated ++ request = getRequest() ++ if request is not None: ++ alsoProvides(request, IDisableCSRFProtection) ++ + + def to50alhpa3(context): + """5.0alpha2 - > 5.0alpha3""" +diff --git a/plone/app/upgrade/v50/final.py b/plone/app/upgrade/v50/final.py +index 7785528e..ab980353 100644 +--- a/plone/app/upgrade/v50/final.py ++++ b/plone/app/upgrade/v50/final.py +@@ -4,6 +4,8 @@ + from plone.registry.interfaces import IRegistry + from Products.CMFCore.utils import getToolByName + from Products.CMFPlone.utils import safe_unicode ++from Products.ZCatalog.ProgressHandler import ZLogHandler ++from zExceptions import NotFound + from zope.component import getUtility + from zope.component.hooks import getSite + +@@ -68,9 +70,17 @@ def refresh_getIcon_catalog_metadata(context): + + cnt = 0 + # search whole catalog +- for brain in zcatalog.unrestrictedSearchResults(): ++ results = zcatalog.unrestrictedSearchResults() ++ num_objects = len(results) ++ pghandler = ZLogHandler(1000) ++ pghandler.init('Updating getIcon metadata', num_objects) ++ for brain in results: ++ pghandler.report(cnt) + # First get the new value +- obj = brain._unrestrictedGetObject() ++ try: ++ obj = brain._unrestrictedGetObject() ++ except (AttributeError, KeyError, TypeError, NotFound): ++ continue + new_value = bool(getattr(aq_base(obj), 'image', False)) + + # We can now update the record with the new getIcon value +@@ -80,6 +90,7 @@ def refresh_getIcon_catalog_metadata(context): + + cnt += 1 # we are curious + # done ++ pghandler.finish() + logger.info('Reindexed `getIcon` for %s items' % str(cnt)) + + refresh_getIcon_catalog_metadata(context) +diff --git a/plone/app/upgrade/v51/betas.py b/plone/app/upgrade/v51/betas.py +index 57eca92c..b0d45ffb 100644 +--- a/plone/app/upgrade/v51/betas.py ++++ b/plone/app/upgrade/v51/betas.py +@@ -5,6 +5,8 @@ + from Products.CMFCore.utils import getToolByName + from Products.CMFPlone.interfaces import IFilterSchema + from Products.CMFPlone.interfaces import ISearchSchema ++from Products.ZCatalog.ProgressHandler import ZLogHandler ++from zExceptions import NotFound + from zope.component import getUtility + import logging + +@@ -152,8 +154,16 @@ def reindex_mime_type(context): + 'Products.ATContentTypes.interfaces.file.IFileContent', + 'Products.ATContentTypes.interfaces.image.IImageContent'] + cnt = 0 +- for brain in zcatalog.unrestrictedSearchResults(object_provides=ifaces): +- obj = brain._unrestrictedGetObject() ++ results = zcatalog.unrestrictedSearchResults(object_provides=ifaces) ++ num_objects = len(results) ++ pghandler = ZLogHandler(1000) ++ pghandler.init('Updating mime_type metadata', num_objects) ++ for brain in results: ++ pghandler.report(cnt) ++ try: ++ obj = brain._unrestrictedGetObject() ++ except (AttributeError, KeyError, TypeError, NotFound): ++ continue + if not obj: + continue + # First get the new value: +@@ -169,6 +179,7 @@ def reindex_mime_type(context): + record[metadata_index] = new_value + catalog.data[brain.getRID()] = tuple(record) + cnt += 1 ++ pghandler.finish() + logger.info('Reindexed `mime_type` for %s items' % str(cnt)) + - if 'tg' in translation_info.keys(): +diff --git a/setup.py b/setup.py +index 66b7475e..95b35014 100644 +--- a/setup.py ++++ b/setup.py +@@ -1,6 +1,6 @@ + from setuptools import setup, find_packages + +-version = '2.0.10.dev0' ++version = '2.0.11.dev0' + + setup( + name='plone.app.upgrade', -Repository: plone.app.multilingual +Repository: plone.app.upgrade Branch: refs/heads/master -Date: 2017-12-12T11:57:56+02:00 -Author: Asko Soukka (datakurre) -Commit: https://github.com/plone/plone.app.multilingual/commit/ff078676e3ddcba081a3184ec97a3c62c8b7760d +Date: 2017-12-13T16:12:24-05:00 +Author: David Glick (davisagli) +Commit: https://github.com/plone/plone.app.upgrade/commit/dd679e6db7802fe52b386ed729c45ece5132c2d3 -Update changelog +Fix changelog Files changed: M CHANGES.rst diff --git a/CHANGES.rst b/CHANGES.rst -index c8bb800a..5411b02c 100644 +index a33d2ca0..6c6decea 100644 --- a/CHANGES.rst +++ b/CHANGES.rst -@@ -15,6 +15,21 @@ New features: - Bug fixes: +@@ -21,6 +21,10 @@ Bug fixes: + This fixes running specific upgrade steps via the portal_setup UI. + [davisagli] - - *add item here* -+- Fix issue where rendering translation menu did write on get when translations -+ were enabled on old site with existing content -+ [datakurre] -+ -+- Fix issue where DX multilingual subscriber was executed even multilingual -+ was not installed -+ [Asko Soukka] ++- Avoid triggering an unnecessary migration of user logins ++ when the use_email_as_login setting is migrated to portal_registry. ++ [davisagli] + -+- Fix edge case where ValueError was raised from DX translatable subscriber -+ when no translations were yet available for the content -+ [datakurre] -+ -+- Fix issue where rendering universal link failed when trnanslation information -+ was not yet available for the content -+ [datakurre] + 2.0.10 (2017-12-13) + ------------------- +@@ -31,10 +35,6 @@ Bug fixes: + Fixes https://github.com/plone/Products.CMFPlone/issues/2238 + [pbauer] + +-- Avoid triggering an unnecessary migration of user logins +- when the use_email_as_login setting is migrated to portal_registry. +- [davisagli] +- - 5.1.3 (2017-11-25) + 2.0.9 (2017-11-26) + ------------------ -Repository: plone.app.multilingual +Repository: plone.app.upgrade Branch: refs/heads/master -Date: 2017-12-14T22:34:18+01:00 -Author: Jens W. Klein (jensens) -Commit: https://github.com/plone/plone.app.multilingual/commit/ab08f395e1519a9a7c00b31acb011d1d9c2a4cd0 +Date: 2017-12-14T17:22:11-05:00 +Author: David Glick (davisagli) +Commit: https://github.com/plone/plone.app.upgrade/commit/446cfcc02fd347bdc4a9ca76d5defdd4b7132a4e -Merge pull request #298 from plone/datakurre-fixes +Merge pull request #145 from plone/davisagli-suppress-login-migration -Fix various edge cases when multilingual was enable on old site with existing content +Avoid triggering user login migration Files changed: M CHANGES.rst -M src/plone/app/multilingual/browser/menu.py -M src/plone/app/multilingual/dx/subscriber.py +M plone/app/upgrade/v50/betas.py +M plone/app/upgrade/v50/configure.zcml diff --git a/CHANGES.rst b/CHANGES.rst -index c8bb800a..5411b02c 100644 +index b386dfea..6c6decea 100644 --- a/CHANGES.rst +++ b/CHANGES.rst -@@ -15,6 +15,21 @@ New features: - Bug fixes: +@@ -21,6 +21,10 @@ Bug fixes: + This fixes running specific upgrade steps via the portal_setup UI. + [davisagli] - - *add item here* -+- Fix issue where rendering translation menu did write on get when translations -+ were enabled on old site with existing content -+ [datakurre] -+ -+- Fix issue where DX multilingual subscriber was executed even multilingual -+ was not installed -+ [Asko Soukka] ++- Avoid triggering an unnecessary migration of user logins ++ when the use_email_as_login setting is migrated to portal_registry. ++ [davisagli] + -+- Fix edge case where ValueError was raised from DX translatable subscriber -+ when no translations were yet available for the content -+ [datakurre] -+ -+- Fix issue where rendering universal link failed when trnanslation information -+ was not yet available for the content -+ [datakurre] - - - 5.1.3 (2017-11-25) -diff --git a/src/plone/app/multilingual/browser/menu.py b/src/plone/app/multilingual/browser/menu.py -index 62fc31d5..4a97268f 100644 ---- a/src/plone/app/multilingual/browser/menu.py -+++ b/src/plone/app/multilingual/browser/menu.py -@@ -15,9 +15,10 @@ - from Products.CMFPlone.interfaces import ILanguage - from plone.app.multilingual.interfaces import IMultiLanguageExtraOptionsSchema - from plone.app.multilingual.interfaces import IPloneAppMultilingualInstalled -+from plone.app.multilingual.interfaces import ITG -+from plone.app.multilingual.interfaces import ITranslatable - from plone.app.multilingual.interfaces import ITranslationManager - from plone.app.multilingual.interfaces import LANGUAGE_INDEPENDENT --from plone.app.multilingual.interfaces import ITranslatable - from plone.app.multilingual.permissions import ManageTranslations - from plone.memoize import view - from plone.registry.interfaces import IRegistry -@@ -62,7 +63,7 @@ def getMenuItems(self, context, request): - ) - content_translated = translated_languages(content) - content_untranslated = untranslated_languages(content) -- content_translation_group = ITranslationManager(content).tg -+ content_translation_group = ITG(content, '') - if not ITranslatable.providedBy(content): - content = None -@@ -80,7 +81,7 @@ def getMenuItems(self, context, request): - ) - folder_translated = translated_languages(folder) - folder_untranslated = untranslated_languages(folder) -- folder_translation_group = ITranslationManager(folder).tg -+ folder_translation_group = ITG(folder, '') - else: - folder_url = '' - folder_language = '' -@@ -231,26 +232,27 @@ def getMenuItems(self, context, request): - "submenu": None, - }) - # Universal link -- results_folder.append({ -- "title": _( -- u"universal_link", -- default=u"Universal link" -- ), -- "description": _( -- u"description_universal_link", -- default=u"Universal link to the content in user's preferred language" # noqa -- ), -- "action": "%s/@@multilingual-universal-link/%s" % ( -- site_url, folder_translation_group), -- "selected": False, -- "icon": None, -- "extra": { -- "id": "_universal_folder_link", -- "separator": None, -- "class": "" -- }, -- "submenu": None, -- }) -+ if folder_translation_group: -+ results_folder.append({ -+ "title": _( -+ u"universal_link", -+ default=u"Universal link" -+ ), -+ "description": _( -+ u"description_universal_link", -+ default=u"Universal link to the content in user's preferred language" # noqa -+ ), -+ "action": "%s/@@multilingual-universal-link/%s" % ( -+ site_url, folder_translation_group), -+ "selected": False, -+ "icon": None, -+ "extra": { -+ "id": "_universal_folder_link", -+ "separator": None, -+ "class": "" -+ }, -+ "submenu": None, -+ }) - - if results_folder: - # Folder translation separator -@@ -395,26 +397,27 @@ def getMenuItems(self, context, request): - "submenu": None, - }) - # Universal link -- results_content.append({ -- "title": _( -- u"universal_link", -- default=u"Universal link" -- ), -- "description": _( -- u"description_universal_link", -- default=u"Universal link to the content in user's preferred language" # noqa -- ), -- "action": "%s/@@multilingual-universal-link/%s" % ( -- site_url, content_translation_group), -- "selected": False, -- "icon": None, -- "extra": { -- "id": "_universal_link", -- "separator": None, -- "class": "" -- }, -- "submenu": None, -- }) -+ if content_translation_group: -+ results_content.append({ -+ "title": _( -+ u"universal_link", -+ default=u"Universal link" -+ ), -+ "description": _( -+ u"description_universal_link", -+ default=u"Universal link to the content in user's preferred language" # noqa -+ ), -+ "action": "%s/@@multilingual-universal-link/%s" % ( -+ site_url, content_translation_group), -+ "selected": False, -+ "icon": None, -+ "extra": { -+ "id": "_universal_link", -+ "separator": None, -+ "class": "" -+ }, -+ "submenu": None, -+ }) - - if results_folder and results_content: - # Item translations separator -diff --git a/src/plone/app/multilingual/dx/subscriber.py b/src/plone/app/multilingual/dx/subscriber.py -index 44f45fc3..7856832f 100644 ---- a/src/plone/app/multilingual/dx/subscriber.py -+++ b/src/plone/app/multilingual/dx/subscriber.py -@@ -8,6 +8,7 @@ - from Products.CMFPlone.interfaces import ILanguage - from plone.app.multilingual.interfaces import ILanguageIndependentFieldsManager - from plone.app.multilingual.interfaces import IMultiLanguageExtraOptionsSchema -+from plone.app.multilingual.interfaces import IPloneAppMultilingualInstalled - from plone.app.multilingual.interfaces import ITranslationManager - from plone.dexterity.interfaces import IDexterityFTI - from plone.registry.interfaces import IRegistry -@@ -26,6 +27,10 @@ class LanguageIndependentModifier(object): - def __call__(self, content, event): - """Called by the event system.""" - request = getattr(event.object, 'REQUEST', getRequest()) + 2.0.10 (2017-12-13) + ------------------- +diff --git a/plone/app/upgrade/v50/betas.py b/plone/app/upgrade/v50/betas.py +index 2ece1ce8..ce1af4d8 100644 +--- a/plone/app/upgrade/v50/betas.py ++++ b/plone/app/upgrade/v50/betas.py +@@ -167,8 +167,18 @@ def _get_enable_self_reg(): + settings.enable_user_folders = pmembership.getMemberareaCreationFlag() + settings.allow_anon_views_about = site_properties.getProperty( + 'allowAnonymousViewAbout', False) + -+ if not IPloneAppMultilingualInstalled.providedBy(request): -+ return ++ # suppress migrating login names while setting use_email_as_login to existing value ++ from Products.CMFPlone.controlpanel import events ++ migrate_to_email_login = events.migrate_to_email_login ++ migrate_from_email_login = events.migrate_from_email_login ++ events.migrate_to_email_login = lambda x: None ++ events.migrate_to_email_login = lambda x: None + settings.use_email_as_login = site_properties.getProperty( + 'use_email_as_login', False) ++ events.migrate_to_email_login = migrate_to_email_login ++ events.migrate_from_email_login = migrate_from_email_login + - translation_info = getattr(request, 'translation_info', {}) - - if 'tg' in translation_info.keys(): -@@ -103,7 +108,8 @@ def get_all_translations(self, content): - """Return all translations excluding the just modified content""" - content_lang = queryAdapter(content, ILanguage).get_language() - translations = ITranslationManager(content).get_translated_languages() -- translations.remove(content_lang) -+ while content_lang in translations: -+ translations.remove(content_lang) - return translations + settings.use_uuid_as_userid = site_properties.getProperty( + 'use_uuid_as_userid', False) +diff --git a/plone/app/upgrade/v50/configure.zcml b/plone/app/upgrade/v50/configure.zcml +index a6ddf604..5e19c679 100644 +--- a/plone/app/upgrade/v50/configure.zcml ++++ b/plone/app/upgrade/v50/configure.zcml +@@ -158,7 +158,7 @@ + /> +