暫無描述

viewsets.py 3.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from django import forms
  2. from base.viewsets import BaseTable, BaseViewset
  3. from crud.tables2_columns import CrudLinkColumn
  4. from django.db.models import Q
  5. from django_tables2 import Column, BooleanColumn, DateTimeColumn
  6. from django.contrib.auth import password_validation
  7. from django.contrib.auth.forms import UsernameField
  8. import django_filters
  9. from crud.tables2_columns import DateTimeColumnEx
  10. from . import models, decorators
  11. class UserFilterSet(django_filters.FilterSet):
  12. search_expr = django_filters.CharFilter(label='Search', method='filter_search_expr')
  13. class Meta:
  14. fields = ('search_expr',)
  15. model = models.User
  16. def filter_search_expr(self, queryset, name, value):
  17. return queryset.filter(Q(username__icontains=value) | Q(first_name__icontains=value) | Q(last_name__icontains=value) | Q(email__icontains=value))
  18. class UserTable(BaseTable):
  19. is_active = BooleanColumn(verbose_name='Active')
  20. is_superuser = BooleanColumn(verbose_name='Superuser')
  21. last_login = DateTimeColumnEx()
  22. delete = CrudLinkColumn('delete', text='', verbose_name='', orderable=False, attrs={'a': {'class': 'btn btn-danger btn-xs glyphicon glyphicon-remove', 'role': 'button'}})
  23. class Meta(BaseTable.Meta):
  24. fields = ('username', 'first_name', 'last_name', 'email', 'is_superuser', 'is_active', 'last_login')
  25. order_by = ('username',)
  26. class UserForm(forms.ModelForm):
  27. username = UsernameField()
  28. email = forms.EmailField(required=True)
  29. is_superuser = forms.BooleanField(label='Superuser', required=False)
  30. password1 = forms.CharField(
  31. label="Password",
  32. strip=False,
  33. required=False,
  34. widget=forms.PasswordInput,
  35. help_text=password_validation.password_validators_help_text_html(),
  36. )
  37. password2 = forms.CharField(
  38. label="Confirm password",
  39. strip=False,
  40. required=False,
  41. widget=forms.PasswordInput,
  42. help_text="Enter the same password as before, for verification.",
  43. )
  44. class Meta:
  45. fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', 'is_superuser', 'is_active')
  46. model = models.User
  47. def customise_for_view(self, view):
  48. if view.view_type == 'create':
  49. self.fields['password1'].required = True
  50. def clean_password2(self):
  51. password1 = self.cleaned_data.get('password1')
  52. password2 = self.cleaned_data.get('password2')
  53. if password1 or password2:
  54. if password1 != password2:
  55. raise forms.ValidationError('The two passwords did not match.', code='password_mismatch')
  56. self.instance.username = self.cleaned_data.get('username')
  57. password_validation.validate_password(password1, self.instance)
  58. return password2
  59. def save(self, commit=True):
  60. user = super(UserForm, self).save(commit=False)
  61. password1 = self.cleaned_data['password1']
  62. if password1:
  63. user.set_password(password1)
  64. if commit:
  65. user.save()
  66. return user
  67. class UserViewset(BaseViewset):
  68. view_decorator = staticmethod(decorators.https_and_superuser_required)
  69. filter_class = UserFilterSet
  70. form_class = UserForm
  71. tables2_class = UserTable
  72. tables2_clickable_rows = True
  73. detail_view_title = 'User'
  74. detail_view_template_name = 'accounts/user_detail_view.html'
  75. def get_queryset(self, view):
  76. return models.User.objects.all()