コード例 #1
0
def createdEvent(obj, event):
    """ It can be a
        IObjectRemovedEvent - don't do anything
        IObjectMovedEvent
        IObjectAddedEvent
        IObjectCopiedEvent
    """
    if IObjectRemovedEvent.providedBy(event):
        return

    portal = getSite()
    language_tool = getToolByName(portal, 'portal_languages')

    # On ObjectCopiedEvent and ObjectMovedEvent aq_parent(event.object) is
    # always equal to event.newParent.
    parent = aq_parent(event.object)

    if (language_tool.startNeutral() and ITranslatable.providedBy(obj)):

        # We leave this untouched by now.
        # We don't set languages
        set_recursive_language(obj, LANGUAGE_INDEPENDENT)

    elif (IPloneSiteRoot.providedBy(parent) and
          ITranslatable.providedBy(obj) and
          ILanguage(obj).get_language() == LANGUAGE_INDEPENDENT):

        # It's a root folder and we set the default language
        # ( not independent allowed )
        language = language_tool.getPreferredLanguage()
        set_recursive_language(obj, language)

    elif ITranslatable.providedBy(parent):
        # Normal use case
        # We set the tg, linking
        language = ILanguage(parent).get_language()
        set_recursive_language(obj, language)
        sdm = obj.session_data_manager
        session = sdm.getSessionData()

        if 'tg' in session.keys() and \
           not portal.portal_factory.isTemporary(obj):
            IMutableTG(obj).set(session['tg'])
            old_obj = ITranslationManager(obj).get_translation(session['old_lang'])

            # Copy ILanguage Independent field on on-the-fly translation
            cloner = ITranslationCloner(old_obj)
            cloner(obj)

            reindex_object(obj)
            del session['tg']
コード例 #2
0
def createdEvent(obj, event):
    """ It can be a
        IObjectRemovedEvent - don't do anything
        IObjectMovedEvent
        IObjectAddedEvent
        IObjectCopiedEvent
    """
    if IObjectRemovedEvent.providedBy(event):
        return

    portal = getSite()
    language_tool = getToolByName(portal, 'portal_languages')

    # On ObjectCopiedEvent and ObjectMovedEvent aq_parent(event.object) is
    # always equal to event.newParent.
    parent = aq_parent(event.object)

    if (language_tool.startNeutral() and ITranslatable.providedBy(obj)):

        # We leave this untouched by now.
        # We don't set languages
        set_recursive_language(obj, LANGUAGE_INDEPENDENT)

    elif (IPloneSiteRoot.providedBy(parent) and ITranslatable.providedBy(obj)
          and ILanguage(obj).get_language() == LANGUAGE_INDEPENDENT):

        # It's a root folder and we set the default language
        # ( not independent allowed )
        language = language_tool.getPreferredLanguage()
        set_recursive_language(obj, language)

    elif ITranslatable.providedBy(parent):
        # Normal use case
        # We set the tg, linking
        language = ILanguage(parent).get_language()
        set_recursive_language(obj, language)
        sdm = obj.session_data_manager
        session = sdm.getSessionData()

        if 'tg' in session.keys() and \
           not portal.portal_factory.isTemporary(obj):
            IMutableTG(obj).set(session['tg'])
            old_obj = ITranslationManager(obj).get_translation(
                session['old_lang'])

            # Copy ILanguage Independent field on on-the-fly translation
            cloner = ITranslationCloner(old_obj)
            cloner(obj)

            reindex_object(obj)
            del session['tg']
コード例 #3
0
def set_child_folder_language(obj, parent):
    portal = getSite()
    language_tool = getToolByName(portal, 'portal_languages')
    if (language_tool.startNeutral() and ITranslatable.providedBy(obj)):
        # We leave this untouched by now.
        set_recursive_language(obj, LANGUAGE_INDEPENDENT)
    elif (IPloneSiteRoot.providedBy(parent) and
          ITranslatable.providedBy(obj) and
          ILanguage(obj).get_language() == LANGUAGE_INDEPENDENT):
        pl = getToolByName(portal, "portal_languages")
        language = pl.getPreferredLanguage()
        set_recursive_language(obj, language)
    elif ITranslatable.providedBy(parent):
        language = ILanguage(parent).get_language()
        set_recursive_language(obj, language)
コード例 #4
0
ファイル: helper.py プロジェクト: EU-OSHA/HWC14-15
 def render(self):
     cat = getToolByName(self.context, 'portal_catalog')
     query = dict(portal_type='Folder', Language='en')
     res = cat(query)
     log.info('Total no. of folders found: {0}'.format(len(res)))
     links = dict()
     for r in res:
         if r.getPath().split('/')[2] != 'en':
             log.warning(
                 "Found a folder with lang EN not under /en: {0}".format(
                     r.getPath()))
             continue
         obj = r.getObject()
         if not ITranslatable.providedBy(obj):
             log.warning(
                 'Found a folder that is not translatable, WTF: {0}'.format(
                     r.getPath()))
             continue
         tm = ITranslationManager(obj)
         log.info('Handling folder {0}.'.format('/'.join(
             obj.getPhysicalPath())))
         for lang, trans in tm.get_translations().items():
             if lang == 'en':
                 continue
             # Copy "Exclude from navigation", section images and related sites
             trans.exclude_from_nav = obj.exclude_from_nav
             rsl = IRelatedSites(trans).related_sites_links
             if len(rsl):
                 links['/'.join(trans.getPhysicalPath())] = rsl
     return json.dumps(links)
