Ejemplo n.º 1
0
def user_edit():
    '''
    用户编辑
    :return:
    '''
    id = request.argget.all('id')
    role_id = request.argget.all('role_id')
    active = str_to_num(request.argget.all('active', 0))

    s, r = arg_verify(reqargs=[("id", id), ("role_id", role_id)], required=True)
    if not s:
        return r

    data = {'msg': gettext("Update success"), 'msg_type': "s", "http_status":201}
    update_data = {
        'role_id': role_id,
        'active': active,
    }
    user = mdb_user.db.user.find_one({"_id": ObjectId(id)})
    if user:
        # 权限检查
        current_user_role = mdb_user.db.role.find_one({"_id": ObjectId(current_user.role_id)})
        edit_user_role = mdb_user.db.role.find_one({"_id": ObjectId(user["role_id"])})
        if edit_user_role \
                and get_num_digits(current_user_role["permissions"]) \
                <= get_num_digits(edit_user_role["permissions"]):
            # 没有权限修改
            data = {"msg_type": "w", "msg": gettext("No permission modification"),
                    "http_status":401}
            return data

    r = mdb_user.db.user.update_one({"_id": ObjectId(id)}, {"$set": update_data})
    if not r.modified_count:
        data = {'msg': gettext("No changes"), 'msg_type': "w", "http_status":201}
    return data
Ejemplo n.º 2
0
def user_restore():
    ids = json_to_pyseq(request.argget.all('ids', []))
    noper = 0
    re_ids = []
    for i in range(0, len(ids)):
        # 检查是否有权限
        current_user_role = mdb_user.db.role.find_one({"_id": ObjectId(current_user.role_id)})
        re_user = mdb_user.db.user.find_one({"_id": ObjectId(ids[i])}, {"role_id": 1})
        re_user_role = mdb_user.db.role.find_one({"_id": ObjectId(re_user["role_id"])})
        if get_num_digits(current_user_role["permissions"]) <= get_num_digits(re_user_role["permissions"]):
            # 没有权限恢复
            noper += 1
            continue
        re_ids.append(ObjectId(ids[i]))

    update_data = {
        'is_delete': 0
    }

    r = mdb_user.db.user.update_many({"_id": {"$in": re_ids}}, {"$set": update_data})
    if r.modified_count:
        data = {'msg': gettext(
            "Restore the {} users,The other {} users have no power control".format(r.modified_count, noper)),
                'msg_type': "s", "http_status":201}
    else:
        data = {'msg': gettext("Restore the failure.May not have permission"), 'msg_type': "w", "http_status":401}
    return data
Ejemplo n.º 3
0
def user_activation():
    active = int(request.argget.all('active', 0))
    ids = json_to_pyseq(request.argget.all('ids', []))
    noper = 0
    ac_ids = []
    for i in range(0, len(ids)):
        # 检查是否有权限
        current_user_role = mdb_user.db.role.find_one({"_id": ObjectId(current_user.role_id)})
        re_user = mdb_user.db.user.find_one({"_id": ObjectId(ids[i])}, {"role_id": 1})
        re_user_role = mdb_user.db.role.find_one({"_id": ObjectId(re_user["role_id"])})
        if get_num_digits(current_user_role["permissions"]) <= get_num_digits(re_user_role["permissions"]):
            # 没有权限恢复
            noper += 1
            continue
        ac_ids.append(ObjectId(ids[i]))

    update_data = {
        'active': active
    }

    r = mdb_user.db.user.update_many({"_id": {"$in": ac_ids}}, {"$set": update_data})
    if r.modified_count:
        data = {'msg': gettext(
            "{} user activation is successful, {} no permission to operate".format(r.modified_count, noper)),
                'msg_type': "s", "http_status":201}
    else:
        data = {'msg': gettext("Activation failed.May not have permission"), 'msg_type': "w", "http_status":401}
    return data
