def add_acquisition_headers(ob, event):
    """ Added as an event handler for the IBeforeTraversal event by
        configure.zcml.

        If the result of the current URI has been a result of
        acquisition, adds a HTTP header to the response, X-Acquired-Path
        with the actual, physical path to the resource.

        If any acquisition used has been redundant (i.e. some object has
        been acquired via itself), an extra header,
        X-Acquired-Redundantly is added to the response with a value of
        'True'.
    """

    request = event.request
    stack = copy(request.get("TraversalRequestNameStack", []))
    if not stack:
        return

    stack.reverse()
    marker = object()
    result = ob.unrestrictedTraverse(stack, marker)
    __traceback_info__ = stack, result

    ctx = result
    if not ITraversable.providedBy(ctx):
        ctx = getattr(ctx, "im_self", getattr(ctx, "context", ctx))

    acquired = False
    chain = aq_chain(ctx)
    if len(chain) > len(set(chain)):
        acquired = True
        request.response.addHeader("X-Acquired-Redundantly", "True")

    if ctx is not marker and ITraversable.providedBy(ctx):

        if not acquired:
            for i in chain:
                context = aq_parent(i)
                container = aq_parent(aq_inner(i))
                if aq_base(context) is not aq_base(container):
                    acquired = True
                    break

        acquired_path = ctx.absolute_url_path()
        if ctx != result and hasattr(result, "__name__"):
            acquired_path = "%s/%s" % (acquired_path, result.__name__)

        if acquired:
            request.response.addHeader("X-Acquired-Path", acquired_path)
Example #2
0
 def callable(self, value):
     if isinstance(value, types.MethodType) and ITraversable.providedBy(
             value.im_self):
         self._callable_path = value.im_self.getPhysicalPath()
         self._callable_name = value.__name__
     else:
         zc. async .job.Job.callable.fset(self, value)
Example #3
0
 def dirOf(self, obj=None):
     path = (self.repo_root,)
     if obj is not None:
         if not ITraversable.providedBy(obj):
             raise TypeError('input is not traversable')
         # XXX this does not take into account partial trees!
         path = path + obj.getPhysicalPath()[1:]
     return join(*path)
Example #4
0
    def _base_args(self):
        # Get options

        # CCA specific: fix the parent in context of cover configuration, with
        # richtext field in cover. We need a traversable context, so we'll get
        # one from request, if not possible otherwise.
        # See https://taskman.eionet.europa.eu/issues/100350

        if not ITraversable.providedBy(self.context):
            for parent in self.request.PARENTS:
                if ITraversable.providedBy(parent):
                    self.context = parent

                    break

        args = super(OverrideRichText, self)._base_args()

        # Get tinymce options
        tinyoptions = args['pattern_options']['tiny']
        buttons = 'tabs tabsDelete tabsItemDelete tabsItemInsertAfter '\
            'tabsItemInsertBefore accordion accordionDelete '\
            'accordionItemDelete accordionItemInsertAfter '\
            'accordionItemInsertBefore '
        toolbar = tinyoptions['toolbar']
        # plugins = tinyoptions['plugins']

        # Modify toolbar
        toolbar = toolbar.split('|')
        toolbar[5] = toolbar[5] + buttons
        toolbar = '|'.join(toolbar)

        # Override
        args['pattern_options']['tiny']['theme_advanced_buttons3'] = buttons
        args['pattern_options']['tiny']['toolbar'] = toolbar
        args['pattern_options']['tiny']['plugins'].append('tabs')
        args['pattern_options']['tiny']['plugins'].append('accordion')
        args['pattern_options']['tiny']['plugins'].remove('contextmenu')

        # Disable relative urls
        args['pattern_options']['tiny']['relative_urls'] = False
        args['pattern_options']['tiny']['convert_urls'] = False

        return args
Example #5
0
 def __str__(self):
     mapped_url = map_url('/'.join(self.context.getPhysicalPath()),
                          self.request)
     if mapped_url is None:
         if ITraversable.providedBy(self.context):
             return super(LineageAbsoluteURL, self).__str__()
         else:
             return AbsoluteURL.__str__(self)
     else:
         return mapped_url
Example #6
0
 def __str__(self):
     mapped_url = map_url('/'.join(self.context.getPhysicalPath()),
                          self.request)
     if mapped_url is None:
         if ITraversable.providedBy(self.context):
             return super(LineageAbsoluteURL, self).__str__()
         else:
             return AbsoluteURL.__str__(self)
     else:
         return mapped_url
Example #7
0
 def getStopCondition(self, container):
     '''
     Returns true if recursive upward traversal has to stop.
     Subclasses may override.
     @param container: the actual container object
     '''
     return (container is None or
             self._isLocalSite(container) or
             IRoot.providedBy(container) or
             #self._isVirtualHostRoot(container) or
             not ITraversable.providedBy(container))