コード例 #5
0
ファイル: backref.py プロジェクト: oikoumene/wcc.activity
def _back_references(source_object, attribute_name, translation=None):
    catalog = getUtility(ICatalog)
    intids = getUtility(IIntIds)

    lang = queryAdapter(source_object, ILanguage).get_language()
    if translation:
        lang = queryAdapter(translation, ILanguage).get_language()

    gsm = getSecurityManager()
    result = []
    for rel in catalog.findRelations({
            'to_id': intids.getId(aq_inner(source_object)),
            'from_attribute':attribute_name
        }):
        obj = intids.queryObject(rel.from_id)
        if obj is not None and checkPermission('zope2.View', obj):
            if ITranslatable.providedBy(obj):
                trans_manager = ITranslationManager(aq_inner(obj))
                try:
                    trans_obj = trans_manager.get_translation(lang)
                except Unauthorized, e:
                    continue

                if trans_obj:
                    result.append(trans_obj)
                    continue

            if gsm.checkPermission('zope2.View', obj):
                result.append(obj)
コード例 #6
0
ファイル: backref.py プロジェクト: oikoumene/wcc.activity
def _at_back_references(source_object, relationship, translation=None):

    lang = queryAdapter(source_object, ILanguage).get_language()
    if translation:
        lang = queryAdapter(translation, ILanguage).get_language()

    refs = IReferenceable(source_object).getBRefs(relationship=relationship)
    gsm = getSecurityManager()
    result = []
    for obj in refs:
        if ITranslatable.providedBy(obj):
            trans_manager = ITranslationManager(aq_inner(obj))
            try: 
                trans_obj = trans_manager.get_translation(lang)
            except Unauthorized:
                continue

            if trans_obj:
                result.append(trans_obj)
                continue

        if gsm.checkPermission('zope2.View', obj):
            result.append(obj)

    return result
コード例 #7
0
ファイル: event.py プロジェクト: erral/osha.hwccontent
    def get_all_events(self, batch=True):
        # Fall back to default language for local events
        kw = {}
        default_lang = api.portal.get_tool(
            "portal_languages").getDefaultLanguage()
        if ITranslatable.providedBy(self.context):
            if default_lang != self.context.Language():
                portal = getSite()
                trans = ITranslationManager(self.context).get_translation(
                    default_lang)
                root = getNavigationRootObject(trans, portal)
                kw['path'] = '/'.join(root.getPhysicalPath())
                kw['Language'] = [default_lang, '']
        start, end = self._start_end
        sort = 'start'
        sort_reverse = False
        if self.mode in ('past', 'all'):
            sort_reverse = True
        expand = True
        local_events = get_events(
            self.context, start=start, end=end, sort=sort,
            sort_reverse=sort_reverse, ret_mode=RET_MODE_ACCESSORS,
            expand=expand, **kw)

        remote_events = self._remote_events()
        reverse = self.mode == 'past'
        all_events = sorted(local_events + remote_events, key=lambda x: x.start, reverse=reverse)
        if batch:
            b_start = self.b_start
            b_size = self.b_size
            res = Batch(all_events, size=b_size, start=b_start, orphan=self.orphan)
        else:
            res = all_events
        return res
コード例 #8
0
 def copy_attributes(self, trans, attrs):
     res = []
     warnings = []
     for attr in attrs:
         field_name, behavior_name = attr.split('|')
         behavior_interface = None
         behavior_instance = queryUtility(IBehavior, name=behavior_name)
         if behavior_instance is not None:
             behavior_interface = behavior_instance.interface
         if behavior_interface is not None:
             value = getattr(
                 behavior_interface(self.context), field_name, _marker)
         else:
             value = getattr(self.context, field_name, _marker)
         if IRelationValue.providedBy(value):
             obj = value.to_object
             adapter = queryAdapter(trans, ILanguage)
             if ITranslatable.providedBy(obj):
                 trans_obj = ITranslationManager(obj)\
                     .get_translation(adapter.get_language())
                 if trans_obj:
                     intids = getUtility(IIntIds)
                     value = RelationValue(intids.getId(trans_obj))
         if not (value == _marker):
             # We check if not (value == _marker) because
             # z3c.relationfield has an __eq__
             if behavior_interface is not None:
                 setattr(behavior_interface(trans), field_name, value)
             else:
                 setattr(trans, field_name, value)
             res.append(
                 u"  > Transferred attribute '%s'" % field_name)
     return dict(res=res, warnings=warnings)
コード例 #9
0
ファイル: helper.py プロジェクト: EU-OSHA/osha.hwccontent
 def render(self):
     cat = getToolByName(self.context, 'portal_catalog')
     query = dict(portal_type='Folder', Language='en')
     res = cat(query)
     log.info('Total no. of folders found: {0}'.format(len(res)))
     links = dict()
     for r in res:
         if r.getPath().split('/')[2] != 'en':
             log.warning("Found a folder with lang EN not under /en: {0}".format(
                 r.getPath()))
             continue
         obj = r.getObject()
         if not ITranslatable.providedBy(obj):
             log.warning('Found a folder that is not translatable, WTF: {0}'.format(
                 r.getPath()))
             continue
         tm = ITranslationManager(obj)
         log.info('Handling folder {0}.'.format('/'.join(obj.getPhysicalPath())))
         for lang, trans in tm.get_translations().items():
             if lang == 'en':
                 continue
             # Copy "Exclude from navigation", section images and related sites
             trans.exclude_from_nav = obj.exclude_from_nav
             rsl = IRelatedSites(trans).related_sites_links
             if len(rsl):
                 links['/'.join(trans.getPhysicalPath())] = rsl
     return json.dumps(links)
コード例 #10
0
def set_recursive_language(obj, language):
    """ Set the language at this object and recursive
    """
    ILanguage(obj).set_language(language)
    modified(obj)  # XXX: this will create recursion, disabled
    if IFolderish.providedBy(obj):
        for item in obj.items():
            if ITranslatable.providedBy(item):
                set_recursive_language(item, language)
コード例 #11
0
    def __call__(self, context):
        self.context = context
        # return all items in the current folder that are translatable
        terms = [
            SimpleTerm(id, title=u'%s (%s)' % (
                unicode(obj.Title(), 'utf-8'), id))
            for id, obj in context.objectItems()
            if ITranslatable.providedBy(obj)]

        return SimpleVocabulary(terms)