Ejemplo n.º 4
0
def user_del():
    ids = json_to_pyseq(request.argget.all('ids', []))
    permanent = request.argget.all('permanent', 0)
    try:
        permanent = int(permanent)
    except BaseException:
        pass
    noper = 0
    temp_ids = ids[:]
    ids = []
    for tid in temp_ids:
        # 检查是否有权限
        current_user_role = mdbs["user"].db.role.find_one({"_id": ObjectId(current_user.role_id)})
        rm_user = get_one_user(user_id=str(tid))
        rm_user_role = mdbs["user"].db.role.find_one({"_id": ObjectId(rm_user["role_id"])})
        if get_num_digits(current_user_role["permissions"]) <= get_num_digits(rm_user_role["permissions"]):
            # 没有权限删除
            continue
        ids.append(ObjectId(tid))

    if not permanent:
        update_data = {
            'is_delete': 1
        }
        r = mdbs["user"].db.user.update_many(
            {"_id": {"$in": ids}}, {"$set": update_data})
        if r.modified_count:
            for uid in ids:
                clean_get_one_user_cache(user_id=uid)

            data = {
                'msg': gettext("Has recovered {} users, {} users can not operate").format(
                    r.modified_count,
                    noper),
                'msg_type': "s",
                "custom_status": 201}
        else:
            data = {
                'msg': gettext("Recycle user failed.May not have permission"),
                'msg_type': "w",
                "custom_status": 401}
    else:
        # 永久删除
        r = mdbs["user"].db.user.delete_many(
            {"_id": {"$in": ids}, "is_delete": {"$in": [1, True]}})
        if r.deleted_count:
            data = {
                'msg': gettext(
                    "{} users have been deleted and {} users can not be deleted".format(
                        r.deleted_count,
                        noper)),
                'msg_type': "s",
                "custom_status": 204}
        else:
            data = {
                'msg': gettext("Failed to delete.May not have permission"),
                'msg_type': "w",
                "custom_status": 401}

    return data
Ejemplo n.º 5
0
def add_role():

    name = request.argget.all('name').strip()
    instructions = request.argget.all('instructions').strip()
    default = int(request.argget.all('default', False).strip())
    temp_permissions = json_to_pyseq(request.argget.all('permissions', []))
    data = {
        'msg': gettext("Add a success"),
        'msg_type': "s",
        "custom_status": 201}

    permissions = 0x0
    for i in temp_permissions:
        permissions = permissions | int(i)

    s, r = arg_verify(reqargs=[(gettext("name"), name)], required=True)
    if not s:
        return r
    elif not mdbs["user"].db.role.find_one({gettext("name"): name}):

        # 权限检查
        user_role = mdbs["user"].db.role.find_one(
            {"_id": ObjectId(current_user.role_id)})
        if get_num_digits(user_role["permissions"]
                          ) <= get_num_digits(permissions):
            data = {
                "msg": gettext(
                    "The current user permissions are lower than the permissions that you want to add,"
                    " without permission to add"),
                "msg_type": "w",
                "custom_status": 401}
            return data

        if default:
            if not mdbs["user"].db.role.find_one({"default": {"$in": [1, True]}}):
                mdbs["user"].db.role.insert_one({"name": name,
                                             "instructions": instructions,
                                             'permissions': permissions,
                                             "default": default})
            else:
                data = {
                    'msg': gettext("Existing default role"),
                    'msg_type': "w",
                    "custom_status": 403}
        else:
            mdbs["user"].db.role.insert_one({"name": name,
                                         "instructions": instructions,
                                         'permissions': permissions,
                                         "default": default})

    else:
        data = {
            'msg': gettext("Role name already exists"),
            'msg_type': "w",
            "custom_status": 403}

    return data
