コード例 #1
0
ファイル: views.py プロジェクト: leeeeey/aswan
 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})
コード例 #2
0
 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})
コード例 #3
0
    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
コード例 #4
0
ファイル: views.py プロジェクト: leeeeey/aswan
    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(u"命中" if res else u"不命中")
            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)
コード例 #5
0
ファイル: views.py プロジェクト: leeeeey/aswan
    def post(self, request, *args, **kwargs):
        form = self.form_class(data=request.POST)
        if form.is_valid():
            uuid_ = form.cleaned_data['strategy']
            req_body = form.cleaned_data["req_body"]
            history_data = form.cleaned_data['history_data'] or None

            client = get_redis_client()
            name = 'user_strategy:{}'.format(uuid_)
            d = client.hgetall(name)
            strategy = UserStrategy(d)
            strategy_day = int(d['strategy_day'])
            threshold = int(d['strategy_limit'])

            if not isinstance(req_body, list):
                req_body = [req_body]
            if history_data:
                func = strategy.get_callable()
                raw_results = [func(req, history_data) for req in req_body]
            else:
                func = strategy.get_callable_from_threshold_list(
                    [strategy_day, threshold])
                raw_results = [func(req) for req in req_body]
            results = [u"命中" if i else u"不命中" for i in raw_results]
            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)
コード例 #6
0
ファイル: views.py プロジェクト: leeeeey/aswan
    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(u"命中")
                else:
                    results.append(u"不命中")
            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)
コード例 #7
0
ファイル: forms.py プロジェクト: leeeeey/aswan
 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
コード例 #8
0
ファイル: views.py プロジェクト: leeeeey/aswan
 def _check_event(self, event_code):
     """check名单项目是否被名单策略原子引用"""
     client = get_redis_client()
     for r in client.scan_iter(match="strategy_menu:*"):
         event_id = client.hget(r, 'event')
         if event_code == event_id:
             return True
     return False
コード例 #9
0
 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': u"未找到规则"})
コード例 #10
0
ファイル: forms.py プロジェクト: leeeeey/aswan
 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
コード例 #11
0
ファイル: testcase.py プロジェクト: leeeeey/aswan
    def tearDownClass(cls):
        super(BaseTestCase, cls).tearDownClass()

        # 清理测试库
        db = get_mongo_client()
        db.client.drop_database(db.name)

        client = get_redis_client()
        client.flushdb()
コード例 #12
0
ファイル: forms.py プロジェクト: leeeeey/aswan
    def clean_name_key(self):
        name_key = self.cleaned_data['name_key']
        if not re.match(self.name_key_pattern, name_key):
            raise forms.ValidationError("输入错误,包含某些特殊字符")

        client = get_redis_client()
        if client.hget(self.map_key, name_key):
            raise forms.ValidationError("该数据源已存在")

        return name_key
コード例 #13
0
ファイル: views.py プロジェクト: leeeeey/aswan
    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=u"id不合法"))

        redis_values_should_remove = defaultdict(list)

        menus_records = list(db['menus'].find(
            {
                '_id': {
                    "$in": obj_ids
                },
                'menu_status': u'有效'
            }, {
                '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=u"记录均不存在"))

        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': u'无效',
            'creator': request.user.username,
            'create_time': datetime.now(),
        }
        try:
            db.menus.update_many({'_id': {
                "$in": obj_ids
            }}, {"$set": update_payload})

            #  同时删除redis中数据
            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=u"操作失败,请稍后重试"))
        return self.render_json_response(dict(state=True, msg="ok"))
コード例 #14
0
ファイル: views.py プロジェクト: leeeeey/aswan
 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})
コード例 #15
0
ファイル: tables.py プロジェクト: leeeeey/aswan
 def render_strategy_source(self, 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 u"{0}({1})".format(name, value)
     return value
コード例 #16
0
ファイル: forms.py プロジェクト: leeeeey/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
コード例 #17
0
ファイル: forms.py プロジェクト: leeeeey/aswan
 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_
コード例 #18
0
ファイル: forms.py プロジェクト: leeeeey/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_
コード例 #19
0
ファイル: forms.py プロジェクト: leeeeey/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_
コード例 #20
0
ファイル: forms.py プロジェクト: leeeeey/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
コード例 #21
0
ファイル: init_data.py プロジェクト: leeeeey/aswan
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']

    # 目前仅仅用于测试中,为了简单,type暂不可配置
    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
コード例 #22
0
ファイル: views.py プロジェクト: leeeeey/aswan
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
コード例 #23
0
ファイル: views.py プロジェクト: leeeeey/aswan
 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
コード例 #24
0
ファイル: models.py プロジェクト: leeeeey/aswan
    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
コード例 #25
0
ファイル: views.py プロジェクト: leeeeey/aswan
    def post(self, request, *args, **kwargs):
        uuid = request.POST.get('id', None)
        is_using, using_rule_ids = _check_strategy(uuid)
        if is_using:
            return self.render_json_response(
                dict(state=False,
                     error=u"该策略原子正被规则{}引用".format(
                         (', '.join(using_rule_ids)))))
        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"))
コード例 #26
0
ファイル: views.py プロジェクト: leeeeey/aswan
 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
コード例 #27
0
    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
コード例 #28
0
ファイル: views.py プロジェクト: leeeeey/aswan
 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})
コード例 #29
0
    def post(self, request, *args, **kwargs):
        try:
            data = self._parse_data(request)
        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(data):
            client.hset(name, key, value)
        return self.render_json_response({
            'state': True,
            'redirect_url': reverse("rule:detail")
        })
コード例 #30
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})