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', required=False) 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.https_and_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()