Ejemplo n.º 6
0
def add_per():

    name = request.argget.all('name', '').strip()
    explain = request.argget.all('explain')
    default = int(request.argget.all('is_default', 0).strip())
    position = str_to_num(request.argget.all('position', 0))
    data = {
        'msg': gettext("Add a success"),
        'msg_type': "s",
        "custom_status": 201}

    s, r = arg_verify(
        reqargs=[
            (gettext("name"), name), (gettext("position"), position)], required=True)
    if not s:
        return r

    hightest_pos = get_num_digits(SUPER_PER)
    permissions = int(math.pow(2, position - 1))
    if hightest_pos > hightest_pos and position < 1:
        data = {
            'msg': gettext(
                "Must be an integer greater than 0,"
                " less than or equal to {}".format(hightest_pos)),
            'msg_type': "w",
            "custom_status": 403}

    elif mdbs["user"].db.permission.find_one({"name": name}):
        data = {'msg': gettext("Permission name or valready exists"),
                'msg_type': "w", "custom_status": 403}

    elif mdbs["user"].db.permission.find_one({"value": permissions}):
        data = {'msg': gettext('Location has been used'),
                'msg_type': "w", "custom_status": 403}
    else:
        user_role = mdbs["user"].db.role.find_one(
            {"_id": ObjectId(current_user.role_id)})
        if get_num_digits(user_role["permissions"]
                          ) <= get_num_digits(permissions):
            data = {
                "msg": gettext(
                    "The current user permissions are lower than the permissions that you want to add,"
                    " without permission to add"),
                "msg_type": "w",
                "custom_status": 401}
            return data

        mdbs["user"].db.permission.insert_one({"name": name,
                                           "explain": explain,
                                           'value': permissions,
                                           "is_default": default})
        cache.delete(key=GET_DEFAULT_SYS_PER_CACHE_KEY, db_type="redis")
        cache.delete(key=GET_ALL_PERS_CACHE_KEY, db_type="redis")
    return data
Ejemplo n.º 7
0
def delete_role():

    ids = json_to_pyseq(request.argget.all('ids'))

    user_role = mdb_user.db.role.find_one(
        {"_id": ObjectId(current_user.role_id)})
    noper = 0
    exist_user_role = 0
    for id in ids:
        id = ObjectId(id)
        # 权限检查
        old_role = mdb_user.db.role.find_one({"_id": id})
        # 如果当前用户的权限最高位 小于 要删除角色的权限,也是不可以
        if old_role and get_num_digits(
                old_role["permissions"]) >= get_num_digits(
                    user_role["permissions"]):
            noper += 1
            continue

        if mdb_user.db.user.find({
                "role_id": id,
                "is_delete": {
                    "$in": [0, False, None]
                }
        }).count(True):
            exist_user_role += 1
        else:
            mdb_user.db.role.delete_many({"_id": id})
    if not noper:
        data = {
            'msg':
            gettext(
                'Delete the success, {} of the roles have users and cannot be deleted'
            ).format(exist_user_role),
            'msg_type':
            's',
            "http_status":
            204
        }
    else:
        data = {
            'msg':
            gettext(
                '{} role do not have permission to delete,'
                ' {} of the roles have users and cannot be deleted').format(
                    noper, exist_user_role),
            'msg_type':
            'w',
            "http_status":
            400
        }

    return data
Ejemplo n.º 8
0
def permissions():
    """
    只获取name,value, explain,以及已使用的权重位置
    :return:
    """

    data = []
    positions = list(range(1, get_num_digits(SUPER_PER) + 1))
    for per in mdbs["user"].dbs["permission"].find(
            {"value": {"$exists": True}}).sort([("value", -1)]):
        temp_pos = get_num_digits(per["value"])
        if temp_pos in positions:
            positions.remove(temp_pos)
        data.append((per["name"], per["value"], per["explain"]))
    data = {
        "permissions": sorted(
            data,
            key=lambda x: x[1]),
        "positions": positions}
    return data
