def _delete(self, schema, data): if True: # try: uuid = data['uuid'] if schema in objectmodels.keys(): self.log("Looking for object to be deleted.", lvl=debug) storageobject = objectmodels[schema].find_one({'uuid': uuid}) self.log("Found object.", lvl=debug) self.log("Fields:", storageobject._fields, "\n\n\n", storageobject.__dict__) storageobject.delete() self.log("Preparing notification.", lvl=debug) notification = objectdeletion(uuid, schema) if uuid in self.subscriptions: deletion = {'component': 'objectmanager', 'action': 'deletion', 'data': uuid } for recipient in self.subscriptions[uuid]: self.fireEvent(send(recipient, deletion)) del (self.subscriptions[uuid]) result = {'component': 'objectmanager', 'action': 'delete', 'data': (True, schema, storageobject.uuid), } return result, notification else: self.log("Unknown schema encountered: ", schema, lvl=warn)
def objectmanagerrequest(self, event): """OM event handler for incoming events :param event: OMRequest with incoming OM pagename and pagedata """ self.log("Event: '%s'" % event.__dict__) action = event.action data = event.data if action not in ['subscribe', 'unsubscribe']: if 'schema' in data: schema = data['schema'] else: self.log("No Schema given, cannot act!", lvl=critical) return if 'filter' in data: objectfilter = data['filter'] else: objectfilter = {} result = None notification = None if action == "list": if schema in objectmodels.keys(): if 'fields' in data: fields = data['fields'] else: fields = [] objlist = [] if objectmodels[schema].count(objectfilter) > WARNSIZE: self.log("Getting a very long list of items for ", schema, lvl=warn) for item in objectmodels[schema].find(objectfilter): try: if fields in ('*', ['*']): objlist.append(item.serializablefields()) else: listitem = {'uuid': item.uuid} if 'name' in item._fields: listitem['name'] = item._fields['name'] for field in fields: if field in item._fields: listitem[field] = item._fields[field] else: listitem[field] = None objlist.append(listitem) except Exception as e: self.log("Faulty object or field: ", e, type(e), item._fields, fields, lvl=error, exc=True) self.log("Generated object list: ", objlist) result = {'component': 'objectmanager', 'action': 'list', 'data': {'schema': schema, 'list': objlist } } else: self.log("Schemata: ", objectmodels.keys()) self.log("List for unavailable schema requested: ", schema, lvl=warn) elif action == "search": if schema in objectmodels.keys(): # objectfilter['$text'] = {'$search': str(data['search'])} objectfilter = { 'name': {'$regex': str(data['search']), '$options': '$i'}} # if 'fields' in data: # fields = data['fields'] # else: fields = [] reqid = data['req'] objlist = [] if collections[schema].count() > WARNSIZE: self.log("Getting a very long list of items for ", schema, lvl=warn) self.log("Objectfilter: ", objectfilter, ' Schema: ', schema, lvl=warn) # for item in collections[schema].find(objectfilter): for item in collections[schema].find(objectfilter): self.log("Search found item: ", item, lvl=warn) try: # TODO: Fix bug in warmongo that needs this workaround: item = objectmodels[schema](item) listitem = {'uuid': item.uuid} if 'name' in item._fields: listitem['name'] = item.name for field in fields: if field in item._fields: listitem[field] = item._fields[field] else: listitem[field] = None objlist.append(listitem) except Exception as e: self.log("Faulty object or field: ", e, type(e), item._fields, fields, lvl=error) self.log("Generated object search list: ", objlist) result = {'component': 'objectmanager', 'action': 'search', 'data': {'schema': schema, 'list': objlist, 'req': reqid } } else: self.log("List for unavailable schema requested: ", schema, lvl=warn) elif action == "get": if 'subscribe' in data: subscribe = data['subscribe'] is True else: subscribe = False try: uuid = str(data['uuid']) except (KeyError, TypeError): uuid = "" if objectfilter == {}: if uuid == "": self.log('Object with no filter/uuid requested:', schema, data, lvl=error) return objectfilter = {'uuid': uuid} storageobject = None if schema in objectmodels.keys(): storageobject = objectmodels[schema].find_one(objectfilter) if not storageobject: if uuid.upper == "CREATE": # TODO: Fix this, a request for an existing object is a # request for an existing object, a creation request is # not. self.log("Object not found, creating: ", data) storageobject = objectmodels[schema]({'uuid': str(uuid4())}) if "useruuid" in schemastore[schema]['schema']['properties']: storageobject.useruuid = event.user.uuid self.log("Attached initial owner's id: ", event.user.uuid) else: self.log("Object not found and not willing to create.", lvl=warn) result = { 'component': 'objectmanager', 'action': 'nonexistant', 'data': { 'schema': schema, } } else: self.log('Object for invalid schema requested!', schema, lvl=error) if storageobject: self.log("Object found, delivering: ", data) if subscribe and uuid != "": self.log('Updating subscriptions', lvl=debug) if uuid in self.subscriptions: if not event.client.uuid in self.subscriptions[uuid]: self.subscriptions[uuid].append(event.client.uuid) else: self.subscriptions[uuid] = [event.client.uuid] result = {'component': 'objectmanager', 'action': 'get', 'data': storageobject.serializablefields() } elif action == "subscribe": uuid = data if uuid in self.subscriptions: if not event.client.uuid in self.subscriptions[uuid]: self.subscriptions[uuid].append(event.client.uuid) else: self.subscriptions[uuid] = [event.client.uuid] result = {'component': 'objectmanager', 'action': 'subscribe', 'data': {'uuid': uuid, 'success': True} } elif action == "unsubscribe": # TODO: Automatic Unsubscription uuid = data if uuid in self.subscriptions: self.subscriptions[uuid].remove(event.client.uuid) if len(self.subscriptions[uuid]) == 0: del (self.subscriptions[uuid]) result = {'component': 'objectmanager', 'action': 'unsubscribe', 'data': {'uuid': uuid, 'success': True} } elif action == "put": result, notification = self._put(schema, data) elif action == 'delete': result, notification = self._delete(schema, data) elif action == 'change': result, notification = self._change(schema, data) else: self.log("Unsupported action: ", action, event, event.__dict__, lvl=warn) return if notification: try: self.fireEvent(notification) except Exception as e: self.log("Transmission error during notification: %s" % e, lvl=error) if result: try: self.fireEvent(send(event.client.uuid, result)) except Exception as e: self.log("Transmission error during response: %s" % e, lvl=error)
def objectmanagerrequest(self, event): """OM event handler for incoming events :param event: OMRequest with incoming OM pagename and pagedata """ hfoslog("[OM] Event: '%s'" % event.__dict__) try: action = event.action data = event.data schema = data['schema'] result = None if action == "list": if schema in objectmodels.keys(): if 'filter' in data: filter = data['filter'] else: filter = {} if 'fields' in data: fields = data['fields'] else: fields = [] objlist = [] if objectmodels[schema].count(filter) > WARNSIZE: hfoslog("[OM] Getting a very long list of items for ", schema, lvl=warn) for item in objectmodels[schema].find(filter): try: listitem = {'uuid': item.uuid, 'name': item.name} for field in fields: if field in item._fields: listitem[field] = item._fields[field] else: listitem[field] = None objlist.append(listitem) except Exception as e: hfoslog("[OM] Faulty object or field: ", item._fields, fields, lvl=error) hfoslog("[OM] Generated object list: ", objlist) result = {'component': 'objectmanager', 'action': 'list', 'data': {'schema': schema, 'list': objlist } } else: hfoslog("[OM] List for unavailable schema requested: ", schema, lvl=warn) elif action == "get": uuid = data['uuid'] obj = None if schema in objectmodels.keys() and uuid.upper != "CREATE": obj = objectmodels[schema].find_one({'uuid': uuid}) if not obj: hfoslog("[OM] Object not found, creating: ", data) obj = objectmodels[schema]({'uuid': str(uuid4())}) else: hfoslog("[OM] Object found, delivering: ", data) result = {'component': 'objectmanager', 'action': 'get', 'data': obj.serializablefields() } elif action == "put": try: putobj = data['obj'] uuid = putobj['uuid'] except KeyError: hfoslog("[OM] Put request with missing arguments!", event, lvl=critical) return try: if uuid != 'create': obj = objectmodels[schema].find_one({'uuid': uuid}) else: putobj['uuid'] = uuid4() if obj: hfoslog("[OM] Updating object:", obj._fields, lvl=debug) obj.update(putobj) else: obj = objectmodels[schema](putobj) hfoslog("[OM] Storing object:", obj._fields, lvl=debug) try: obj.validate() except ValidationError: hfoslog("[OM] Validation of new object failed!", data, lvl=warn) obj.save() hfoslog("[OM] Object stored.") result = {'component': 'objectmanager', 'action': 'put', 'data': (True, obj.uuid), } except Exception as e: hfoslog("[OM] Error during object storage:", e, type(e), lvl=error) else: hfoslog("[OM] Unsupported action: ", action, event, event.__dict__, lvl=warn) return if result: try: self.fireEvent(send(event.client.uuid, result)) except Exception as e: hfoslog("[OM] Transmission error before broadcast: %s" % e, lvl=error) except Exception as e: hfoslog("[OM] Error: '%s' %s" % (e, type(e)), lvl=error)
def objectmanagerrequest(self, event): """OM event handler for incoming events :param event: OMRequest with incoming OM pagename and pagedata """ hfoslog("[OM] Event: '%s'" % event.__dict__) try: action = event.action data = event.data schema = data['schema'] result = None if action == "list": if schema in objectmodels.keys(): if 'filter' in data: filter = data['filter'] else: filter = {} if 'fields' in data: fields = data['fields'] else: fields = [] objlist = [] if objectmodels[schema].count(filter) > WARNSIZE: hfoslog("[OM] Getting a very long list of items for ", schema, lvl=warn) for item in objectmodels[schema].find(filter): try: listitem = {'uuid': item.uuid, 'name': item.name} for field in fields: if field in item._fields: listitem[field] = item._fields[field] else: listitem[field] = None objlist.append(listitem) except Exception as e: hfoslog("[OM] Faulty object or field: ", item._fields, fields, lvl=error) hfoslog("[OM] Generated object list: ", objlist) result = { 'component': 'objectmanager', 'action': 'list', 'data': { 'schema': schema, 'list': objlist } } else: hfoslog("[OM] List for unavailable schema requested: ", schema, lvl=warn) elif action == "get": uuid = data['uuid'] obj = None if schema in objectmodels.keys() and uuid.upper != "CREATE": obj = objectmodels[schema].find_one({'uuid': uuid}) if not obj: hfoslog("[OM] Object not found, creating: ", data) obj = objectmodels[schema]({'uuid': str(uuid4())}) else: hfoslog("[OM] Object found, delivering: ", data) result = { 'component': 'objectmanager', 'action': 'get', 'data': obj.serializablefields() } elif action == "put": try: putobj = data['obj'] uuid = putobj['uuid'] except KeyError: hfoslog("[OM] Put request with missing arguments!", event, lvl=critical) return try: if uuid != 'create': obj = objectmodels[schema].find_one({'uuid': uuid}) else: putobj['uuid'] = uuid4() if obj: hfoslog("[OM] Updating object:", obj._fields, lvl=debug) obj.update(putobj) else: obj = objectmodels[schema](putobj) hfoslog("[OM] Storing object:", obj._fields, lvl=debug) try: obj.validate() except ValidationError: hfoslog("[OM] Validation of new object failed!", data, lvl=warn) obj.save() hfoslog("[OM] Object stored.") result = { 'component': 'objectmanager', 'action': 'put', 'data': (True, obj.uuid), } except Exception as e: hfoslog("[OM] Error during object storage:", e, type(e), lvl=error) else: hfoslog("[OM] Unsupported action: ", action, event, event.__dict__, lvl=warn) return if result: try: self.fireEvent(send(event.client.uuid, result)) except Exception as e: hfoslog("[OM] Transmission error before broadcast: %s" % e, lvl=error) except Exception as e: hfoslog("[OM] Error: '%s' %s" % (e, type(e)), lvl=error)