コード例 #12
0
def set_recursive_language(obj, language):
    """ Set the language at this object and recursive
    """
    if ILanguage(obj).get_language() != language:
        ILanguage(obj).set_language(language)
        ITranslationManager(obj).update()
        reindex_object(obj)
    if IFolderish.providedBy(obj):
        for item in obj.items():
            if ITranslatable.providedBy(item):
                set_recursive_language(item, language)
コード例 #13
0
def set_recursive_language(obj, language):
    """ Set the language at this object and recursive
    """
    if ILanguage(obj).get_language() != language:
        ILanguage(obj).set_language(language)
        ITranslationManager(obj).update()
        reindex_object(obj)
    if IFolderish.providedBy(obj):
        for item in obj.items():
            if ITranslatable.providedBy(item):
                set_recursive_language(item, language)
コード例 #14
0
def set_recursive_language(obj, language):
    """ Set the language at this object and recursive
    """
    ILanguage(obj).set_language(language)
    # XXX: this will create recursion, disabled
    # modified(obj)

    # update translations for each object
    update_on_modify(obj, None)
    if IFolderish.providedBy(obj):
        for item in obj.items():
            if ITranslatable.providedBy(item):
                set_recursive_language(item, language)
コード例 #15
0
 def update(self):
     sdm = self.context.session_data_manager
     session = sdm.getSessionData(create=True)
     if ITranslatable.providedBy(self.context):
         self.lang = ILanguage(self.context).get_language()
     else:
         self.lang = 'NaN'
     if 'tg' in session.keys():
         tg = session['tg']
         self.available = True
         ptool = getToolByName(self.context, 'portal_catalog')
         query = {'TranslationGroup': tg, 'Language': 'all'}
         results = ptool.searchResults(query)
         self.origin = results
コード例 #16
0
ファイル: backref.py プロジェクト: oikoumene/wcc.activity
def back_references(source_object, attribute_name):
    """ Return back references from source object on specified attribute_name """
    language_tool = getToolByName(source_object, 'portal_languages')
    default_language = language_tool.getDefaultLanguage()

    default_rels = []
    # if this object is translatable, we should get the back relationship from the
    # default language of this object
    if ITranslatable.providedBy(source_object):
        trans_manager = ITranslationManager(aq_inner(source_object))
        default_lang_obj = trans_manager.get_translation(default_language)
        if default_lang_obj:
            default_rels = _back_references(default_lang_obj, attribute_name, source_object)

    return list(set(default_rels + _back_references(source_object, attribute_name)))
コード例 #17
0
def createdEvent(obj, event):
    portal = getSite()
    language_tool = getToolByName(portal, 'portal_languages')

    # On ObjectCopiedEvent and ObjectMovedEvent aq_parent(event.object) is
    # always equal to event.newParent.
    parent = aq_parent(event.object)

    if (language_tool.startNeutral() and ITranslatable.providedBy(obj)):

        # We leave this untouched by now.
        # We don't set languages
        set_recursive_language(obj, LANGUAGE_INDEPENDENT)

    elif (IPloneSiteRoot.providedBy(parent) and
          ITranslatable.providedBy(obj) and
          ILanguage(obj).get_language() == LANGUAGE_INDEPENDENT):

        # It's a root folder and we set the default language
        # ( not independent allowed )
        language = language_tool.getPreferredLanguage()
        set_recursive_language(obj, language)

    elif ITranslatable.providedBy(parent):
        # Normal use case
        # We set the tg, linking
        language = ILanguage(parent).get_language()
        set_recursive_language(obj, language)
        sdm = obj.session_data_manager
        session = sdm.getSessionData()

        if 'tg' in session.keys() and \
           not portal.portal_factory.isTemporary(obj):
            IMutableTG(obj).set(session['tg'])
            modified(obj)
            del session['tg']
コード例 #18
0
ファイル: backref.py プロジェクト: oikoumene/wcc.activity
def at_back_references(source_object, relationship):
    language_tool = getToolByName(source_object, 'portal_languages')
    default_language = language_tool.getDefaultLanguage()

    # if this object is translatable, we should get the back relationship from the
    # default language of this object

    default_rels = []
    if ITranslatable.providedBy(source_object):
        trans_manager = ITranslationManager(aq_inner(source_object))
        default_lang_obj = trans_manager.get_translation(default_language)
        if default_lang_obj:
            default_rels = _at_back_references(default_lang_obj, relationship, source_object)

    return list(set(default_rels + _at_back_references(source_object, relationship)))
コード例 #19
0
ファイル: events.py プロジェクト: intk/plonetheme.museumbase
def objectTranslated(ob, event):
    createdEvent(ob, event)

    if ITranslatable.providedBy(ob):
        if ob.language == "en" and ob.portal_type != "Folder":
            if not hasattr(ob, 'slideshow'):
                if ITranslationManager(ob).has_translation('nl'):
                    original_ob = ITranslationManager(ob).get_translation('nl')
                    
                    if hasattr(original_ob, 'slideshow'):
                        slideshow = original_ob['slideshow']
                        ITranslationManager(slideshow).add_translation('en')
                        slideshow_trans = ITranslationManager(slideshow).get_translation('en')
                        slideshow_trans.title = slideshow.title
                        slideshow_trans.portal_workflow.doActionFor(slideshow_trans, "publish", comment="Slideshow published")
                        
                        for sitem in slideshow:
                            if slideshow[sitem].portal_type == "Image":
                                ITranslationManager(slideshow[sitem]).add_translation('en')
                                trans = ITranslationManager(slideshow[sitem]).get_translation('en')
                                trans.image = slideshow[sitem].image
                                addCropToTranslation(slideshow[sitem], trans)

                        ob.reindexObject()
                        ob.reindexObject(idxs=["hasMedia"])
                        ob.reindexObject(idxs=["leadMedia"])
                else:
                    ob.invokeFactory(
                        type_name="Folder",
                        id=u'slideshow',
                        title='slideshow',
                    )

                    folder = ob['slideshow']
                    ILanguage(folder).set_language(ob.language)

                    try:
                        folder.portal_workflow.doActionFor(folder, "publish", comment="Slideshow content automatically published")
                        ob.reindexObject()
                    except:
                        pass
                        
        # TODO - check if NL has slideshow

        return

    return