Ejemplo n.º 9
0
def permission():
    """
    获取一个权限
    :return:
    """
    tid = request.argget.all('id').strip()
    data = {}
    data["per"] = mdbs["user"].db.permission.find_one({"_id": ObjectId(tid)})
    if not data["per"]:
        data = {
            'msg': gettext("The specified permission is not found"),
            'msg_type': "w",
            "custom_status": 404}
    else:
        data["per"]["_id"] = str(data["per"]["_id"])
        data["per"]["pos"] = get_num_digits(data["per"]["value"])

    return data
Ejemplo n.º 10
0
def permissions_details():
    """
    获取多个权限的详情
    :return:
    """

    data = {}
    page = int(request.argget.all('page', 1))
    pre = int(request.argget.all('pre', 10))
    rs = mdbs["user"].db.permission.find({})
    data_cnt = rs.count(True)
    roles = list(rs.skip(pre * (page - 1)).limit(pre))
    roles = sorted(roles, key=lambda x: x["value"])
    for role in roles:
        role["pos"] = get_num_digits(role["value"])
    data["pers"] = datas_paging(pre=pre,
                                page_num=page,
                                data_cnt=data_cnt,
                                datas=objid_to_str(roles))

    return data
Ejemplo n.º 11
0
def delete_per():

    ids = json_to_pyseq(request.argget.all('ids'))
    user_role = mdbs["user"].db.role.find_one(
        {"_id": ObjectId(current_user.role_id)})

    unauth_del_pers = []  # 无权删除的
    preserve = []  # 必须保留的
    need_remove = []
    need_remove_per_value = []

    for tid in ids:
        tid = ObjectId(tid)
        # 权限检查
        old_per = mdbs["user"].db.permission.find_one({"_id": tid})
        # 如果当前用户的权限最高位 小于 要删除角色的权限,也是不可以
        if old_per and get_num_digits(old_per["value"]) >= get_num_digits(
                user_role["permissions"]):
            unauth_del_pers.append(old_per["name"])
            continue
        if old_per["name"] in PRESERVE_PERS or old_per["default"]:
            preserve.append(old_per["name"])
            continue
        need_remove.append(tid)
        need_remove_per_value.append(old_per["permissions"])

    # Delete
    msg_updated_rolename = ""
    if need_remove:

        mdbs["user"].db.permission.delete_many({
            "_id": {
                "$in": need_remove
            },
            "name": {
                "$nin": PRESERVE_PERS
            }
        })
        # 删除后必须更新使用了该权限的role和api&page
        updated_rolename = []
        for v in need_remove_per_value:
            r = update_role_and_api_per(old_per_value=v, new_per_value=0)
            updated_rolename.extend(r["updated_rolename"])

        msg_updated_rolename = gettext("The role of the chain reaction is: \n")
        if updated_rolename:
            updated_rolename = list(set(updated_rolename))
            for ur in updated_rolename:
                msg_updated_rolename = '{}, "{}"'.format(
                    msg_updated_rolename, ur)

        cache.delete(key=GET_DEFAULT_SYS_PER_CACHE_KEY, db_type="redis")
        cache.delete(key=GET_ALL_PERS_CACHE_KEY, db_type="redis")

    if not unauth_del_pers and not preserve:
        data = {
            'msg':
            gettext('Successfully deleted. {}'.format(msg_updated_rolename)),
            'msg_type': 'success',
            "custom_status": 204
        }
    else:
        warning_msg = ""
        if unauth_del_pers:
            warning_msg = gettext('No permission to delete {}. ').format(
                ",".join(unauth_del_pers))
        elif preserve:
            warning_msg = gettext(
                "{}{} are permissions that must be retained.").format(
                    warning_msg, ",".join(preserve))
        data = {
            'msg': warning_msg,
            'msg_type': 'warning',
            "custom_status": 400
        }

    return data
