From 958fde7b020ca474e236ca89c05780c0a0b5575e Mon Sep 17 00:00:00 2001 From: ycggyao Date: Mon, 29 Jul 2024 19:17:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(backend):=20=E6=9D=83=E9=99=90=E8=A7=84?= =?UTF-8?q?=E5=88=99=E6=8E=A5=E5=8F=A3=E4=BC=98=E5=8C=96=20#5794?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dbpermission/db_account/handlers.py | 4 +++ .../dbpermission/db_account/serializers.py | 15 +++++++++ .../dbpermission/db_account/views.py | 31 +++++++++++++++---- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/dbm-ui/backend/db_services/dbpermission/db_account/handlers.py b/dbm-ui/backend/db_services/dbpermission/db_account/handlers.py index c7bef1c7a9..e2df7a6020 100644 --- a/dbm-ui/backend/db_services/dbpermission/db_account/handlers.py +++ b/dbm-ui/backend/db_services/dbpermission/db_account/handlers.py @@ -60,6 +60,10 @@ def _format_account_rules(self, account_rules_list: Dict) -> Dict: for account_rules in account_rules_list["items"]: account_rules["account"]["account_id"] = account_rules["account"].pop("id") + # 检查 rules 是否为 None + if account_rules.get("rules") is None: + account_rules["rules"] = [] + for rule in account_rules["rules"]: rule["rule_id"] = rule.pop("id") rule["access_db"] = rule.pop("dbname") diff --git a/dbm-ui/backend/db_services/dbpermission/db_account/serializers.py b/dbm-ui/backend/db_services/dbpermission/db_account/serializers.py index d55309f53d..ae607b2ba5 100644 --- a/dbm-ui/backend/db_services/dbpermission/db_account/serializers.py +++ b/dbm-ui/backend/db_services/dbpermission/db_account/serializers.py @@ -108,6 +108,21 @@ class FilterAccountRulesSerializer(serializers.Serializer): access_db = serializers.CharField(help_text=_("访问DB"), required=False) privilege = serializers.CharField(help_text=_("规则列表"), required=False) + limit = serializers.IntegerField(required=False, default=10) + offset = serializers.IntegerField(required=False, default=0) + + def validate(self, attrs): + # 重命名字段 + if "account_type" in attrs: + attrs["cluster_type"] = attrs.pop("account_type") + if "access_db" in attrs: + attrs["dbname"] = attrs.pop("access_db") + if "privilege" in attrs: + attrs["privs"] = attrs.pop("privilege").split(",") + if "rule_ids" in attrs: + attrs["ids"] = [int(i) for i in attrs.pop("rule_ids").split(",")] + return attrs + class QueryAccountRulesSerializer(serializers.Serializer): user = serializers.CharField(help_text=_("账号名称")) diff --git a/dbm-ui/backend/db_services/dbpermission/db_account/views.py b/dbm-ui/backend/db_services/dbpermission/db_account/views.py index 8c8fc795cd..4ab825e4cf 100644 --- a/dbm-ui/backend/db_services/dbpermission/db_account/views.py +++ b/dbm-ui/backend/db_services/dbpermission/db_account/views.py @@ -17,6 +17,7 @@ from backend.bk_web import viewsets from backend.bk_web.swagger import common_swagger_auto_schema +from backend.components import DBPrivManagerApi from backend.db_services.dbpermission.db_account.dataclass import AccountMeta, AccountRuleMeta from backend.db_services.dbpermission.db_account.handlers import AccountHandler from backend.db_services.dbpermission.db_account.serializers import ( @@ -143,12 +144,30 @@ def add_account_rule(self, request, bk_biz_id): ], ) def list_account_rules(self, request, bk_biz_id): - return self._view_common_handler( - request=request, - bk_biz_id=bk_biz_id, - meta=self.account_rule_meta, - func=self.account_handler.list_account_rules.__name__, - ) + validated_data = self.params_validate(self.get_serializer_class()) + base_info = { + "bk_biz_id": bk_biz_id, + "operator": request.user.username, + "account_type": validated_data.get("cluster_type"), + "context": {}, + } + params = {**validated_data, "bk_biz_id": bk_biz_id} + + # 判断无过滤条件 或者过滤条件只有user 则展示无规则用户 + if (validated_data["offset"] == 0 and len(validated_data) == 3) or ( + len(validated_data) == 4 and "user" in validated_data + ): + params.update({"no_rule_user": True}) + + # 开区查询rule_id的情况,no_rule_user为False + if validated_data.get("ids"): + params.update({"no_rule_user": False}) + + rules_list = DBPrivManagerApi.list_account_rules(params) + if not rules_list["items"]: + return Response({"count": 0, "results": []}) + account_rules_list = self.account_handler(**base_info)._format_account_rules(rules_list) + return Response({"count": account_rules_list["count"], "results": account_rules_list["items"]}) @common_swagger_auto_schema( operation_summary=_("查询账号规则"),