# coding:utf-8 from django import forms from .models import IDC, Asset, AssetGroup, AdminUser, SystemUser, Tag from django.utils.translation import gettext_lazy as _ # class AssetForm(forms.ModelForm): # class Meta: # model = Asset # # fields = [ # 'ip', 'other_ip', 'remote_card_ip', 'hostname', 'port', 'groups', 'username', 'password', # 'idc', 'mac_address', 'brand', 'cpu', 'memory', 'disk', 'os', 'cabinet_no', 'cabinet_pos', # 'number', 'status', 'type', 'env', 'sn', 'is_active', 'comment', 'admin_user', 'system_users' # ] # # widgets = { # '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): tags = forms.CharField(label=_('Tags'), widget=forms.TextInput(attrs={'id': 'tags'}), help_text='Use `,` split') def __init__(self, *args, **kwargs): instance = kwargs.get('instance') if instance: initial = kwargs.get('initial', {}) tags = Tag.objects.filter(asset=instance) tags_value = ','.join([tag.value for tag in tags]) initial['tags'] = tags_value super(AssetCreateForm, self).__init__(*args, **kwargs) def _save_m2m(self): tags = self.cleaned_data['tags'] if tags: value_list = tags.split(',') self.instance.tags.all().delete() Tag.objects.bulk_create( [Tag(value=value) for value in value_list] ) class Meta: model = Asset fields = [ 'hostname', 'ip', 'port', 'type', 'comment', 'admin_user', 'system_users', 'idc', 'groups' ] widgets = { 'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Select asset groups')}), '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', } 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'): 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" ] 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', 'network', 'comment'] widgets = { 'name': forms.TextInput(attrs={'placeholder': _('Name')}), 'network': forms.Textarea( attrs={'placeholder': '192.168.1.0/24\n192.168.2.0/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')}) ) auto_generate_key = forms.BooleanField(required=True, 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() 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_file = self.cleaned_data['private_key_file'] if password: admin_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: admin_user.private_key = private_key_file.read() admin_user.save() return self.instance class Meta: model = AdminUser fields = ['name', 'username', 'auto_generate_key', 'password', 'private_key_file', 'as_default', '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() 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', }