From 8cbfa3b1bda71a3ff2bc5192c5be47b7a10f968f Mon Sep 17 00:00:00 2001 From: schnee Date: Sun, 28 Apr 2024 11:22:15 +0800 Subject: [PATCH] feat: add batch create preview api (#1680) --- .../web/organization/serializers/__init__.py | 4 +++ .../web/organization/serializers/users.py | 13 ++++++++ .../bkuser/apis/web/organization/urls.py | 6 ++++ .../apis/web/organization/views/__init__.py | 2 ++ .../apis/web/organization/views/users.py | 32 +++++++++++++++++-- 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/bk-user/bkuser/apis/web/organization/serializers/__init__.py b/src/bk-user/bkuser/apis/web/organization/serializers/__init__.py index 65b7d4c86..f5d0dd757 100644 --- a/src/bk-user/bkuser/apis/web/organization/serializers/__init__.py +++ b/src/bk-user/bkuser/apis/web/organization/serializers/__init__.py @@ -35,6 +35,8 @@ OptionalTenantUserListInputSLZ, OptionalTenantUserListOutputSLZ, TenantUserBatchCreateInputSLZ, + TenantUserBatchCreatePreviewInputSLZ, + TenantUserBatchCreatePreviewOutputSLZ, TenantUserBatchDeleteInputSLZ, TenantUserCreateInputSLZ, TenantUserCreateOutputSLZ, @@ -79,6 +81,8 @@ "TenantUserOrganizationPathOutputSLZ", "TenantUserStatusUpdateOutputSLZ", "TenantUserBatchCreateInputSLZ", + "TenantUserBatchCreatePreviewInputSLZ", + "TenantUserBatchCreatePreviewOutputSLZ", "TenantUserBatchDeleteInputSLZ", # 租户部门 - 用户关系 "TenantDeptUserRelationBatchCreateInputSLZ", diff --git a/src/bk-user/bkuser/apis/web/organization/serializers/users.py b/src/bk-user/bkuser/apis/web/organization/serializers/users.py index 45bf38123..ed353384c 100644 --- a/src/bk-user/bkuser/apis/web/organization/serializers/users.py +++ b/src/bk-user/bkuser/apis/web/organization/serializers/users.py @@ -459,6 +459,19 @@ def _validate_user_infos( ).is_valid(raise_exception=True) +class TenantUserBatchCreatePreviewInputSLZ(TenantUserBatchCreateInputSLZ): + ... + + +class TenantUserBatchCreatePreviewOutputSLZ(serializers.Serializer): + username = serializers.CharField(help_text="用户名") + full_name = serializers.CharField(help_text="姓名") + email = serializers.EmailField(help_text="邮箱") + phone = serializers.CharField(help_text="手机号") + phone_country_code = serializers.CharField(help_text="手机国际区号") + extras = serializers.JSONField(help_text="自定义字段") + + class TenantUserBatchDeleteInputSLZ(serializers.Serializer): user_ids = StringArrayField( help_text="用户 ID 列表", min_items=1, max_items=settings.ORGANIZATION_BATCH_OPERATION_API_LIMIT diff --git a/src/bk-user/bkuser/apis/web/organization/urls.py b/src/bk-user/bkuser/apis/web/organization/urls.py index 7761c687f..6b21c6222 100644 --- a/src/bk-user/bkuser/apis/web/organization/urls.py +++ b/src/bk-user/bkuser/apis/web/organization/urls.py @@ -103,6 +103,12 @@ views.TenantUserBatchCreateApi.as_view(), name="organization.tenant_user.batch_create", ), + # 租户用户 - 快速录入 - 预览 + path( + "tenants/users/operations/batch_create_preview/", + views.TenantUserBatchCreatePreviewApi.as_view(), + name="organization.tenant_user.batch_create_preview", + ), # 租户用户 - 批量删除 path( "tenants/users/operations/batch_delete/", diff --git a/src/bk-user/bkuser/apis/web/organization/views/__init__.py b/src/bk-user/bkuser/apis/web/organization/views/__init__.py index 5c12d05ae..f7a6f496d 100644 --- a/src/bk-user/bkuser/apis/web/organization/views/__init__.py +++ b/src/bk-user/bkuser/apis/web/organization/views/__init__.py @@ -28,6 +28,7 @@ from .users import ( OptionalTenantUserListApi, TenantUserBatchCreateApi, + TenantUserBatchCreatePreviewApi, TenantUserBatchDeleteApi, TenantUserListCreateApi, TenantUserOrganizationPathListApi, @@ -56,6 +57,7 @@ "TenantUserOrganizationPathListApi", "TenantUserStatusUpdateApi", "TenantUserBatchCreateApi", + "TenantUserBatchCreatePreviewApi", "TenantUserBatchDeleteApi", # 租户部门 - 用户关系 "TenantDeptUserRelationBatchCreateApi", diff --git a/src/bk-user/bkuser/apis/web/organization/views/users.py b/src/bk-user/bkuser/apis/web/organization/views/users.py index e2bd5b3c0..844a523b7 100644 --- a/src/bk-user/bkuser/apis/web/organization/views/users.py +++ b/src/bk-user/bkuser/apis/web/organization/views/users.py @@ -27,6 +27,8 @@ OptionalTenantUserListInputSLZ, OptionalTenantUserListOutputSLZ, TenantUserBatchCreateInputSLZ, + TenantUserBatchCreatePreviewInputSLZ, + TenantUserBatchCreatePreviewOutputSLZ, TenantUserBatchDeleteInputSLZ, TenantUserCreateInputSLZ, TenantUserCreateOutputSLZ, @@ -625,8 +627,7 @@ def post(self, request, *args, **kwargs): data_source = self.get_current_tenant_local_real_data_source() slz = TenantUserBatchCreateInputSLZ( - data=request.data, - context={"tenant_id": cur_tenant_id, "data_source_id": data_source.id}, + data=request.data, context={"tenant_id": cur_tenant_id, "data_source_id": data_source.id} ) slz.is_valid(raise_exception=True) data = slz.validated_data @@ -690,6 +691,33 @@ def post(self, request, *args, **kwargs): return Response(status=status.HTTP_204_NO_CONTENT) +class TenantUserBatchCreatePreviewApi(CurrentUserTenantDataSourceMixin, generics.CreateAPIView): + """批量创建租户用户 - 预览""" + + permission_classes = [IsAuthenticated, perm_class(PermAction.MANAGE_TENANT)] + + @swagger_auto_schema( + tags=["organization.user"], + operation_description="租户用户快速录入 - 预览", + request_body=TenantUserBatchCreatePreviewInputSLZ(), + responses={status.HTTP_200_OK: TenantUserBatchCreatePreviewOutputSLZ(many=True)}, + ) + def post(self, request, *args, **kwargs): + cur_tenant_id = self.get_current_tenant_id() + data_source = self.get_current_tenant_local_real_data_source() + + slz = TenantUserBatchCreatePreviewInputSLZ( + data=request.data, context={"tenant_id": cur_tenant_id, "data_source_id": data_source.id} + ) + slz.is_valid(raise_exception=True) + data = slz.validated_data + + return Response( + TenantUserBatchCreatePreviewOutputSLZ(data["user_infos"], many=True).data, + status=status.HTTP_200_OK, + ) + + class TenantUserBatchDeleteApi(CurrentUserTenantDataSourceMixin, generics.DestroyAPIView): """批量删除租户用户"""