Beispiel #1
0
        def object_data_generator(obj, attrs=dict()):
            yield ('objectType', lambda: self.object_type_map[obj.type])
            yield ('objectID', lambda: obj.oid)
            yield ('objectName', lambda: obj.name)
            yield ('parentURI', lambda: obj.__parent__.__name__)
            yield ('parentID', lambda: (obj.__parent__.oid
                                        if (not IRootContainer.providedBy(obj)
                                            and not ISystemCapability.providedBy(obj))
                                        else None))
            yield ('completionStatus', lambda: 'Complete')  # TODO: report errors / incomplete status

            if IStorageContainer.providedBy(obj) or IDataObject.providedBy(obj):
                yield ('metadata', lambda: dict(obj.metadata))

            if isinstance(obj, ObjectIdContainer):
                yield ('children', lambda: [(child.oid if IInStorageContainer.providedBy(child)
                                             else child.__name__) for child in obj.listcontent()])
                yield ('childrenrange', lambda: '0-%d' % len(obj.listcontent()))
            elif IStorageContainer.providedBy(obj):
                yield ('children', lambda: [(child.name if IDataObject.providedBy(child)
                                             else child.__name__) for child in obj.listcontent()])
                yield ('childrenrange', lambda: '0-%d' % len(obj.listcontent()))
            elif IDataObject.providedBy(obj) and render_value:
                # NOTE: 'value' attribute name is mandated by the specification
                if 'value' in attrs:
                    begin, end = (int(v) for v in attrs['value'])
                else:
                    begin = 0
                    end = None
                yield ('value', lambda: get_data(obj, begin=begin, end=end))
                yield ('valuetransferencoding', lambda: 'base64')
            elif ISystemCapability.providedBy(obj):
                yield ('children', lambda: [])
                yield ('childrenrange', lambda: '0-0'),
                yield ('capabilities', lambda: current_capabilities.system)
Beispiel #2
0
    def render_get(self, request):
        if not request.interaction.checkPermission('view', self.context):
            raise NotFound

        cdmi = request.getHeader('X-CDMI-Specification-Version')

        if cdmi or not IDataObject.providedBy(self.context):
            request.setHeader('Content-Type', self.object_type_map[self.context.type])
            log.debug('Received arguments: %s', request.args)
            attrs = dict(self.parse_args_to_filter_attrs(request.args))
            return self.object_to_dict(self.context, request, attrs=attrs)
        else:
            return self.handle_noncdmi_get(request)
Beispiel #3
0
    def handle_success(self, r, request, obj, principal, update, dstream, encoding):
        if not update:
            obj.__owner__ = principal
            self.context.add(obj)

        if IDataObject.providedBy(obj):
            # XXX this is a hack and it doesn't feel the extraction should
            # happen here. But cannot come up with smarter ideas at the moment
            credentials = request.getHeader('X-Auth-Token')
            self.store_object(obj, dstream, encoding, credentials)

        self.add_log_event(principal, '%s of %s (%s) via CDMI was successful' %
                           ('Creation' if not update else 'Update', obj.name, obj.__name__))
Beispiel #4
0
    def object_to_dict(self, obj):
        parent_oid = (obj.__parent__.oid if not IRootContainer.providedBy(obj) else None)

        data = {'objectType': self.object_type_map[obj.type],
                'objectID': obj.oid,
                'objectName': obj.name,
                'parentURI': obj.__parent__.__name__,
                'parentID': parent_oid,
                'completionStatus': 'Complete',
                'metadata': dict(obj.metadata),
                'childrenrange': '0-%d' % len(obj.listcontent()),
                'children': [child.name if IDataObject.providedBy(child)
                             else child.__name__
                             for child in obj.listcontent()]}

        data.update(self.get_additional_data(obj))
        return data
Beispiel #5
0
 def render_delete(self, request):
     name = unicode(parse_path(request.path)[-1])
     existing_object = self.context.__parent__[name]
     if existing_object:
         log.debug('Deleting %s', self.context)
         # are we deleting a container?
         if IStorageContainer.providedBy(self.context):
             # check children
             children = [child for child in self.context.listcontent() if
                         IDataObject.providedBy(child) or
                         IStorageContainer.providedBy(child)]
             if len(children) > 0:
                 raise BadRequest('Attempt to delete a non-empty container')
         else:
             # XXX: Alternative authentication methods!
             credentials = request.getHeader('X-Auth-Token')
             storemgr = getAdapter(self.context, IDataStoreFactory).create()
             storemgr.delete(credentials)
         del self.context.__parent__[name]
         handle(self.context, ModelDeletedEvent(self.context.__parent__))
     else:
         raise NotFound