diff --git a/shelfzilla/apps/account/admin.py b/shelfzilla/apps/account/admin.py index 5eca453..6c72074 100644 --- a/shelfzilla/apps/account/admin.py +++ b/shelfzilla/apps/account/admin.py @@ -10,8 +10,10 @@ from __future__ import absolute_import, unicode_literals import logging # django imports +from django import forms from django.contrib import admin from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin +from django.contrib.auth.forms import ReadOnlyPasswordHashField from django.contrib.auth.models import Permission from django.utils.translation import ugettext_lazy as _ @@ -21,10 +23,56 @@ from . import models logger = logging.getLogger(__name__) +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 = models.User + fields = ('email', 'birthdate') + + 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() + + class Meta: + model = models.User + fields = ('email', 'password', 'birthdate', 'is_active', 'is_staff') + + 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 UserAdmin(DjangoUserAdmin): # The forms to add and change user instances - # form = UserChangeForm - # add_form = UserCreationForm + form = UserChangeForm + add_form = UserCreationForm # The fields to be used in displaying the User model. # These override the definitions on the base UserAdmin diff --git a/shelfzilla/apps/account/migrations/0002_auto_20141111_1208.py b/shelfzilla/apps/account/migrations/0002_auto_20141111_1208.py new file mode 100644 index 0000000..ad305e6 --- /dev/null +++ b/shelfzilla/apps/account/migrations/0002_auto_20141111_1208.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='username', + field=models.CharField(unique=True, max_length=128, verbose_name='Username', db_index=True), + preserve_default=True, + ), + ]