def novabase_simplify(self, obj, skip_complex_processing=False): """Simplify a NovaBase object.""" if not self.already_processed(obj): # obj.update_foreign_keys() key = self.get_cache_key(obj) if self.simple_cache.has_key(key): simplified_object = self.simple_cache[key] else: novabase_classname = str(obj.__class__.__name__) if novabase_classname == "LazyReference" or novabase_classname == "LazyValue": novabase_classname = obj.resolve_model_name() if isinstance(obj, dict) and "novabase_classname" in obj: novabase_classname = obj["novabase_classname"] tmp = { "simplify_strategy": "novabase", "tablename": obj.__tablename__, "novabase_classname": novabase_classname, "id": obj.id, "_pid": extract_adress(obj) } if hasattr(tmp, "user_id"): tmp = utils.merge_dicts(obj, {"user_id": obj.user_id}) if hasattr(tmp, "project_id"): tmp = utils.merge_dicts(tmp, {"project_id": obj.project_id}) if not key in self.simple_cache: self.simple_cache[key] = tmp self.target_cache[key] = obj simplified_object = tmp if skip_complex_processing: return simplified_object key = self.get_cache_key(obj) if not key in self.simple_cache: self.simple_cache[key] = simplified_object self.target_cache[key] = obj complex_object = self.extract_complex_object(obj) metadata_class_name = novabase_classname complex_object[ "_metadata_novabase_classname"] = metadata_class_name complex_object["_pid"] = extract_adress(obj) complex_object["_rid"] = str(self.request_uuid) if not key in self.complex_cache: self.complex_cache[key] = complex_object else: key = self.get_cache_key(obj) simplified_object = self.simple_cache[key] return simplified_object
def object_simplify(self, obj): """Convert this object to dictionnary that contains simplified values: every value is simplified according to the appropriate strategy.""" result = obj do_deep_simplification = False is_basic_type = False try: if hasattr(obj, "__dict__") or obj.__class__.__name__ == "dict": do_deep_simplification = True except: is_basic_type = True if do_deep_simplification and not is_basic_type: novabase_classname = str(obj.__class__.__name__) if novabase_classname == "LazyReference" or novabase_classname == "LazyValue": novabase_classname = obj.resolve_model_name() if isinstance(obj, dict) and "novabase_classname" in obj: novabase_classname = obj["novabase_classname"] # Initialize fields to iterate if hasattr(obj, "reload_default_values"): obj.reload_default_values() result = self.extract_complex_object(obj) if utils.is_novabase(obj): key = self.get_cache_key(obj) if not key in self.complex_cache: self.complex_cache[key] = result self.simple_cache[key] = self.novabase_simplify(obj, True) self.target_cache[key] = obj metadata_class_name = novabase_classname metadata_dict = { "_metadata_novabase_classname": metadata_class_name, "_pid": extract_adress(obj), "_rid": str(self.request_uuid) } self.complex_cache[key] = utils.merge_dicts( self.complex_cache[key], metadata_dict) self.simple_cache[key] = utils.merge_dicts( self.simple_cache[key], metadata_dict) result = self.complex_cache[key] return result
def lock(self, name, ttl): self.unlock(name, only_expired=True) retry = 0 request_uuid = ("%s_%s" % (self.uuid, name)).__hash__() while retry < self.retry_count: now = time.time() failed = False keys = map(lambda x: "%s_%s" % (x, name), self.lock_labels) lock_value = {"host": self.uuid, "start_date": now, "ttl": ttl, "request_uuid": request_uuid} processed_keys = [] for key in keys: lock_value_with_key = merge_dicts(lock_value, {"key": key}) result = self.redis_client.hsetnx("lock", key, json.dumps(lock_value_with_key)) if result == 0: failed = True break else: processed_keys += [key] if failed: self.redis_client.hdel("lock", processed_keys) retry += 1 time.sleep(random.uniform(0.005, 0.010)) else: return True return False
def query(self, *entities, **kwargs): from lib.rome.core.orm.query import Query return Query(*entities, **merge_dicts(kwargs, {"session": self}))