コード例 #20
0
ファイル: viewlets.py プロジェクト: erral/osha.hwccontent
 def update(self):
     self.context = self.get_datacontext(self.context)
     self.available = True if (self.context and self.context.see_also) \
         else False
     if self.available:
         user = api.user.get_current()
         language = api.portal.get_tool(
             'portal_languages').getPreferredLanguage()
         items = list()
         for relation in self.context.see_also:
             obj = relation.to_object
             if ITranslatable.providedBy(obj):
                 obj = ITranslationManager(obj).get_restricted_translation(
                     language) or obj
             if user.has_permission('View', obj):
                 items.append(obj)
         self.items = items
コード例 #21
0
ファイル: event.py プロジェクト: EU-OSHA/HWC14-15
    def get_all_events(self, batch=True):
        # Fall back to default language for local events
        kw = {}
        default_lang = api.portal.get_tool(
            "portal_languages").getDefaultLanguage()
        if ITranslatable.providedBy(self.context):
            if default_lang != self.context.Language():
                portal = getSite()
                trans = ITranslationManager(
                    self.context).get_translation(default_lang)
                root = getNavigationRootObject(trans, portal)
                kw['path'] = '/'.join(root.getPhysicalPath())
                kw['Language'] = [default_lang, '']
        start, end = self._start_end
        sort = 'start'
        sort_reverse = False
        if self.mode in ('past', 'all'):
            sort_reverse = True
        expand = True
        local_events = get_events(self.context,
                                  start=start,
                                  end=end,
                                  sort=sort,
                                  review_state='published',
                                  sort_reverse=sort_reverse,
                                  ret_mode=RET_MODE_ACCESSORS,
                                  expand=expand,
                                  **kw)

        remote_events = self._remote_events()
        reverse = self.mode == 'past'
        all_events = sorted(local_events + remote_events,
                            key=lambda x: x.start,
                            reverse=reverse)
        if batch:
            b_start = self.b_start
            b_size = self.b_size
            res = Batch(all_events,
                        size=b_size,
                        start=b_start,
                        orphan=self.orphan)
        else:
            res = all_events
        return res
コード例 #22
0
    def __call__(self):
        """ Explore the site's content and place it on the right RLF
        """
        context = aq_inner(self.context)
        pl = getToolByName(context, "portal_languages")
        pu = getToolByName(context, "portal_url")
        portal = pu.getPortalObject()
        supported_langs = pl.getSupportedLanguages()

        output = []
        for path, obj in findObjects(portal):
            try:
                lang_adptr = ILanguage(obj)
            except:
                info_str = "Found object %s with no language support." % (path)
                logger.info(info_str)
                output.append(info_str)
                continue

            obj_lang = lang_adptr.get_language()
            if obj_lang not in supported_langs:
                info_str = "Found object %s with unsupported language %s." % (
                                            path, obj_lang)
                logger.info(info_str)
                output.append(info_str)
            else:
                target_folder = ITranslationLocator(obj)(obj_lang)
                parent = aq_parent(obj)
                if IPloneSiteRoot.providedBy(parent) \
                   and ITranslatable.providedBy(obj) \
                   and not INavigationRoot.providedBy(obj):
                    target_folder = getattr(portal, obj_lang, None)

                if target_folder != parent:
                    cb_copy_data = parent.manage_cutObjects(obj.getId())
                    list_ids = target_folder.manage_pasteObjects(cb_copy_data)
                    new_id = list_ids[0]['new_id']
                    new_object = target_folder[new_id]
                    info_str = "Moved object %s to lang folder %s" % (
                                            parent.getPhysicalPath(), obj_lang)
                    logger.info(info_str)
                    output.append(new_object.id)

        return output
コード例 #23
0
    def __call__(self):
        """ Explore the site's content and place it on the right RLF
        """
        context = aq_inner(self.context)
        pl = getToolByName(context, "portal_languages")
        pu = getToolByName(context, "portal_url")
        portal = pu.getPortalObject()
        supported_langs = pl.getSupportedLanguages()

        output = []
        for path, obj in findObjects(portal):
            try:
                lang_adptr = ILanguage(obj)
            except:
                info_str = "Found object %s with no language support." % (path)
                logger.info(info_str)
                output.append(info_str)
                continue

            obj_lang = lang_adptr.get_language()
            if obj_lang not in supported_langs:
                info_str = "Found object %s with unsupported language %s." % (
                    path, obj_lang)
                logger.info(info_str)
                output.append(info_str)
            else:
                target_folder = ITranslationLocator(obj)(obj_lang)
                parent = aq_parent(obj)
                if IPloneSiteRoot.providedBy(parent) \
                   and ITranslatable.providedBy(obj) \
                   and not INavigationRoot.providedBy(obj):
                    target_folder = getattr(portal, obj_lang, None)

                if target_folder != parent:
                    cb_copy_data = parent.manage_cutObjects(obj.getId())
                    list_ids = target_folder.manage_pasteObjects(cb_copy_data)
                    new_id = list_ids[0]['new_id']
                    new_object = target_folder[new_id]
                    info_str = "Moved object %s to lang folder %s" % (
                        parent.getPhysicalPath(), obj_lang)
                    logger.info(info_str)
                    output.append(new_object.id)

        return output
