diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 30e48a443..c2d7e9cd4 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -13,19 +13,24 @@ class AssetCreateForm(forms.ModelForm): class Meta: model = Asset fields = [ - 'hostname', 'ip', 'public_ip', 'port', 'type', 'comment', 'admin_user', - 'idc', 'groups', 'status', 'env', 'is_active' + 'hostname', 'ip', 'public_ip', 'port', 'type', 'comment', + 'admin_user', 'idc', 'groups', 'status', 'env', 'is_active' ] widgets = { - 'groups': forms.SelectMultiple(attrs={'class': 'select2', - 'data-placeholder': _('Select asset groups')}), - 'admin_user': forms.Select(attrs={'class': 'select2', 'data-placeholder': _('Select asset admin user')}), + 'groups': forms.SelectMultiple( + attrs={'class': 'select2', + 'data-placeholder': _('Select asset groups')}), + 'admin_user': forms.Select( + attrs={'class': 'select2', + 'data-placeholder': _('Select asset admin user')}), } help_texts = { 'hostname': '* required', 'ip': '* required', - 'system_users': _('System user will be granted for user to login assets (using ansible create automatic)'), - 'admin_user': _('Admin user should be exist on asset already, And have sudo ALL permission'), + 'system_users': _('System user will be granted for user to login ' + 'assets (using ansible create automatic)'), + 'admin_user': _('Admin user should be exist on asset already, ' + 'And have sudo ALL permission'), } def clean_admin_user(self): @@ -43,23 +48,43 @@ class AssetUpdateForm(forms.ModelForm): 'cabinet_pos', 'number', 'comment' ] widgets = { - 'groups': forms.SelectMultiple(attrs={'class': 'select2', - 'data-placeholder': _('Select asset groups')}), - 'admin_user': forms.Select(attrs={'class': 'select2', 'data-placeholder': _('Select asset admin user')}), + 'groups': forms.SelectMultiple( + attrs={'class': 'select2', + 'data-placeholder': _('Select asset groups')}), + 'admin_user': forms.Select( + attrs={'class': 'select2', + 'data-placeholder': _('Select asset admin user')}), } help_texts = { 'hostname': '* required', 'ip': '* required', - 'system_users': _('System user will be granted for user to login assets (using ansible create automatic)'), - 'admin_user': _('Admin user should be exist on asset already, And have sudo ALL permission'), + 'system_users': _('System user will be granted for user ' + 'to login assets (using ansible create automatic)'), + 'admin_user': _('Admin user should be exist on asset ' + 'already, And have sudo ALL permission'), } class AssetBulkUpdateForm(forms.ModelForm): + assets = forms.MultipleChoiceField( + required=True, + help_text='* required', + label=_('Select assets'), + choices=[(asset.id, asset.hostname) for asset in Asset.objects.all()], + widget=forms.SelectMultiple( + attrs={ + 'class': 'select2', + 'data-placeholder': _('Select assets') + } + ) + ) + port = forms.IntegerField(min_value=1, max_value=65535, + required=False, label=_('Port')) + class Meta: model = Asset fields = [ - 'port', 'groups', 'admin_user', 'idc', + 'assets', 'port', 'groups', 'admin_user', 'idc', 'type', 'env', 'status', ] widgets = { @@ -71,6 +96,17 @@ class AssetBulkUpdateForm(forms.ModelForm): 'data-placeholder': _('Select asset admin user')}), } + def save(self, commit=True): + cleaned_data = {k: v for k, v in self.cleaned_data.items() if v is not None} + assets_id = cleaned_data.pop('assets') + groups = cleaned_data.pop('groups') + assets = Asset.objects.filter(id__in=assets_id) + assets.update(**cleaned_data) + if groups: + for asset in assets: + asset.groups.set(groups) + return assets + class AssetGroupForm(forms.ModelForm): # See AdminUserForm comment same it diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index 499ad2cf0..bba94c749 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -41,10 +41,13 @@ class Asset(models.Model): ip = models.GenericIPAddressField(max_length=32, verbose_name=_('IP'), db_index=True) hostname = models.CharField(max_length=128, unique=True, verbose_name=_('Hostname')) port = models.IntegerField(default=22, verbose_name=_('Port')) - groups = models.ManyToManyField(AssetGroup, blank=True, related_name='assets', verbose_name=_('Asset groups')) + groups = models.ManyToManyField(AssetGroup, blank=True, related_name='assets', + verbose_name=_('Asset groups')) admin_user = models.ForeignKey(AdminUser, null=True, blank=True, related_name='assets', on_delete=models.SET_NULL, verbose_name=_("Admin user")) - system_users = models.ManyToManyField(SystemUser, blank=True, related_name='assets', verbose_name=_("System User")) + system_users = models.ManyToManyField(SystemUser, blank=True, + related_name='assets', + verbose_name=_("System User")) idc = models.ForeignKey(IDC, blank=True, null=True, related_name='assets', on_delete=models.SET_NULL, verbose_name=_('IDC'),) is_active = models.BooleanField(default=True, verbose_name=_('Is active')) @@ -52,12 +55,14 @@ class Asset(models.Model): default='Server', verbose_name=_('Asset type'),) env = models.CharField(choices=ENV_CHOICES, max_length=8, blank=True, null=True, default='Prod', verbose_name=_('Asset environment'),) - status = models.CharField(choices=STATUS_CHOICES, max_length=8, null=True, blank=True, + status = models.CharField(choices=STATUS_CHOICES, max_length=12, null=True, blank=True, default='In use', verbose_name=_('Asset status')) # Some information - public_ip = models.GenericIPAddressField(max_length=32, blank=True, null=True, verbose_name=_('Public IP')) - remote_card_ip = models.CharField(max_length=16, null=True, blank=True, verbose_name=_('Remote control card IP')) + public_ip = models.GenericIPAddressField(max_length=32, blank=True, + null=True, verbose_name=_('Public IP')) + remote_card_ip = models.CharField(max_length=16, null=True, blank=True, + verbose_name=_('Remote control card IP')) cabinet_no = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Cabinet number')) cabinet_pos = models.IntegerField(null=True, blank=True, verbose_name=_('Cabinet position')) number = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Asset number')) diff --git a/apps/assets/templates/assets/asset_bulk_update.html b/apps/assets/templates/assets/asset_bulk_update.html index 44951778e..e72b44302 100644 --- a/apps/assets/templates/assets/asset_bulk_update.html +++ b/apps/assets/templates/assets/asset_bulk_update.html @@ -9,32 +9,14 @@