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)
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 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)
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
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
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))
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
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)
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
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
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
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
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
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
def display(event): name = event.__class__.__name__ if IObjectEvent.providedBy(event): if ITraversable.providedBy(event.object): name += ' for ' + '/'.join(event.object.getPhysicalPath()) return name
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)