Example #8
0
    def traverse(cls, base, request, path_items):
        """See ``zope.app.pagetemplate.engine``."""

        path_items = list(path_items)
        path_items.reverse()

        while path_items:
            name = path_items.pop()
            if ITraversable.providedBy(base):
                base = getattr(base, cls.traverseMethod)(name)
            else:
                base = traversePathElement(base, name, path_items,
                                           request=request)

        return base
Example #9
0
    def __call__(self):
        layout = self._getLayout()
        if layout is None:
            raise NotFound("No default site layout set")

        pathContext = self.context
        while not ITraversable.providedBy(pathContext):
            pathContext = aq_parent(pathContext)
            if pathContext is None:
                break

        path = layout
        if pathContext is not None:
            path = urlparse.urljoin(pathContext.absolute_url_path(), layout)

        return resolveResource(path)
Example #10
0
    def layout(self):
        layout = self._getLayout()
        if layout is None:
            raise NotFound("No default site layout set")

        pathContext = self.context
        while not ITraversable.providedBy(pathContext):
            pathContext = aq_parent(pathContext)
            if pathContext is None:
                break

        path = layout
        if pathContext is not None:
            path = urlparse.urljoin(pathContext.absolute_url_path(), layout)

        return path
Example #11
0
    def breadcrumbs(self):
        context = aq_inner(self.context)
        container = aq_parent(context)
        request = self.request

        name = context.getId()

        if container is None or self._isVirtualHostRoot() \
            or not ITraversable.providedBy(container):
            return ({'name': name, 'url': context.absolute_url()}, )

        view = getMultiAdapter((container, request), IAbsoluteURL)
        base = tuple(view.breadcrumbs())
        base += ({'name': name, 'url': ("%s/%s" % (base[-1]['url'], name))}, )

        return base
Example #12
0
    def breadcrumbs(self):
        context = aq_inner(self.context)
        container = aq_parent(context)
        request = self.request

        name = context.getId()
        
        if container is None or self._isVirtualHostRoot() \
            or not ITraversable.providedBy(container):
            return (
                {'name': name, 'url': context.absolute_url()},)

        view = zapi.getMultiAdapter((container, request), IAbsoluteURL)
        base = tuple(view.breadcrumbs())
        base += (
            {'name': name, 'url': ("%s/%s" % (base[-1]['url'], name))},)

        return base
Example #13
0
    def layout(self):
        layout = self._getLayout()
        if layout is None:
            raise NotFound("No default site layout set")

        pathContext = self.context
        while not ITraversable.providedBy(pathContext):
            pathContext = aq_parent(pathContext)
            if pathContext is None:
                break

        if isinstance(layout, six.binary_type):
            layout = layout.decode()

        path = layout
        if pathContext is not None:
            path = parse.urljoin(pathContext.absolute_url_path(), layout)

        return path
Example #14
0
    def orphanDir(self, obj):
        """
        Orphan a directory (removal)

        Mark it with __orphan{timestamp}_{id} and return it.
        """

        if not ITraversable.providedBy(obj):
            raise TypeError('obj must be traversable')

        path = self.dirCreatedFor(obj)
        if path is None:
            # Do nothing.
            return

        target = join(dirname(path), (
            '__orphan%f_%s' % (time(), basename(path))))
        rename(path, target)
        return target
Example #15
0
    def traverse(cls, base, request, path_items):
        """See ``zope.app.pagetemplate.engine``."""

        length = len(path_items)
        if length:
            i = 0
            method = cls.traverse_method
            while i < length:
                name = path_items[i]
                i += 1

                if ITraversable.providedBy(base):
                    traverser = getattr(base, method)
                    base = traverser(name)
                else:
                    base = traversePathElement(
                        base, name, path_items[i:], request=request
                    )

        return base
Example #16
0
    def traverse(cls, base, request, path_items):
        """See ``zope.app.pagetemplate.engine``."""

        length = len(path_items)
        if length:
            i = 0
            method = cls.traverse_method
            while i < length:
                name = path_items[i]
                i += 1

                if ITraversable.providedBy(base):
                    traverser = getattr(base, method)
                    base = traverser(name)
                else:
                    base = traversePathElement(
                        base, name, path_items[i:], request=request
                        )

        return base
Example #17
0
 def display(event):
     name = event.__class__.__name__
     if IObjectEvent.providedBy(event):
         if ITraversable.providedBy(event.object):
             name += ' for ' + '/'.join(event.object.getPhysicalPath())
     return name
Example #18
0
 def callable(self, value):
     if isinstance(value, types.MethodType) and ITraversable.providedBy(value.im_self):
         self._callable_path = value.im_self.getPhysicalPath()
         self._callable_name = value.__name__
     else:
         zc.async.job.Job.callable.fset(self, value)
 def _getBrainByValue(self, value):
     if ITraversable.providedBy(value):
         token = '/'.join(value.getPhysicalPath())
     else:
         token = self.portal_path + value
     return self._getBrainByToken(token)
Example #20
0
 def _getBrainByValue(self, value):
     if ITraversable.providedBy(value):
         token = '/'.join(value.getPhysicalPath())
     else:
         token = self.portal_path + value
     return self._getBrainByToken(token)