# HG changeset patch # User ymh # Date 1374511580 -7200 # Node ID dd46f7a3b0643c12c17228124afafe834f896458 # Parent 980b592542861de9d4f5d67b965d141ed5ebb025 Correct form management for user admin. remove unused form class. diff -r 980b59254286 -r dd46f7a3b064 src/ldt/ldt/user/admin.py --- a/src/ldt/ldt/user/admin.py Mon Jul 22 12:12:59 2013 +0200 +++ b/src/ldt/ldt/user/admin.py Mon Jul 22 18:46:20 2013 +0200 @@ -1,8 +1,12 @@ from django.contrib import admin +from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import Group +from django.utils.translation import gettext_lazy as _ from guardian.admin import GuardedModelAdmin -from ldt.user.models import LdtUser -from models import GroupProfile +from ldt.user.forms import AdminUserCreationForm, AdminUserChangeForm +from ldt.user.models import GroupProfile, LdtUser + + class GroupProfileInline(admin.StackedInline): model = GroupProfile @@ -10,9 +14,10 @@ class GroupAdmin(GuardedModelAdmin): inlines = [GroupProfileInline, ] -class LdtUserAdmin(admin.ModelAdmin): - pass - +class LdtUserAdmin(UserAdmin): + form = AdminUserChangeForm + add_form = AdminUserCreationForm + fieldsets = tuple(list(UserAdmin.fieldsets) + [(_('profile'), {'fields':('language','image')})]) admin.site.unregister(Group) admin.site.register(Group, GroupAdmin) diff -r 980b59254286 -r dd46f7a3b064 src/ldt/ldt/user/forms.py --- a/src/ldt/ldt/user/forms.py Mon Jul 22 12:12:59 2013 +0200 +++ b/src/ldt/ldt/user/forms.py Mon Jul 22 18:46:20 2013 +0200 @@ -3,97 +3,11 @@ from django.contrib.auth import get_user_model from django.contrib.auth.forms import UserCreationForm, UserChangeForm from django.contrib.auth.models import Group -from django.forms.util import ErrorList from django.utils.translation import gettext as _ +import os User = get_user_model() - -class LdtForm(UserCreationForm): - - class Meta: - model = User - - def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, - initial=None, error_class=ErrorList, label_suffix=':', - empty_permitted=False, instance=None): - - if instance: - initial = initial or {} - - super(LdtForm, self).__init__(data, files, auto_id, prefix, - initial, error_class, label_suffix, empty_permitted, instance) - - if instance: - self.fields['password1'].required = False - self.fields['password1'].label = _('New password') - self.fields['password2'].required = False - self.fields['password2'].label = _('New password confirmation') - - self._password_change = True - - def clean_username(self): - if self.instance: - return self.cleaned_data['username'] - return super(LdtForm, self).clean_username() - def clean_password2(self): - if self.instance and self.cleaned_data['password1'] == '' and self.cleaned_data['password2'] == '': - self._password_change = False - return u'' - return super(LdtForm, self).clean_password2() - - - def save(self, commit=True): - Super = self._password_change and LdtForm or UserCreationForm - user = super(Super, self).save(commit=False) - # if user.pk != None: - # self.save_m2m() - - if commit: - user.save() - - return user - - -class EmailChangeForm(forms.Form): - email1 = forms.EmailField(label=_("E-mail"), max_length=75) - email2 = forms.EmailField(label=_("E-mail"), max_length=75) - - def __init__(self, user=None, *args, **kwargs): - self.user = user - super(EmailChangeForm, self).__init__(*args, **kwargs) - - def clean_email2(self): - email1 = self.cleaned_data.get('email1') - email2 = self.cleaned_data.get('email2') - if email1 and email2: - if email1 != email2: - raise forms.ValidationError(_("The two emails didn't match.")) - return email2 - - - def save(self): - self.user.email = self.cleaned_data['email1'] - self.user.save() - return self.user - - -class NameChangeForm(forms.Form): - first_name = forms.CharField(label=_("First name"), max_length=30) - last_name = forms.CharField(label=_("Last name"), max_length=30) - - def __init__(self, user=None, *args, **kwargs): - self.user = user - super(NameChangeForm, self).__init__(*args, **kwargs) - - - def save(self): - self.user.first_name = self.cleaned_data['first_name'] - self.user.last_name = self.cleaned_data['last_name'] - self.user.save() - return self.user - - class ProfileForm(UserChangeForm): def __init__(self, user=None, *args, **kwargs): @@ -104,6 +18,45 @@ class Meta: model = User fields = ('username', 'email', 'first_name', 'last_name', 'password') + +class AdminUserCreationForm(UserCreationForm): + + class Meta: + model = User + + def clean_username(self): + # Since User.username is unique, this check is redundant, + # but it sets a nicer error message than the ORM. See #13147. + username = self.cleaned_data["username"] + try: + User.objects.get(username=username) + except User.DoesNotExist: + return username + raise forms.ValidationError(self.error_messages['duplicate_username']) + +class AdminUserChangeForm(UserChangeForm): + language = forms.ChoiceField(label=_("Language"), choices=[(k,_(v)) for k,v in settings.LANGUAGES], initial=settings.LANGUAGE_CODE[:2]) + image = forms.ImageField(label=_("Profile picture"), required=False) + + def clean_image(self): + image = self.cleaned_data['image'] + + if not image: + return settings.DEFAULT_USER_ICON + + if image and image.size > settings.PROFILE_IMG_MAX_SIZE: + raise forms.ValidationError(_("Image size is limited to %s" % settings.PROFILE_IMG_MAX_SIZE)) + + if image != self.instance.image: + filename = image.name + ext = filename.split(".")[-1] + image.name = os.path.join(os.path.dirname(filename),str(self.instance.id) + "." + ext) + + return image + + + class Meta: + model = User class LanguageChangeForm(forms.Form): @@ -128,7 +81,7 @@ def clean_image(self): image = self.cleaned_data['image'] - + if image and image.size > settings.PROFILE_IMG_MAX_SIZE: raise forms.ValidationError(_("Image size is limited to %s" % settings.PROFILE_IMG_MAX_SIZE)) @@ -160,5 +113,7 @@ # We save the picture with the correct name img_container.image = self.cleaned_data['image'] img_container.save() - return self.model + return self.model + + \ No newline at end of file diff -r 980b59254286 -r dd46f7a3b064 src/ldt/ldt/user/models.py --- a/src/ldt/ldt/user/models.py Mon Jul 22 12:12:59 2013 +0200 +++ b/src/ldt/ldt/user/models.py Mon Jul 22 18:46:20 2013 +0200 @@ -53,7 +53,7 @@ class LdtUser(AbstractUser): language = models.CharField(max_length=2, default=settings.LANGUAGE_CODE[:2]) - image = ImageField(upload_to=settings.MEDIA_ROOT+"thumbnails/users/", default=settings.DEFAULT_USER_ICON, max_length=200) + image = ImageField(upload_to="thumbnails/users/", default=settings.DEFAULT_USER_ICON, max_length=200) objects = LdtUserManager() diff -r 980b59254286 -r dd46f7a3b064 src/ldt/ldt/user/views.py --- a/src/ldt/ldt/user/views.py Mon Jul 22 12:12:59 2013 +0200 +++ b/src/ldt/ldt/user/views.py Mon Jul 22 18:46:20 2013 +0200 @@ -1,4 +1,3 @@ -from .forms import ProfileForm, LanguageChangeForm, PictureForm from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import PasswordChangeForm @@ -8,6 +7,7 @@ from django.utils import simplejson from django.utils.translation import ugettext as _ from django.views.i18n import set_language +from ldt.user.forms import ProfileForm, LanguageChangeForm, PictureForm @login_required def profile(request):