mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
5.2 KiB
152 lines
5.2 KiB
# -*- coding: utf-8 -*- |
|
# |
|
from django import forms |
|
from django.utils.translation import gettext_lazy as _ |
|
|
|
from ..models import Asset, AdminUser |
|
from common.utils import get_logger |
|
|
|
logger = get_logger(__file__) |
|
__all__ = ['AssetCreateForm', 'AssetUpdateForm', 'AssetBulkUpdateForm'] |
|
|
|
|
|
class AssetCreateForm(forms.ModelForm): |
|
class Meta: |
|
model = Asset |
|
fields = [ |
|
'hostname', 'ip', 'public_ip', 'port', 'comment', |
|
'nodes', 'is_active', 'admin_user', 'labels', 'platform', |
|
'domain', |
|
|
|
] |
|
widgets = { |
|
'nodes': forms.SelectMultiple(attrs={ |
|
'class': 'select2', 'data-placeholder': _('Nodes') |
|
}), |
|
'admin_user': forms.Select(attrs={ |
|
'class': 'select2', 'data-placeholder': _('Admin user') |
|
}), |
|
'labels': forms.SelectMultiple(attrs={ |
|
'class': 'select2', 'data-placeholder': _('Label') |
|
}), |
|
'port': forms.TextInput(), |
|
'domain': forms.Select(attrs={ |
|
'class': 'select2', 'data-placeholder': _('Domain') |
|
}), |
|
} |
|
labels = { |
|
'nodes': _("Node"), |
|
} |
|
help_texts = { |
|
'hostname': '* required', |
|
'ip': '* required', |
|
'port': '* required', |
|
'admin_user': _( |
|
'root or other NOPASSWD sudo privilege user existed in asset,' |
|
'If asset is windows or other set any one, more see admin user left menu' |
|
), |
|
'platform': _("* required Must set exact system platform, Windows, Linux ..."), |
|
'domain': _("If your have some network not connect with each other, you can set domain") |
|
} |
|
|
|
|
|
class AssetUpdateForm(forms.ModelForm): |
|
class Meta: |
|
model = Asset |
|
fields = [ |
|
'hostname', 'ip', 'port', 'nodes', 'is_active', 'platform', |
|
'public_ip', 'number', 'comment', 'admin_user', 'labels', |
|
'domain', |
|
] |
|
widgets = { |
|
'nodes': forms.SelectMultiple(attrs={ |
|
'class': 'select2', 'data-placeholder': _('Node') |
|
}), |
|
'admin_user': forms.Select(attrs={ |
|
'class': 'select2', 'data-placeholder': _('Admin user') |
|
}), |
|
'labels': forms.SelectMultiple(attrs={ |
|
'class': 'select2', 'data-placeholder': _('Label') |
|
}), |
|
'port': forms.TextInput(), |
|
'domain': forms.Select(attrs={ |
|
'class': 'select2', 'data-placeholder': _('Domain') |
|
}), |
|
} |
|
labels = { |
|
'nodes': _("Node"), |
|
} |
|
help_texts = { |
|
'hostname': '* required', |
|
'ip': '* required', |
|
'port': '* required', |
|
'cluster': '* required', |
|
'admin_user': _( |
|
'root or other NOPASSWD sudo privilege user existed in asset,' |
|
'If asset is windows or other set any one, more see admin user left menu' |
|
), |
|
'platform': _("* required Must set exact system platform, Windows, Linux ..."), |
|
'domain': _("If your have some network not connect with each other, you can set domain") |
|
} |
|
|
|
|
|
class AssetBulkUpdateForm(forms.ModelForm): |
|
assets = forms.ModelMultipleChoiceField( |
|
required=True, help_text='* required', |
|
label=_('Select assets'), queryset=Asset.objects.all(), |
|
widget=forms.SelectMultiple( |
|
attrs={ |
|
'class': 'select2', |
|
'data-placeholder': _('Select assets') |
|
} |
|
) |
|
) |
|
port = forms.IntegerField( |
|
label=_('Port'), required=False, min_value=1, max_value=65535, |
|
) |
|
admin_user = forms.ModelChoiceField( |
|
required=False, queryset=AdminUser.objects.all(), |
|
label=_("Admin user"), |
|
widget=forms.Select( |
|
attrs={ |
|
'class': 'select2', |
|
'data-placeholder': _('Admin user') |
|
} |
|
) |
|
) |
|
|
|
class Meta: |
|
model = Asset |
|
fields = [ |
|
'assets', 'port', 'admin_user', 'labels', 'nodes', 'platform' |
|
] |
|
widgets = { |
|
'labels': forms.SelectMultiple( |
|
attrs={'class': 'select2', 'data-placeholder': _('Label')} |
|
), |
|
'nodes': forms.SelectMultiple( |
|
attrs={'class': 'select2', 'data-placeholder': _('Node')} |
|
), |
|
} |
|
|
|
def save(self, commit=True): |
|
changed_fields = [] |
|
for field in self._meta.fields: |
|
if self.data.get(field) not in [None, '']: |
|
changed_fields.append(field) |
|
|
|
cleaned_data = {k: v for k, v in self.cleaned_data.items() |
|
if k in changed_fields} |
|
assets = cleaned_data.pop('assets') |
|
labels = cleaned_data.pop('labels', []) |
|
nodes = cleaned_data.pop('nodes') |
|
assets = Asset.objects.filter(id__in=[asset.id for asset in assets]) |
|
assets.update(**cleaned_data) |
|
|
|
if labels: |
|
for label in labels: |
|
label.assets.add(*tuple(assets)) |
|
if nodes: |
|
for node in nodes: |
|
node.assets.add(*tuple(assets)) |
|
return assets
|
|
|