Ejemplo n.º 12
0
def edit_per():

    tid = request.argget.all('id').strip()
    name = request.argget.all('name', '').strip()
    explain = request.argget.all('explain', '')
    default = int(request.argget.all('is_default', 0).strip())
    position = str_to_num(request.argget.all('position', 0))

    s, r = arg_verify(reqargs=[(gettext("name"), name),
                               (gettext("position"), position)],
                      required=True)
    if not s:
        return r

    hightest_pos = get_num_digits(SUPER_PER)
    if position > hightest_pos and position < 1:
        data = {
            'msg':
            gettext("Must be an integer greater than 0,"
                    " less than or equal to {}".format(hightest_pos)),
            'msg_type':
            "w",
            "custom_status":
            403
        }
        return data

    data = {
        "msg":
        gettext(
            "The current user permissions are lower than the permissions you want to modify,"
            " without permission to modify"),
        "msg_type":
        "w",
        "custom_status":
        401
    }
    user_role = mdbs["user"].db.role.find_one(
        {"_id": ObjectId(current_user.role_id)})
    # 如果当前用户的权限最高位 小于 要修改成的这个角色权重的最高位,是不可以的
    permissions = int(math.pow(2, position - 1))
    if get_num_digits(user_role["permissions"]) <= get_num_digits(permissions):
        return data

    per = {
        "name": name,
        "explain": explain,
        'value': permissions,
        "is_default": default
    }

    if mdbs["user"].db.permission.find_one({
            "name": name,
            "_id": {
                "$ne": ObjectId(tid)
            }
    }):
        data = {
            'msg': gettext("Permission name already exists"),
            'msg_type': "w",
            "custom_status": 403
        }

    elif mdbs["user"].db.permission.find_one({
            "value": permissions,
            "_id": {
                "$ne": ObjectId(tid)
            }
    }):
        data = {
            'msg': gettext('Location has been used'),
            'msg_type': "w",
            "custom_status": 403
        }
    else:
        old_per = mdbs["user"].db.permission.find_one({
            "_id": ObjectId(tid),
            "value": {
                "$exists": True
            }
        })
        if old_per:
            old_per_value = old_per["value"]

            r = mdbs["user"].db.permission.update_one({"_id": ObjectId(tid)},
                                                      {"$set": per})
            if not r.modified_count:
                data = {
                    'msg': gettext("No changes"),
                    'msg_type': "w",
                    "custom_status": 201
                }
            else:
                r = update_role_and_api_per(old_per_value, new_per_value=0)
                updated_rolename = r["updated_rolename"]
                msg_updated_rolename = gettext(
                    "The role of the chain reaction is: \n")
                if updated_rolename:
                    for ur in updated_rolename:
                        msg_updated_rolename = '{}, "{}"'.format(
                            msg_updated_rolename, ur)
                else:
                    msg_updated_rolename = '{} 0'.format(msg_updated_rolename)
                # 刷新缓存
                cache.delete(key=GET_DEFAULT_SYS_PER_CACHE_KEY,
                             db_type="redis")
                cache.delete(key=GET_ALL_PERS_CACHE_KEY, db_type="redis")
                data = {
                    'msg':
                    gettext("The update is successful. {}".format(
                        msg_updated_rolename)),
                    'msg_type':
                    "s",
                    "custom_status":
                    201
                }
        else:
            data = {
                'msg': gettext("Update failed"),
                'msg_type': "w",
                "custom_status": 400
            }
    return data
