forms.py 10.4 KB
Newer Older
W
wangyong 已提交
1 2 3
# coding:utf-8
from django import forms

baltery's avatar
baltery 已提交
4
from .models import IDC, Asset, AssetGroup, AdminUser, SystemUser
W
wangyong 已提交
5
from django.utils.translation import gettext_lazy as _
W
wangyong 已提交
6 7


baltery's avatar
baltery 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
# 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):
W
wangyong 已提交
26 27 28 29
    class Meta:
        model = Asset

        fields = [
baltery's avatar
baltery 已提交
30
            'hostname', 'ip', 'port', 'type', 'zone', 'comment', 'admin_user', 'system_users', 'idc', 'groups'
W
wangyong 已提交
31 32
        ]

W
wangyong 已提交
33
        widgets = {
baltery's avatar
baltery 已提交
34 35 36 37 38 39 40 41 42
            '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',
W
wangyong 已提交
43 44
        }

W
wangyong 已提交
45 46

class AssetGroupForm(forms.ModelForm):
baltery's avatar
baltery 已提交
47
    # See AdminUserForm comment same it
baltery's avatar
baltery 已提交
48
    assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
49 50 51 52 53
                                            label=_('Asset'),
                                            required=False,
                                            widget=forms.SelectMultiple(
                                                attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
                                            )
baltery's avatar
baltery 已提交
54 55 56 57 58 59 60 61 62 63 64 65 66

    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))

W
wangyong 已提交
67 68 69 70 71
    class Meta:
        model = AssetGroup
        fields = [
            "name", "comment"
        ]
baltery's avatar
baltery 已提交
72 73 74
        help_texts = {
            'name': '* required',
        }
W
wangyong 已提交
75 76


baltery's avatar
Add idc  
baltery 已提交
77
class IDCForm(forms.ModelForm):
baltery's avatar
baltery 已提交
78
    # See AdminUserForm comment same it
baltery's avatar
Add idc  
baltery 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
    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))

W
wangyong 已提交
98 99 100 101
    class Meta:
        model = IDC
        fields = ['name', "bandwidth", "operator", 'contact', 'phone', 'address', 'network', 'comment']
        widgets = {
baltery's avatar
Add idc  
baltery 已提交
102
            'name': forms.TextInput(attrs={'placeholder': _('Name')}),
W
wangyong 已提交
103 104 105
            'network': forms.Textarea(
                attrs={'placeholder': '192.168.1.0/24\n192.168.2.0/24'})
        }
baltery's avatar
baltery 已提交
106 107


baltery's avatar
baltery 已提交
108
class AdminUserForm(forms.ModelForm):
baltery's avatar
baltery 已提交
109
    # Admin user assets define, let user select, save it in form not in view
baltery's avatar
baltery 已提交
110 111 112 113 114 115
    assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
                                            label=_('Asset'),
                                            required=False,
                                            widget=forms.SelectMultiple(
                                                attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
                                            )
baltery's avatar
baltery 已提交
116
    auto_generate_key = forms.BooleanField(required=True, initial=True)
baltery's avatar
baltery 已提交
117
    # Form field name can not start with `_`, so redefine it,
baltery's avatar
baltery 已提交
118 119
    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)
baltery's avatar
baltery 已提交
120
    # Need use upload private key file except paste private key content
baltery's avatar
baltery 已提交
121
    private_key_file = forms.FileField(required=False)
baltery's avatar
baltery 已提交
122 123

    def __init__(self, *args, **kwargs):
baltery's avatar
baltery 已提交
124
        # When update a admin user instance, initial it
baltery's avatar
baltery 已提交
125 126 127
        if kwargs.get('instance'):
            initial = kwargs.get('initial', {})
            initial['assets'] = kwargs['instance'].assets.all()
baltery's avatar
baltery 已提交
128
        super(AdminUserForm, self).__init__(*args, **kwargs)
baltery's avatar
baltery 已提交
129 130

    def _save_m2m(self):
baltery's avatar
baltery 已提交
131
        # Save assets relation with admin user
baltery's avatar
baltery 已提交
132
        super(AdminUserForm, self)._save_m2m()
baltery's avatar
baltery 已提交
133 134 135 136
        assets = self.cleaned_data['assets']
        self.instance.assets.clear()
        self.instance.assets.add(*tuple(assets))

baltery's avatar
baltery 已提交
137
    def save(self, commit=True):
baltery's avatar
baltery 已提交
138
        # Because we define custom field, so we need rewrite :method: `save`
baltery's avatar
baltery 已提交
139 140 141 142 143 144 145
        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)
baltery's avatar
baltery 已提交
146
        # Todo: Validate private key file, and generate public key
baltery's avatar
baltery 已提交
147
        # Todo: Auto generate private key and public key
baltery's avatar
baltery 已提交
148 149 150 151 152
        if private_key_file:
            admin_user.private_key = private_key_file.read()
        admin_user.save()
        return self.instance

baltery's avatar
baltery 已提交
153
    class Meta:
baltery's avatar
baltery 已提交
154
        model = AdminUser
baltery's avatar
baltery 已提交
155
        fields = ['name', 'username', 'auto_generate_key', 'password', 'private_key_file', 'as_default', 'comment']
baltery's avatar
baltery 已提交
156 157
        widgets = {
            'name': forms.TextInput(attrs={'placeholder': _('Name')}),
baltery's avatar
baltery 已提交
158 159 160 161 162 163 164
            'username': forms.TextInput(attrs={'placeholder': _('Username')}),
        }
        help_texts = {
            'name': '* required',
            'username': '* required',
        }

baltery's avatar
baltery 已提交
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180

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')})
                                                  )
baltery's avatar
baltery 已提交
181
    auto_generate_key = forms.BooleanField(initial=True)
baltery's avatar
baltery 已提交
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
    # 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',
        }