コード例 #24
0
 def update(self):
     self.context = self.get_datacontext(self.context)
     self.available = True if (self.context and self.context.see_also) \
         else False
     if self.available:
         user = api.user.get_current()
         language = api.portal.get_tool(
             'portal_languages').getPreferredLanguage()
         items = list()
         for relation in self.context.see_also:
             if relation.isBroken():
                 continue
             obj = relation.to_object
             if ITranslatable.providedBy(obj):
                 obj = ITranslationManager(obj).get_restricted_translation(
                     language) or obj
             if user.has_permission('View', obj):
                 items.append(obj)
         self.items = items
コード例 #25
0
    def _translations(self, missing):
        # Figure out the "closest" translation in the parent chain of the
        # context. We stop at both an INavigationRoot or an ISiteRoot to look
        # for translations. We do want to find something that is definitely
        # in the language the user asked for.
        context = aq_inner(self.context)
        translations = {}
        chain = aq_chain(context)
        first_pass = True
        _checkPermission = getSecurityManager().checkPermission
        for item in chain:
            if ISiteRoot.providedBy(item):
                # We have a site root, which works as a fallback
                has_view_permission = bool(_checkPermission('View', item))
                for c in missing:
                    translations[c] = (item, first_pass, has_view_permission)
                break

            elif IFactoryTempFolder.providedBy(item) or \
                    IFactoryTool.providedBy(item):
                # TempFolder or portal_factory, can't have a translation
                continue

            try:
                canonical = ITranslationManager(item)
            except TypeError:
                if not ITranslatable.providedBy(item):
                    raise TypeError('The object "%s", of type "%s" available in %s is not translatable, but needs to be translatable' % \
                        (item, item.portal_type, item.absolute_url()))
                else:
                    raise

            item_trans = canonical.get_translations()
            for code, trans in item_trans.items():
                code = str(code)
                if code not in translations:
                    # make a link to a translation only if the user
                    # has view permission
                    has_view_permission = bool(_checkPermission('View', trans))
                    if (not INavigationRoot.providedBy(item)
                            and not has_view_permission):
                        continue
                    # If we don't yet have a translation for this language
                    # add it and mark it as found
                    translations[code] = (trans, first_pass,
                            has_view_permission)
                    missing = missing - set((code, ))

            if len(missing) <= 0:
                # We have translations for all
                break
            if INavigationRoot.providedBy(item):
                # Don't break out of the navigation root jail
                has_view_permission = bool(_checkPermission('View', item))
                for c in missing:
                    translations[c] = (item, False, has_view_permission)
                break
            first_pass = False
        # return a dict of language code to tuple. the first tuple element is
        # the translated object, the second argument indicates wether the
        # translation is a direct translation of the context or something from
        # higher up the translation chain
        return translations
コード例 #26
0
ファイル: helper.py プロジェクト: EU-OSHA/osha.hwccontent
 def get_len_translations(self):
     if not ITranslatable.providedBy(self.context):
         return 0
     tm = ITranslationManager(self.context)
     return len(tm.get_translations())
コード例 #27
0
ファイル: helper.py プロジェクト: EU-OSHA/osha.hwccontent
    def render(self):
        cat = getToolByName(self.context, 'portal_catalog')
        query = dict(portal_type='Folder', Language='en')
        res = cat(query)
        log.info('Total no. of folders found: {0}'.format(len(res)))
        for r in res:
            if r.getPath().split('/')[2] != 'en':
                log.warning("Found a folder with lang EN not under /en: {0}".format(
                    r.getPath()))
                continue
            obj = r.getObject()
            if not ITranslatable.providedBy(obj):
                log.warning('Found a folder that is not translatable, WTF: {0}'.format(
                    r.getPath()))
                continue
            ordering = obj.getOrdering()
            order = ordering.idsInOrder()
            tm = ITranslationManager(obj)
            log.info('Handling folder {0}.'.format('/'.join(obj.getPhysicalPath())))
            for lang, trans in tm.get_translations().items():
                if lang == 'en':
                    continue
                # Copy "Exclude from navigation", section images and related sites
                trans.exclude_from_nav = obj.exclude_from_nav
                IRelatedSites(trans).related_sites_links = IRelatedSites(obj).related_sites_links
                ISectionImage(trans).section_image = ISectionImage(obj).section_image
                # Copy over marker interfaces
                ifaces_to_add = IMarkerInterfaces(obj).getDirectlyProvidedNames()
                if len(ifaces_to_add):
                    t_ifaces = IMarkerInterfaces(trans)
                    add = t_ifaces.dottedToInterfaces(ifaces_to_add)
                    t_ifaces.update(add=add, remove=list())
                # handle the default page settings
                prop = 'default_page'
                propval = aq_base(obj).getProperty(prop, None)
                if propval:
                    # get translation of default-page, if it exists (since the id might be different!)
                    default_page = getattr(obj, propval, None)
                    t_default_page = default_page and ITranslationManager(default_page).get_translation(lang)
                    if not t_default_page:
                        continue
                    # check if marker interfaces need to be copied
                    dp_ifaces_to_add = IMarkerInterfaces(default_page).getDirectlyProvidedNames()
                    if len(dp_ifaces_to_add):
                        t_dp_ifaces = IMarkerInterfaces(t_default_page)
                        add = t_dp_ifaces.dottedToInterfaces(dp_ifaces_to_add)
                        t_dp_ifaces.update(add=add, remove=list())
                    if aq_base(trans).hasProperty(prop):
                        trans._delProperty(prop)
                    trans._setProperty(id=prop, value=t_default_page.id, type="string")
                # now set the correct order
                t_ordering = trans.getOrdering()
                t_order = t_ordering.idsInOrder()
                for i in range(len(order)):
                    if order[i] in t_order:
                        t_ordering.moveObjectToPosition(
                            order[i], i, suppress_events=True)
                if t_order != t_ordering.idsInOrder():
                    trans.reindexObject()

        log.info('Now, fix FOP languages')
        results = cat(portal_type="osha.hwccontent.focalpoint", Language='all')
        fopcnt = 0
        for res in results:
            fop = res.getObject()
            if fop.Language() != '':
                fop.setLanguage('')
                fop.reindexObject()
                fopcnt += 1
        log.info('Reset the language on {0} FOPs'.format(fopcnt))
        return "ok"
