def post(self, request, *args, **kwargs): uuid_ = request.POST.get('uuid', None) if uuid_: client = get_redis_client() name = 'rule:{}'.format(uuid_) try: strategy_group_list = json.loads(client.hget( name, 'strategys')) strategy_list = [ d['strategy_list'][0] for d in strategy_group_list ] uuids = [x[0] for x in strategy_list] members = (self._get_bool_strategy_args(uuids, client) | self._get_freq_strategy_args(uuids, client) | self._get_menu_strategy_args(uuids, client) | self._get_user_strategy_args(uuids, client)) except Exception: return self.render_json_response({'state': False}) req_body = {} for member in members: 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): form = self.form_class(data=request.POST) if form.is_valid(): uuid_ = request.POST.get('strategy') req_body = request.POST.get('req_body', '') req_body = json.loads(req_body) client = get_redis_client() name = 'bool_strategy:{}'.format(uuid_) d = client.hgetall(name) strategy = BoolStrategy(d) func = strategy.get_callable() if not isinstance(req_body, list): req_body = [req_body] results = [] for req in req_body: resp = func(req) if resp: results.append(_("Hit")) else: results.append(_("Missed")) 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 post(self, request, *args, **kwargs): uuid = request.POST.get('uuid', None) if uuid: client = get_redis_client() name = 'user_strategy:{}'.format(uuid) d = client.hgetall(name) strategy_body = d['strategy_body'] members = strategy_body.split(",") history = {"user_id": "xxxxxx"} req_body = {"user_id": "xxxxxx"} for member in members: history[member] = "yyyyyy" req_body[member] = "yyyyyy" ts = int(time.time()) history_data = [] for _ in range(3): history["timestamp"] = ts history_data.append(history) return self.render_json_response({ 'state': True, 'history_data': history_data, 'req_body': req_body }) else: return self.render_json_response({ 'state': False })
def post(self, request, *args, **kwargs): form = MenuStrategyTestForm(data=request.POST) if form.is_valid(): uuid_ = request.POST.get('strategy') req_body = form.cleaned_data['req_body'] results = [] client = get_redis_client() name = 'strategy_menu:{}'.format(uuid_) d = client.hgetall(name) strategy = MenuStrategy(d) func = strategy.get_callable() if not isinstance(req_body, list): req_body = [req_body] for req in req_body: res = func(req) results.append(_("Hit") if res else _("Missed")) 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 get_rule(self): uuid_ = self.request.GET.get('id') if not uuid_: raise Http404 client = get_redis_client() name = 'rule:{}'.format(uuid_) d = client.hgetall(name) if not d: raise Http404 data = {} for key in ("status", 'title', 'describe', 'end_time', 'id', 'uuid'): data[key] = d[key] try: rule_list = json.loads(d["strategys"]) except ValueError: rule_list = [] for rule in rule_list: rule["group_name"] = rule["name"] rule["weight"] = rule.get('weight', '') rule["control_display"] = CONTROL_MAP.get(rule["control"], rule["control"]) rule["strategy_name"] = ";".join(x[2] for x in rule["strategy_list"] if len(x) == 3) rule["strategy_list_str"] = json.dumps(rule["strategy_list"]) data['rule_list'] = rule_list return data
def _check_event(event_code): """Whether the check list item is referenced by list Policy""" client = get_redis_client() for key in client.scan_iter(match="strategy_menu:*"): event_id = client.hget('event', key) if event_code == event_id: return True return False
def _build_strategy_choices(cls): client = get_redis_client() choices = [] for name in client.scan_iter(match="user_strategy:*"): d = client.hgetall(name) if 'uuid' in d and 'strategy_name' in d: choices.append((d['uuid'], d['strategy_name'])) return choices
def tearDownClass(cls): super(BaseTestCase, cls).tearDownClass() # Clean up the test library db = get_mongo_client() db.client.drop_database(db.name) client = get_redis_client() client.flushdb()
def save(self): client = get_redis_client() cd = self.cleaned_data name_key = cd['name_key'] name_show = cd['name_show'] content = cd['content'] content.update(name_show=name_show) client.hset(self.map_key, name_key, json.dumps(content)) return name_key
def _build_strategy_choices(cls): client = get_redis_client() choices = [] for name in client.scan_iter(match="freq_strategy:*"): d = client.hgetall(name) if 'uuid' in d and 'strategy_name' in d: choices.append((d['uuid'], d['strategy_name'])) # choices.insert(0, ("", "Please choose a PolicyName")) return choices
def post(self, request, *args, **kwargs): db = get_mongo_client() ids = request.POST.get('ids') try: assert ids obj_ids = [ObjectId(id_) for id_ in ids.split(',')] except Exception: return self.render_json_response( dict(state=False, error=_("ID is illegal"))) redis_values_should_remove = defaultdict(list) menus_records = list(db['menus'].find( { '_id': { "$in": obj_ids }, 'menu_status': 'valid' }, { 'event_code': True, '_id': False, 'dimension': True, 'menu_type': True, 'value': True, })) if not menus_records: return self.render_json_response( dict(state=False, error=_("Records don't exist"))) for d in menus_records: redis_key = build_redis_key(d['event_code'], d['dimension'], d['menu_type']) if redis_key: redis_values_should_remove[redis_key].append(d['value']) update_payload = { 'menu_status': 'invalid', 'creator': request.user.username, 'create_time': datetime.now(), } try: db.menus.update_many({'_id': { "$in": obj_ids }}, {"$set": update_payload}) # Simultaneous delete redis data redis_client = get_redis_client() pipeline = redis_client.pipeline(transaction=False) for key, values in redis_values_should_remove.items(): pipeline.srem(key, *values) pipeline.execute() except Exception: return self.render_json_response( dict(state=False, error=_("Operation failed, please try again later"))) return self.render_json_response(dict(state=True, msg=_("ok")))
def post(self, request, *args, **kwargs): uuid_ = request.POST.get('id', None) if uuid_: client = get_redis_client() name = 'rule:{}'.format(uuid_) client.delete(name) return self.render_json_response({'state': True, 'msg': _("ok")}) return self.render_json_response({ 'state': False, 'error': _("No rules found") })
def render_strategy_source(value): client = get_redis_client() data = client.hget("CONFIG_SOURCE_MAP", value) if data: try: name = json.loads(data).get('name_show', '') except ValueError: return value if name: return "{0}({1})".format(name, value) return value
def _check_strategy(strategy_id): """Check whether Policy is referenced by a rule in force""" client = get_redis_client() 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: return True, rule["id"] return False, None
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, *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 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 clean_name_key(self): name_key = self.cleaned_data['name_key'] error_message = _("Incorrect input with some special characters") if not re.match(self.name_key_pattern, name_key): raise forms.ValidationError(error_message) client = get_redis_client() error_message = _("The data source already exists") if client.hget(self.map_key, name_key): raise forms.ValidationError(error_message) return name_key
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 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'] # Currently only used in testing, for simplicity, type is not configurable 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 post(self, request, *args, **kwargs): uuid = request.POST.get('uuid', None) if uuid: client = get_redis_client() name = 'strategy_menu:{}'.format(uuid) d = client.hgetall(name) dimension = d['dimension'] req_body = {dimension: "xxxxx"} else: req_body = {} return self.render_json_response({ 'state': True, 'req_body': req_body })
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'] = [ _("The data source is not{}").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'] = [ _("This record already exists, do not add it twice") ] self.values_sign = values_sign
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(cls, 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': en, 'type': type_}) item['name_show'] = name_show item['content'] = content rs.append(item) return rs
def post(self, request, *args, **kwargs): try: data = self._parse_data(request, *args, **kwargs) except ValueError as e: return self.render_json_response({ 'state': False, 'error': str(e), }) client = get_redis_client() name = 'rule:{}'.format(data['uuid']) for key, value in self._build_key_value(self, data): client.hset(name, key, value) return self.render_json_response({ 'state': True, 'redirect_url': reverse("rule:detail") })
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 save(self, *args, **kwargs): """When adding, update is add value if there is the same dimension value, project plus ListType""" 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='valid', 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 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): 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=_("The Policy is being referenced by the rule").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") ))