def test_moving_shared_content_to_lrf(self): # Create shared document createContentInContainer( self.portal, 'Document', title=u"Test document") uuid = IUUID(self.portal['test-document']) # CHeck thats ghost is ghost self.assertTrue(is_shared(self.portal.ca['test-document'])) # Check is in the catalog brains = self.portal.portal_catalog.searchResults(UID=uuid) self.assertEqual(len(brains), 1) self.assertEqual(brains[0].getPath(), '/plone/test-document') brains = self.portal.portal_catalog.searchResults( UID='{0:s}-ca'.format(uuid)) self.assertEqual(len(brains), 1) self.assertEqual(brains[0].getPath(), '/plone/ca/test-document') brains = self.portal.portal_catalog.searchResults( UID='{0:s}-es'.format(uuid)) self.assertEqual(len(brains), 1) self.assertEqual(brains[0].getPath(), '/plone/es/test-document') # MOVE! moved = multilingualMoveObject(self.portal.ca['test-document'], 'ca') # Check that the old and the new uuid are the same moved_uuid = IUUID(self.portal.ca['copy_of_test-document']) self.assertEqual(uuid, moved_uuid) self.assertFalse(is_shared(moved)) # Check portal_catalog is updated after move brains = self.portal.portal_catalog.searchResults(UID=uuid) self.assertEqual(len(brains), 1) self.assertEqual(brains[0].getPath(), '/plone/ca/copy_of_test-document') brains = self.portal.portal_catalog.searchResults( UID='{0:s}-ca'.format(uuid)) self.assertEqual(len(brains), 0) brains = self.portal.portal_catalog.searchResults( UID='{0:s}-es'.format(uuid)) self.assertEqual(len(brains), 0) # Check which translations it have self.assertEqual( ITranslationManager(moved).get_translations(), {'ca': moved}) ITranslationManager(moved).add_translation('es') self.assertEqual( ITranslationManager(moved).get_translations(), {'ca': moved, 'es': self.portal.es['copy_of_test-document']}) # Check that ghost is no longer ghost self.assertFalse( is_shared(self.portal.es['copy_of_test-document']))
def test_shared_to_lrf(self): self.root_a_ca = makeContent(self.portal, "dxdoc", id="a_ca") from plone.uuid.interfaces import IUUID old_uuid = IUUID(self.root_a_ca) # The ghost is ghost self.assertTrue(is_shared(self.portal.ca.a_ca)) # Check is in the catalog brains = self.portal.portal_catalog.searchResults(UID=old_uuid) self.assertTrue(len(brains) == 1) self.assertTrue(brains[0].getPath() == "/plone/a_ca") brains = self.portal.portal_catalog.searchResults(UID=old_uuid + "-ca") self.assertTrue(len(brains) == 1) self.assertTrue(brains[0].getPath() == "/plone/ca/a_ca") brains = self.portal.portal_catalog.searchResults(UID=old_uuid + "-es") self.assertTrue(len(brains) == 1) self.assertTrue(brains[0].getPath() == "/plone/es/a_ca") new_object = multilingualMoveObject(self.portal.ca.a_ca, "ca") # check that the old and the new uuid are the same new_uuid = IUUID(self.portal.ca.copy_of_a_ca) self.assertTrue(old_uuid, new_uuid) self.assertFalse(is_shared(new_object)) # check portal_catalog is updated brains = self.portal.portal_catalog.searchResults(UID=old_uuid) self.assertTrue(len(brains) == 1) self.assertTrue(brains[0].getPath() == "/plone/ca/copy_of_a_ca") brains = self.portal.portal_catalog.searchResults(UID=old_uuid + "-ca") self.assertTrue(len(brains) == 0) brains = self.portal.portal_catalog.searchResults(UID=old_uuid + "-es") self.assertTrue(len(brains) == 0) # Check which translations it have self.failUnless(ITranslationManager(new_object).get_translations(), {"ca": new_object}) ITranslationManager(new_object).add_translation("es") self.failUnless( ITranslationManager(new_object).get_translations(), {"ca": new_object, "es": self.portal.es.copy_of_a_ca} ) self.assertFalse(is_shared(self.portal.es.copy_of_a_ca))
def reindex_neutral(obj, event): # we need to look for the parent that is already indexed if IPloneSiteRoot.providedBy(obj) \ or (not is_shared(obj) and not is_shared_original(obj)): return parent = aq_parent(obj) if ILanguageRootFolder.providedBy(parent): # If it's parent is language root folder no need to reindex return site = getSite() language_tool = getToolByName(site, 'portal_languages') language_infos = language_tool.supported_langs if IPloneSiteRoot.providedBy(parent): # It's plone site root we need to look at LRF for language_info in language_infos: lrf_to_reindex = getattr(parent, language_info, None) to_reindex = getattr(lrf_to_reindex, obj.id, None) if to_reindex is not None: to_reindex.reindexObject() else: content_id = IUUID(parent).split('-')[0] pc = getToolByName(site, 'portal_catalog') for language_info in language_infos: brains = pc.unrestrictedSearchResults( UID=content_id + '-' + language_info) if len(brains): obj.unrestrictedTraverse( brains[0].getPath() + '/' + obj.id).reindexObject() return
def untranslated_languages(context): language_tool = getToolByName(context, 'portal_languages') language_infos = language_tool.getAvailableLanguages() available_portal_languages = language_tool.supported_langs manager = ITranslationManager(context) translated_languages = manager.get_translated_languages() if is_shared(context): translated_languages = [] languages = [] for lang in available_portal_languages: if lang not in translated_languages: native = language_infos[lang].get('native', None) name = language_infos[lang].get('name', lang) languages.append( SimpleVocabulary.createTerm(lang, lang, native or name)) return SimpleVocabulary(languages)
def reindex_neutral(obj, event): """Neutral On shared elements, the uuid is different so we need to take care of them on catalog in case we modify any shared element """ # is the given object Neutral? if IPloneSiteRoot.providedBy(obj) \ or obj.getId() in BLACK_LIST_IDS \ or (not is_shared(obj) and not is_shared_original(obj)): return parent = aq_parent(obj) if ILanguageRootFolder.providedBy(parent): # If it's parent is language root folder there is no need to reindex return site = getSite() language_tool = getToolByName(site, 'portal_languages') language_infos = language_tool.supported_langs if IPloneSiteRoot.providedBy(parent): # It's plone site root we need to look at LRF _reindex_site_root(obj, parent, language_infos) return # ok, we're very neutral content_id = IUUID(parent).split('-')[0] pc = getToolByName(site, 'portal_catalog') for language_info in language_infos: brains = pc.unrestrictedSearchResults( UID=content_id + '-' + language_info ) if len(brains): # we have results, so parent was indexed before. brain = brains[0] obj.unrestrictedTraverse( brain.getPath() + '/' + obj.id).reindexObject()
def getMenuItems(self, context, request): """Return menu item entries in a TAL-friendly form.""" menu = [] url = context.absolute_url() lt = getToolByName(context, "portal_languages") site_url = getSite().absolute_url() showflags = lt.showFlags() context_id = ITranslationManager(context).tg registry = getUtility(IRegistry) settings = registry.forInterface(IMultiLanguageExtraOptionsSchema) edit_view = 'babel_edit' if settings.redirect_babel_view else 'edit' # In case is neutral language show set language menu only is_neutral_content = ( ILanguage(context).get_language() == LANGUAGE_INDEPENDENT or is_shared(context) ) if not is_neutral_content and not INavigationRoot.providedBy(context): menu.append({ "title": _( u"title_babel_edit", default=u"Edit with babel view" ), "description": _( u"description_babel_edit", default=u"Edit with the babel_edit" ), "action": url + "/" + edit_view, "selected": False, "icon": None, "extra": { "id": "_edit_babel_edit", "separator": None, "class": "", }, "submenu": None, }) contexts = [context, ] prt = aq_parent(context) if isDefaultPage(prt, context): contexts.append(prt) for idx, context in enumerate(contexts): url = context.absolute_url() langs = untranslated_languages(context) for lang in langs: lang_name = lang.title lang_id = lang.value icon = showflags and lt.getFlagForLanguageCode(lang_id) \ or None item = { "description": _( u"description_translate_into", default=u"Translate into ${lang_name}", mapping={"lang_name": lang_name} ), "action": "%s/@@create_translation?language=%s" % ( url, lang_id), "selected": False, "icon": icon, "width": "14", "height": "11", "extra": {"id": "translate_into_%s" % lang_id, "separator": None, "class": "contentmenuflags"}, "submenu": None, } item['title'] = idx and _( u'create_translation_folder', default=u"Create ${lang_name} folder", mapping={"lang_name": lang_name} ) or _( u'create_translation', default=u"Create ${lang_name}", mapping={"lang_name": lang_name} ) menu.append(item) langs = translated_languages(context) urls = translated_urls(context) for lang in langs: if lang.value not in urls.by_token: # omit if translation is not permitted to access. continue lang_name = lang.title lang_id = lang.value icon = showflags and lt.getFlagForLanguageCode(lang_id) \ or None item = { "description": _( u"description_babeledit_menu", default=u"Babel edit ${lang_name}", mapping={"lang_name": lang_name} ), "action": (urls.getTerm(lang_id).title + "/" + edit_view), "selected": False, "icon": icon, "width": "14", "height": "11", "extra": {"id": "babel_edit_%s" % lang_id, "separator": None, "class": "contentmenuflags"}, "submenu": None, } item['title'] = idx and _( u'edit_translation_folder', default=u"Edit ${lang_name} folder", mapping={"lang_name": lang_name} ) or _( u'edit_translation', default=u"Edit ${lang_name}", mapping={"lang_name": lang_name} ) menu.append(item) item = { "description": _( u"description_add_translations", default=u"Add existing content as translation"), "action": url + "/add_translations", "selected": False, "icon": None, "extra": { "id": "_add_translations", "separator": langs and "actionSeparator" or None, "class": "" }, "submenu": None, } item['title'] = idx and _( u"title_add_translations_folder", default=u"Add translations for folder..." ) or _( u"title_add_translations", default=u"Add translations..." ) menu.append(item) item = { "title": _( u"title_remove_translations", default=u"Remove translations..." ), "description": _( u"description_remove_translations", default=u"Delete translations or remove the relations" ), "action": url + "/remove_translations", "selected": False, "icon": None, "extra": { "id": "_remove_translations", "separator": langs and "actionSeparator" or None, "class": "" }, "submenu": None, } menu.append(item) elif is_neutral_content: menu.append({ "title": _( u"language_folder", default=u"Return to language folder" ), "description": _( u"description_language_folder", default=u"Go to the user's browser preferred language " u"related folder" ), "action": site_url + '/' + lt.getPreferredLanguage(), "selected": False, "icon": None, "extra": { "id": "_shared_folder", "separator": None, "class": "" }, "submenu": None, }) if not is_neutral_content: menu.append({ "title": _( u"universal_link", default=u"Universal Link" ), "description": _( u"description_universal_link", default=u"Universal Language content link" ), "action": "%s/@@multilingual-universal-link/%s" % ( site_url, context_id), "selected": False, "icon": None, "extra": { "id": "_universal_link", "separator": None, "class": "" }, "submenu": None, }) menu.append({ "title": _( u"shared_folder", default=u"Go to shared folder" ), "description": _( u"description_shared_folder", default=u"Show the language shared (neutral language) " u"folder" ), "action": site_url + '/folder_contents', "selected": False, "icon": None, "extra": { "id": "_shared_folder", "separator": None, "class": ""}, "submenu": None, }) menu.append({ "title": _( u"title_set_language", default=u"Set content language" ), "description": _( u"description_set_language", default=u"Set or change the current content language" ), "action": url + "/update_language", "selected": False, "icon": None, "extra": { "id": "_set_language", "separator": None, "class": "" }, "submenu": None, }) return menu