Ejemplo n.º 13
0
def user_edit():
    """
    用户编辑
    :return:
    """
    tid = request.argget.all('id')
    role_id = request.argget.all('role_id')
    email = request.argget.all('email')
    password = request.argget.all('password')
    active = str_to_num(request.argget.all('active', 0))

    s, r = arg_verify(reqargs=[("id", tid), ("role_id", role_id)],
                      required=True)
    if not s:
        return r

    data = {
        'msg': gettext("Update success"),
        'msg_type': "s",
        "custom_status": 201
    }

    if not email:
        email = None
    update_data = {'role_id': role_id, 'active': active, "email": email}
    user = get_one_user(user_id=str(tid))
    if user:
        # 权限检查
        current_user_role = mdbs["user"].db.role.find_one(
            {"_id": ObjectId(current_user.role_id)})
        edit_user_role = mdbs["user"].db.role.find_one(
            {"_id": ObjectId(user["role_id"])})
        if edit_user_role \
                and get_num_digits(current_user_role["permissions"]) \
                <= get_num_digits(edit_user_role["permissions"]):
            # 没有权限修改
            data = {
                "msg_type": "w",
                "msg": gettext("No permission modification"),
                "custom_status": 401
            }
            return data

    if email:
        # 邮件注册
        # 邮箱格式验证
        s, r = email_format_ver(email)
        if not s:
            data = {'msg': r, 'msg_type': "e", "custom_status": 422}
            return data
        elif mdbs["user"].db.user.find_one({
                "email": email,
                "_id": {
                    "$ne": ObjectId(tid)
                }
        }):
            # 邮箱是否注册过
            data = {
                'msg':
                gettext(
                    "This email has been registered in the site oh, please login directly."
                ),
                'msg_type':
                "w",
                "custom_status":
                403
            }
            return data
    if password:
        # 密码格式验证
        s, r = password_format_ver(password)
        if not s:
            data = {'msg': r, 'msg_type': "e", "custom_status": 422}
            return data

    if password:
        password = generate_password_hash(password)
        update_data["password"] = password
    r = update_one_user(user_id=str(tid), updata={"$set": update_data})
    if not r.modified_count:
        data = {
            'msg': gettext("No changes"),
            'msg_type': "w",
            "custom_status": 201
        }
    return data
Ejemplo n.º 14
0
def update_url():
    '''
    更新修改 url权限
    :return:
    '''
    id = request.argget.all("id")
    method = request.argget.all("method")
    login_auth = str_to_num(request.argget.all("login_auth", 0))
    custom_permission = json_to_pyseq(
        request.argget.all("custom_permission", []))
    s, r = arg_verify([("id", id)], required=True)
    if not s:
        return r

    s, r = arg_verify(
        [(gettext("method"), method)],
        required=True,
        only=["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"])
    if not s:
        return r

    permission = 0x0
    for i in custom_permission:
        try:
            i = int(i)
            permission = permission | int(i)
        except:
            pass

    # 修改权限验证
    data = {
        "msg":
        gettext(
            "The current user permissions are lower than the permissions you want to modify,"
            " without permission to modify"),
        "msg_type":
        "w",
        "http_status":
        401
    }
    user_role = mdb_user.db.role.find_one(
        {"_id": ObjectId(current_user.role_id)})
    # 如果当前用户的权限最高位 小于 要修改成的权重的最高位,是不可以的
    if get_num_digits(user_role["permissions"]) <= get_num_digits(permission):
        return data

    old_permission = 0
    old_url_per = mdb_sys.db.sys_urls.find_one({"_id": ObjectId(id)})
    if old_url_per and method in old_url_per["custom_permission"]:
        old_permission = old_url_per["custom_permission"][method]

    # 如果当前用户的权限最高位 小于 要修改url请求的权限,也是不可以
    if get_num_digits(
            user_role["permissions"]) <= get_num_digits(old_permission):
        return data

    r = mdb_sys.db.sys_urls.update_one({"_id": ObjectId(id)}, {
        "$set": {
            "custom_permission.{}".format(method): permission,
            "login_auth.{}".format(method): login_auth
        }
    })
    if r.modified_count:
        # 清除缓存
        r = mdb_sys.db.sys_urls.find_one({"_id": ObjectId(id)})
        if r:
            cache.delete(key="get_sys_url_url_{}".format(r['url']),
                         db_type="redis")
        data = {
            "msg": gettext("Modify the success"),
            "msg_type": "s",
            "http_status": 201
        }
    else:
        data = {
            "msg": gettext("No modification"),
            "msg_type": "w",
            "http_status": 400
        }
    return data
