|
|
@@ -1,3 +1,93 @@
|
|
|
from django.contrib import admin
|
|
|
+from django.contrib.auth.forms import ReadOnlyPasswordHashField
|
|
|
+from django.contrib.auth.models import Group
|
|
|
+from django import forms
|
|
|
+from .models import User
|
|
|
|
|
|
-# Register your models here.
|
|
|
+
|
|
|
+class UserCreationForm(forms.ModelForm):
|
|
|
+ """A form for creating new users. Includes all the required
|
|
|
+ fields, plus a repeated password."""
|
|
|
+ password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
|
|
|
+ password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
|
|
|
+
|
|
|
+ class Meta:
|
|
|
+ model = User
|
|
|
+ fields = ('email', 'age', 'name')
|
|
|
+
|
|
|
+ def clean_password2(self):
|
|
|
+ # Check that the two password entries match
|
|
|
+ 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):
|
|
|
+ # Save the provided password in hashed format
|
|
|
+ user = super(UserCreationForm, self).save(commit=False)
|
|
|
+ user.set_password(self.cleaned_data["password1"])
|
|
|
+ if commit:
|
|
|
+ user.save()
|
|
|
+ return user
|
|
|
+
|
|
|
+
|
|
|
+class UserChangeForm(forms.ModelForm):
|
|
|
+ """A form for updating users. Includes all the fields on
|
|
|
+ the user, but replaces the password field with admin's
|
|
|
+ password hash display field.
|
|
|
+ """
|
|
|
+ password = ReadOnlyPasswordHashField(label=("Password"),
|
|
|
+ help_text=("Raw passwords are not stored, so there is no way to see "
|
|
|
+ "this user's password, but you can change the password "
|
|
|
+ "using <a href=\"password/\">this form</a>."))
|
|
|
+
|
|
|
+ class Meta:
|
|
|
+ model = User
|
|
|
+ fields = ('email', 'age', 'name','password')
|
|
|
+
|
|
|
+ def clean_password(self):
|
|
|
+ # Regardless of what the user provides, return the initial value.
|
|
|
+ # This is done here, rather than on the field, because the
|
|
|
+ # field does not have access to the initial value
|
|
|
+ return self.initial["password"]
|
|
|
+
|
|
|
+
|
|
|
+class CustomUserAdmin(admin.ModelAdmin):
|
|
|
+ # The forms to add and change user instances
|
|
|
+ form = UserChangeForm
|
|
|
+ add_form = UserCreationForm
|
|
|
+ model = User
|
|
|
+ # The fields to be used in displaying the User model.
|
|
|
+ # These override the definitions on the base UserAdmin
|
|
|
+ # that reference specific fields on auth.User.
|
|
|
+ list_display = ('email', 'name', 'age', 'is_superuser')
|
|
|
+ list_filter = ('is_superuser',)
|
|
|
+ fieldsets = (
|
|
|
+ (None, {'fields': ('email', 'password')}),
|
|
|
+ ('Personal info', {'fields': ('name','age')}),
|
|
|
+ )
|
|
|
+ add_fieldsets = (
|
|
|
+ (None, {
|
|
|
+ 'classes': ('wide',),
|
|
|
+ 'fields': ('email', 'name','age', 'password1', 'password2')}
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ search_fields = ('email',)
|
|
|
+ ordering = ('email',)
|
|
|
+ filter_horizontal = ()
|
|
|
+
|
|
|
+ def get_fieldsets(self, request, obj=None):
|
|
|
+ if not obj:
|
|
|
+ return self.add_fieldsets
|
|
|
+ return self.fieldsets
|
|
|
+
|
|
|
+ def get_form(self, request, obj=None, change=False, **kwargs):
|
|
|
+ if not obj:
|
|
|
+ return self.add_form
|
|
|
+ return self.form
|
|
|
+
|
|
|
+
|
|
|
+admin.site.register(User, CustomUserAdmin)
|
|
|
+admin.site.unregister(Group)
|