| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- from django import forms
- from base.viewsets import BaseTable, BaseViewset
- from crud.tables2_columns import CrudLinkColumn
- from django.db.models import Q
- from django_tables2 import Column, BooleanColumn, DateTimeColumn
- from django.contrib.auth import password_validation
- from django.contrib.auth.forms import UsernameField
- import django_filters
- from crud.tables2_columns import DateTimeColumnEx
- from . import models, decorators
- class UserFilterSet(django_filters.FilterSet):
- search_expr = django_filters.CharFilter(label='Search', method='filter_search_expr')
- class Meta:
- fields = ('search_expr',)
- model = models.User
- def filter_search_expr(self, queryset, name, value):
- return queryset.filter(Q(username__icontains=value) | Q(first_name__icontains=value) | Q(last_name__icontains=value) | Q(email__icontains=value))
- class UserTable(BaseTable):
- is_active = BooleanColumn(verbose_name='Active')
- is_superuser = BooleanColumn(verbose_name='Superuser')
- last_login = DateTimeColumnEx()
- delete = CrudLinkColumn('delete', text='', verbose_name='', orderable=False, attrs={'a': {'class': 'btn btn-danger btn-xs glyphicon glyphicon-remove', 'role': 'button'}})
- class Meta(BaseTable.Meta):
- fields = ('username', 'first_name', 'last_name', 'email', 'is_superuser', 'is_active', 'last_login')
- order_by = ('username',)
- class UserForm(forms.ModelForm):
- username = UsernameField()
- email = forms.EmailField(required=True)
- is_superuser = forms.BooleanField(label='Superuser')
- password1 = forms.CharField(
- label="Password",
- strip=False,
- required=False,
- widget=forms.PasswordInput,
- help_text=password_validation.password_validators_help_text_html(),
- )
- password2 = forms.CharField(
- label="Confirm password",
- strip=False,
- required=False,
- widget=forms.PasswordInput,
- help_text="Enter the same password as before, for verification.",
- )
- class Meta:
- fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', 'is_superuser', 'is_active')
- model = models.User
- def customise_for_view(self, view):
- if view.view_type == 'create':
- self.fields['password1'].required = True
- def clean_password2(self):
- password1 = self.cleaned_data.get('password1')
- password2 = self.cleaned_data.get('password2')
- if password1 or password2:
- if password1 != password2:
- raise forms.ValidationError('The two passwords did not match.', code='password_mismatch')
- self.instance.username = self.cleaned_data.get('username')
- password_validation.validate_password(password1, self.instance)
- return password2
- def save(self, commit=True):
- user = super(UserForm, self).save(commit=False)
- password1 = self.cleaned_data['password1']
- if password1:
- user.set_password(password1)
- if commit:
- user.save()
- return user
- class UserViewset(BaseViewset):
- view_decorator = staticmethod(decorators.superuser_required)
- filter_class = UserFilterSet
- form_class = UserForm
- tables2_class = UserTable
- tables2_clickable_rows = True
- detail_view_title = 'User'
- detail_view_template_name = 'accounts/user_detail_view.html'
- def get_queryset(self, view):
- return models.User.objects.all()
|