Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
 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()
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
    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
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
 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
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
    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
Exemplo n.º 12
0
    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
Exemplo n.º 13
0
    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
Exemplo n.º 14
0
    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
Exemplo n.º 15
0
    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
Exemplo n.º 16
0
    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
Exemplo n.º 17
0
 async def load_behavior(self, behavior):
     if IAsyncBehavior.implementedBy(behavior.__class__):
         # providedBy not working here?
         await behavior.load(create=False)