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)
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)
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__))
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
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