Ejemplo n.º 15
0
def edit_role():

    id = request.argget.all('id').strip()
    name = request.argget.all('name').strip()
    instructions = request.argget.all('instructions').strip()
    default = int(request.argget.all('default', 0))
    temp_permissions = json_to_pyseq(request.argget.all('permissions', []))

    permissions = 0x0
    for i in temp_permissions:
        permissions = permissions | int(i)

    s, r = arg_verify(reqargs=[(gettext("name"), name)], required=True)
    if not s:
        return r

    data = {
        "msg":
        gettext(
            "The current user permissions are lower than the permissions you want to modify,"
            " without permission to modify"),
        "msg_type":
        "w",
        "http_status":
        401
    }
    user_role = mdb_user.db.role.find_one(
        {"_id": ObjectId(current_user.role_id)})
    # 如果当前用户的权限最高位 小于 要修改成的这个角色权重的最高位,是不可以的
    if get_num_digits(user_role["permissions"]) <= get_num_digits(permissions):

        return data

    old_role = mdb_user.db.role.find_one({"_id": ObjectId(id)})
    # 如果当前用户的权限最高位 小于 要修改角色的权限,也是不可以
    if old_role and get_num_digits(old_role["permissions"]) >= get_num_digits(
            user_role["permissions"]):
        return data

    role = {
        "name": name,
        "instructions": instructions,
        'permissions': permissions,
        "default": default
    }

    data = {
        'msg': gettext("Save success"),
        'msg_type': "s",
        "http_status": 201
    }
    if not mdb_user.db.role.find_one({
            "name": name,
            "_id": {
                "$ne": ObjectId(id)
            }
    }):
        if default:
            if not mdb_user.db.role.find_one({
                    "default": {
                        "$in": [1, True]
                    },
                    "_id": {
                        "$ne": ObjectId(id)
                    }
            }):
                r = mdb_user.db.role.update_one({"_id": ObjectId(id)},
                                                {"$set": role})
                if not r.modified_count:
                    data = {
                        'msg': gettext("No changes"),
                        'msg_type': "w",
                        "http_status": 201
                    }
            else:
                data = {
                    'msg': gettext("Existing default role"),
                    'msg_type': "w",
                    "http_status": 403
                }
        else:
            r = mdb_user.db.role.update_one({"_id": ObjectId(id)},
                                            {"$set": role})
            if not r.modified_count:
                data = {
                    'msg': gettext("No changes"),
                    'msg_type': "w",
                    "http_status": 201
                }

    else:
        data = {
            'msg': gettext("Role name already exists"),
            'msg_type': "w",
            "http_status": 403
        }

    return data
