from django import forms from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.utils.translation import gettext_lazy as _ from .models import Account, Role class AccountChangeForm(forms.ModelForm): password = forms.CharField( label=_("Password"), widget=forms.PasswordInput, required=False, help_text=_("Raw passwords are not stored, so there is no way to see this user's password.") ) class Meta: model = Account fields = '__all__' def save(self, commit=True): password = self.cleaned_data.get('password') if password: self.instance.set_password(password) return super().save(commit=commit) class AccountCreationForm(forms.ModelForm): password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput) password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput) class Meta: model = Account fields = ('login',) def clean_password2(self): password1 = self.cleaned_data.get("password1") password2 = self.cleaned_data.get("password2") if password1 and password2 and password1 != password2: raise forms.ValidationError(_("Passwords don't match")) return password2 def save(self, commit=True): user = super().save(commit=False) user.set_password(self.cleaned_data["password1"]) if commit: user.save() return user @admin.register(Account) class AccountAdmin(BaseUserAdmin): form = AccountChangeForm add_form = AccountCreationForm list_display = ('login', 'full_name', 'role', 'is_staff', 'is_active') list_filter = ('is_staff', 'is_active', 'role') search_fields = ('login', 'first_name', 'last_name', 'middle_name', 'phone', 'email') ordering = ('login',) filter_horizontal = ('groups', 'user_permissions') fieldsets = ( (None, {'fields': ('login', 'password')}), (_('Personal info'), {'fields': ('first_name', 'last_name', 'middle_name', 'phone', 'email')}), (_('Permissions'), { 'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'), }), (_('Role'), {'fields': ('role',)}), ) add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('login', 'password1', 'password2'), }), ) @admin.display(description=_('Full name')) def full_name(self, obj): return str(obj) @admin.register(Role) class RoleAdmin(admin.ModelAdmin): list_display = ('name',) search_fields = ('name',)