async def do_traverse(request, parent, path): """Traverse for the code API.""" if not path: return parent, path assert request is not None # could be used for permissions, etc if IContainer.providedBy(parent) and \ path[0] != request._db_id: # Tried to access a container outside the request raise HTTPUnauthorized() if IApplication.providedBy(parent) and \ path[0] != request._container_id: # Tried to access a container outside the request raise HTTPUnauthorized() try: if path[0].startswith('_') or path[0] in ('.', '..'): raise HTTPUnauthorized() context = parent[path[0]] except TypeError: return parent, path except KeyError: return parent, path context._v_parent = parent return await traverse(request, context, path[1:])
async def traverse( request: IRequest, parent: IBaseObject, path: Tuple[str, ...]) -> Tuple[IBaseObject, Tuple[str, ...]]: """Do not use outside the main router function.""" if IApplication.providedBy(parent): request.application = parent if len(path) == 0: return parent, path assert request is not None # could be used for permissions, etc if not ITraversable.providedBy(parent): # not a traversable context return parent, path try: if path[0][0] == "_" or path[0] in (".", ".."): raise HTTPUnauthorized() if path[0][0] == "@": # shortcut return parent, path if IAsyncContainer.providedBy(parent): context = await parent.async_get(path[0], suppress_events=True) if context is None: return parent, path else: context = parent[path[0]] except (TypeError, KeyError, AttributeError): return parent, path if IDatabase.providedBy(context): task_vars.db.set(context) # Add a transaction Manager to request tm = context.get_transaction_manager() task_vars.tm.set(tm) # Start a transaction txn = await tm.begin( read_only=not app_settings["check_writable_request"](request)) # Get the root of the tree context = await tm.get_root(txn=txn) if IContainer.providedBy(context): task_vars.container.set(context) # make sure to unset before we attempt to load in case # there is an existing registry object set on task_vars task_vars.registry.set(None) registry = await get_registry(context) layers = registry.get(ACTIVE_LAYERS_KEY, []) for layer in layers: try: alsoProvides(request, import_class(layer)) except ModuleNotFoundError: logger.error("Can not apply layer " + layer, request=request) return await traverse(request, context, path[1:])
def get_full_content_path(request, ob): path = "/" if hasattr(request, "_db_id"): path += request._db_id + "/" if hasattr(request, "container"): path += request.container.__name__ + "/" if IApplication.providedBy(ob): return path return ("{}{}".format(path, get_content_path(ob)).replace("//", "/").rstrip("/"))
def get_full_content_path(ob) -> str: parts = [] while ob is not None and not IApplication.providedBy(ob): if IDatabase.providedBy(ob): parts.append(ob.__db_id__) break else: parts.append(ob.__name__) ob = getattr(ob, '__parent__', None) return '/' + '/'.join(reversed(parts))
async def traverse(request, parent, path): """Do not use outside the main router function.""" if IApplication.providedBy(parent): request.application = parent if not path: return parent, path assert request is not None # could be used for permissions, etc if not ITraversable.providedBy(parent): # not a traversable context return parent, path try: if path[0][0] == '_' or path[0] in ('.', '..'): raise HTTPUnauthorized() if path[0][0] == '@': # shortcut return parent, path if IAsyncContainer.providedBy(parent): context = await parent.async_get(path[0], suppress_events=True) if context is None: return parent, path else: context = parent[path[0]] except (TypeError, KeyError, AttributeError): return parent, path if IDatabase.providedBy(context): request._db_write_enabled = app_settings['check_writable_request']( request) request._db_id = context.id # Add a transaction Manager to request tm = request._tm = context.get_transaction_manager() # Start a transaction txn = await tm.begin(request=request) # Get the root of the tree context = await tm.get_root(txn=txn) if IContainer.providedBy(context): request._container_id = context.id request.container = context annotations_container = IAnnotations(request.container) request.container_settings = await annotations_container.async_get( REGISTRY_DATA_KEY) layers = request.container_settings.get(ACTIVE_LAYERS_KEY, []) for layer in layers: try: alsoProvides(request, import_class(layer)) except ModuleNotFoundError: logger.error('Can not apply layer ' + layer, request=request) return await traverse(request, context, path[1:])
async def traverse(request, parent, path): """Do not use outside the main router function.""" if IApplication.providedBy(parent): request.application = parent if not path: return parent, path assert request is not None # could be used for permissions, etc if not ITraversable.providedBy(parent): # not a traversable context return parent, path try: if path[0][0] == '_' or path[0] in ('.', '..'): raise HTTPUnauthorized() if path[0][0] == '@': # shortcut return parent, path if IAsyncContainer.providedBy(parent): context = await parent.async_get(path[0], suppress_events=True) if context is None: return parent, path else: context = parent[path[0]] except (TypeError, KeyError, AttributeError): return parent, path if IDatabase.providedBy(context): request._db_write_enabled = app_settings['check_writable_request'](request) request._db_id = context.id # Add a transaction Manager to request tm = request._tm = context.get_transaction_manager() # Start a transaction txn = await tm.begin(request=request) # Get the root of the tree context = await tm.get_root(txn=txn) if IContainer.providedBy(context): request._container_id = context.id request.container = context annotations_container = IAnnotations(request.container) request.container_settings = await annotations_container.async_get(REGISTRY_DATA_KEY) layers = request.container_settings.get(ACTIVE_LAYERS_KEY, []) for layer in layers: try: alsoProvides(request, import_class(layer)) except ModuleNotFoundError: logger.error('Can not apply layer ' + layer, request=request) return await traverse(request, context, path[1:])
def get_full_content_path(ob) -> str: """ Generate full path of resource object from root :param content: object to get path from """ parts = [] while ob is not None and not IApplication.providedBy(ob): if IDatabase.providedBy(ob): parts.append(ob.__db_id__) break else: parts.append(ob.__name__) ob = getattr(ob, '__parent__', None) return '/' + '/'.join(reversed(parts))
async def traverse(request, parent, path): """Do not use outside the main router function.""" if IApplication.providedBy(parent): request.application = parent if not path: return parent, path assert request is not None # could be used for permissions, etc if not ITraversable.providedBy(parent): # not a traversable context return parent, path try: if path[0].startswith('_'): raise HTTPUnauthorized() if IAsyncContainer.providedBy(parent): context = await parent.async_get(path[0]) else: context = parent[path[0]] except (TypeError, KeyError, AttributeError): return parent, path if IDatabase.providedBy(context): request._db_write_enabled = False request._db_id = context.id # Create a transaction Manager request._tm = context.new_transaction_manager() # Start a transaction try: await request._tm.begin(request=request) except asyncpg.exceptions.UndefinedTableError: pass # Get the root of the tree context = await request._tm.root() if ISite.providedBy(context): request._site_id = context.id request.site = context annotations_container = IAnnotations(request.site) request.site_settings = await annotations_container.async_get( REGISTRY_DATA_KEY) layers = request.site_settings.get(ACTIVE_LAYERS_KEY, []) for layer in layers: alsoProvides(request, import_class(layer)) return await traverse(request, context, path[1:])