async def move(context, request): try: data = await request.json() except Exception: data = {} destination = data.get('destination') if destination is None: destination_ob = context.__parent__ else: try: destination_ob = await navigate_to(request.container, destination) except KeyError: destination_ob = None if destination_ob is None: raise PreconditionFailed(context, 'Could not find destination object') old_id = context.id if 'new_id' in data: new_id = data['new_id'] context.id = context.__name__ = new_id else: new_id = context.id security = IInteraction(request) if not security.check_permission('guillotina.AddContent', destination_ob): raise PreconditionFailed( context, 'You do not have permission to add content to the ' 'destination object') if await destination_ob.async_contains(new_id): raise PreconditionFailed( context, f'Destination already has object with the id {new_id}') original_parent = context.__parent__ txn = get_transaction(request) cache_keys = txn._cache.get_cache_keys(context, 'deleted') data['id'] = new_id await notify( BeforeObjectMovedEvent(context, original_parent, old_id, destination_ob, new_id, payload=data)) context.__parent__ = destination_ob context._p_register() await notify( ObjectMovedEvent(context, original_parent, old_id, destination_ob, new_id, payload=data)) cache_keys += txn._cache.get_cache_keys(context, 'added') await txn._cache.delete_all(cache_keys) absolute_url = query_multi_adapter((context, request), IAbsoluteURL) return { '@url': absolute_url() }
async def move( context: IResource, destination: Optional[Union[IResource, str]] = None, new_id: Optional[str] = None, check_permission: bool = True, ) -> None: if destination is None: destination_ob = context.__parent__ else: if isinstance(destination, str): destination_ob = None if destination.startswith("/"): container = task_vars.container.get() if container is not None: try: destination_ob = await navigate_to(container, destination) except KeyError: pass else: try: destination_ob = await get_object_by_uid(destination) except KeyError: pass else: destination_ob = destination if destination_ob is None: raise PreconditionFailed(context, "Could not find destination object") if destination_ob.__uuid__ == context.__uuid__: raise PreconditionFailed(context, "You can not move object to itself") if destination_ob.__uuid__ == context.__parent__.__uuid__ and new_id == context.id: raise PreconditionFailed(context, "Object already belongs to this parent with same id") txn = get_transaction() if txn is not None: cache_keys = txn._cache.get_cache_keys(context, "deleted") old_id = context.id if new_id is None: new_id = context.id else: id_checker = get_adapter(context, IIDChecker) if not isinstance(new_id, str) or not await id_checker(new_id, context.type_name): raise PreconditionFailed(new_id, "Invalid id") if check_permission: policy = get_security_policy() if not policy.check_permission("guillotina.AddContent", destination_ob): raise PreconditionFailed( context, "You do not have permission to add content to the destination object" ) if await destination_ob.async_contains(new_id): raise HTTPConflict(content={"reason": f'Destination already has object with the id "{new_id}"'}) original_parent = context.__parent__ await notify( BeforeObjectMovedEvent( context, original_parent, old_id, destination_ob, new_id, payload={"id": new_id, "destination": destination}, ) ) if new_id != old_id: context.id = context.__name__ = new_id context.__parent__ = destination_ob context.register() await notify( ObjectMovedEvent( context, original_parent, old_id, destination_ob, new_id, payload={"id": new_id, "destination": destination}, ) ) if txn is not None: cache_keys += txn._cache.get_cache_keys(context, "added") await txn._cache.delete_all(cache_keys)
async def move(context: IResource, destination: Union[IResource, str] = None, new_id: str = None, check_permission: bool = True) -> None: if destination is None: destination_ob = context.__parent__ else: if isinstance(destination, str): request = get_current_request() try: destination_ob = await navigate_to(request.container, destination) except KeyError: destination_ob = None else: destination_ob = destination if destination_ob is None: raise PreconditionFailed(context, 'Could not find destination object') old_id = context.id if new_id is not None: context.id = context.__name__ = new_id else: new_id = context.id if check_permission: request = get_current_request() security = IInteraction(request) if not security.check_permission('guillotina.AddContent', destination_ob): raise PreconditionFailed( context, 'You do not have permission to add content to the ' 'destination object') if await destination_ob.async_contains(new_id): raise PreconditionFailed( context, f'Destination already has object with the id {new_id}') original_parent = context.__parent__ txn = get_transaction(request) cache_keys = txn._cache.get_cache_keys(context, 'deleted') await notify( BeforeObjectMovedEvent(context, original_parent, old_id, destination_ob, new_id, payload={ 'id': new_id, 'destination': destination })) context.__parent__ = destination_ob context._p_register() await notify( ObjectMovedEvent(context, original_parent, old_id, destination_ob, new_id, payload={ 'id': new_id, 'destination': destination })) cache_keys += txn._cache.get_cache_keys(context, 'added') await txn._cache.delete_all(cache_keys)
async def move(context: IResource, destination: Union[IResource, str] = None, new_id: str = None, check_permission: bool = True) -> None: if destination is None: destination_ob = context.__parent__ else: if isinstance(destination, str): container = task_vars.container.get() if container is not None: try: destination_ob = await navigate_to(container, destination) except KeyError: destination_ob = None else: raise PreconditionFailed(context, 'Could not find destination object') else: destination_ob = destination if destination_ob is None: raise PreconditionFailed(context, 'Could not find destination object') if destination_ob.__uuid__ == context.__uuid__: raise PreconditionFailed(context, 'You can not move object to itself') if destination_ob.__uuid__ == context.__parent__.__uuid__ and new_id == context.id: raise PreconditionFailed( context, 'Object already belongs to this parent with same id') txn = get_transaction() if txn is not None: cache_keys = txn._cache.get_cache_keys(context, 'deleted') old_id = context.id if new_id is not None: context.id = context.__name__ = new_id else: new_id = context.id if check_permission: policy = get_security_policy() if not policy.check_permission('guillotina.AddContent', destination_ob): raise PreconditionFailed( context, 'You do not have permission to add content to the ' 'destination object') if await destination_ob.async_contains(new_id): raise PreconditionFailed( context, f'Destination already has object with the id {new_id}') original_parent = context.__parent__ await notify( BeforeObjectMovedEvent(context, original_parent, old_id, destination_ob, new_id, payload={ 'id': new_id, 'destination': destination })) context.__parent__ = destination_ob context.register() await notify( ObjectMovedEvent(context, original_parent, old_id, destination_ob, new_id, payload={ 'id': new_id, 'destination': destination })) if txn is not None: cache_keys += txn._cache.get_cache_keys(context, 'added') await txn._cache.delete_all(cache_keys)