|
|
|
# ~*~ coding: utf-8 ~*~
|
|
|
|
|
|
|
|
from django import forms
|
|
|
|
from django.contrib.auth.forms import AuthenticationForm
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from captcha.fields import CaptchaField
|
|
|
|
|
|
|
|
from common.utils import validate_ssh_public_key
|
|
|
|
from perms.models import AssetPermission
|
|
|
|
from .models import User, UserGroup
|
|
|
|
|
|
|
|
|
|
|
|
class UserLoginForm(AuthenticationForm):
|
|
|
|
username = forms.CharField(label=_('Username'), max_length=100)
|
|
|
|
password = forms.CharField(
|
|
|
|
label=_('Password'), widget=forms.PasswordInput, max_length=100,
|
|
|
|
strip=False)
|
|
|
|
captcha = CaptchaField()
|
|
|
|
|
|
|
|
|
|
|
|
class UserCreateUpdateForm(forms.ModelForm):
|
|
|
|
class Meta:
|
|
|
|
model = User
|
|
|
|
fields = [
|
|
|
|
'username', 'name', 'email', 'groups', 'wechat',
|
|
|
|
'phone', 'enable_otp', 'role', 'date_expired', 'comment',
|
|
|
|
]
|
|
|
|
help_texts = {
|
|
|
|
'username': '* required',
|
|
|
|
'name': '* required',
|
|
|
|
'email': '* required',
|
|
|
|
}
|
|
|
|
widgets = {
|
|
|
|
'groups': forms.SelectMultiple(
|
|
|
|
attrs={'class': 'select2',
|
|
|
|
'data-placeholder': _('Join user groups')}),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class UserProfileForm(forms.ModelForm):
|
|
|
|
class Meta:
|
|
|
|
model = User
|
|
|
|
fields = [
|
|
|
|
'username', 'name', 'email',
|
|
|
|
'wechat', 'phone',
|
|
|
|
]
|
|
|
|
help_texts = {
|
|
|
|
'username': '* required',
|
|
|
|
'name': '* required',
|
|
|
|
'email': '* required',
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class UserPasswordForm(forms.Form):
|
|
|
|
old_password = forms.CharField(
|
|
|
|
min_length=5, max_length=128, widget=forms.PasswordInput)
|
|
|
|
new_password = forms.CharField(
|
|
|
|
min_length=5, max_length=128, widget=forms.PasswordInput)
|
|
|
|
confirm_password = forms.CharField(
|
|
|
|
min_length=5, max_length=128, widget=forms.PasswordInput)
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
self.instance = kwargs.pop('instance')
|
|
|
|
super(UserPasswordForm, self).__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
def clean_old_password(self):
|
|
|
|
old_password = self.cleaned_data['old_password']
|
|
|
|
if not self.instance.check_password(old_password):
|
|
|
|
raise forms.ValidationError(_('Old password error'))
|
|
|
|
return old_password
|
|
|
|
|
|
|
|
def clean_confirm_password(self):
|
|
|
|
new_password = self.cleaned_data['new_password']
|
|
|
|
confirm_password = self.cleaned_data['confirm_password']
|
|
|
|
|
|
|
|
if new_password != confirm_password:
|
|
|
|
raise forms.ValidationError(_('Password does not match'))
|
|
|
|
return confirm_password
|
|
|
|
|
|
|
|
def save(self):
|
|
|
|
password = self.cleaned_data['new_password']
|
|
|
|
self.instance.set_password(password)
|
|
|
|
self.instance.save()
|
|
|
|
return self.instance
|
|
|
|
|
|
|
|
|
|
|
|
class UserPublicKeyForm(forms.Form):
|
|
|
|
public_key = forms.CharField(
|
|
|
|
label=_('ssh public key'), max_length=5000,
|
|
|
|
widget=forms.Textarea(attrs={'placeholder': _('ssh-rsa AAAA...')}),
|
|
|
|
help_text=_('Paste your id_rsa.pub here.'))
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
if 'instance' in kwargs:
|
|
|
|
self.instance = kwargs.pop('instance')
|
|
|
|
else:
|
|
|
|
self.instance = None
|
|
|
|
super(UserPublicKeyForm, self).__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
def clean_public_key(self):
|
|
|
|
public_key = self.cleaned_data['public_key']
|
|
|
|
if self.instance.public_key and public_key == self.instance.public_key:
|
|
|
|
raise forms.ValidationError(_('Public key should not be the '
|
|
|
|
'same as your old one.'))
|
|
|
|
|
|
|
|
if not validate_ssh_public_key(public_key):
|
|
|
|
raise forms.ValidationError(_('Not a valid ssh public key'))
|
|
|
|
return public_key
|
|
|
|
|
|
|
|
def save(self):
|
|
|
|
public_key = self.cleaned_data['public_key']
|
|
|
|
self.instance.public_key = public_key
|
|
|
|
self.instance.save()
|
|
|
|
return self.instance
|
|
|
|
|
|
|
|
|
|
|
|
class UserBulkUpdateForm(forms.ModelForm):
|
|
|
|
role = forms.ChoiceField(
|
|
|
|
label=_('Role'),
|
|
|
|
choices=[('Admin', 'Administrator'), ('User', 'User')],
|
|
|
|
)
|
|
|
|
users = forms.MultipleChoiceField(
|
|
|
|
required=True,
|
|
|
|
help_text='* required',
|
|
|
|
label=_('Select users'),
|
|
|
|
choices=[(user.id, user.name ) for user in User.objects.all()],
|
|
|
|
widget=forms.SelectMultiple(
|
|
|
|
attrs={
|
|
|
|
'class': 'select2',
|
|
|
|
'data-placeholder': _('Select users')
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = User
|
|
|
|
fields = ['users', 'role', 'groups', 'date_expired', 'is_active', 'enable_otp']
|
|
|
|
widgets = {
|
|
|
|
'groups': forms.SelectMultiple(
|
|
|
|
attrs={'class': 'select2',
|
|
|
|
'data-placeholder': _('Select user groups')}),
|
|
|
|
}
|
|
|
|
|
|
|
|
def save(self, commit=True):
|
|
|
|
cleaned_data = {k: v for k, v in self.cleaned_data.items() if
|
|
|
|
v is not None}
|
|
|
|
users_id = cleaned_data.pop('users')
|
|
|
|
groups = cleaned_data.pop('groups')
|
|
|
|
users = User.objects.filter(id__in=users_id)
|
|
|
|
users.update(**cleaned_data)
|
|
|
|
if groups:
|
|
|
|
for user in users:
|
|
|
|
user.groups.set(groups)
|
|
|
|
return users
|
|
|
|
|
|
|
|
|
|
|
|
class UserGroupForm(forms.ModelForm):
|
|
|
|
class Meta:
|
|
|
|
model = UserGroup
|
|
|
|
fields = [
|
|
|
|
'name', 'comment'
|
|
|
|
]
|
|
|
|
help_texts = {
|
|
|
|
'name': '* required'
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class UserPrivateAssetPermissionForm(forms.ModelForm):
|
|
|
|
def save(self, commit=True):
|
|
|
|
self.instance = super(UserPrivateAssetPermissionForm, self)\
|
|
|
|
.save(commit=commit)
|
|
|
|
self.instance.users = [self.user]
|
|
|
|
self.instance.save()
|
|
|
|
return self.instance
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = AssetPermission
|
|
|
|
fields = [
|
|
|
|
'assets', 'asset_groups', 'system_users', 'name',
|
|
|
|
]
|
|
|
|
widgets = {
|
|
|
|
'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')}),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class UserGroupPrivateAssetPermissionForm(forms.ModelForm):
|
|
|
|
def save(self, commit=True):
|
|
|
|
self.instance = super(UserGroupPrivateAssetPermissionForm, self)\
|
|
|
|
.save(commit=commit)
|
|
|
|
self.instance.user_groups = [self.user_group]
|
|
|
|
self.instance.save()
|
|
|
|
return self.instance
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = AssetPermission
|
|
|
|
fields = [
|
|
|
|
'assets', 'asset_groups', 'system_users', 'name',
|
|
|
|
]
|
|
|
|
widgets = {
|
|
|
|
'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')}),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class FileForm(forms.Form):
|
|
|
|
file = forms.FileField()
|