Ejemplo n.º 16
0
def sys_config_edit():

    key = request.argget.all('key')
    project = request.argget.all('project')
    value = request.argget.all('value')
    info = request.argget.all('info')
    version = mdb_sys.db.sys_config.find_one(
        {"new_version": {
            "$exists": True
        }}, {"_id": 0})

    s, r = arg_verify(reqargs=[("key", key), ("project", project)],
                      required=True)
    if not s:
        return r

    # 查看是否是必须root用户才能设置的
    if project in MUST_ROOT_SETTING:
        # 权限检查
        user_role = mdb_user.db.role.find_one(
            {"_id": ObjectId(current_user.role_id)})
        if get_num_digits(user_role["permissions"]) < get_num_digits(
                permissions(["ROOT"])):
            data = {
                "msg": gettext("Root permission required"),
                "msg_type": "w",
                "http_status": 401
            }
            return data

    old_conf = mdb_sys.db.sys_config.find_one({
        "key":
        key,
        "project":
        project,
        "conf_version":
        version["new_version"]
    })
    if not old_conf:
        data = {
            "msg": gettext("There is no such data"),
            "msg_type": "e",
            "http_status": 404
        }
    else:
        try:
            if old_conf["type"] == "int" or old_conf["type"] == "binary":
                value = int(value)
            elif old_conf["type"] == "float":
                value = float(value)
            elif old_conf["type"] == "string":
                value = str(value)
            elif old_conf["type"] == "bool":
                try:
                    value = int(value)
                    if value:
                        value = True
                    else:
                        value = False
                except:
                    pass
                if value or (isinstance(value, str)
                             and value.upper() != "FALSE"):
                    value = True
                else:
                    value = False

            elif old_conf["type"] == "list":
                # 如果不是list类型,则转为list类型
                if not isinstance(value, list):
                    #  "[]"转list
                    value = json.loads(value)
                if not isinstance(value, list):
                    # "aaa,bbb,ccc"转["aaa", "bbb", "ccc"]
                    value = value.strip(",").split(",")
                    value = [v.strip("\n") for v in value]

            elif old_conf["type"] == "dict":
                if not isinstance(value, dict):
                    value = json.loads(value)
                if not isinstance(value, dict):
                    data = {
                        "msg":
                        gettext(
                            'The format of the "value" errors, need a "{}" type'
                        ).format(old_conf["type"]),
                        "msg_type":
                        "e",
                        "http_status":
                        400
                    }
                    return data
            elif old_conf["type"] == "tuple":
                if not isinstance(value, tuple):
                    value = json.loads(value)
                if not isinstance(value, tuple):
                    data = {
                        "msg":
                        gettext(
                            'The format of the "value" errors, need a "{}" type'
                        ).format(old_conf["type"]),
                        "msg_type":
                        "e",
                        "http_status":
                        400
                    }
                    return data
            elif old_conf["type"] == "password":
                value = str(value)
            else:
                data = {
                    "msg": gettext('There is no {}').format(old_conf["type"]),
                    "msg_type": "e",
                    "http_status": 400
                }
                return data
        except Exception as e:
            data = {
                "msg":
                gettext('The format of the "value" errors, need a "{}" type').
                format(old_conf["type"]),
                "msg_type":
                "e",
                "http_status":
                400
            }
            return data
        if not info:
            info = old_conf["info"]
        conf = {"value": value, "update_time": time.time(), "info": info}

        # 更新版本
        # 解释:只要有一台服务器端重启web并更新配置, 则会把重启时最新版本加入到used_version中
        if version["new_version"] in version["used_versions"]:

            # 如果目前的最新版本号在used_version中, 则本次修改就要生成更新的配置版本
            now_version = time_to_utcdate(tformat="%Y_%m_%d_%H_%M_%S")
            old_version = mdb_sys.db.sys_config.find(
                {
                    "project": {
                        "$exists": True
                    },
                    "conf_version": version["new_version"]
                }, {"_id": 0})
            # 生成最新版本配置
            for v in old_version:
                v["conf_version"] = now_version
                mdb_sys.db.sys_config.insert_one(v)

            # 更新当前使用的最新版本号
            mdb_sys.db.sys_config.update_one(
                {"new_version": {
                    "$exists": True
                }}, {"$set": {
                    "new_version": now_version
                }})

            # 删除多余的配置版本
            ver_cnt = len(version["used_versions"])
            if ver_cnt >= 15:
                rm_vers = version["used_versions"][0:ver_cnt - 15]
                mdb_sys.db.sys_config.update_one(
                    {"new_version": {
                        "$exists": True
                    }}, {
                        "$set": {
                            "used_versions":
                            version["used_versions"][ver_cnt - 15:]
                        }
                    })
                mdb_sys.db.sys_config.delete_many(
                    {"version": {
                        "$in": rm_vers
                    }})
        else:
            # 否则, 本次修改暂不生成新配置版本
            now_version = version["new_version"]

        # 更新修改数据
        mdb_sys.db.sys_config.update_one(
            {
                "project": project,
                "key": key,
                "conf_version": now_version
            }, {"$set": conf},
            upsert=True)
        # 删除缓存,达到更新缓存
        cache.delete(CONFIG_CACHE_KEY)
        data = {
            "msg": gettext("Modify the success"),
            "msg_type": "s",
            "http_status": 201
        }
    return data