forms.py 11.2 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, Tag
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):
baltery's avatar
baltery 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
    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]
            )

W
wangyong 已提交
49 50 51 52
    class Meta:
        model = Asset

        fields = [
baltery's avatar
baltery 已提交
53
            'hostname', 'ip', 'port', 'type', 'comment', 'admin_user', 'system_users', 'idc', 'groups'
W
wangyong 已提交
54
        ]
W
wangyong 已提交
55
        widgets = {
baltery's avatar
baltery 已提交
56 57 58 59 60 61 62 63 64
            '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 已提交
65 66
        }

W
wangyong 已提交
67 68

class AssetGroupForm(forms.ModelForm):
baltery's avatar
baltery 已提交
69
    # See AdminUserForm comment same it
baltery's avatar
baltery 已提交
70
    assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
71 72 73 74 75
                                            label=_('Asset'),
                                            required=False,
                                            widget=forms.SelectMultiple(
                                                attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
                                            )
baltery's avatar
baltery 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88

    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 已提交
89 90 91 92 93
    class Meta:
        model = AssetGroup
        fields = [
            "name", "comment"
        ]
baltery's avatar
baltery 已提交
94 95 96
        help_texts = {
            'name': '* required',
        }
W
wangyong 已提交
97 98


baltery's avatar
Add idc  
baltery 已提交
99
class IDCForm(forms.ModelForm):
baltery's avatar
baltery 已提交
100
    # See AdminUserForm comment same it
baltery's avatar
Add idc  
baltery 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
    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 已提交
120 121 122 123
    class Meta:
        model = IDC
        fields = ['name', "bandwidth", "operator", 'contact', 'phone', 'address', 'network', 'comment']
        widgets = {
baltery's avatar
Add idc  
baltery 已提交
124
            'name': forms.TextInput(attrs={'placeholder': _('Name')}),
W
wangyong 已提交
125 126 127
            'network': forms.Textarea(
                attrs={'placeholder': '192.168.1.0/24\n192.168.2.0/24'})
        }
baltery's avatar
baltery 已提交
128 129


baltery's avatar
baltery 已提交
130
class AdminUserForm(forms.ModelForm):
baltery's avatar
baltery 已提交
131
    # Admin user assets define, let user select, save it in form not in view
baltery's avatar
baltery 已提交
132 133 134 135 136 137
    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 已提交
138
    auto_generate_key = forms.BooleanField(required=True, initial=True)
baltery's avatar
baltery 已提交
139
    # Form field name can not start with `_`, so redefine it,
baltery's avatar
baltery 已提交
140 141
    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 已提交
142
    # Need use upload private key file except paste private key content
baltery's avatar
baltery 已提交
143
    private_key_file = forms.FileField(required=False)
baltery's avatar
baltery 已提交
144 145

    def __init__(self, *args, **kwargs):
baltery's avatar
baltery 已提交
146
        # When update a admin user instance, initial it
baltery's avatar
baltery 已提交
147 148 149
        if kwargs.get('instance'):
            initial = kwargs.get('initial', {})
            initial['assets'] = kwargs['instance'].assets.all()
baltery's avatar
baltery 已提交
150
        super(AdminUserForm, self).__init__(*args, **kwargs)
baltery's avatar
baltery 已提交
151 152

    def _save_m2m(self):
baltery's avatar
baltery 已提交
153
        # Save assets relation with admin user
baltery's avatar
baltery 已提交
154
        super(AdminUserForm, self)._save_m2m()
baltery's avatar
baltery 已提交
155 156 157 158
        assets = self.cleaned_data['assets']
        self.instance.assets.clear()
        self.instance.assets.add(*tuple(assets))

baltery's avatar
baltery 已提交
159
    def save(self, commit=True):
baltery's avatar
baltery 已提交
160
        # Because we define custom field, so we need rewrite :method: `save`
baltery's avatar
baltery 已提交
161 162 163 164 165 166 167
        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 已提交
168
        # Todo: Validate private key file, and generate public key
baltery's avatar
baltery 已提交
169
        # Todo: Auto generate private key and public key
baltery's avatar
baltery 已提交
170 171 172 173 174
        if private_key_file:
            admin_user.private_key = private_key_file.read()
        admin_user.save()
        return self.instance

baltery's avatar
baltery 已提交
175
    class Meta:
baltery's avatar
baltery 已提交
176
        model = AdminUser
baltery's avatar
baltery 已提交
177
        fields = ['name', 'username', 'auto_generate_key', 'password', 'private_key_file', 'as_default', 'comment']
baltery's avatar
baltery 已提交
178 179
        widgets = {
            'name': forms.TextInput(attrs={'placeholder': _('Name')}),
baltery's avatar
baltery 已提交
180 181 182 183 184 185 186
            'username': forms.TextInput(attrs={'placeholder': _('Username')}),
        }
        help_texts = {
            'name': '* required',
            'username': '* required',
        }

baltery's avatar
baltery 已提交
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202

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 已提交
203
    auto_generate_key = forms.BooleanField(initial=True)
baltery's avatar
baltery 已提交
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 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
    # 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',
        }