コード例 #1
0
ファイル: forms.py プロジェクト: GamerCode/aswan
 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_
コード例 #2
0
 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_
コード例 #3
0
ファイル: forms.py プロジェクト: GamerCode/aswan
    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_
コード例 #4
0
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
コード例 #5
0
ファイル: forms.py プロジェクト: GamerCode/aswan
    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
コード例 #6
0
ファイル: forms.py プロジェクト: GamerCode/aswan
 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
コード例 #7
0
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
コード例 #8
0
    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"))
コード例 #9
0
    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
コード例 #10
0
 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
コード例 #11
0
ファイル: models.py プロジェクト: onisama/-
    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
コード例 #12
0
 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
コード例 #13
0
ファイル: views.py プロジェクト: onisama/-
    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
コード例 #14
0
ファイル: views.py プロジェクト: onisama/-
    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")
        })
コード例 #15
0
 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})
コード例 #16
0
    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})
コード例 #17
0
    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"))
コード例 #18
0
ファイル: views.py プロジェクト: onisama/-
 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)
コード例 #19
0
ファイル: init_data.py プロジェクト: onisama/-
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)
コード例 #20
0
 def get_all_strategy_configs(self):
     client = get_redis_client()
     return [
         client.hgetall(name)
         for name in client.scan_iter(match=self.key_prefix)
     ]
コード例 #21
0
# 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])