コード例 #28
0
    def _get_translations_by_closest(self, supported_langs):
        """ Return the translations information by
            figuring out the 'closest' translation in the parent chain of the
            context. We stop at both an INavigationRoot or an ISiteRoot to look
            for translations. We do want to find something that is definitely
            in the language the user asked for regardless anything else.
        """
        context = aq_inner(self.context)
        missing = set([str(c) for c in supported_langs])
        translations = {}
        chain = aq_chain(context)
        first_pass = True
        _checkPermission = getSecurityManager().checkPermission
        for item in chain:
            if ISiteRoot.providedBy(item):
                # We have a site root, which works as a fallback
                has_view_permission = bool(_checkPermission('View', item))
                for c in missing:
                    translations[c] = (item, first_pass, has_view_permission)
                break

            elif IFactoryTempFolder.providedBy(item) or \
                    IFactoryTool.providedBy(item):
                # TempFolder or portal_factory, can't have a translation
                continue

            try:
                canonical = ITranslationManager(item)
            except TypeError:
                if not ITranslatable.providedBy(item):
                    # In case there it's not translatable go to parent
                    # This solves the problem when a parent is not ITranslatable
                    continue
                else:
                    raise

            item_trans = canonical.get_translations()
            for code, trans in item_trans.items():
                code = str(code)
                if code not in translations:
                    # make a link to a translation only if the user
                    # has view permission
                    has_view_permission = bool(_checkPermission('View', trans))
                    if (not INavigationRoot.providedBy(item)
                            and not has_view_permission):
                        continue
                    # If we don't yet have a translation for this language
                    # add it and mark it as found
                    translations[code] = (trans, first_pass,
                            has_view_permission)
                    missing = missing - set((code, ))

            if len(missing) <= 0:
                # We have translations for all
                break
            if INavigationRoot.providedBy(item):
                # Don't break out of the navigation root jail
                has_view_permission = bool(_checkPermission('View', item))
                for c in missing:
                    translations[c] = (item, False, has_view_permission)
                break
            first_pass = False
        # return a dict of language code to tuple. the first tuple element is
        # the translated object, the second argument indicates wether the
        # translation is a direct translation of the context or something from
        # higher up the translation chain
        return translations
コード例 #29
0
    def languages(self):
        context = aq_inner(self.context)
        registry = getUtility(IRegistry)
        find_translations_policy = registry.forInterface(IMultiLanguagePolicies).selector_lookup_translations_policy

        languages_info = super(LanguageSelectorViewlet, self).languages()
        supported_langs = [v['code'] for v in languages_info]

        results = []

        # If it's neutral language don't do anything
        if ITranslatable.providedBy(context) and ILanguage(context).get_language() == LANGUAGE_INDEPENDENT:
            translations = {}
        elif find_translations_policy == 'closest':
            translations = self._get_translations_by_closest(supported_langs)
        else:
            translations = self._get_translations_by_dialog(supported_langs)

        # We want to preserve the current template / view as used for the
        # current object and also use it for the other languages
        append_path = self._findpath(context.getPhysicalPath(),
                                     self.request.get('PATH_INFO', ''))
        formvariables = self._formvariables(self.request.form)
        _checkPermission = getSecurityManager().checkPermission

        non_viewable = set()

        for lang_info in languages_info:
            # Avoid to modify the original language dict
            data = lang_info.copy()
            code = str(data['code'])
            data['translated'] = code in translations.keys()
            set_language = '?set_language=%s' % code

            try:
                appendtourl = '/'.join(append_path)
                if self.set_language:
                    appendtourl += '?' + make_query(formvariables,
                                                    dict(set_language=code))
                elif formvariables:
                    appendtourl += '?' + make_query(formvariables)
            except UnicodeError:
                appendtourl = '/'.join(append_path)
                if self.set_language:
                    appendtourl += set_language

            if data['translated']:
                trans, direct, has_view_permission = translations[code]
                if not has_view_permission:
                    # shortcut if the user cannot see the item
                    non_viewable.add((data['code']))
                    continue

                state = getMultiAdapter((trans, self.request),
                        name='plone_context_state')

                if direct:
                    try:
                        data['url'] = state.canonical_object_url() + \
                            appendtourl
                    except AttributeError:
                        data['url'] = context.absolute_url() + appendtourl
                else:
                    try:
                        data['url'] = state.canonical_object_url() + \
                            set_language
                    except AttributeError:
                        data['url'] = context.absolute_url() + set_language
            else:
                has_view_permission = bool(_checkPermission('View', context))
                # Ideally, we should also check the View permission of default
                # items of folderish objects.
                # However, this would be expensive at it would mean that the
                # default item should be loaded as well.
                #
                # IOW, it is a conscious decision to not take in account the
                # use case where a user has View permission a folder but not on
                # its default item.
                if not has_view_permission:
                    non_viewable.add((data['code']))
                    continue

                state = getMultiAdapter((context, self.request),
                        name='plone_context_state')
                if find_translations_policy == 'closest':
                    try:
                        data['url'] = state.canonical_object_url() + appendtourl
                    except AttributeError:
                        data['url'] = context.absolute_url() + appendtourl
                else:
                    try:
                        data['url'] = state.canonical_object_url() + NOT_TRANSLATED_YET_TEMPLATE + '?' + make_query(dict(set_language=code))
                    except AttributeError:
                        data['url'] = context.absolute_url() + NOT_TRANSLATED_YET_TEMPLATE + appendtourl

            results.append(data)

        # filter out non-viewable items
        results = [r for r in results if r['code'] not in non_viewable]
        return results
