From 5ffd1f99fdb721f21c65648ae3c39d33ad6bf8a5 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 24 Jul 2017 22:42:01 +0800 Subject: [PATCH] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E5=A4=8D=E6=9B=B4=E6=96=B0?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/forms.py | 55 +++++++++++++++++++ .../templates/assets/system_user_update.html | 38 +++++++++++++ apps/assets/views/system_user.py | 8 +-- 3 files changed, 97 insertions(+), 4 deletions(-) diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 2796d2528..902325310 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -302,5 +302,60 @@ class SystemUserForm(forms.ModelForm): } +class SystemUserUpdateForm(forms.ModelForm): + # Admin user assets define, let user select, save it in form not in view + auto_generate_key = forms.BooleanField(initial=False, required=False) + # Form field name can not start with `_`, so redefine it, + password = forms.CharField(widget=forms.PasswordInput, required=False, + max_length=100, strip=True) + # Need use upload private key file except paste private key content + private_key_file = forms.FileField(required=False) + + def __init__(self, *args, **kwargs): + super(SystemUserUpdateForm, self).__init__(*args, **kwargs) + + def save(self, commit=True): + # Because we define custom field, so we need rewrite :method: `save` + system_user = super(SystemUserUpdateForm, self).save(commit=commit) + password = self.cleaned_data['password'] + private_key_file = self.cleaned_data.get('private_key_file') + + if system_user.auth_method == 'P' and password: + system_user.password = password + elif system_user.auth_method == 'K' and private_key_file: + private_key = private_key_file.read().strip() + public_key = ssh_pubkey_gen(private_key=private_key) + system_user.private_key = private_key + system_user.public_key = public_key + system_user.save() + return self.instance + + def clean_private_key_file(self): + if self.data['auth_method'] == 'K' and self.cleaned_data['private_key_file']: + key_string = self.cleaned_data['private_key_file'].read() + self.cleaned_data['private_key_file'].seek(0) + if not validate_ssh_private_key(key_string): + raise forms.ValidationError(_('Invalid private key')) + return self.cleaned_data['private_key_file'] + + class Meta: + model = SystemUser + fields = [ + 'name', 'username', 'protocol', 'auto_generate_key', 'password', + 'private_key_file', 'auth_method', 'auto_push', 'sudo', + 'comment', 'shell' + ] + widgets = { + 'name': forms.TextInput(attrs={'placeholder': _('Name')}), + 'username': forms.TextInput(attrs={'placeholder': _('Username')}), + } + help_texts = { + 'name': '* required', + 'username': '* required', + 'auto_push': 'Auto push system user to asset', + } + + + class FileForm(forms.Form): file = forms.FileField() diff --git a/apps/assets/templates/assets/system_user_update.html b/apps/assets/templates/assets/system_user_update.html index 506ef151c..c068b3986 100644 --- a/apps/assets/templates/assets/system_user_update.html +++ b/apps/assets/templates/assets/system_user_update.html @@ -13,3 +13,41 @@ {% endblock %} + +{% block custom_foot_js %} + +{% endblock %} \ No newline at end of file diff --git a/apps/assets/views/system_user.py b/apps/assets/views/system_user.py index ca7ebd412..801bc78f4 100644 --- a/apps/assets/views/system_user.py +++ b/apps/assets/views/system_user.py @@ -4,14 +4,14 @@ from __future__ import absolute_import, unicode_literals from django.utils.translation import ugettext as _ from django.conf import settings from django.db import transaction -from django.views.generic import TemplateView, ListView, View -from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView +from django.views.generic import TemplateView, ListView +from django.views.generic.edit import CreateView, DeleteView, UpdateView from django.urls import reverse_lazy from django.contrib.messages.views import SuccessMessageMixin from django.views.generic.detail import DetailView, SingleObjectMixin from .. import forms -from ..models import Asset, AssetGroup, AdminUser, IDC, SystemUser +from ..models import Asset, AssetGroup, SystemUser from ..hands import AdminUserRequiredMixin from perms.utils import associate_system_users_and_assets @@ -65,7 +65,7 @@ class SystemUserCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateVi class SystemUserUpdateView(AdminUserRequiredMixin, UpdateView): model = SystemUser - form_class = forms.SystemUserForm + form_class = forms.SystemUserUpdateForm template_name = 'assets/system_user_update.html' def get_context_data(self, **kwargs):