12589 review changes and add localization

This commit is contained in:
Arthur 2023-07-13 18:49:07 +07:00
parent b851f33e81
commit e2cc63fb26
4 changed files with 42 additions and 24 deletions

View File

@ -1,5 +1,5 @@
from django import forms from django import forms
from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy as _
from netbox.forms import NetBoxModelBulkEditForm from netbox.forms import NetBoxModelBulkEditForm
from users.models import * from users.models import *
@ -16,14 +16,17 @@ __all__ = (
class UserBulkEditForm(BootstrapMixin, forms.Form): class UserBulkEditForm(BootstrapMixin, forms.Form):
pk = forms.ModelMultipleChoiceField( pk = forms.ModelMultipleChoiceField(
label=_('Pk'),
queryset=None, # Set from self.model on init queryset=None, # Set from self.model on init
widget=forms.MultipleHiddenInput widget=forms.MultipleHiddenInput
) )
first_name = forms.CharField( first_name = forms.CharField(
label=_('First name'),
max_length=150, max_length=150,
required=False required=False
) )
last_name = forms.CharField( last_name = forms.CharField(
label=_('Last name'),
max_length=150, max_length=150,
required=False required=False
) )
@ -53,14 +56,17 @@ class UserBulkEditForm(BootstrapMixin, forms.Form):
class ObjectPermissionBulkEditForm(BootstrapMixin, forms.Form): class ObjectPermissionBulkEditForm(BootstrapMixin, forms.Form):
pk = forms.ModelMultipleChoiceField( pk = forms.ModelMultipleChoiceField(
label=_('Pk'),
queryset=None, # Set from self.model on init queryset=None, # Set from self.model on init
widget=forms.MultipleHiddenInput widget=forms.MultipleHiddenInput
) )
description = forms.CharField( description = forms.CharField(
label=_('Description'),
max_length=200, max_length=200,
required=False required=False
) )
enabled = forms.BooleanField( enabled = forms.BooleanField(
label=_('Enabled'),
required=False, required=False,
) )

View File

@ -1,7 +1,7 @@
from django import forms from django import forms
from users.models import * from users.models import *
from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy as _
from netbox.forms import NetBoxModelImportForm from netbox.forms import NetBoxModelImportForm
from utilities.forms import BootstrapMixin from utilities.forms import BootstrapMixin
from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, SlugField from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, SlugField

View File

@ -1,5 +1,5 @@
from django import forms from django import forms
from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy as _
from circuits.choices import CircuitCommitRateChoices, CircuitStatusChoices from circuits.choices import CircuitCommitRateChoices, CircuitStatusChoices
from circuits.models import * from circuits.models import *
@ -23,28 +23,28 @@ class UserFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm):
model = NetBoxUser model = NetBoxUser
fieldsets = ( fieldsets = (
(None, ('q', 'filter_id',)), (None, ('q', 'filter_id',)),
('Security', ('is_superuser', 'is_staff', 'is_active')), (_('Security'), ('is_superuser', 'is_staff', 'is_active')),
) )
is_superuser = forms.NullBooleanField( is_superuser = forms.NullBooleanField(
required=False, required=False,
widget=forms.Select( widget=forms.Select(
choices=BOOLEAN_WITH_BLANK_CHOICES choices=BOOLEAN_WITH_BLANK_CHOICES
), ),
label='Is Superuser', label=_('Is Superuser'),
) )
is_staff = forms.NullBooleanField( is_staff = forms.NullBooleanField(
required=False, required=False,
widget=forms.Select( widget=forms.Select(
choices=BOOLEAN_WITH_BLANK_CHOICES choices=BOOLEAN_WITH_BLANK_CHOICES
), ),
label='Is Staff', label=_('Is Staff'),
) )
is_active = forms.NullBooleanField( is_active = forms.NullBooleanField(
required=False, required=False,
widget=forms.Select( widget=forms.Select(
choices=BOOLEAN_WITH_BLANK_CHOICES choices=BOOLEAN_WITH_BLANK_CHOICES
), ),
label='Is Active', label=_('Is Active'),
) )
@ -62,6 +62,7 @@ class ObjectPermissionFilterForm(ContactModelFilterForm, NetBoxModelFilterSetFor
(None, ('enabled',)), (None, ('enabled',)),
) )
enabled = forms.NullBooleanField( enabled = forms.NullBooleanField(
label=_('Enabled'),
required=False, required=False,
widget=forms.Select( widget=forms.Select(
choices=BOOLEAN_WITH_BLANK_CHOICES choices=BOOLEAN_WITH_BLANK_CHOICES

View File

@ -5,9 +5,10 @@ from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm as
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.postgres.forms import SimpleArrayField from django.contrib.postgres.forms import SimpleArrayField
from django.core.exceptions import FieldError
from django.urls import reverse from django.urls import reverse
from django.utils.html import mark_safe from django.utils.html import mark_safe
from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy as _
from ipam.formfields import IPNetworkFormField from ipam.formfields import IPNetworkFormField
from ipam.validators import prefix_validator from ipam.validators import prefix_validator
@ -18,7 +19,7 @@ from utilities.forms.widgets import DateTimePicker
from utilities.utils import flatten_dict from utilities.utils import flatten_dict
from users.constants import * from users.constants import *
from users.models import * from users.models import *
from utilities.permissions import qs_filter_from_constraints
__all__ = ( __all__ = (
'GroupForm', 'GroupForm',
@ -69,17 +70,18 @@ class UserConfigFormMetaclass(forms.models.ModelFormMetaclass):
class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMetaclass): class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMetaclass):
fieldsets = ( fieldsets = (
('User Interface', ( (_('User Interface'), (
'pagination.per_page', 'pagination.per_page',
'pagination.placement', 'pagination.placement',
'ui.colormode', 'ui.colormode',
)), )),
('Miscellaneous', ( (_('Miscellaneous'), (
'data_format', 'data_format',
)), )),
) )
# List of clearable preferences # List of clearable preferences
pk = forms.MultipleChoiceField( pk = forms.MultipleChoiceField(
label=_('Pk'),
choices=[], choices=[],
required=False required=False
) )
@ -124,6 +126,7 @@ class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMe
class TokenForm(BootstrapMixin, forms.ModelForm): class TokenForm(BootstrapMixin, forms.ModelForm):
key = forms.CharField( key = forms.CharField(
label=_('Key'),
required=False, required=False,
help_text=_("If no key is provided, one will be generated automatically.") help_text=_("If no key is provided, one will be generated automatically.")
) )
@ -154,15 +157,18 @@ class TokenForm(BootstrapMixin, forms.ModelForm):
class UserForm(BootstrapMixin, forms.ModelForm): class UserForm(BootstrapMixin, forms.ModelForm):
password = forms.CharField( password = forms.CharField(
label=_('Password'),
widget=forms.PasswordInput(), widget=forms.PasswordInput(),
required=True, required=True,
) )
confirm_password = forms.CharField( confirm_password = forms.CharField(
label=_('Confirm password'),
widget=forms.PasswordInput(), widget=forms.PasswordInput(),
required=True, required=True,
help_text=_("Enter the same password as before, for verification."), help_text=_("Enter the same password as before, for verification."),
) )
groups = DynamicModelMultipleChoiceField( groups = DynamicModelMultipleChoiceField(
label=_('Groups'),
required=False, required=False,
queryset=Group.objects.all() queryset=Group.objects.all()
) )
@ -174,10 +180,10 @@ class UserForm(BootstrapMixin, forms.ModelForm):
) )
fieldsets = ( fieldsets = (
('User', ('username', 'password', 'confirm_password', 'first_name', 'last_name', 'email', )), (_('User'), ('username', 'password', 'confirm_password', 'first_name', 'last_name', 'email', )),
('Groups', ('groups', )), (_('Groups'), ('groups', )),
('Status', ('is_active', 'is_staff', 'is_superuser', )), (_('Status'), ('is_active', 'is_staff', 'is_superuser', )),
('Permissions', ('object_permissions', )), (_('Permissions'), ('object_permissions', )),
) )
class Meta: class Meta:
@ -241,6 +247,7 @@ class UserForm(BootstrapMixin, forms.ModelForm):
class GroupForm(BootstrapMixin, forms.ModelForm): class GroupForm(BootstrapMixin, forms.ModelForm):
users = DynamicModelMultipleChoiceField( users = DynamicModelMultipleChoiceField(
label=_('Users'),
required=False, required=False,
queryset=get_user_model().objects.all() queryset=get_user_model().objects.all()
) )
@ -253,8 +260,8 @@ class GroupForm(BootstrapMixin, forms.ModelForm):
fieldsets = ( fieldsets = (
(None, ('name', )), (None, ('name', )),
('Users', ('users', )), (_('Users'), ('users', )),
('Permissions', ('object_permissions', )), (_('Permissions'), ('object_permissions', )),
) )
class Meta: class Meta:
@ -278,18 +285,22 @@ class GroupForm(BootstrapMixin, forms.ModelForm):
class ObjectPermissionForm(BootstrapMixin, forms.ModelForm): class ObjectPermissionForm(BootstrapMixin, forms.ModelForm):
actions = SimpleArrayField( actions = SimpleArrayField(
label=_('Actions'),
base_field=forms.CharField(), base_field=forms.CharField(),
required=False, required=False,
) )
users = DynamicModelMultipleChoiceField( users = DynamicModelMultipleChoiceField(
label=_('Users'),
required=False, required=False,
queryset=get_user_model().objects.all() queryset=get_user_model().objects.all()
) )
groups = DynamicModelMultipleChoiceField( groups = DynamicModelMultipleChoiceField(
label=_('Groups'),
required=False, required=False,
queryset=Group.objects.all() queryset=Group.objects.all()
) )
object_types = forms.ModelMultipleChoiceField( object_types = ContentTypeMultipleChoiceField(
label=_('Object types'),
queryset=ContentType.objects.all(), queryset=ContentType.objects.all(),
limit_choices_to=OBJECTPERMISSION_OBJECT_TYPES, limit_choices_to=OBJECTPERMISSION_OBJECT_TYPES,
widget=forms.SelectMultiple(attrs={'size': 6}) widget=forms.SelectMultiple(attrs={'size': 6})
@ -302,10 +313,10 @@ class ObjectPermissionForm(BootstrapMixin, forms.ModelForm):
fieldsets = ( fieldsets = (
(None, ('name', 'description', 'enabled',)), (None, ('name', 'description', 'enabled',)),
('Actions', ('can_view', 'can_add', 'can_change', 'can_delete', 'actions')), (_('Actions'), ('can_view', 'can_add', 'can_change', 'can_delete', 'actions')),
('Objects', ('object_types', )), (_('Objects'), ('object_types', )),
('Assignment', ('groups', 'users')), (_('Assignment'), ('groups', 'users')),
('Constraints', ('constraints',)) (_('Constraints'), ('constraints',))
) )
class Meta: class Meta:
@ -355,7 +366,7 @@ class ObjectPermissionForm(BootstrapMixin, forms.ModelForm):
# At least one action must be specified # At least one action must be specified
if not self.cleaned_data['actions']: if not self.cleaned_data['actions']:
raise forms.ValidationError("At least one action must be selected.") raise forms.ValidationError(_("At least one action must be selected."))
# Validate the specified model constraints by attempting to execute a query. We don't care whether the query # Validate the specified model constraints by attempting to execute a query. We don't care whether the query
# returns anything; we just want to make sure the specified constraints are valid. # returns anything; we just want to make sure the specified constraints are valid.
@ -372,5 +383,5 @@ class ObjectPermissionForm(BootstrapMixin, forms.ModelForm):
model.objects.filter(qs_filter_from_constraints(constraints, tokens)).exists() model.objects.filter(qs_filter_from_constraints(constraints, tokens)).exists()
except FieldError as e: except FieldError as e:
raise forms.ValidationError({ raise forms.ValidationError({
'constraints': f'Invalid filter for {model}: {e}' 'constraints': _('Invalid filter for {model}: {e}').format(model=model, e=e)
}) })