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']))
Example #2
0
    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()
Example #6
0
    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