async def __call__(self, data, validate_all=False, ignore_errors=False): errors = [] factory = get_cached_factory(self.context.type_name) main_schema = factory.schema await self.set_schema( main_schema, self.context, data, errors, validate_all, False) for behavior_schema, behavior in await get_all_behaviors(self.context, load=False): dotted_name = behavior_schema.__identifier__ if dotted_name not in data: # syntax {"namespace.IBehavior": {"foo": "bar"}} # we're not even patching this behavior if no iface found in payload continue if IAsyncBehavior.implementedBy(behavior.__class__): # providedBy not working here? await behavior.load(create=True) await self.set_schema( behavior_schema, behavior, data, errors, validate_all, True) if errors and not ignore_errors: raise DeserializationError(errors) self.context._p_register() return self.context
async def __call__(self, include=[], omit=[]): self.include = include self.omit = omit parent = self.context.__parent__ if parent is not None: # We render the summary of the parent try: parent_summary = await get_multi_adapter( (parent, self.request), IResourceSerializeToJsonSummary)() except ComponentLookupError: parent_summary = {} else: parent_summary = {} factory = get_cached_factory(self.context.type_name) behaviors = [] for behavior_schema in factory.behaviors or (): behaviors.append(behavior_schema.__identifier__) result = { '@id': IAbsoluteURL(self.context, self.request)(), '@type': self.context.type_name, '@name': self.context.__name__, '@uid': self.context.uuid, '@static_behaviors': behaviors, 'parent': parent_summary, # should be @parent 'is_folderish': IFolder.providedBy(self.context), # eek, should be @folderish? 'creation_date': json_compatible(self.context.creation_date), 'modification_date': json_compatible(self.context.modification_date), 'UID': self.context.uuid, # should be removed } main_schema = factory.schema await self.get_schema(main_schema, self.context, result, False) # include can be one of: # - <field name> on content schema # - namespace.IBehavior # - namespace.IBehavior.field_name included_ifaces = [name for name in self.include if '.' in name] included_ifaces.extend([name.rsplit('.', 1)[0] for name in self.include if '.' in name]) for behavior_schema, behavior in await get_all_behaviors(self.context, load=False): if '*' not in self.include: dotted_name = behavior_schema.__identifier__ if (dotted_name in self.omit or (len(included_ifaces) > 0 and dotted_name not in included_ifaces)): # make sure the schema isn't filtered continue if (not getattr(behavior, 'auto_serialize', True) and dotted_name not in included_ifaces): continue if IAsyncBehavior.implementedBy(behavior.__class__): # providedBy not working here? await behavior.load(create=False) await self.get_schema(behavior_schema, behavior, result, True) return result
async def __call__(self): if self.behavior is not None and IAsyncBehavior.implementedBy(self.behavior.__class__): # providedBy not working here? await self.behavior.load(create=True) # We need to get the upload as async IO and look for an adapter # for the field to save there by chunks adapter = get_multi_adapter((self.context, self.request, self.field), IFileManager) return await adapter.tus_create()
async def __call__(self, include=[], omit=[]): self.include = include self.omit = omit parent = self.context.__parent__ if parent is not None: # We render the summary of the parent try: parent_summary = await get_multi_adapter( (parent, self.request), IResourceSerializeToJsonSummary)() except ComponentLookupError: parent_summary = {} else: parent_summary = {} result = { '@id': IAbsoluteURL(self.context, self.request)(), '@type': self.context.type_name, '@name': self.context.__name__, '@uid': self.context.uuid, 'parent': parent_summary, 'is_folderish': IFolder.providedBy(self.context), 'creation_date': json_compatible(self.context.creation_date), 'modification_date': json_compatible(self.context.modification_date), 'UID': self.context.uuid, } factory = get_cached_factory(self.context.type_name) main_schema = factory.schema await self.get_schema(main_schema, self.context, result, False) # include can be one of: # - <field name> on content schema # - namespace.IBehavior # - namespace.IBehavior.field_name included_ifaces = [name for name in self.include if '.' in name] included_ifaces.extend( [name.rsplit('.', 1)[0] for name in self.include if '.' in name]) for behavior_schema, behavior in await get_all_behaviors(self.context, load=False): dotted_name = behavior_schema.__identifier__ if (dotted_name in self.omit or (len(included_ifaces) > 0 and dotted_name not in included_ifaces)): # make sure the schema isn't filtered continue if (not getattr(behavior, 'auto_serialize', True) and dotted_name not in included_ifaces): continue if IAsyncBehavior.implementedBy(behavior.__class__): # providedBy not working here? await behavior.load(create=False) await self.get_schema(behavior_schema, behavior, result, True) return result
async def get_all_behaviors(content, create=False) -> list: behaviors = [] for behavior_schema in get_all_behavior_interfaces(content): behavior = behavior_schema(content) if IAsyncBehavior.implementedBy(behavior.__class__): # providedBy not working here? await behavior.load(create=create) behaviors.append((behavior_schema, behavior)) return behaviors
async def __call__(self): parent = self.context.__parent__ if parent is not None: # We render the summary of the parent try: parent_summary = await getMultiAdapter( (parent, self.request), IResourceSerializeToJsonSummary)() except ComponentLookupError: parent_summary = {} else: parent_summary = {} result = { '@id': IAbsoluteURL(self.context, self.request)(), '@type': self.context.portal_type, 'parent': parent_summary, 'created': json_compatible(self.context.created), 'modified': json_compatible(self.context.modified), 'UID': self.context.uuid, } factory = get_cached_factory(self.context.portal_type) main_schema = factory.schema await self.get_schema(main_schema, self.context, result, False) for behavior_schema in factory.behaviors or (): behavior = behavior_schema(self.context) if IAsyncBehavior.implementedBy(behavior.__class__): # providedBy not working here? await behavior.load() await self.get_schema(behavior_schema, behavior, result, True) for dynamic_behavior in self.context.__behaviors__ or (): dynamic_behavior_obj = BEHAVIOR_CACHE[dynamic_behavior] behavior = dynamic_behavior_obj(self.context) if IAsyncBehavior.implementedBy(dynamic_behavior_obj.__class__): # providedBy not working here? await behavior.load() await self.get_schema(dynamic_behavior_obj, behavior, result, True) return result
async def save(self): self.request._db_write_enabled = True tm = get_tm(self.request) txn = await tm.begin(self.request) for key, value in self.data.items(): context, field = await self.get_field(key) if IAsyncBehavior.implementedBy(context.__class__): # it's a behavior we're editing... await context.load() await txn.refresh(context.data) else: await txn.refresh(context) setattr(context, field.__name__, value) if IAsyncBehavior.implementedBy(context.__class__): # it's a behavior we're editing... context.data.register() else: context.register() await tm.commit(txn=txn)
async def get_value(self, field_name): self.request._db_write_enabled = False tm = get_tm(self.request) txn = await tm.begin(self.request) context, field = await self.get_field(field_name) if IAsyncBehavior.implementedBy(context.__class__): await context.load() await txn.refresh(context.data) else: await txn.refresh(context) val = getattr(context, field.__name__) await tm.abort(txn=txn) return val
async def prepare(self): # we want have the field name = self.request.matchdict["field_name"] fti = query_utility(IFactory, name=self.context.type_name) schema = fti.schema field = None self.behavior = None if name in schema: field = schema[name] else: # TODO : We need to optimize and move to content.py iterSchema for behavior_schema in fti.behaviors or (): if name in behavior_schema: field = behavior_schema[name] self.behavior = behavior_schema(self.context) break for behavior_name in self.context.__behaviors__ or (): behavior_schema = BEHAVIOR_CACHE[behavior_name] if name in behavior_schema: field = behavior_schema[name] self.behavior = behavior_schema(self.context) break # Check that its a File Field if field is None: raise HTTPNotFound(content={"reason": "No valid name"}) if self.behavior is not None: ctx = self.behavior else: ctx = self.context if self.behavior is not None and IAsyncBehavior.implementedBy( self.behavior.__class__): # providedBy not working here? await self.behavior.load() if IDict.providedBy(field) and ICloudFileField.providedBy( field.value_type): key = self.request.matchdict.get("file_key") if key is not None: self.field = CloudFileField(__name__=name).bind( DictFieldProxy(key, ctx, name)) elif ICloudFileField.providedBy(field): self.field = field.bind(ctx) if self.field is None: raise HTTPNotFound(content={"reason": "No valid name"}) return self
async def __call__(self, data, validate_all=False): modified = False errors = [] factory = get_cached_factory(self.context.portal_type) main_schema = factory.schema await self.set_schema(main_schema, self.context, data, errors, validate_all, False) for behavior_schema in factory.behaviors or (): if behavior_schema.__identifier__ in data: behavior = behavior_schema(self.context) if IAsyncBehavior.implementedBy(behavior.__class__): # providedBy not working here? await behavior.load(create=True) await self.set_schema(behavior_schema, behavior, data, errors, validate_all, True) for dynamic_behavior in self.context.__behaviors__ or (): dynamic_behavior_obj = BEHAVIOR_CACHE[dynamic_behavior] if dynamic_behavior_obj.__identifier__ in data: behavior = dynamic_behavior_obj(self.context) if IAsyncBehavior.implementedBy( dynamic_behavior_obj.__class__): # providedBy not working here? await behavior.load(create=True) await self.set_schema(dynamic_behavior_obj, behavior, data, errors, validate_all, True) if errors: raise DeserializationError(errors) if modified: self.context._p_register() await notify(ObjectModifiedEvent(self.context, data)) return self.context
async def get_value(self, ob, index_name): try: schema = self.mappings[ob.type_name][index_name]['schema'] index_data = self.mappings[ob.type_name][index_name]['properties'] except KeyError: return None behavior = schema(ob) if IAsyncBehavior.implementedBy(behavior.__class__): # providedBy not working here? await behavior.load(create=False) try: if 'accessor' in index_data: return await apply_coroutine(index_data['accessor'], behavior) else: return self.data_adapter.get_data(behavior, schema, index_name) except NoIndexField: pass
async def __call__( self, data: Dict[str, Any], validate_all: bool = False, ignore_errors: bool = False, create: bool = False, ) -> IResource: errors: List[Dict[str, Any]] = [] # do behavior first in case they modify context values for behavior_schema, behavior in await get_all_behaviors(self.context, load=False): dotted_name = behavior_schema.__identifier__ if dotted_name not in data: # syntax {"namespace.IBehavior": {"foo": "bar"}} # we're not even patching this behavior if no iface found in payload if create: # signal to caching engine to cache no data here so # we prevent a future lookup try: txn = self.context.__txn__ await txn._cache.set( _EMPTY, container=self.context, id=behavior.__annotations_data_key__, variant="annotation", ) except AttributeError: pass continue if IAsyncBehavior.implementedBy(behavior.__class__): # providedBy not working here? await behavior.load(create=True) await self.set_schema(behavior_schema, behavior, data, errors, validate_all, True) factory = get_cached_factory(self.context.type_name) main_schema = factory.schema await self.set_schema(main_schema, self.context, data, errors, validate_all, False) if errors and not ignore_errors: raise DeserializationError(errors) return self.context
async def __call__(self, data, validate_all=False, ignore_errors=False, create=False): errors = [] # do behavior first in case they modify context values for behavior_schema, behavior in await get_all_behaviors(self.context, load=False): dotted_name = behavior_schema.__identifier__ if dotted_name not in data: # syntax {"namespace.IBehavior": {"foo": "bar"}} # we're not even patching this behavior if no iface found in payload if create: # signal to caching engine to cache no data here so # we prevent a future lookup try: txn = self.context._p_jar await txn._cache.set( _EMPTY, container=self.context, id=behavior.__annotations_data_key__, variant='annotation') except AttributeError: pass continue if IAsyncBehavior.implementedBy(behavior.__class__): # providedBy not working here? await behavior.load(create=True) await self.set_schema( behavior_schema, behavior, data, errors, validate_all, True) factory = get_cached_factory(self.context.type_name) main_schema = factory.schema await self.set_schema( main_schema, self.context, data, errors, validate_all, False) if errors and not ignore_errors: raise DeserializationError(errors) self.context._p_register() return self.context
async def prepare(self): # we want have the field name = self.request.matchdict['field_name'] fti = query_utility(IFactory, name=self.context.type_name) schema = fti.schema field = None self.behavior = None if name in schema: field = schema[name] else: # TODO : We need to optimize and move to content.py iterSchema for behavior_schema in fti.behaviors or (): if name in behavior_schema: field = behavior_schema[name] self.behavior = behavior_schema(self.context) break for behavior_name in self.context.__behaviors__ or (): behavior_schema = BEHAVIOR_CACHE[behavior_name] if name in behavior_schema: field = behavior_schema[name] self.behavior = behavior_schema(self.context) break # Check that its a File Field if field is None: raise HTTPNotFound(content={ 'reason': 'No valid name'}) if self.behavior is not None: self.field = field.bind(self.behavior) else: self.field = field.bind(self.context) if (self.behavior is not None and IAsyncBehavior.implementedBy(self.behavior.__class__)): # providedBy not working here? await self.behavior.load() return self
async def publish_traverse(self, traverse): if len(traverse) == 1: # we want have the field name = traverse[0] fti = query_utility(IFactory, name=self.context.type_name) schema = fti.schema field = None self.behavior = None if name in schema: field = schema[name] else: # TODO : We need to optimize and move to content.py iterSchema for behavior_schema in fti.behaviors or (): if name in behavior_schema: field = behavior_schema[name] self.behavior = behavior_schema(self.context) break for behavior_name in self.context.__behaviors__ or (): behavior_schema = BEHAVIOR_CACHE[behavior_name] if name in behavior_schema: field = behavior_schema[name] self.behavior = behavior_schema(self.context) break # Check that its a File Field if field is None: raise KeyError('No valid name') self.field = field.bind(self.behavior) else: self.field = None if (self.behavior is not None and IAsyncBehavior.implementedBy(self.behavior.__class__)): # providedBy not working here? await self.behavior.load() return self
async def __call__(self, include=None, omit=None): self.include = include or [] self.omit = omit or [] parent = self.context.__parent__ if parent is not None: # We render the summary of the parent try: parent_summary = await get_multi_adapter( (parent, self.request), IResourceSerializeToJsonSummary)() except ComponentLookupError: parent_summary = {} else: parent_summary = {} factory = get_cached_factory(self.context.type_name) behaviors = [] for behavior_schema in factory.behaviors or (): behaviors.append(behavior_schema.__identifier__) result = { "@id": get_object_url(self.context, self.request), "@type": self.context.type_name, "@name": self.context.__name__, "@uid": self.context.uuid, "@static_behaviors": behaviors, "parent": parent_summary, # should be @parent "is_folderish": IFolder.providedBy(self.context), # eek, should be @folderish? "creation_date": json_compatible(self.context.creation_date), "modification_date": json_compatible(self.context.modification_date), } main_schema = factory.schema await self.get_schema(main_schema, self.context, result, False) # include can be one of: # - <field name> on content schema # - namespace.IBehavior # - namespace.IBehavior.field_name included_ifaces = [name for name in self.include if "." in name] included_ifaces.extend( [name.rsplit(".", 1)[0] for name in self.include if "." in name]) for behavior_schema, behavior in await get_all_behaviors(self.context, load=False): if "*" not in self.include: dotted_name = behavior_schema.__identifier__ if dotted_name in self.omit or (len(included_ifaces) > 0 and dotted_name not in included_ifaces): # make sure the schema isn't filtered continue if not getattr(behavior, "auto_serialize", True) and dotted_name not in included_ifaces: continue if IAsyncBehavior.implementedBy(behavior.__class__): # providedBy not working here? await behavior.load(create=False) await self.get_schema(behavior_schema, behavior, result, True) for post_serialize_processors in app_settings["post_serialize"]: await apply_coroutine(post_serialize_processors, self.context, result) return result
async def load_behavior(self, behavior): if IAsyncBehavior.implementedBy(behavior.__class__): # providedBy not working here? await behavior.load(create=False)