コード例 #30
0
ファイル: helper.py プロジェクト: EU-OSHA/HWC14-15
    def render(self):
        cat = getToolByName(self.context, 'portal_catalog')
        query = dict(portal_type='Folder', Language='en')
        res = cat(query)
        log.info('Total no. of folders found: {0}'.format(len(res)))
        for r in res:
            if r.getPath().split('/')[2] != 'en':
                log.warning(
                    "Found a folder with lang EN not under /en: {0}".format(
                        r.getPath()))
                continue
            obj = r.getObject()
            if not ITranslatable.providedBy(obj):
                log.warning(
                    'Found a folder that is not translatable, WTF: {0}'.format(
                        r.getPath()))
                continue
            ordering = obj.getOrdering()
            order = ordering.idsInOrder()
            tm = ITranslationManager(obj)
            log.info('Handling folder {0}.'.format('/'.join(
                obj.getPhysicalPath())))
            for lang, trans in tm.get_translations().items():
                if lang == 'en':
                    continue
                # Copy "Exclude from navigation", section images and related sites
                trans.exclude_from_nav = obj.exclude_from_nav
                IRelatedSites(trans).related_sites_links = IRelatedSites(
                    obj).related_sites_links
                ISectionImage(trans).section_image = ISectionImage(
                    obj).section_image
                # Copy over marker interfaces
                ifaces_to_add = IMarkerInterfaces(
                    obj).getDirectlyProvidedNames()
                if len(ifaces_to_add):
                    t_ifaces = IMarkerInterfaces(trans)
                    add = t_ifaces.dottedToInterfaces(ifaces_to_add)
                    t_ifaces.update(add=add, remove=list())
                # handle the default page settings
                prop = 'default_page'
                propval = aq_base(obj).getProperty(prop, None)
                if propval:
                    # get translation of default-page, if it exists (since the id might be different!)
                    default_page = getattr(obj, propval, None)
                    t_default_page = default_page and ITranslationManager(
                        default_page).get_translation(lang)
                    if not t_default_page:
                        continue
                    # check if marker interfaces need to be copied
                    dp_ifaces_to_add = IMarkerInterfaces(
                        default_page).getDirectlyProvidedNames()
                    if len(dp_ifaces_to_add):
                        t_dp_ifaces = IMarkerInterfaces(t_default_page)
                        add = t_dp_ifaces.dottedToInterfaces(dp_ifaces_to_add)
                        t_dp_ifaces.update(add=add, remove=list())
                    if aq_base(trans).hasProperty(prop):
                        trans._delProperty(prop)
                    trans._setProperty(id=prop,
                                       value=t_default_page.id,
                                       type="string")
                # now set the correct order
                t_ordering = trans.getOrdering()
                t_order = t_ordering.idsInOrder()
                for i in range(len(order)):
                    if order[i] in t_order:
                        t_ordering.moveObjectToPosition(order[i],
                                                        i,
                                                        suppress_events=True)
                if t_order != t_ordering.idsInOrder():
                    trans.reindexObject()

        log.info('Now, fix FOP languages')
        results = cat(portal_type="osha.hwccontent.focalpoint", Language='all')
        fopcnt = 0
        for res in results:
            fop = res.getObject()
            if fop.Language() != '':
                fop.setLanguage('')
                fop.reindexObject()
                fopcnt += 1
        log.info('Reset the language on {0} FOPs'.format(fopcnt))
        return "ok"
コード例 #31
0
    def export(self):
        if self.export_shoppinglist is True:
            objects = self._getObjectsFromShoppinglist()
        elif self.recursive is True:
            objects = self._getObjectsByPath()
        else:
            objects = [self.context]

        if self.html_compatibility:
            HEAD = HTML_HEAD
        else:
            HEAD = XLIFF_HEAD

        xliff_pages = []

        for ob in objects:
            # Make extra sure the object is translatable. The multilingual
            # behavior for this type might have been deactivated without reindexing
            # all instances of this type.
            if not ITranslatable.providedBy(ob):
                continue
            xob = IXLIFF(ob)
            xliff_pages.append((
                "/".join(ob.getPhysicalPath()),
                xob.render(self.html_compatibility, self.source_language),))

        if self.zip is True:
            Z = StringIO()
            zf = zipfile.ZipFile(Z, 'w')

            if self.single_file is True:    # single file as zip
                if len(xliff_pages) == 1:
                    zf.writestr(
                        xliff_pages[0][0], HEAD % dict(content=xliff_pages[0][1]))
                else:
                    data = [x[1] for x in xliff_pages]
                    zf.writestr(
                        'export.xliff', HEAD % dict(content="\n".join(data)))

            # multiple files as zip
            else:
                for page in xliff_pages:
                    zf.writestr(page[0], HEAD % dict(content=page[1]))

            zf.close()
            Z.seek(0)
            content = Z.read()
            Z.close()

        else:
            # files as plain, so we need to join them to single_file.
            # one or more files to be returned directly, so we don't need
            # the filenames
            content = [x[1] for x in xliff_pages]
            content = "\n".join(content)
            content = HEAD % dict(content=content)
            # Set that as it has been selected implicitly by specifying
            # multiple files but not selecting zip
            self.single_file = True

        return content
