diff --git a/users/admin.py b/users/admin.py index 6de5069a..400cb1cd 100644 --- a/users/admin.py +++ b/users/admin.py @@ -50,10 +50,8 @@ from .models import ( LdapUserGroup, ) from .forms import ( - UserChangeForm, - UserCreationForm, - ServiceUserChangeForm, - ServiceUserCreationForm, + UserAdminForm, + ServiceUserAdminForm, ) @@ -130,36 +128,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 +162,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", ), }, ), @@ -191,15 +229,15 @@ class ServiceUserAdmin(VersionAdmin, BaseUserAdmin): mot de passe; etc""" # The forms to add and change user instances - form = ServiceUserChangeForm - add_form = ServiceUserCreationForm + form = ServiceUserAdminForm + add_form = ServiceUserAdminForm # 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 = ("pseudo", "access_group") list_filter = () - fieldsets = ((None, {"fields": ("pseudo", "password", "access_group")}),) + fieldsets = ((None, {"fields": ("pseudo", "access_group", "comment", "password1", "password2")}),) # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin # overrides get_fieldsets to use this attribute when creating a user. add_fieldsets = ( @@ -210,9 +248,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) @@ -225,11 +262,6 @@ admin.site.register(Ban, BanAdmin) 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. admin.site.unregister(Group) diff --git a/users/forms.py b/users/forms.py index 6b116d25..f057373d 100644 --- a/users/forms.py +++ b/users/forms.py @@ -121,8 +121,8 @@ class PassForm(FormRevMixin, FieldPermissionFormMixin, forms.ModelForm): user.save() -class UserCreationForm(FormRevMixin, forms.ModelForm): - """A form for creating new users. Includes all the required +class UserAdminForm(FormRevMixin, forms.ModelForm): + """A form for creating new and editing users. Includes all the required fields, plus a repeated password. Formulaire pour la création d'un user. N'est utilisé que pour @@ -133,23 +133,69 @@ 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, + ) + + def __init__(self, *args, **kwargs): + prefix = kwargs.pop("prefix", self.Meta.model.__name__) + super(UserAdminForm, self).__init__(*args, prefix=prefix, **kwargs) + self.fields["email"].required = True + + class Meta: + 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: + 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(UserAdminForm, self).save(commit=False) + if self.cleaned_data["password1"]: + user.set_password(self.cleaned_data["password1"]) + user.save() + return user + + +class ServiceUserAdminForm(FormRevMixin, forms.ModelForm): + """A form for creating new users. Includes all the required + fields, plus a repeated password. + + Formulaire pour la creation de nouveaux serviceusers. + Requiert seulement un mot de passe; et un pseudo""" + + password1 = forms.CharField( + label=_("Password"), + widget=forms.PasswordInput, + max_length=255, ) password2 = forms.CharField( label=_("Password confirmation"), widget=forms.PasswordInput, max_length=255, ) - 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) - self.fields["email"].required = True + super(ServiceUserAdminForm, self).__init__(*args, prefix=prefix, **kwargs) class Meta: - model = Adherent - fields = ("pseudo", "surname", "email") + model = ServiceUser + fields = ("pseudo",) def clean_password2(self): """Verifie que password1 et 2 sont identiques""" @@ -158,120 +204,16 @@ class UserCreationForm(FormRevMixin, forms.ModelForm): password2 = self.cleaned_data.get("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") - return user - - -class ServiceUserCreationForm(FormRevMixin, forms.ModelForm): - """A form for creating new users. Includes all the required - fields, plus a repeated password. - - Formulaire pour la creation de nouveaux serviceusers. - Requiert seulement un mot de passe; et un pseudo""" - - password1 = forms.CharField( - label=_("Password"), widget=forms.PasswordInput, min_length=8, max_length=255 - ) - password2 = forms.CharField( - label=_("Password confirmation"), - widget=forms.PasswordInput, - min_length=8, - max_length=255, - ) - - def __init__(self, *args, **kwargs): - prefix = kwargs.pop("prefix", self.Meta.model.__name__) - super(ServiceUserCreationForm, self).__init__(*args, prefix=prefix, **kwargs) - - class Meta: - model = ServiceUser - fields = ("pseudo",) - - def clean_password2(self): - """Verifie que password1 et 2 sont indentiques""" - # 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.")) - return password2 - - def save(self, commit=True): - # Save the provided password in hashed format - user = super(ServiceUserCreationForm, self).save(commit=False) + user = super(ServiceUserAdminForm, self).save(commit=False) user.set_password(self.cleaned_data["password1"]) user.save() 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 - password hash display field. - - Formulaire pour l'edition des service users coté admin - """ - - password = ReadOnlyPasswordHashField() - - def __init__(self, *args, **kwargs): - prefix = kwargs.pop("prefix", self.Meta.model.__name__) - super(ServiceUserChangeForm, self).__init__(*args, prefix=prefix, **kwargs) - - class Meta: - model = ServiceUser - fields = ("pseudo",) - - def clean_password(self): - """Dummy fun""" - return self.initial["password"] - - class ResetPasswordForm(forms.Form): """Formulaire de demande de reinitialisation de mot de passe, mdp oublié"""