From 9b85aafa52fd3e4545c2c6805f3c5bcb8f8ae36c Mon Sep 17 00:00:00 2001 From: ibuler Date: Wed, 17 Mar 2021 13:01:59 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=85=A8=E5=B1=80=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E4=BB=85=E6=94=AF=E6=8C=81=E5=88=A0=E9=99=A4=E5=92=8C=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 73470 -> 73608 bytes apps/locale/zh/LC_MESSAGES/django.po | 237 ++++++++++++++------------- apps/orgs/mixins/api.py | 23 ++- 3 files changed, 145 insertions(+), 115 deletions(-) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 3a6dfef4d1b51da4c84fe5c8a1cb1d77af8d10cb..2d48fa05da7d6fc58eb85afdc6a41a318e6a0aef 100644 GIT binary patch delta 20810 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 z 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 delta 20648 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 O^Ei8k^&MZ9j{ZMZ)yg>l diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 20e7cc254..4bcdd69e4 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-03-11 17:54+0800\n" +"POT-Creation-Date: 2021-03-17 11:21+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -126,12 +126,12 @@ msgstr "动作" #: acls/serializers/login_acl.py:28 assets/models/label.py:15 #: audits/models.py:36 audits/models.py:56 audits/models.py:69 #: audits/serializers.py:81 authentication/models.py:44 -#: authentication/models.py:95 orgs/models.py:18 orgs/models.py:403 +#: authentication/models.py:95 orgs/models.py:18 orgs/models.py:420 #: perms/models/base.py:50 templates/index.html:78 #: terminal/backends/command/models.py:18 #: terminal/backends/command/serializers.py:12 terminal/models/session.py:37 #: tickets/models/comment.py:17 users/models/user.py:159 -#: users/models/user.py:677 users/serializers/group.py:20 +#: users/models/user.py:684 users/serializers/group.py:20 #: users/templates/users/user_asset_permission.html:38 #: users/templates/users/user_asset_permission.html:64 #: users/templates/users/user_database_app_permission.html:37 @@ -156,9 +156,9 @@ msgstr "系统用户" #: acls/models/login_asset_acl.py:22 #: applications/serializers/attrs/application_category/remote_app.py:33 #: assets/models/asset.py:355 assets/models/authbook.py:26 -#: assets/models/gathered_user.py:14 assets/serializers/admin_user.py:29 +#: assets/models/gathered_user.py:14 assets/serializers/admin_user.py:30 #: assets/serializers/asset_user.py:47 assets/serializers/asset_user.py:84 -#: assets/serializers/system_user.py:191 audits/models.py:38 +#: assets/serializers/system_user.py:192 audits/models.py:38 #: perms/models/asset_permission.py:99 templates/index.html:82 #: terminal/backends/command/models.py:19 #: terminal/backends/command/serializers.py:13 terminal/models/session.py:39 @@ -192,7 +192,7 @@ msgstr "IP 地址无效: `{}`" msgid "IP" msgstr "IP" -#: acls/serializers/login_acl.py:41 +#: acls/serializers/login_acl.py:45 msgid "The user `{}` is not in the current organization: `{}`" msgstr "用户 `{}` 不在当前组织: `{}`" @@ -241,12 +241,12 @@ msgstr "协议选项: {}" msgid "Unsupported protocols: {}" msgstr "不支持的协议: {}" -#: acls/serializers/login_asset_acl.py:78 +#: acls/serializers/login_asset_acl.py:80 #: tickets/serializers/ticket/ticket.py:109 msgid "The organization `{}` does not exist" msgstr "组织 `{}` 不存在" -#: acls/serializers/login_asset_acl.py:83 +#: acls/serializers/login_asset_acl.py:85 msgid "None of the reviewers belong to Organization `{}`" msgstr "所有复核人都不属于组织 `{}`" @@ -335,7 +335,7 @@ msgstr "目标URL" #: applications/serializers/attrs/application_type/vmware_client.py:30 #: assets/models/base.py:252 assets/serializers/asset_user.py:71 #: audits/signals_handler.py:46 authentication/forms.py:22 -#: authentication/templates/authentication/login.html:148 +#: authentication/templates/authentication/login.html:155 #: settings/serializers/settings.py:89 users/forms/profile.py:21 #: users/templates/users/user_otp_check_password.html:13 #: users/templates/users/user_password_update.html:43 @@ -394,7 +394,8 @@ msgstr "基础" msgid "Charset" msgstr "编码" -#: assets/models/asset.py:145 tickets/models/ticket.py:40 +#: assets/models/asset.py:145 assets/serializers/asset.py:171 +#: tickets/models/ticket.py:40 msgid "Meta" msgstr "元数据" @@ -503,7 +504,7 @@ msgstr "标签管理" #: assets/models/cluster.py:28 assets/models/cmd_filter.py:26 #: assets/models/cmd_filter.py:60 assets/models/group.py:21 #: common/db/models.py:70 common/mixins/models.py:49 orgs/models.py:24 -#: orgs/models.py:407 perms/models/base.py:55 users/models/user.py:571 +#: orgs/models.py:424 perms/models/base.py:55 users/models/user.py:571 #: users/serializers/group.py:35 users/templates/users/user_detail.html:97 #: xpack/plugins/change_auth_plan/models.py:81 #: xpack/plugins/cloud/models.py:104 xpack/plugins/gathered_user/models.py:30 @@ -517,7 +518,7 @@ msgstr "创建者" #: assets/models/gathered_user.py:19 assets/models/group.py:22 #: assets/models/label.py:25 common/db/models.py:72 common/mixins/models.py:50 #: ops/models/adhoc.py:38 ops/models/command.py:29 orgs/models.py:25 -#: orgs/models.py:405 perms/models/base.py:56 users/models/group.py:18 +#: orgs/models.py:422 perms/models/base.py:56 users/models/group.py:18 #: users/templates/users/user_group_detail.html:58 #: xpack/plugins/cloud/models.py:107 msgid "Date created" @@ -553,7 +554,7 @@ msgstr "SSH公钥" #: assets/models/base.py:257 assets/models/gathered_user.py:20 #: common/db/models.py:73 common/mixins/models.py:51 ops/models/adhoc.py:39 -#: orgs/models.py:406 +#: orgs/models.py:423 msgid "Date updated" msgstr "更新日期" @@ -591,7 +592,7 @@ msgid "Default" msgstr "默认" #: assets/models/cluster.py:36 assets/models/label.py:14 -#: users/models/user.py:689 +#: users/models/user.py:696 msgid "System" msgstr "系统" @@ -664,7 +665,7 @@ msgstr "资产组" msgid "Default asset group" msgstr "默认资产组" -#: assets/models/label.py:19 assets/models/node.py:575 settings/models.py:30 +#: assets/models/label.py:19 assets/models/node.py:601 settings/models.py:30 msgid "Value" msgstr "值" @@ -672,23 +673,23 @@ msgstr "值" msgid "New node" msgstr "新节点" -#: assets/models/node.py:467 users/templates/users/_granted_assets.html:130 +#: assets/models/node.py:466 users/templates/users/_granted_assets.html:130 msgid "empty" msgstr "空" -#: assets/models/node.py:574 perms/models/asset_permission.py:156 +#: assets/models/node.py:600 perms/models/asset_permission.py:156 msgid "Key" msgstr "键" -#: assets/models/node.py:576 +#: assets/models/node.py:602 msgid "Full value" msgstr "全称" -#: assets/models/node.py:579 perms/models/asset_permission.py:157 +#: assets/models/node.py:605 perms/models/asset_permission.py:157 msgid "Parent key" msgstr "ssh私钥" -#: assets/models/node.py:588 assets/serializers/system_user.py:190 +#: assets/models/node.py:614 assets/serializers/system_user.py:191 #: users/templates/users/user_asset_permission.html:41 #: users/templates/users/user_asset_permission.html:73 #: users/templates/users/user_asset_permission.html:158 @@ -858,6 +859,17 @@ msgstr "应用数量" msgid "Gateways count" msgstr "网关数量" +#: assets/serializers/label.py:13 assets/serializers/system_user.py:45 +#: assets/serializers/system_user.py:166 +#: perms/serializers/asset/permission.py:66 +msgid "Assets amount" +msgstr "资产数量" + +#: assets/serializers/label.py:14 +#: tickets/serializers/ticket/meta/ticket_type/apply_application.py:24 +msgid "Category display" +msgstr "类别 (显示名称)" + #: assets/serializers/node.py:18 msgid "value" msgstr "值" @@ -870,22 +882,17 @@ msgstr "不能包含: /" msgid "The same level node name cannot be the same" msgstr "同级别节点名字不能重复" -#: assets/serializers/system_user.py:44 assets/serializers/system_user.py:164 +#: assets/serializers/system_user.py:44 assets/serializers/system_user.py:165 #: perms/serializers/asset/permission.py:67 msgid "Nodes amount" msgstr "节点数量" -#: assets/serializers/system_user.py:45 assets/serializers/system_user.py:165 -#: perms/serializers/asset/permission.py:66 -msgid "Assets amount" -msgstr "资产数量" - -#: assets/serializers/system_user.py:46 assets/serializers/system_user.py:166 -#: assets/serializers/system_user.py:192 +#: assets/serializers/system_user.py:46 assets/serializers/system_user.py:167 +#: assets/serializers/system_user.py:193 msgid "Login mode display" msgstr "登录模式(显示名称)" -#: assets/serializers/system_user.py:48 assets/serializers/system_user.py:168 +#: assets/serializers/system_user.py:48 assets/serializers/system_user.py:169 msgid "Ad domain" msgstr "Ad 网域" @@ -1165,7 +1172,7 @@ msgstr "用户代理" #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: authentication/templates/authentication/login_otp.html:6 #: users/forms/profile.py:64 users/models/user.py:552 -#: users/serializers/profile.py:102 users/templates/users/user_detail.html:77 +#: users/serializers/profile.py:104 users/templates/users/user_detail.html:77 #: users/templates/users/user_profile.html:87 msgid "MFA" msgstr "多因子认证" @@ -1349,8 +1356,8 @@ msgid "" "after {} minutes)" msgstr "账号已被锁定(请联系管理员解锁 或 {}分钟后重试)" -#: authentication/errors.py:55 users/views/profile/otp.py:110 -#: users/views/profile/otp.py:149 users/views/profile/otp.py:169 +#: authentication/errors.py:55 users/views/profile/otp.py:107 +#: users/views/profile/otp.py:146 users/views/profile/otp.py:166 msgid "MFA code invalid, or ntp sync server time" msgstr "MFA验证码不正确,或者服务器端时间不对" @@ -1429,7 +1436,7 @@ msgid "Show" msgstr "显示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/models/user.py:445 users/serializers/profile.py:99 +#: users/models/user.py:445 users/serializers/profile.py:101 #: users/templates/users/user_profile.html:94 #: users/templates/users/user_profile.html:163 #: users/templates/users/user_profile.html:166 @@ -1438,7 +1445,7 @@ msgid "Disable" msgstr "禁用" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/models/user.py:446 users/serializers/profile.py:100 +#: users/models/user.py:446 users/serializers/profile.py:102 #: users/templates/users/user_profile.html:92 #: users/templates/users/user_profile.html:170 msgid "Enable" @@ -1487,30 +1494,30 @@ msgstr "确认" msgid "Code error" msgstr "代码错误" -#: authentication/templates/authentication/login.html:141 +#: authentication/templates/authentication/login.html:148 msgid "Welcome back, please enter username and password to login" msgstr "欢迎回来,请输入用户名和密码登录" -#: authentication/templates/authentication/login.html:167 +#: authentication/templates/authentication/login.html:174 #: users/templates/users/forgot_password.html:15 #: users/templates/users/forgot_password.html:16 msgid "Forgot password" msgstr "忘记密码" -#: authentication/templates/authentication/login.html:174 +#: authentication/templates/authentication/login.html:181 #: templates/_header_bar.html:83 msgid "Login" msgstr "登录" -#: authentication/templates/authentication/login.html:181 +#: authentication/templates/authentication/login.html:188 msgid "More login options" msgstr "更多登录方式" -#: authentication/templates/authentication/login.html:184 +#: authentication/templates/authentication/login.html:191 msgid "OpenID" msgstr "OpenID" -#: authentication/templates/authentication/login.html:189 +#: authentication/templates/authentication/login.html:196 msgid "CAS" msgstr "" @@ -1833,15 +1840,15 @@ msgstr "{} 任务结束" msgid "Date finished" msgstr "结束日期" -#: ops/models/command.py:74 +#: ops/models/command.py:78 msgid "Task start" msgstr "任务开始" -#: ops/models/command.py:96 +#: ops/models/command.py:100 msgid "Command `{}` is forbidden ........" msgstr "命令 `{}` 不允许被执行 ......." -#: ops/models/command.py:109 +#: ops/models/command.py:113 msgid "Task end" msgstr "任务结束" @@ -1865,16 +1872,21 @@ msgstr "更新任务内容: {}" msgid "Disk used more than 80%: {} => {}" msgstr "磁盘使用率超过 80%: {} => {}" -#: orgs/api.py:64 -msgid "Organization contains undeleted resources" -msgstr "组织包含未删除的资源" +#: orgs/api.py:76 +#, python-brace-format +msgid "Have `{model._meta.verbose_name}` exists, Please delete" +msgstr "`{model._meta.verbose_name}` 存在数据, 请先删除" -#: orgs/api.py:68 +#: orgs/api.py:80 msgid "The current organization cannot be deleted" msgstr "当前组织不能被删除" +#: orgs/mixins/api.py:46 +msgid "Root organization only allow view and delete" +msgstr "全局组织仅支持 查看和删除" + #: orgs/mixins/models.py:45 orgs/mixins/serializers.py:25 orgs/models.py:36 -#: orgs/models.py:402 orgs/serializers.py:101 +#: orgs/models.py:419 orgs/serializers.py:101 #: tickets/serializers/ticket/ticket.py:81 msgid "Organization" msgstr "组织" @@ -1891,7 +1903,7 @@ msgstr "组织审计员" msgid "GLOBAL" msgstr "全局组织" -#: orgs/models.py:404 users/models/user.py:540 +#: orgs/models.py:421 users/models/user.py:540 #: users/templates/users/_select_user_modal.html:15 #: users/templates/users/user_detail.html:73 #: users/templates/users/user_list.html:16 @@ -1998,11 +2010,13 @@ msgid "" "permission type. ({})" msgstr "应用列表中包含与授权类型不同的应用。({})" -#: perms/serializers/asset/permission.py:61 users/serializers/user.py:67 +#: perms/serializers/asset/permission.py:43 +#: perms/serializers/asset/permission.py:61 users/serializers/user.py:34 +#: users/serializers/user.py:69 msgid "Is expired" msgstr "是否过期" -#: perms/serializers/asset/permission.py:62 users/serializers/user.py:66 +#: perms/serializers/asset/permission.py:62 users/serializers/user.py:68 msgid "Is valid" msgstr "账户是否有效" @@ -2022,7 +2036,7 @@ msgstr "系统用户数量" msgid "Test mail sent to {}, please check" msgstr "邮件已经发送{}, 请检查" -#: settings/api/common.py:110 xpack/plugins/interface/api.py:18 +#: settings/api/common.py:107 xpack/plugins/interface/api.py:18 #: xpack/plugins/interface/models.py:36 msgid "Welcome to the JumpServer open source Bastion Host" msgstr "欢迎使用JumpServer开源堡垒机" @@ -3423,10 +3437,6 @@ msgstr "受理人" msgid "Assignees display" msgstr "受理人 (显示名称)" -#: tickets/serializers/ticket/meta/ticket_type/apply_application.py:24 -msgid "Category display" -msgstr "类别 (显示名称)" - #: tickets/serializers/ticket/meta/ticket_type/apply_application.py:31 #: tickets/serializers/ticket/ticket.py:19 msgid "Type display" @@ -3558,7 +3568,7 @@ msgstr "工单已处理 - {} ({})" msgid "Your ticket has been processed, processor - {}" msgstr "你的工单已被处理, 处理人 - {}" -#: users/api/user.py:200 +#: users/api/user.py:212 msgid "Could not reset self otp, use profile reset instead" msgstr "不能在该页面重置多因子认证, 请去个人信息页面重置" @@ -3638,8 +3648,8 @@ msgstr "复制你的公钥到这里" msgid "Public key should not be the same as your old one." msgstr "不能和原来的密钥相同" -#: users/forms/profile.py:149 users/serializers/profile.py:74 -#: users/serializers/profile.py:147 users/serializers/profile.py:160 +#: users/forms/profile.py:149 users/serializers/profile.py:76 +#: users/serializers/profile.py:149 users/serializers/profile.py:162 msgid "Not a valid ssh public key" msgstr "SSH密钥不合法" @@ -3677,27 +3687,27 @@ msgstr "用户来源" msgid "Date password last updated" msgstr "最后更新密码日期" -#: users/models/user.py:685 +#: users/models/user.py:692 msgid "Administrator" msgstr "管理员" -#: users/models/user.py:688 +#: users/models/user.py:695 msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" -#: users/serializers/profile.py:32 +#: users/serializers/profile.py:34 msgid "The old password is incorrect" msgstr "旧密码错误" -#: users/serializers/profile.py:40 users/serializers/user.py:112 +#: users/serializers/profile.py:42 users/serializers/user.py:112 msgid "Password does not match security rules" msgstr "密码不满足安全规则" -#: users/serializers/profile.py:46 +#: users/serializers/profile.py:48 msgid "The newly set password is inconsistent" msgstr "两次密码不一致" -#: users/serializers/profile.py:118 users/serializers/user.py:65 +#: users/serializers/profile.py:120 users/serializers/user.py:67 msgid "Is first login" msgstr "首次登录" @@ -3715,58 +3725,58 @@ msgid "Password strategy" msgstr "密码策略" #: users/serializers/user.py:30 -msgid "MFA level for display" -msgstr "多因子认证等级(显示名称)" - -#: users/serializers/user.py:31 -msgid "Login blocked" -msgstr "登录被阻塞" - -#: users/serializers/user.py:32 -msgid "Can update" -msgstr "是否可更新" - -#: users/serializers/user.py:33 -msgid "Can delete" -msgstr "是否可删除" - -#: users/serializers/user.py:35 users/serializers/user.py:72 -msgid "Organization role name" -msgstr "组织角色名称" - -#: users/serializers/user.py:68 -msgid "Avatar url" -msgstr "头像路径" - -#: users/serializers/user.py:70 -msgid "Groups name" -msgstr "用户组名" - -#: users/serializers/user.py:71 -msgid "Source name" -msgstr "用户来源名" - -#: users/serializers/user.py:73 -msgid "Super role name" -msgstr "超级角色名称" - -#: users/serializers/user.py:74 -msgid "Total role name" -msgstr "汇总角色名称" - -#: users/serializers/user.py:75 msgid "MFA enabled" msgstr "是否开启多因子认证" -#: users/serializers/user.py:76 +#: users/serializers/user.py:31 msgid "MFA force enabled" msgstr "强制启用多因子认证" +#: users/serializers/user.py:32 +msgid "MFA level for display" +msgstr "多因子认证等级(显示名称)" + +#: users/serializers/user.py:33 +msgid "Login blocked" +msgstr "登录被阻塞" + +#: users/serializers/user.py:35 +msgid "Can update" +msgstr "是否可更新" + +#: users/serializers/user.py:36 +msgid "Can delete" +msgstr "是否可删除" + +#: users/serializers/user.py:38 users/serializers/user.py:74 +msgid "Organization role name" +msgstr "组织角色名称" + +#: users/serializers/user.py:70 +msgid "Avatar url" +msgstr "头像路径" + +#: users/serializers/user.py:72 +msgid "Groups name" +msgstr "用户组名" + +#: users/serializers/user.py:73 +msgid "Source name" +msgstr "用户来源名" + +#: users/serializers/user.py:75 +msgid "Super role name" +msgstr "超级角色名称" + +#: users/serializers/user.py:76 +msgid "Total role name" +msgstr "汇总角色名称" + #: users/serializers/user.py:100 msgid "Role limit to {}" msgstr "角色只能为 {}" -#: users/serializers/user.py:202 +#: users/serializers/user.py:197 msgid "name not unique" msgstr "名称重复" @@ -4591,19 +4601,19 @@ msgstr "" "
\n" " " -#: users/views/profile/otp.py:193 +#: users/views/profile/otp.py:190 msgid "MFA enable success" msgstr "多因子认证启用成功" -#: users/views/profile/otp.py:194 +#: users/views/profile/otp.py:191 msgid "MFA enable success, return login page" msgstr "多因子认证启用成功,返回到登录页面" -#: users/views/profile/otp.py:196 +#: users/views/profile/otp.py:193 msgid "MFA disable success" msgstr "多因子认证禁用成功" -#: users/views/profile/otp.py:197 +#: users/views/profile/otp.py:194 msgid "MFA disable success, return login page" msgstr "多因子认证禁用成功,返回登录页面" @@ -5098,7 +5108,7 @@ msgstr "许可证导入成功" msgid "License is invalid" msgstr "无效的许可证" -#: xpack/plugins/license/meta.py:11 xpack/plugins/license/models.py:124 +#: xpack/plugins/license/meta.py:11 xpack/plugins/license/models.py:127 msgid "License" msgstr "许可证" @@ -5117,3 +5127,6 @@ msgstr "旗舰版" #: xpack/plugins/license/models.py:77 msgid "Community edition" msgstr "社区版" + +#~ msgid "Organization contains undeleted resources" +#~ msgstr "组织包含未删除的资源" diff --git a/apps/orgs/mixins/api.py b/apps/orgs/mixins/api.py index bfcd4b7af..8717d86cd 100644 --- a/apps/orgs/mixins/api.py +++ b/apps/orgs/mixins/api.py @@ -2,6 +2,9 @@ # from rest_framework.viewsets import ModelViewSet, GenericViewSet from rest_framework_bulk import BulkModelViewSet +from rest_framework.exceptions import MethodNotAllowed +from django.utils.translation import ugettext_lazy as _ + from common.mixins import CommonApiMixin, RelationMixin from orgs.utils import current_org @@ -39,15 +42,29 @@ class OrgQuerySetMixin: return queryset -class OrgModelViewSet(CommonApiMixin, OrgQuerySetMixin, ModelViewSet): +class OrgViewSetMixin(OrgQuerySetMixin): + root_org_readonly_msg = _("Root organization only allow view and delete") + + def update(self, request, *args, **kwargs): + if current_org.is_root(): + raise MethodNotAllowed('put', self.root_org_readonly_msg) + return super().update(request, *args, **kwargs) + + def create(self, request, *args, **kwargs): + if current_org.is_root(): + raise MethodNotAllowed('post', self.root_org_readonly_msg) + return super().update(request, *args, **kwargs) + + +class OrgModelViewSet(CommonApiMixin, OrgViewSetMixin, ModelViewSet): pass -class OrgGenericViewSet(CommonApiMixin, OrgQuerySetMixin, GenericViewSet): +class OrgGenericViewSet(CommonApiMixin, OrgViewSetMixin, GenericViewSet): pass -class OrgBulkModelViewSet(CommonApiMixin, OrgQuerySetMixin, BulkModelViewSet): +class OrgBulkModelViewSet(CommonApiMixin, OrgViewSetMixin, BulkModelViewSet): def allow_bulk_destroy(self, qs, filtered): qs_count = qs.count() filtered_count = filtered.count()