From 670c8a6d0b56d377cb44d290588e1d1ae219429e Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 16 Aug 2018 16:32:49 +0800 Subject: [PATCH] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E5=A4=8D=E5=94=AF=E4=B8=80?= =?UTF-8?q?=E8=AE=A4=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/i18n/zh/LC_MESSAGES/django.mo | Bin 37960 -> 37997 bytes apps/i18n/zh/LC_MESSAGES/django.po | 76 +++++++++++++++-------------- apps/orgs/mixins.py | 33 ++++++++++--- apps/users/forms.py | 4 +- apps/users/models/group.py | 2 +- 5 files changed, 70 insertions(+), 45 deletions(-) diff --git a/apps/i18n/zh/LC_MESSAGES/django.mo b/apps/i18n/zh/LC_MESSAGES/django.mo index a7bbb98a31e029a30757823dac27fec41ae0b835..94e9f07425f50c28bfaa3cf264575144a77d793b 100644 GIT binary patch delta 12093 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 diff --git a/apps/i18n/zh/LC_MESSAGES/django.po b/apps/i18n/zh/LC_MESSAGES/django.po index 335c491e0..93ccac8fc 100644 --- a/apps/i18n/zh/LC_MESSAGES/django.po +++ b/apps/i18n/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: 2018-08-15 15:14+0800\n" +"POT-Creation-Date: 2018-08-16 16:28+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -33,7 +33,7 @@ msgstr "" msgid "测试节点下资产是否可连接: {}" msgstr "" -#: assets/forms/asset.py:27 assets/models/asset.py:80 assets/models/user.py:113 +#: assets/forms/asset.py:27 assets/models/asset.py:82 assets/models/user.py:113 #: assets/templates/assets/asset_detail.html:183 #: assets/templates/assets/asset_detail.html:191 #: assets/templates/assets/system_user_detail.html:178 perms/models.py:32 @@ -41,7 +41,7 @@ msgid "Nodes" msgstr "节点管理" #: assets/forms/asset.py:30 assets/forms/asset.py:69 assets/forms/asset.py:112 -#: assets/forms/asset.py:116 assets/models/asset.py:85 +#: assets/forms/asset.py:116 assets/models/asset.py:87 #: assets/models/cluster.py:19 assets/models/user.py:73 #: assets/templates/assets/asset_detail.html:73 templates/_nav.html:25 #: xpack/plugins/orgs/templates/orgs/org_list.html:18 @@ -59,7 +59,7 @@ msgstr "管理用户" msgid "Label" msgstr "标签" -#: assets/forms/asset.py:37 assets/forms/asset.py:76 assets/models/asset.py:76 +#: assets/forms/asset.py:37 assets/forms/asset.py:76 assets/models/asset.py:78 #: assets/models/domain.py:47 assets/templates/assets/user_asset_list.html:168 #: xpack/plugins/orgs/templates/orgs/org_list.html:17 msgid "Domain" @@ -93,7 +93,7 @@ msgstr "如果有多个的互相隔离的网络,设置资产属于的网域, msgid "Select assets" msgstr "选择资产" -#: assets/forms/asset.py:108 assets/models/asset.py:73 +#: assets/forms/asset.py:108 assets/models/asset.py:75 #: assets/models/domain.py:45 assets/templates/assets/admin_user_assets.html:53 #: assets/templates/assets/asset_detail.html:69 #: assets/templates/assets/domain_gateway_list.html:58 @@ -103,7 +103,7 @@ msgid "Port" msgstr "端口" #: assets/forms/domain.py:15 assets/forms/label.py:13 -#: assets/models/asset.py:232 assets/templates/assets/admin_user_list.html:25 +#: assets/models/asset.py:242 assets/templates/assets/admin_user_list.html:25 #: assets/templates/assets/domain_detail.html:60 #: assets/templates/assets/domain_list.html:23 #: assets/templates/assets/label_list.html:16 @@ -141,7 +141,7 @@ msgstr "密码不能包含特殊字符" #: common/templates/common/terminal_setting.html:72 #: common/templates/common/terminal_setting.html:90 ops/models/adhoc.py:36 #: ops/templates/ops/task_detail.html:59 ops/templates/ops/task_list.html:35 -#: orgs/models.py:10 perms/models.py:28 +#: orgs/models.py:12 perms/models.py:28 #: perms/templates/perms/asset_permission_detail.html:62 #: perms/templates/perms/asset_permission_list.html:53 #: perms/templates/perms/asset_permission_user.html:54 terminal/models.py:17 @@ -225,7 +225,7 @@ msgid "" "password." msgstr "如果选择手动登录模式,用户名和密码则不需要填写" -#: assets/models/asset.py:70 assets/models/domain.py:44 +#: assets/models/asset.py:72 assets/models/domain.py:44 #: assets/templates/assets/_asset_list_modal.html:46 #: assets/templates/assets/admin_user_assets.html:52 #: assets/templates/assets/asset_detail.html:61 @@ -241,7 +241,7 @@ msgstr "如果选择手动登录模式,用户名和密码则不需要填写" msgid "IP" msgstr "IP" -#: assets/models/asset.py:71 assets/templates/assets/_asset_list_modal.html:45 +#: assets/models/asset.py:73 assets/templates/assets/_asset_list_modal.html:45 #: assets/templates/assets/admin_user_assets.html:51 #: assets/templates/assets/asset_detail.html:57 #: assets/templates/assets/asset_list.html:91 @@ -254,7 +254,7 @@ msgstr "IP" msgid "Hostname" msgstr "主机名" -#: assets/models/asset.py:72 assets/models/domain.py:46 +#: assets/models/asset.py:74 assets/models/domain.py:46 #: assets/models/user.py:116 #: assets/templates/assets/domain_gateway_list.html:59 #: assets/templates/assets/system_user_detail.html:70 @@ -264,109 +264,109 @@ msgstr "主机名" msgid "Protocol" msgstr "协议" -#: assets/models/asset.py:74 assets/templates/assets/asset_detail.html:97 +#: assets/models/asset.py:76 assets/templates/assets/asset_detail.html:97 #: assets/templates/assets/user_asset_list.html:165 msgid "Platform" msgstr "系统平台" -#: assets/models/asset.py:81 assets/models/domain.py:49 +#: assets/models/asset.py:83 assets/models/domain.py:49 #: assets/models/label.py:21 assets/templates/assets/asset_detail.html:105 #: assets/templates/assets/user_asset_list.html:169 msgid "Is active" msgstr "激活" -#: assets/models/asset.py:88 assets/templates/assets/asset_detail.html:65 +#: assets/models/asset.py:90 assets/templates/assets/asset_detail.html:65 msgid "Public IP" msgstr "公网IP" -#: assets/models/asset.py:89 assets/templates/assets/asset_detail.html:113 +#: assets/models/asset.py:91 assets/templates/assets/asset_detail.html:113 msgid "Asset number" msgstr "资产编号" -#: assets/models/asset.py:93 assets/templates/assets/asset_detail.html:77 +#: assets/models/asset.py:95 assets/templates/assets/asset_detail.html:77 msgid "Vendor" msgstr "制造商" -#: assets/models/asset.py:95 assets/templates/assets/asset_detail.html:81 +#: assets/models/asset.py:97 assets/templates/assets/asset_detail.html:81 msgid "Model" msgstr "型号" -#: assets/models/asset.py:97 assets/templates/assets/asset_detail.html:109 +#: assets/models/asset.py:99 assets/templates/assets/asset_detail.html:109 msgid "Serial number" msgstr "序列号" -#: assets/models/asset.py:100 +#: assets/models/asset.py:102 msgid "CPU model" msgstr "CPU型号" -#: assets/models/asset.py:101 +#: assets/models/asset.py:103 msgid "CPU count" msgstr "CPU数量" -#: assets/models/asset.py:102 +#: assets/models/asset.py:104 msgid "CPU cores" msgstr "CPU核数" -#: assets/models/asset.py:103 +#: assets/models/asset.py:105 #, fuzzy #| msgid "CPU count" msgid "CPU vcpus" msgstr "CPU数量" -#: assets/models/asset.py:105 assets/templates/assets/asset_detail.html:89 +#: assets/models/asset.py:107 assets/templates/assets/asset_detail.html:89 msgid "Memory" msgstr "内存" -#: assets/models/asset.py:107 +#: assets/models/asset.py:109 msgid "Disk total" msgstr "硬盘大小" -#: assets/models/asset.py:109 +#: assets/models/asset.py:111 msgid "Disk info" msgstr "硬盘信息" -#: assets/models/asset.py:112 assets/templates/assets/asset_detail.html:101 +#: assets/models/asset.py:114 assets/templates/assets/asset_detail.html:101 #: assets/templates/assets/user_asset_list.html:166 msgid "OS" msgstr "操作系统" -#: assets/models/asset.py:114 +#: assets/models/asset.py:116 msgid "OS version" msgstr "系统版本" -#: assets/models/asset.py:116 +#: assets/models/asset.py:118 msgid "OS arch" msgstr "系统架构" -#: assets/models/asset.py:118 +#: assets/models/asset.py:120 msgid "Hostname raw" msgstr "主机名原始" -#: assets/models/asset.py:122 assets/templates/assets/asset_create.html:34 +#: assets/models/asset.py:124 assets/templates/assets/asset_create.html:34 #: assets/templates/assets/asset_detail.html:220 #: assets/templates/assets/asset_update.html:39 templates/_nav.html:27 msgid "Labels" msgstr "标签管理" -#: assets/models/asset.py:124 assets/models/base.py:30 +#: assets/models/asset.py:126 assets/models/base.py:30 #: assets/models/cluster.py:28 assets/models/group.py:21 #: assets/templates/assets/admin_user_detail.html:68 #: assets/templates/assets/asset_detail.html:117 #: assets/templates/assets/domain_detail.html:72 #: assets/templates/assets/system_user_detail.html:100 -#: ops/templates/ops/adhoc_detail.html:86 orgs/models.py:13 perms/models.py:37 +#: ops/templates/ops/adhoc_detail.html:86 orgs/models.py:15 perms/models.py:37 #: perms/models.py:83 perms/templates/perms/asset_permission_detail.html:98 #: users/models/user.py:92 users/templates/users/user_detail.html:111 msgid "Created by" msgstr "创建者" -#: assets/models/asset.py:127 assets/models/cluster.py:26 +#: assets/models/asset.py:129 assets/models/cluster.py:26 #: assets/models/domain.py:21 assets/models/group.py:22 #: assets/models/label.py:24 assets/templates/assets/admin_user_detail.html:64 #: assets/templates/assets/domain_detail.html:68 #: assets/templates/assets/system_user_detail.html:96 #: ops/templates/ops/adhoc_detail.html:90 ops/templates/ops/task_detail.html:63 -#: orgs/models.py:14 perms/models.py:38 perms/models.py:84 +#: orgs/models.py:16 perms/models.py:38 perms/models.py:84 #: perms/templates/perms/asset_permission_detail.html:94 #: terminal/templates/terminal/terminal_detail.html:59 users/models/group.py:17 #: users/templates/users/user_group_detail.html:63 @@ -374,7 +374,7 @@ msgstr "创建者" msgid "Date created" msgstr "创建日期" -#: assets/models/asset.py:129 assets/models/base.py:27 +#: assets/models/asset.py:131 assets/models/base.py:27 #: assets/models/cluster.py:29 assets/models/domain.py:19 #: assets/models/domain.py:48 assets/models/group.py:23 #: assets/models/label.py:22 assets/templates/assets/admin_user_detail.html:72 @@ -386,7 +386,7 @@ msgstr "创建日期" #: assets/templates/assets/system_user_detail.html:104 #: assets/templates/assets/system_user_list.html:34 #: assets/templates/assets/user_asset_list.html:170 common/models.py:30 -#: ops/models/adhoc.py:42 orgs/models.py:15 perms/models.py:39 +#: ops/models/adhoc.py:42 orgs/models.py:17 perms/models.py:39 #: perms/models.py:85 perms/templates/perms/asset_permission_detail.html:102 #: terminal/models.py:27 terminal/templates/terminal/terminal_detail.html:63 #: users/models/group.py:15 users/models/user.py:84 @@ -1918,6 +1918,10 @@ msgstr "任务列表" msgid "Task run history" msgstr "执行历史" +#: orgs/mixins.py:79 +msgid "Organization" +msgstr "组织" + #: perms/forms.py:20 users/forms.py:265 users/forms.py:270 users/forms.py:316 #: xpack/plugins/orgs/forms.py:30 msgid "Select users" @@ -3322,7 +3326,7 @@ msgid "Select admins" msgstr "选择管理员" #: xpack/plugins/orgs/meta.py:8 -msgid "Organization" +msgid "Organizations" msgstr "组织管理" #: xpack/plugins/orgs/templates/orgs/org_detail.html:22 diff --git a/apps/orgs/mixins.py b/apps/orgs/mixins.py index 648611d50..767bf579b 100644 --- a/apps/orgs/mixins.py +++ b/apps/orgs/mixins.py @@ -3,12 +3,15 @@ from werkzeug.local import Local from django.db import models +from django.utils.translation import ugettext_lazy as _ from django.db.models import Q from django.shortcuts import redirect from django.forms import ModelForm from django.http.response import HttpResponseForbidden +from django.core.exceptions import ValidationError -from common.utils import get_logger, is_uuid + +from common.utils import get_logger from .utils import current_org, set_current_org, set_to_root_org from .models import Organization @@ -26,15 +29,15 @@ class OrgManager(models.Manager): def get_queryset(self): queryset = super(OrgManager, self).get_queryset() kwargs = {} - if not hasattr(tl, 'times'): - tl.times = 0 + # if not hasattr(tl, 'times'): + # tl.times = 0 # logger.debug("[{}]>>>>>>>>>> Get query set".format(tl.times)) if not current_org: kwargs['id'] = None elif current_org.is_real(): kwargs['org_id'] = current_org.id elif current_org.is_default(): - queryset = queryset.filter(Q(org_id="") | Q(org_id__isnull=True)) + queryset = queryset.filter(org_id="") queryset = queryset.filter(**kwargs) tl.times += 1 return queryset @@ -73,7 +76,7 @@ class OrgManager(models.Manager): class OrgModelMixin(models.Model): - org_id = models.CharField(max_length=36, null=True, blank=True, default=None) + org_id = models.CharField(max_length=36, blank=True, default='', verbose_name=_("Organization")) objects = OrgManager() sep = '@' @@ -120,6 +123,25 @@ class OrgModelMixin(models.Model): else: return name + def validate_unique(self, exclude=None): + """ + Check unique constraints on the model and raise ValidationError if any + failed. + """ + self.org_id = current_org.id if current_org.is_real() else '' + if exclude and 'org_id' in exclude: + exclude.remove('org_id') + unique_checks, date_checks = self._get_unique_checks(exclude=exclude) + + errors = self._perform_unique_checks(unique_checks) + date_errors = self._perform_date_checks(date_checks) + + for k, v in date_errors.items(): + errors.setdefault(k, []).extend(v) + + if errors: + raise ValidationError(errors) + class Meta: abstract = True @@ -157,4 +179,3 @@ class OrgModelForm(ModelForm): continue model = field.queryset.model field.queryset = model.objects.all() - diff --git a/apps/users/forms.py b/apps/users/forms.py index 5ccc0b2ac..1af4d9593 100644 --- a/apps/users/forms.py +++ b/apps/users/forms.py @@ -306,7 +306,7 @@ def user_limit_to(): return {"orgs": current_org} -class UserGroupForm(forms.ModelForm): +class UserGroupForm(OrgModelForm): users = forms.ModelMultipleChoiceField( queryset=User.objects.exclude(role=User.ROLE_APP), label=_("User"), @@ -342,7 +342,7 @@ class UserGroupForm(forms.ModelForm): class Meta: model = UserGroup fields = [ - 'name', 'users', 'comment' + 'name', 'users', 'comment', ] help_texts = { 'name': '* required' diff --git a/apps/users/models/group.py b/apps/users/models/group.py index e3d310d97..3de8ca331 100644 --- a/apps/users/models/group.py +++ b/apps/users/models/group.py @@ -22,7 +22,7 @@ class UserGroup(OrgModelMixin): class Meta: ordering = ['name'] - unique_together = [('org_id', 'name')] + unique_together = [('org_id', 'name'),] verbose_name = _("User group") @classmethod