Beispiel #1
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})
Beispiel #2
0
    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)
Beispiel #3
0
 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
         })
Beispiel #4
0
    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)
Beispiel #5
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
Beispiel #6
0
 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
Beispiel #7
0
 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
Beispiel #8
0
    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()
Beispiel #9
0
 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
Beispiel #10
0
 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
Beispiel #11
0
    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")))
Beispiel #12
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': _("No rules found")
     })
Beispiel #13
0
 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
Beispiel #14
0
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
Beispiel #15
0
 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_
Beispiel #16
0
    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_
Beispiel #17
0
 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
Beispiel #18
0
    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
Beispiel #19
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_
Beispiel #20
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']

    # 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
Beispiel #21
0
 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
     })
Beispiel #22
0
    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
Beispiel #23
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
Beispiel #24
0
    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
Beispiel #25
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': en, 'type': type_})
         item['name_show'] = name_show
         item['content'] = content
         rs.append(item)
     return rs
Beispiel #26
0
    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")
        })
Beispiel #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
Beispiel #28
0
    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
Beispiel #29
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
         })
Beispiel #30
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=_("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")
        ))