From 3da33a57e27d0c37e1e563b38fb03dd0912d4f7a Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 7 Jan 2017 20:17:22 +0800 Subject: [PATCH] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E6=94=B9tab=20->=20space,?= =?UTF-8?q?=20=E5=88=A0=E9=99=A4system=20user=E7=9A=84=20as=20default?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/forms.py | 562 +++++++++++++++++++++--------------------- apps/assets/models.py | 2 +- 2 files changed, 282 insertions(+), 282 deletions(-) diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 677b9c4e5..bdd4ee51e 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -20,305 +20,305 @@ from common.utils import validate_ssh_private_key, ssh_pubkey_gen # 'groups': forms.SelectMultiple(attrs={'class': 'select2-groups', 'data-placeholder': _('Select asset groups')}), # 'system_user': forms.SelectMultiple(attrs={'class': 'select2-system-user', 'data-placeholder': _('Select asset system user')}), # 'admin_user': forms.SelectMultiple(attrs={'class': 'select2-admin-user', 'data-placeholder': _('Select asset admin user')}), - # } + # } # class AssetCreateForm(forms.ModelForm): - def __init__(self, *args, **kwargs): - instance = kwargs.get('instance', None) - if instance: - initial = kwargs.get('initial', {}) - initial['tags'] = [t.pk for t in kwargs['instance'].tags.all()] - super(AssetCreateForm, self).__init__(*args, **kwargs) - - def _save_m2m(self): - super(AssetCreateForm, self)._save_m2m() - tags = self.cleaned_data['tags'] - self.instance.tags.clear() - self.instance.tags.add(*tuple(tags)) - - def clean(self): - clean_data = super(AssetCreateForm, self).clean() - ip = clean_data.get('ip') - port = clean_data.get('port') - query = Asset.objects.filter(ip=ip, port=port) - if query: - raise forms.ValidationError('this asset has exists.') - - class Meta: - model = Asset - tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.all()) - fields = [ - 'hostname', 'ip', 'port', 'type', 'comment', 'admin_user', 'system_users', 'idc', 'groups', - 'other_ip', 'remote_card_ip', 'mac_address', 'brand', 'cpu', 'memory', 'disk', 'os', 'cabinet_no', - 'cabinet_pos', 'number', 'status', 'env', 'sn', 'tags', - ] - widgets = { - 'groups': forms.SelectMultiple(attrs={'class': 'select2', - 'data-placeholder': _('Select asset groups')}), - 'tags': forms.SelectMultiple(attrs={'class': 'select2', - 'data-placeholder': _('Select asset tags')}), - 'system_users': forms.SelectMultiple(attrs={'class': 'select2', - 'data-placeholder': _('Select asset system users')}), - 'admin_user': forms.Select(attrs={'class': 'select2', 'data-placeholder': _('Select asset admin user')}), - } - help_texts = { - 'hostname': '* required', - 'ip': '* required', - 'system_users': _('System user will be granted for user to login assets (using ansible create automatic)'), - 'admin_user': _('Admin user should be exist on asset already, And have sudo ALL permission'), - 'tags': '最多5个标签,单个标签最长8个汉字,按回车确认' - } + def __init__(self, *args, **kwargs): + instance = kwargs.get('instance', None) + if instance: + initial = kwargs.get('initial', {}) + initial['tags'] = [t.pk for t in kwargs['instance'].tags.all()] + super(AssetCreateForm, self).__init__(*args, **kwargs) + + def _save_m2m(self): + super(AssetCreateForm, self)._save_m2m() + tags = self.cleaned_data['tags'] + self.instance.tags.clear() + self.instance.tags.add(*tuple(tags)) + + def clean(self): + clean_data = super(AssetCreateForm, self).clean() + ip = clean_data.get('ip') + port = clean_data.get('port') + query = Asset.objects.filter(ip=ip, port=port) + if query: + raise forms.ValidationError('this asset has exists.') + + class Meta: + model = Asset + tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.all()) + fields = [ + 'hostname', 'ip', 'port', 'type', 'comment', 'admin_user', 'system_users', 'idc', 'groups', + 'other_ip', 'remote_card_ip', 'mac_address', 'brand', 'cpu', 'memory', 'disk', 'os', 'cabinet_no', + 'cabinet_pos', 'number', 'status', 'env', 'sn', 'tags', + ] + widgets = { + 'groups': forms.SelectMultiple(attrs={'class': 'select2', + 'data-placeholder': _('Select asset groups')}), + 'tags': forms.SelectMultiple(attrs={'class': 'select2', + 'data-placeholder': _('Select asset tags')}), + 'system_users': forms.SelectMultiple(attrs={'class': 'select2', + 'data-placeholder': _('Select asset system users')}), + 'admin_user': forms.Select(attrs={'class': 'select2', 'data-placeholder': _('Select asset admin user')}), + } + help_texts = { + 'hostname': '* required', + 'ip': '* required', + 'system_users': _('System user will be granted for user to login assets (using ansible create automatic)'), + 'admin_user': _('Admin user should be exist on asset already, And have sudo ALL permission'), + 'tags': '最多5个标签,单个标签最长8个汉字,按回车确认' + } class AssetGroupForm(forms.ModelForm): - # See AdminUserForm comment same it - assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), - label=_('Asset'), - required=False, - widget=forms.SelectMultiple( - attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) - ) - - def __init__(self, *args, **kwargs): - if kwargs.get('instance', None): - initial = kwargs.get('initial', {}) - initial['assets'] = kwargs['instance'].assets.all() - super(AssetGroupForm, self).__init__(*args, **kwargs) - - def _save_m2m(self): - super(AssetGroupForm, self)._save_m2m() - assets = self.cleaned_data['assets'] - self.instance.assets.clear() - self.instance.assets.add(*tuple(assets)) - - class Meta: - model = AssetGroup - fields = [ - "name", "comment","system_users", - ] - widgets = { - 'name' : forms.TextInput(attrs={}), - 'system_users': forms.SelectMultiple(attrs={'class': 'select2-system-user', 'data-placeholder': _('Select asset system user')}), - - } - help_texts = { - 'name': '* required', - } + # See AdminUserForm comment same it + assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), + label=_('Asset'), + required=False, + widget=forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) + ) + + def __init__(self, *args, **kwargs): + if kwargs.get('instance', None): + initial = kwargs.get('initial', {}) + initial['assets'] = kwargs['instance'].assets.all() + super(AssetGroupForm, self).__init__(*args, **kwargs) + + def _save_m2m(self): + super(AssetGroupForm, self)._save_m2m() + assets = self.cleaned_data['assets'] + self.instance.assets.clear() + self.instance.assets.add(*tuple(assets)) + + class Meta: + model = AssetGroup + fields = [ + "name", "comment","system_users", + ] + widgets = { + 'name' : forms.TextInput(attrs={}), + 'system_users': forms.SelectMultiple(attrs={'class': 'select2-system-user', 'data-placeholder': _('Select asset system user')}), + + } + help_texts = { + 'name': '* required', + } class IDCForm(forms.ModelForm): - # See AdminUserForm comment same it - assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), - label=_('Asset'), - required=False, - widget=forms.SelectMultiple( - attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) - ) - - def __init__(self, *args, **kwargs): - if kwargs.get('instance'): - initial = kwargs.get('initial', {}) - initial['assets'] = kwargs['instance'].assets.all() - super(IDCForm, self).__init__(*args, **kwargs) - - def _save_m2m(self): - super(IDCForm, self)._save_m2m() - assets = self.cleaned_data['assets'] - self.instance.assets.clear() - self.instance.assets.add(*tuple(assets)) - - class Meta: - model = IDC - fields = ['name', "bandwidth", "operator", 'contact', 'phone', 'address', 'intranet', 'extranet','comment'] - widgets = { - 'name': forms.TextInput(attrs={'placeholder': _('Name')}), - 'intranet': forms.Textarea( - attrs={'placeholder': 'IP段之间用逗号隔开,如:192.168.1.0/24,192.168.1.0/24'}), - 'extranet': forms.Textarea( - attrs={'placeholder': 'IP段之间用逗号隔开,如:201.1.32.1/24,202.2.32.1/24'}) - } + # See AdminUserForm comment same it + assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), + label=_('Asset'), + required=False, + widget=forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) + ) + + def __init__(self, *args, **kwargs): + if kwargs.get('instance'): + initial = kwargs.get('initial', {}) + initial['assets'] = kwargs['instance'].assets.all() + super(IDCForm, self).__init__(*args, **kwargs) + + def _save_m2m(self): + super(IDCForm, self)._save_m2m() + assets = self.cleaned_data['assets'] + self.instance.assets.clear() + self.instance.assets.add(*tuple(assets)) + + class Meta: + model = IDC + fields = ['name', "bandwidth", "operator", 'contact', 'phone', 'address', 'intranet', 'extranet','comment'] + widgets = { + 'name': forms.TextInput(attrs={'placeholder': _('Name')}), + 'intranet': forms.Textarea( + attrs={'placeholder': 'IP段之间用逗号隔开,如:192.168.1.0/24,192.168.1.0/24'}), + 'extranet': forms.Textarea( + attrs={'placeholder': 'IP段之间用逗号隔开,如:201.1.32.1/24,202.2.32.1/24'}) + } class AdminUserForm(forms.ModelForm): - # Admin user assets define, let user select, save it in form not in view - assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), - label=_('Asset'), - required=False, - widget=forms.SelectMultiple( - attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) - ) - # Form field name can not start with `_`, so redefine it, - password = forms.CharField(widget=forms.PasswordInput, max_length=100, min_length=8, strip=True, - help_text=_('If also set private key, use that first'), required=False) - # Need use upload private key file except paste private key content - private_key_file = forms.FileField(required=False) - - def __init__(self, *args, **kwargs): - # When update a admin user instance, initial it - if kwargs.get('instance'): - initial = kwargs.get('initial', {}) - initial['assets'] = kwargs['instance'].assets.all() - super(AdminUserForm, self).__init__(*args, **kwargs) - - def _save_m2m(self): - # Save assets relation with admin user - super(AdminUserForm, self)._save_m2m() - assets = self.cleaned_data['assets'] - self.instance.assets.clear() - self.instance.assets.add(*tuple(assets)) - - def save(self, commit=True): - # Because we define custom field, so we need rewrite :method: `save` - admin_user = super(AdminUserForm, self).save(commit=commit) - password = self.cleaned_data['password'] - private_key = self.cleaned_data['private_key_file'] - public_key = ssh_pubkey_gen(private_key) - - if password: - admin_user.password = password - if private_key: - admin_user.private_key = private_key - admin_user.public_key = public_key - admin_user.save() - return admin_user - - def clean_private_key_file(self): - private_key_file = self.cleaned_data['private_key_file'] - if private_key_file: - private_key = private_key_file.read() - if not validate_ssh_private_key(private_key): - raise forms.ValidationError(_('Invalid private key')) - return private_key - return private_key_file - - def clean(self): - password = self.cleaned_data['password'] - private_key_file = self.cleaned_data.get('private_key_file', '') - - if not (password or private_key_file): - raise forms.ValidationError(_('Password and private key file must be input one')) - - class Meta: - model = AdminUser - fields = ['name', 'username', 'password', 'private_key_file', 'comment'] - widgets = { - 'name': forms.TextInput(attrs={'placeholder': _('Name')}), - 'username': forms.TextInput(attrs={'placeholder': _('Username')}), - } - help_texts = { - 'name': '* required', - 'username': '* required', - } + # Admin user assets define, let user select, save it in form not in view + assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), + label=_('Asset'), + required=False, + widget=forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) + ) + # Form field name can not start with `_`, so redefine it, + password = forms.CharField(widget=forms.PasswordInput, max_length=100, min_length=8, strip=True, + help_text=_('If also set private key, use that first'), required=False) + # Need use upload private key file except paste private key content + private_key_file = forms.FileField(required=False) + + def __init__(self, *args, **kwargs): + # When update a admin user instance, initial it + if kwargs.get('instance'): + initial = kwargs.get('initial', {}) + initial['assets'] = kwargs['instance'].assets.all() + super(AdminUserForm, self).__init__(*args, **kwargs) + + def _save_m2m(self): + # Save assets relation with admin user + super(AdminUserForm, self)._save_m2m() + assets = self.cleaned_data['assets'] + self.instance.assets.clear() + self.instance.assets.add(*tuple(assets)) + + def save(self, commit=True): + # Because we define custom field, so we need rewrite :method: `save` + admin_user = super(AdminUserForm, self).save(commit=commit) + password = self.cleaned_data['password'] + private_key = self.cleaned_data['private_key_file'] + public_key = ssh_pubkey_gen(private_key) + + if password: + admin_user.password = password + if private_key: + admin_user.private_key = private_key + admin_user.public_key = public_key + admin_user.save() + return admin_user + + def clean_private_key_file(self): + private_key_file = self.cleaned_data['private_key_file'] + if private_key_file: + private_key = private_key_file.read() + if not validate_ssh_private_key(private_key): + raise forms.ValidationError(_('Invalid private key')) + return private_key + return private_key_file + + def clean(self): + password = self.cleaned_data['password'] + private_key_file = self.cleaned_data.get('private_key_file', '') + + if not (password or private_key_file): + raise forms.ValidationError(_('Password and private key file must be input one')) + + class Meta: + model = AdminUser + fields = ['name', 'username', 'password', 'private_key_file', 'comment'] + widgets = { + 'name': forms.TextInput(attrs={'placeholder': _('Name')}), + 'username': forms.TextInput(attrs={'placeholder': _('Username')}), + } + help_texts = { + 'name': '* required', + 'username': '* required', + } class SystemUserForm(forms.ModelForm): - # Admin user assets define, let user select, save it in form not in view - assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), - label=_('Asset'), - required=False, - widget=forms.SelectMultiple( - attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) - ) - asset_groups = forms.ModelMultipleChoiceField(queryset=AssetGroup.objects.all(), - label=_('Asset group'), - required=False, - widget=forms.SelectMultiple( - attrs={'class': 'select2', - 'data-placeholder': _('Select asset groups')}) - ) - auto_generate_key = forms.BooleanField(initial=True) - # Form field name can not start with `_`, so redefine it, - password = forms.CharField(widget=forms.PasswordInput, max_length=100, min_length=8, strip=True, - help_text=_('If also set private key, use that first'), required=False) - # Need use upload private key file except paste private key content - private_key_file = forms.FileField(required=False) - - def __init__(self, *args, **kwargs): - # When update a admin user instance, initial it - if kwargs.get('instance'): - initial = kwargs.get('initial', {}) - initial['assets'] = kwargs['instance'].assets.all() - initial['asset_groups'] = kwargs['instance'].asset_groups.all() - super(SystemUserForm, self).__init__(*args, **kwargs) - - def _save_m2m(self): - # Save assets relation with admin user - super(SystemUserForm, self)._save_m2m() - assets = self.cleaned_data['assets'] - asset_groups = self.cleaned_data['asset_groups'] - self.instance.assets.clear() - self.instance.assets.add(*tuple(assets)) - self.instance.asset_groups.clear() - self.instance.asset_groups.add(*tuple(asset_groups)) - - def save(self, commit=True): - # Because we define custom field, so we need rewrite :method: `save` - system_user = super(SystemUserForm, self).save(commit=commit) - password = self.cleaned_data['password'] - private_key_file = self.cleaned_data['private_key_file'] - - if password: - system_user.password = password - print(password) - # Todo: Validate private key file, and generate public key - # Todo: Auto generate private key and public key - if private_key_file: - system_user.private_key = private_key_file.read().strip() - system_user.save() - return self.instance - - class Meta: - model = SystemUser - fields = [ - 'name', 'username', 'protocol', 'auto_generate_key', 'password', 'private_key_file', 'as_default', - 'auto_push', 'auto_update', 'sudo', 'comment', 'shell', 'home', 'uid', - ] - widgets = { - 'name': forms.TextInput(attrs={'placeholder': _('Name')}), - 'username': forms.TextInput(attrs={'placeholder': _('Username')}), - } - help_texts = { - 'name': '* required', - 'username': '* required', - 'auth_push': 'Auto push system user to asset', - 'auth_update': 'Auto update system user ssh key', - } + # Admin user assets define, let user select, save it in form not in view + assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), + label=_('Asset'), + required=False, + widget=forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) + ) + asset_groups = forms.ModelMultipleChoiceField(queryset=AssetGroup.objects.all(), + label=_('Asset group'), + required=False, + widget=forms.SelectMultiple( + attrs={'class': 'select2', + 'data-placeholder': _('Select asset groups')}) + ) + auto_generate_key = forms.BooleanField(initial=True) + # Form field name can not start with `_`, so redefine it, + password = forms.CharField(widget=forms.PasswordInput, max_length=100, min_length=8, strip=True, + help_text=_('If also set private key, use that first'), required=False) + # Need use upload private key file except paste private key content + private_key_file = forms.FileField(required=False) + + def __init__(self, *args, **kwargs): + # When update a admin user instance, initial it + if kwargs.get('instance'): + initial = kwargs.get('initial', {}) + initial['assets'] = kwargs['instance'].assets.all() + initial['asset_groups'] = kwargs['instance'].asset_groups.all() + super(SystemUserForm, self).__init__(*args, **kwargs) + + def _save_m2m(self): + # Save assets relation with admin user + super(SystemUserForm, self)._save_m2m() + assets = self.cleaned_data['assets'] + asset_groups = self.cleaned_data['asset_groups'] + self.instance.assets.clear() + self.instance.assets.add(*tuple(assets)) + self.instance.asset_groups.clear() + self.instance.asset_groups.add(*tuple(asset_groups)) + + def save(self, commit=True): + # Because we define custom field, so we need rewrite :method: `save` + system_user = super(SystemUserForm, self).save(commit=commit) + password = self.cleaned_data['password'] + private_key_file = self.cleaned_data['private_key_file'] + + if password: + system_user.password = password + print(password) + # Todo: Validate private key file, and generate public key + # Todo: Auto generate private key and public key + if private_key_file: + system_user.private_key = private_key_file.read().strip() + system_user.save() + return self.instance + + class Meta: + model = SystemUser + fields = [ + 'name', 'username', 'protocol', 'auto_generate_key', 'password', 'private_key_file', + 'auto_push', 'auto_update', 'sudo', 'comment', 'shell', 'home', 'uid', + ] + widgets = { + 'name': forms.TextInput(attrs={'placeholder': _('Name')}), + 'username': forms.TextInput(attrs={'placeholder': _('Username')}), + } + help_texts = { + 'name': '* required', + 'username': '* required', + 'auth_push': 'Auto push system user to asset', + 'auth_update': 'Auto update system user ssh key', + } class AssetTagForm(forms.ModelForm): - assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), - label=_('Asset'), - required=False, - widget=forms.SelectMultiple( - attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) - ) - - def __init__(self, *args, **kwargs): - if kwargs.get('instance', None): - initial = kwargs.get('initial', {}) - initial['assets'] = kwargs['instance'].asset_set.all() - super(AssetTagForm, self).__init__(*args, **kwargs) - - def _save_m2m(self): - assets = self.cleaned_data['assets'] - self.instance.assets.clear() - self.instance.assets.add(*tuple(assets)) - super(AssetTagForm, self)._save_m2m() - - class Meta: - model = Tag - fields = [ - "name", - ] - widgets = { - 'name' : forms.TextInput(attrs={}), - - } - help_texts = { - 'name': '* required', - } + assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), + label=_('Asset'), + required=False, + widget=forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) + ) + + def __init__(self, *args, **kwargs): + if kwargs.get('instance', None): + initial = kwargs.get('initial', {}) + initial['assets'] = kwargs['instance'].asset_set.all() + super(AssetTagForm, self).__init__(*args, **kwargs) + + def _save_m2m(self): + assets = self.cleaned_data['assets'] + self.instance.assets.clear() + self.instance.assets.add(*tuple(assets)) + super(AssetTagForm, self)._save_m2m() + + class Meta: + model = Tag + fields = [ + "name", + ] + widgets = { + 'name' : forms.TextInput(attrs={}), + + } + help_texts = { + 'name': '* required', + } class FileForm(forms.Form): - file = forms.FileField() \ No newline at end of file + file = forms.FileField() diff --git a/apps/assets/models.py b/apps/assets/models.py index 7cd025946..597910821 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -144,7 +144,6 @@ class SystemUser(models.Model): protocol = models.CharField(max_length=16, choices=PROTOCOL_CHOICES, default='ssh', verbose_name=_('Protocol')) _private_key = models.CharField(max_length=4096, blank=True, verbose_name=_('SSH private key')) _public_key = models.CharField(max_length=4096, blank=True, verbose_name=_('SSH public key')) - as_default = models.BooleanField(default=False, verbose_name=_('As default')) auto_push = models.BooleanField(default=True, verbose_name=_('Auto push')) auto_update = models.BooleanField(default=True, verbose_name=_('Auto update pass/key')) sudo = models.TextField(max_length=4096, default='/user/bin/whoami', verbose_name=_('Sudo')) @@ -269,6 +268,7 @@ class AssetGroup(models.Model): def get_default_idc(): return IDC.initial() + class Tag(models.Model): name = models.CharField(max_length=64, unique=True, verbose_name=_('Name')) created_time = models.DateTimeField(auto_now_add=True, verbose_name=_('Create time')) -- GitLab