|
|
|
# ~*~ coding: utf-8 ~*~
|
|
|
|
|
|
|
|
from __future__ import absolute_import, unicode_literals
|
|
|
|
from django import forms
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
|
|
|
|
# from .hands import User, UserGroup, Asset, AssetGroup, SystemUser
|
|
|
|
from .models import AssetPermission
|
|
|
|
from users.models import User
|
|
|
|
|
|
|
|
|
|
|
|
class AssetPermissionForm(forms.ModelForm):
|
|
|
|
users = forms.ModelMultipleChoiceField(
|
|
|
|
queryset=User.objects.exclude(role=User.ROLE_APP),
|
|
|
|
widget=forms.SelectMultiple(
|
|
|
|
attrs={'class': 'select2', 'data-placeholder': _('Select users')},
|
|
|
|
),
|
|
|
|
label=_("User"),
|
|
|
|
required=False,
|
|
|
|
)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = AssetPermission
|
|
|
|
fields = [
|
|
|
|
'name', 'users', 'user_groups', 'assets', 'asset_groups',
|
|
|
|
'system_users', 'is_active', 'date_expired', 'comment',
|
|
|
|
]
|
|
|
|
widgets = {
|
|
|
|
'user_groups': forms.SelectMultiple(
|
|
|
|
attrs={'class': 'select2',
|
|
|
|
'data-placeholder': _('Select user groups')}),
|
|
|
|
'assets': forms.SelectMultiple(
|
|
|
|
attrs={'class': 'select2',
|
|
|
|
'data-placeholder': _('Select assets')}),
|
|
|
|
'asset_groups': forms.SelectMultiple(
|
|
|
|
attrs={'class': 'select2',
|
|
|
|
'data-placeholder': _('Select asset groups')}),
|
|
|
|
'system_users': forms.SelectMultiple(
|
|
|
|
attrs={'class': 'select2',
|
|
|
|
'data-placeholder': _('Select system users')}),
|
|
|
|
}
|
|
|
|
help_texts = {
|
|
|
|
'name': '* required',
|
|
|
|
'system_users': '* required',
|
|
|
|
}
|
|
|
|
|
|
|
|
def clean_user_groups(self):
|
|
|
|
users = self.cleaned_data.get('users')
|
|
|
|
user_groups = self.cleaned_data.get('user_groups')
|
|
|
|
|
|
|
|
if not users and not user_groups:
|
|
|
|
raise forms.ValidationError(_("User or group at least one required"))
|
|
|
|
return self.cleaned_data["user_groups"]
|
|
|
|
|
|
|
|
def clean_asset_groups(self):
|
|
|
|
assets = self.cleaned_data.get('assets')
|
|
|
|
asset_groups = self.cleaned_data.get('asset_groups')
|
|
|
|
|
|
|
|
if not assets and not asset_groups:
|
|
|
|
raise forms.ValidationError(_("Asset or group at least one required"))
|
|
|
|
|
|
|
|
return self.cleaned_data["asset_groups"]
|
|
|
|
|
|
|
|
def clean_system_users(self):
|
|
|
|
from assets.utils import check_assets_have_system_user
|
|
|
|
|
|
|
|
errors = []
|
|
|
|
assets = self.cleaned_data['assets']
|
|
|
|
asset_groups = self.cleaned_data.get('asset_groups')
|
|
|
|
system_users = self.cleaned_data.get('system_users')
|
|
|
|
|
|
|
|
if not asset_groups and not assets:
|
|
|
|
return self.cleaned_data.get("system_users")
|
|
|
|
|
|
|
|
error_data = check_assets_have_system_user(assets, system_users)
|
|
|
|
if error_data:
|
|
|
|
for asset, system_users in error_data.items():
|
|
|
|
msg = _("Asset {} of cluster {} not have [{}] system users, please check \n")
|
|
|
|
error = forms.ValidationError(msg.format(
|
|
|
|
asset.hostname,
|
|
|
|
asset.cluster.name,
|
|
|
|
", ".join(system_user.name for system_user in system_users)
|
|
|
|
))
|
|
|
|
errors.append(error)
|
|
|
|
|
|
|
|
for group in asset_groups:
|
|
|
|
msg = _("Asset {}(group {}) of cluster {} not have [{}] system users, please check \n")
|
|
|
|
assets = group.assets.all()
|
|
|
|
error_data = check_assets_have_system_user(assets, system_users)
|
|
|
|
for asset, system_users in error_data.items():
|
|
|
|
errors.append(msg.format(
|
|
|
|
asset.hostname, group.name, asset.cluster.name,
|
|
|
|
", ".join(system_user.name for system_user in system_users)
|
|
|
|
))
|
|
|
|
if errors:
|
|
|
|
raise forms.ValidationError(errors)
|
|
|
|
return self.cleaned_data['system_users']
|