forms.py 9.3 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",
W
wangyong 已提交
15 16 17
            "number", "status", "type", "env", "sn", "is_active", "comment"
        ]

W
wangyong 已提交
18
        widgets = {
baltery's avatar
baltery 已提交
19
            'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Select asset groups')}),
W
wangyong 已提交
20 21
        }

W
wangyong 已提交
22 23

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

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


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


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

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

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

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

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

baltery's avatar
baltery 已提交
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 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

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(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()
            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',
        }