コード例 #32
0
    def getClosestDestination(self):
        """Get the "closest translated object" URL.
        """
        # We sould travel the parent chain using the catalog here,
        # but I think using the acquisition chain is faster
        # (or well, __parent__ pointers) because the catalog
        # would require a lot of queries, while technically,
        # having done traversal up to this point you should
        # have the objects in memory already

        # As we don't have any content object we are going to look
        # for the best option

        root = getToolByName(self.context, 'portal_url')
        ltool = getToolByName(self.context, 'portal_languages')

        # We are useing TranslationManager to get the translations of a string tg
        manager = TranslationManager(self.tg)
        context = None
        languages = manager.get_translations()
        if len(languages) == 0:
            # If there is no results there are no translations
            # we move to portal root
            return self.wrapDestination(root(), postpath=False)

        # We are going to see if there is the prefered language translation
        # Otherwise we get the first as context to look for translation
        prefered = ltool.getPreferredLanguage()
        if prefered in languages:
            context = languages[prefered]
        else:
            context = languages[languages.keys()[0]]

        checkPermission = getSecurityManager().checkPermission
        chain = self.getParentChain(context)
        for item in chain:
            if ISiteRoot.providedBy(item):
                # We do not care to get a permission error
                # if the whole of the portal cannot be viewed.
                # Having a permission issue on the root is fine;
                # not so much for everything else so that is checked there
                return self.wrapDestination(item.absolute_url())
            elif IFactoryTempFolder.providedBy(item) or \
                    IFactoryTool.providedBy(item):
                # TempFolder or portal_factory, can't have a translation
                continue
            try:
                canonical = ITranslationManager(item)
            except TypeError:
                if not ITranslatable.providedBy(item):
                    # In case there it's not translatable go to parent
                    # This solves the problem when a parent is not ITranslatable
                    continue
                else:
                    raise
            translation = canonical.get_translation(self.lang)
            if translation and (
                INavigationRoot.providedBy(translation) or
                bool(checkPermission('View', translation))
            ):
                # Not a direct translation, therefore no postpath
                # (the view might not exist on a different context)
                return self.wrapDestination(translation.absolute_url(),
                                            postpath=False)
        # Site root's the fallback
        return self.wrapDestination(root(), postpath=False)
コード例 #33
0
 def is_translatable(self):
     """ Helper method used on the linguatools object tab to see if it
         should render
     """
     context = aq_inner(self.context)
     return ITranslatable.providedBy(context)
コード例 #34
0
ファイル: helper.py プロジェクト: EU-OSHA/HWC14-15
 def get_len_translations(self):
     if not ITranslatable.providedBy(self.context):
         return 0
     tm = ITranslationManager(self.context)
     return len(tm.get_translations())
コード例 #35
0
    def export(self):
        if self.export_shoppinglist is True:
            objects = self._getObjectsFromShoppinglist()
        elif self.recursive is True:
            objects = self._getObjectsByPath()
        else:
            objects = [self.context]

        if self.html_compatibility:
            HEAD = HTML_HEAD
        else:
            HEAD = XLIFF_HEAD

        xliff_pages = []

        for ob in objects:
            # Make extra sure the object is translatable. The multilingual
            # behavior for this type might have been deactivated without reindexing
            # all instances of this type.
            if not ITranslatable.providedBy(ob):
                continue
            xob = IXLIFF(ob)
            xliff_pages.append((
                "/".join(ob.getPhysicalPath()),
                xob.render(self.html_compatibility, self.source_language),))

        if self.zip is True:
            Z = StringIO()
            zf = zipfile.ZipFile(Z, 'w')

            if self.single_file is True:    # single file as zip
                if len(xliff_pages) == 1:
                    zf.writestr(
                        xliff_pages[0][0], HEAD % dict(content=xliff_pages[0][1]))
                else:
                    data = [x[1] for x in xliff_pages]
                    zf.writestr(
                        'export.xliff', HEAD % dict(content="\n".join(data)))

            # multiple files as zip
            else:
                for page in xliff_pages:
                    zf.writestr(page[0], HEAD % dict(content=page[1]))

            zf.close()
            Z.seek(0)
            content = Z.read()
            Z.close()

        else:
            # files as plain, so we need to join them to single_file.
            # one or more files to be returned directly, so we don't need
            # the filenames
            content = [x[1] for x in xliff_pages]
            content = "\n".join(content)
            content = HEAD % dict(content=content)
            # Set that as it has been selected implicitly by specifying
            # multiple files but not selecting zip
            self.single_file = True

        return content
コード例 #36
0
def cut_and_paste(ob, *args, **kw):
    """ Uses OFS to cut and paste an object.
    """
    err = list()
    if not kw['target_path']:
        err.append('You must specify a target path')
    id = kw['id_to_move']
    if not id:
        err.append(u'You must select an object to move')
    id = safe_unicode(id)
    if len(err):
        return err

    lang = kw['lang']
    target_base = kw['target_base']
    if target_base is None:
        err.append(
            u'No object was found at the given taget path %s'
            % kw['target_path'])
        return err
    if ITranslatable.providedBy(target_base):
        target_manager = ITranslationManager(target_base)
        target = target_manager.get_translation(lang)
    else:
        err.append(
            u'The target object is not translatable. Please '
            'choose a different target that is translatable.')
        return err
    if target is None:
        err.append(
            u'No translation in language "%s" was found of '
            'the target %s' % (lang, kw['target_path']))
        return err
    if not IBaseFolder.providedBy(target):
        err.append(
            u'The target object is not folderish - pasting is '
            'not possible.')
        return err
    name = None
    if id in ob.objectIds():
        name = id
        trans_object = getattr(ob, name)
    else:
        # look for translation via get_translation
        manager = ITranslationManager(kw['target_object'])
        trans_object = manager.get_translation(lang)
        if trans_object:
            if Acquisition.aq_parent(trans_object) == ob:
                name = trans_object.getId()

    if name is None:
        err.append(
            u'No translation of the requested object for language '
            '%s found in %s' % (lang, '/'.join(ob.getPhysicalPath())))
        return err
    if target == trans_object:
        err.append(
            u'The target cannot be identical to the object you want to move')
        return err

    # we need to pass a string
    name = safe_unicode(name).encode('utf-8')
    try:
        cut = ob.manage_cutObjects(name)
    except ResourceLockedError:
        lockable = ILockable(trans_object)
        lockable.unlock()
        cut = ob.manage_cutObjects(name)
    try:
        target.manage_pasteObjects(cut)
    except Exception, error:
        err.append(
            u'Not possible to paste item in language %s to target %s.'
            'Error message: %s' % (lang, target.absolute_url(), error))