forms.py 9.6 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 8 9 10 11 12


class AssetForm(forms.ModelForm):
    class Meta:
        model = Asset

        fields = [
W
wangyong 已提交
13
            "ip", "other_ip", "remote_card_ip", "hostname", "port", "groups", "username", "password",
baltery's avatar
baltery 已提交
14
            "idc", "mac_address", "brand", "cpu", "memory", "disk", "os", "cabinet_no", "cabinet_pos",
baltery's avatar
baltery 已提交
15
            "number", "status", "type", "env", "sn", "is_active", "comment", "admin_user", "system_users"
W
wangyong 已提交
16 17
        ]

W
wangyong 已提交
18
        widgets = {
W
wangyong 已提交
19 20 21
            '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')}),
W
wangyong 已提交
22 23
        }

W
wangyong 已提交
24 25

class AssetGroupForm(forms.ModelForm):
baltery's avatar
baltery 已提交
26
    # See AdminUserForm comment same it
baltery's avatar
baltery 已提交
27
    assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
28 29 30 31 32
                                            label=_('Asset'),
                                            required=False,
                                            widget=forms.SelectMultiple(
                                                attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
                                            )
baltery's avatar
baltery 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45

    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 已提交
46 47 48 49 50
    class Meta:
        model = AssetGroup
        fields = [
            "name", "comment"
        ]
baltery's avatar
baltery 已提交
51 52 53
        help_texts = {
            'name': '* required',
        }
W
wangyong 已提交
54 55


baltery's avatar
Add idc  
baltery 已提交
56
class IDCForm(forms.ModelForm):
baltery's avatar
baltery 已提交
57
    # See AdminUserForm comment same it
baltery's avatar
Add idc  
baltery 已提交
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
    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 已提交
77 78 79 80
    class Meta:
        model = IDC
        fields = ['name', "bandwidth", "operator", 'contact', 'phone', 'address', 'network', 'comment']
        widgets = {
baltery's avatar
Add idc  
baltery 已提交
81
            'name': forms.TextInput(attrs={'placeholder': _('Name')}),
W
wangyong 已提交
82 83 84
            'network': forms.Textarea(
                attrs={'placeholder': '192.168.1.0/24\n192.168.2.0/24'})
        }
baltery's avatar
baltery 已提交
85 86


baltery's avatar
baltery 已提交
87
class AdminUserForm(forms.ModelForm):
baltery's avatar
baltery 已提交
88
    # Admin user assets define, let user select, save it in form not in view
baltery's avatar
baltery 已提交
89 90 91 92 93 94
    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 已提交
95
    auto_generate_key = forms.BooleanField(required=True, initial=True)
baltery's avatar
baltery 已提交
96
    # Form field name can not start with `_`, so redefine it,
baltery's avatar
baltery 已提交
97 98
    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 已提交
99
    # Need use upload private key file except paste private key content
baltery's avatar
baltery 已提交
100
    private_key_file = forms.FileField(required=False)
baltery's avatar
baltery 已提交
101 102

    def __init__(self, *args, **kwargs):
baltery's avatar
baltery 已提交
103
        # When update a admin user instance, initial it
baltery's avatar
baltery 已提交
104 105 106
        if kwargs.get('instance'):
            initial = kwargs.get('initial', {})
            initial['assets'] = kwargs['instance'].assets.all()
baltery's avatar
baltery 已提交
107
        super(AdminUserForm, self).__init__(*args, **kwargs)
baltery's avatar
baltery 已提交
108 109

    def _save_m2m(self):
baltery's avatar
baltery 已提交
110
        # Save assets relation with admin user
baltery's avatar
baltery 已提交
111
        super(AdminUserForm, self)._save_m2m()
baltery's avatar
baltery 已提交
112 113 114 115
        assets = self.cleaned_data['assets']
        self.instance.assets.clear()
        self.instance.assets.add(*tuple(assets))

baltery's avatar
baltery 已提交
116
    def save(self, commit=True):
baltery's avatar
baltery 已提交
117
        # Because we define custom field, so we need rewrite :method: `save`
baltery's avatar
baltery 已提交
118 119 120 121 122 123 124
        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 已提交
125
        # Todo: Validate private key file, and generate public key
baltery's avatar
baltery 已提交
126
        # Todo: Auto generate private key and public key
baltery's avatar
baltery 已提交
127 128 129 130 131
        if private_key_file:
            admin_user.private_key = private_key_file.read()
        admin_user.save()
        return self.instance

baltery's avatar
baltery 已提交
132
    class Meta:
baltery's avatar
baltery 已提交
133
        model = AdminUser
baltery's avatar
baltery 已提交
134
        fields = ['name', 'username', 'auto_generate_key', 'password', 'private_key_file', 'as_default', 'comment']
baltery's avatar
baltery 已提交
135 136
        widgets = {
            'name': forms.TextInput(attrs={'placeholder': _('Name')}),
baltery's avatar
baltery 已提交
137 138 139 140 141 142 143
            'username': forms.TextInput(attrs={'placeholder': _('Username')}),
        }
        help_texts = {
            'name': '* required',
            'username': '* required',
        }

baltery's avatar
baltery 已提交
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159

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 已提交
160
    auto_generate_key = forms.BooleanField(initial=True)
baltery's avatar
baltery 已提交
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 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
    # 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',
        }