From 93e6c96493e6b558b60ff95d4885953e5c95e5a4 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Thu, 28 May 2020 22:08:16 +0200 Subject: [PATCH] Fix user adherent/club creation form --- users/admin.py | 80 ++++++++++++++++++++++++++++++++++++-------------- users/forms.py | 64 +++++++++------------------------------- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/users/admin.py b/users/admin.py index 6de5069a..765bd6bf 100644 --- a/users/admin.py +++ b/users/admin.py @@ -50,8 +50,7 @@ from .models import ( LdapUserGroup, ) from .forms import ( - UserChangeForm, - UserCreationForm, + UserAdminForm, ServiceUserChangeForm, ServiceUserCreationForm, ) @@ -130,36 +129,29 @@ class WhitelistAdmin(VersionAdmin): pass -class UserAdmin(VersionAdmin, BaseUserAdmin): - """Gestion d'un user : modification des champs perso, mot de passe, etc""" - +class AdherentAdmin(VersionAdmin, BaseUserAdmin): # The forms to add and change user instances - form = UserChangeForm - add_form = UserCreationForm - # 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. + add_form = UserAdminForm + form = UserAdminForm + list_display = ( "pseudo", + "name", "surname", "email", "local_email_redirect", "local_email_enabled", "school", - "is_admin", "shell", ) - # Need to reset the settings from BaseUserAdmin - # They are using fields we don't use like 'is_staff' list_filter = () fieldsets = ( - (None, {"fields": ("pseudo", "password")}), + (None, {"fields": ("pseudo",)}), ( "Personal info", - {"fields": ("surname", "email", "school", "shell", "uid_number", "profile_image")}, + {"fields": ("surname", "name", "email", "school", "shell", "uid_number", "profile_image", "password1", "password2")}, ), - ("Permissions", {"fields": ("is_admin",)}), ) # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin # overrides get_fieldsets to use this attribute when creating a user. @@ -171,12 +163,59 @@ class UserAdmin(VersionAdmin, BaseUserAdmin): "fields": ( "pseudo", "surname", + "name", "email", "school", - "is_admin", "password1", "password2", "profile_image", + "is_superuser", + ), + }, + ), + ) + search_fields = ("pseudo", "surname", "name") + ordering = ("pseudo",) + filter_horizontal = () + + +class ClubAdmin(VersionAdmin, BaseUserAdmin): + # The forms to add and change user instances + add_form = UserAdminForm + form = UserAdminForm + + list_display = ( + "pseudo", + "surname", + "email", + "local_email_redirect", + "local_email_enabled", + "school", + "shell", + ) + list_filter = () + fieldsets = ( + (None, {"fields": ("pseudo",)}), + ( + "Personal info", + {"fields": ("surname", "email", "school", "shell", "uid_number", "profile_image", "password1", "password2")}, + ), + ) + + add_fieldsets = ( + ( + None, + { + "classes": ("wide",), + "fields": ( + "pseudo", + "surname", + "email", + "school", + "password1", + "password2", + "profile_image", + "is_superuser", ), }, ), @@ -210,9 +249,8 @@ class ServiceUserAdmin(VersionAdmin, BaseUserAdmin): filter_horizontal = () -admin.site.register(User, UserAdmin) -admin.site.register(Adherent, UserAdmin) -admin.site.register(Club, UserAdmin) +admin.site.register(Adherent, AdherentAdmin) +admin.site.register(Club, ClubAdmin) admin.site.register(ServiceUser, ServiceUserAdmin) admin.site.register(LdapUser, LdapUserAdmin) admin.site.register(LdapUserGroup, LdapUserGroupAdmin) @@ -226,9 +264,7 @@ admin.site.register(EMailAddress, EMailAddressAdmin) admin.site.register(Whitelist, WhitelistAdmin) admin.site.register(Request, RequestAdmin) # Now register the new UserAdmin... -admin.site.unregister(User) admin.site.unregister(ServiceUser) -admin.site.register(User, UserAdmin) admin.site.register(ServiceUser, ServiceUserAdmin) # ... and, since we're not using Django's built-in permissions, # unregister the Group model from admin. diff --git a/users/forms.py b/users/forms.py index 6b116d25..26975ec5 100644 --- a/users/forms.py +++ b/users/forms.py @@ -121,7 +121,7 @@ class PassForm(FormRevMixin, FieldPermissionFormMixin, forms.ModelForm): user.save() -class UserCreationForm(FormRevMixin, forms.ModelForm): +class UserAdminForm(FormRevMixin, forms.ModelForm): """A form for creating new users. Includes all the required fields, plus a repeated password. @@ -133,40 +133,41 @@ class UserCreationForm(FormRevMixin, forms.ModelForm): label=_("Password"), widget=forms.PasswordInput, max_length=255, - help_text=password_validators_help_text_html() + help_text=password_validators_help_text_html(), + required=False, ) password2 = forms.CharField( label=_("Password confirmation"), widget=forms.PasswordInput, max_length=255, + required=False, ) - is_admin = forms.BooleanField(label=_("Is admin")) def __init__(self, *args, **kwargs): prefix = kwargs.pop("prefix", self.Meta.model.__name__) - super(UserCreationForm, self).__init__(*args, prefix=prefix, **kwargs) + super(UserAdminForm, self).__init__(*args, prefix=prefix, **kwargs) self.fields["email"].required = True class Meta: - model = Adherent - fields = ("pseudo", "surname", "email") + fields = ("pseudo", "surname", "name", "email", "is_superuser") def clean_password2(self): """Verifie que password1 et 2 sont identiques""" # 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(_("The passwords don't match.")) - validate_password(password1) + if password1 and password2: + if password1 and password2 and password1 != password2: + raise forms.ValidationError(_("The passwords don't match.")) + validate_password(password1) 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"]) - user.save() - user.is_admin = self.cleaned_data.get("is_admin") + user = super(UserAdminForm, self).save(commit=False) + if self.cleaned_data["password1"]: + user.set_password(self.cleaned_data["password1"]) + user.save() return user @@ -212,43 +213,6 @@ class ServiceUserCreationForm(FormRevMixin, forms.ModelForm): return user -class UserChangeForm(FormRevMixin, 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. - - Formulaire pour la modification d'un user coté admin - """ - - password = ReadOnlyPasswordHashField() - is_admin = forms.BooleanField(label=_("Is admin"), required=False) - - class Meta: - model = Adherent - fields = ("pseudo", "password", "surname", "email") - - def __init__(self, *args, **kwargs): - prefix = kwargs.pop("prefix", self.Meta.model.__name__) - super(UserChangeForm, self).__init__(*args, prefix=prefix, **kwargs) - print(_("User is admin: %s") % kwargs["instance"].is_admin) - self.initial["is_admin"] = kwargs["instance"].is_admin - - def clean_password(self): - """Dummy fun""" - # 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"] - - def save(self, commit=True): - # Save the provided password in hashed format - user = super(UserChangeForm, self).save(commit=False) - user.is_admin = self.cleaned_data.get("is_admin") - if commit: - user.save() - return user - - class ServiceUserChangeForm(FormRevMixin, forms.ModelForm): """A form for updating users. Includes all the fields on the user, but replaces the password field with admin's