Correct form management for user admin. remove unused form class.
authorymh <ymh.work@gmail.com>
Mon, 22 Jul 2013 18:46:20 +0200
changeset 1219 dd46f7a3b064
parent 1218 980b59254286
child 1220 4645fbf981b2
Correct form management for user admin. remove unused form class.
src/ldt/ldt/user/admin.py
src/ldt/ldt/user/forms.py
src/ldt/ldt/user/models.py
src/ldt/ldt/user/views.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)
--- 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
--- 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()
 
--- 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):