def save(self, *args, **kwargs): client = get_redis_client() uuid_ = str(uuid.uuid4()) name = 'user_strategy:{}'.format(uuid_) payload = {} for key in ('strategy_name', 'strategy_desc', 'strategy_day', 'strategy_body', 'strategy_limit', 'strategy_source'): payload[key] = self.cleaned_data.get(key, '') payload['uuid'] = uuid_ client.hmset(name, payload) client.sadd(settings.STRATEGY_SIGN_KEY, self.values_sign) return uuid_
def save(self): client = get_redis_client() uuid_ = str(uuid.uuid4()) name = 'bool_strategy:{}'.format(uuid_) payload = {} for key in ('strategy_name', 'strategy_desc', 'strategy_var', 'strategy_op', 'strategy_func', 'strategy_threshold'): payload[key] = self.cleaned_data.get(key, '') payload['uuid'] = uuid_ client.hmset(name, payload) client.sadd(settings.STRATEGY_SIGN_KEY, self.values_sign) return uuid_
def save(self, *args, **kwargs): client = get_redis_client() uuid_ = str(uuid.uuid4()) name = 'strategy_menu:{}'.format(uuid_) payload = {'uuid': uuid_} for key in ('strategy_name', 'strategy_desc', 'menu_op', 'event', 'dimension', 'menu_type'): payload[key] = self.cleaned_data.get(key, '') client.hmset(name, payload) client.sadd(settings.STRATEGY_SIGN_KEY, self.values_sign) return uuid_
def create_data_source(source_key=None, source_name=None, fields=None): source_key = source_key or get_sample_str(8) source_name = source_name or get_sample_str(8) fields = fields or ['user_id', 'uid'] content = {field: 'string' for field in fields} content['name_show'] = source_name map_key = 'CONFIG_SOURCE_MAP' client = get_redis_client() client.hset(map_key, source_key, json.dumps(content)) return source_key
def clean(self): client = get_redis_client() cd = self.cleaned_data source_key = cd['strategy_source'] strategy_body_str = cd.get('strategy_body', '') valid_bodys = json.loads(client.hget('CONFIG_SOURCE_MAP', source_key)) for strategy_body in strategy_body_str.split(','): if strategy_body not in valid_bodys: self.errors['strategy_body'] = [ u"数据源没有{}。".format(strategy_body) ] return fields = [str(cd.get(x, "")) for x in USER_STRATEGY_UNIQ_SET_KEYS] if not all(fields): return values_sign = ":".join(fields) client = get_redis_client() if client.sismember(settings.STRATEGY_SIGN_KEY, values_sign): self.errors['strategy_name'] = [u"该条记录已存在,请勿重复添加"] self.values_sign = values_sign
def is_exists(self, cleaned_data): client = get_redis_client() temp = copy.deepcopy(cleaned_data) temp.pop("strategy_desc", None) temp.pop("strategy_name", None) keys = sorted(temp.keys()) values_sign = "".join([temp[x] for x in keys]) exists = client.sismember(settings.STRATEGY_SIGN_KEY, values_sign) self.values_sign = values_sign if exists in (0, '0'): return False return True
def _check_strategy(strategy_id): """校验策略原子是否被生效中的规则引用""" client = get_redis_client() using_rule_ids = [] for r in client.scan_iter(match="rule:*"): rule = client.hgetall(r) strategy_group_list = json.loads(rule.get("strategys", '[]')) for strategy_group in strategy_group_list: strategy_list = strategy_group.get("strategy_list", []) for stategy_data in strategy_list: if stategy_data and stategy_data[0] == strategy_id: using_rule_ids.append(rule["id"]) return bool(using_rule_ids), using_rule_ids
def post(self, request, *args, **kwargs): uuid = request.POST.get('id', None) is_using, rule_id = _check_strategy(uuid) if is_using: return self.render_json_response( dict(state=False, error=u"该策略原子正被规则{}引用".format(rule_id))) client = get_redis_client() name = self.key_tpl.format(uuid=uuid) data = client.hgetall(name) values_sign = self.get_values_sign(data) client.srem(settings.STRATEGY_SIGN_KEY, values_sign) client.delete(name) return self.render_json_response(dict(state=True, msg="ok"))
def save(self, *args, **kwargs): """新增时,若存在维度值+项目+名单类型相同情况,则update为新增值""" cd = self.cleaned_data value_list = cd['value'] chinese_name = self.request.user.username error_datas = [] end_time = cd['end_time'].replace(tzinfo=None) db = get_mongo_client() redis_client = get_redis_client() for value in value_list: payload = dict( end_time=end_time, menu_desc=cd['menu_desc'], menu_status=u"有效", create_time=datetime.datetime.now(), creator=chinese_name ) value = value.strip() dimension = cd['dimension'] menu_type = cd['menu_type'] event_code = cd.get('event_code') condition = dict(value=value, event_code=event_code, menu_type=menu_type, dimension=dimension ) res = db.menus.find_one(condition) try: if not res: payload.update(condition) db.menus.insert_one(payload) else: db.menus.update_one({"_id": res.get("_id", '')}, {"$set": payload}) # 同时写redis redis_key = build_redis_key(event_code, dimension, menu_type) if redis_key: redis_client.sadd(redis_key, value) except Exception: error_datas.append(value) return error_datas
def get_queryset(self): client = get_redis_client() qs = client.hgetall("CONFIG_SOURCE_MAP") new_qs = [] name = self.request.GET.get('name', None) for name_key in qs: item = {"name_key": name_key} content = json.loads(qs[name_key]) name_show = content.pop('name_show', '') if name and name not in name_show: continue item['name_show'] = name_show item['content'] = json.dumps(content) new_qs.append(item) return new_qs
def create(self, creator_name, title, describe, status, end_time, strategy_confs): strategy_obj = Strategys() new_strategy_confs = [] for name, strategy_uuids, control, custom, weight in strategy_confs: strategy_uuids = strategy_uuids.split(';') new_strategy_confs.append({ 'name': name, 'custom': custom, 'control': control, 'weight': weight, 'strategy_list': [[ strategy_uuid, strategy_obj.get_thresholds(strategy_uuid), strategy_obj.get_strategy_name(strategy_uuid) ] for strategy_uuid in strategy_uuids] }) strategy_list = sorted(new_strategy_confs, key=lambda x: int(x["weight"]), reverse=True) rule_uuid = str(uuid.uuid4()) payload = { 'uuid': rule_uuid, 'user': creator_name, 'update_time': str(int(time.time())), 'end_time': datetime.strftime(end_time, '%Y-%m-%d %H:%M:%S'), 'title': title, 'describe': describe, 'status': status, 'strategys': json.dumps(strategy_list) } client = get_redis_client() rule_id = client.incr(settings.LAST_RULE_ID_KEY) payload['id'] = rule_id rule_key = 'rule:{}'.format(rule_uuid) client.hmset(rule_key, payload) return str(rule_id), rule_uuid
def get_source_data(self): client = get_redis_client() data_list = client.hgetall("CONFIG_SOURCE_MAP") rs = [] for name_key in data_list: item = {"name_key": name_key} raw_content = json.loads(data_list[name_key]) name_show = raw_content.pop('name_show', '') content = [] for en, type_ in raw_content.items(): zh = self.field_en_zh_map.get(en, en) content.append({'name': en, 'desc': zh, 'type': type_}) item['name_show'] = name_show item['content'] = content rs.append(item) return rs
def get_queryset(self): form_obj = self.filter_form(data=self.request.GET) form_obj.full_clean() status, rule_name = form_obj.cleaned_data.get( 'status'), form_obj.cleaned_data.get('rule_name') client = get_redis_client() result = [] for rule_key in client.scan_iter(match="rule:*"): rule_config = client.hgetall(rule_key) if status and rule_config.get('status', '') != status: continue if rule_name and rule_name not in rule_config.get('title', ''): continue result.append(rule_config) return result
def post(self, request, *args, **kwargs): try: data = self._parse_data(request) except ValueError as e: return self.render_json_response({ 'state': False, 'error': unicode(e), }) client = get_redis_client() name = 'rule:{}'.format(data['uuid']) for key, value in self._build_key_value(data): client.hset(name, key, value) return self.render_json_response({ 'state': True, 'redirect_url': reverse("rule:detail") })
def post(self, request, *args, **kwargs): uuid = request.POST.get('uuid', None) if uuid: client = get_redis_client() name = 'bool_strategy:{}'.format(uuid) d = client.hgetall(name) strategy_func = d['strategy_func'] required_args = BuiltInFuncs.get_required_args(strategy_func) req_body = {} for member in required_args: req_body[member] = "xxxxxx" return self.render_json_response({ 'state': True, 'req_body': req_body }) else: return self.render_json_response({'state': False})
def post(self, request, *args, **kwargs): try: data = json.loads(request.POST.get('data', '{}')) # 从参数中获取需要修改的规则uuid rule_uuid = data.get('rule_uuid', None) # 从参数中获取需要修改的策略组的下标 strategy_index = data.get('strategy_index', None) # 从参数中获取前端传参过来的策略列表 new_strategy_confs = data.get('strategy_list', None) assert strategy_index is not None assert isinstance(strategy_index, int) and strategy_index >= 0 assert all((rule_uuid, new_strategy_confs)) except (AssertionError, TypeError, ValueError): return self.render_json_response({'state': False, 'msg': '参数校验失败'}) client = get_redis_client() try: # 从redis中获取需要修改的规则所有数据 rule_conf = client.hgetall("rule:{}".format(rule_uuid)) # 从规则数据中获取策略组数据列表 strategy_confs = json.loads(rule_conf.get('strategys')) # 从策略组列表中找出需要编辑的策略组 strategy_conf = strategy_confs[strategy_index] except (TypeError, ValueError, IndexError, RedisError): return self.render_json_response({'state': False, 'msg': '配置读取失败'}) strategys_obj = Strategys() strategy_conf['strategy_list'] = [[ x['strategy_uuid'], x['threshold_list'], strategys_obj.build_strategy_name_from_thresholds( x['strategy_uuid'], x['threshold_list']) ] for x in new_strategy_confs] # 构造编辑后的策略组 strategy_confs[strategy_index] = strategy_conf # 回写策略组 rule_conf["strategys"] = json.dumps(strategy_confs) rule_conf['user'] = request.user.username rule_conf['update_time'] = str(int(time.time())) try: client.hmset("rule:{}".format(rule_uuid), rule_conf) # 回写规则数据 except RedisError: return self.render_json_response({'state': False, 'msg': '配置回写失败'}) return self.render_json_response({'state': True})
def post(self, request, *args, **kwargs): name_key = request.POST.get('name_key', "") if not name_key: return self.render_json_response( dict(state=False, error=u"name_key is required.")) client = get_redis_client() used_keys = set() for key in client.scan_iter(match="freq_strategy:*"): source_name = client.hget(key, 'strategy_source') if source_name: used_keys.add(source_name) for key in client.scan_iter(match="user_strategy:*"): source_name = client.hget(key, 'strategy_source') if source_name: used_keys.add(source_name) if name_key in used_keys: return self.render_json_response( dict(state=False, error=u"[{}]已被使用,不能删除".format(name_key))) client.hdel("CONFIG_SOURCE_MAP", name_key) return self.render_json_response(dict(state=True, msg="ok"))
def post(self, request, *args, **kwargs): form = self.form_class(data=request.POST) if form.is_valid(): uuid_ = request.POST.get('rule') name = "rule:{}".format(uuid_) conn = get_redis_client() id_ = conn.hget(name, 'id') req_body = form.cleaned_data['req_body'] if not isinstance(req_body, list): req_body = [req_body] from risk_models.rule import calculate_rule results = [] for req in req_body: result, _ = calculate_rule(id_, req) results.append(CONTROL_MAP[result]) if len(results) == 1: results = results[0] data = dict(state=True, data=results) else: data = dict(state=False, error=errors_to_dict(form.errors)) return self.render_json_response(data)
def add_element_to_menu(event_code, menu_type, dimension, element, end_time=None, menu_desc=None): """ 为名单中增加元素 :param str|unicode event_code: 名单项目code :param str|unicode menu_type: 名单类型 black white gray :param str|unicode dimension: 名单维度 user_id / ip / ... :param str|unicode element: 放入名单的元素 :param datetime end_time: 失效时间 :param str|unicode menu_desc: 备注 :return: """ end_time = (end_time or datetime.now() + timedelta(hours=1)) menu_desc = menu_desc or get_sample_str(15) payload = dict(end_time=end_time, menu_desc=menu_desc, menu_status=u"有效", create_time=datetime.now(), creator='test', value=element, event_code=event_code, dimension=dimension, menu_type=menu_type) db = get_mongo_client() insert_result = db['menus'].insert_one(payload) redis_client = get_redis_client() redis_key = build_redis_key(event_code, dimension=dimension, menu_type=menu_type) if redis_key: redis_client.sadd(redis_key, element) return str(insert_result.inserted_id)
def get_all_strategy_configs(self): client = get_redis_client() return [ client.hgetall(name) for name in client.scan_iter(match=self.key_prefix) ]
# coding=utf8 import json from core.redis_client import get_redis_client client = get_redis_client() __all__ = ["get_source_largest_period"] def _get_stategy_largest_period(strategy_type): """ 获取strategy_type类型的策略最大时长 """ # 1.在数据源和主体名称一致时,扫描strategy数据并获取最大时间段 uuid_source_body = {} strategys = {} for strategy_key in client.scan_iter(match=strategy_type + ":*"): strategy_data = client.hgetall(strategy_key) uuid = strategy_key.split(":")[-1] source = strategy_data.get('strategy_source', '') body = strategy_data.get('strategy_body', '') uuid_source_body[uuid] = [source, body] period = strategy_data.get("strategy_time") or strategy_data.get( "strategy_day") if period is None: continue key = "|".join(uuid_source_body[uuid]) strategys.setdefault(key, set()).add(int(period)) strategys_max = {} for key in strategys: strategys_max[key] = max(strategys[key])