# -*- coding: utf-8 -*- from __future__ import division, absolute_import, unicode_literals from django import forms from django.contrib.auth import authenticate from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.forms import UserCreationForm, UserChangeForm from django.core.exceptions import ValidationError from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ # Translators : %(username)s will be replaced by the username_field name # (default : username, but could be email, or something else) ERROR_MESSAGE = _( "Please enter the correct %(username)s and password " "for a staff account. Note that both fields may be case-sensitive." ) class AdminAuthenticationForm(AuthenticationForm): """ A custom authentication form used in the admin app. Liberally copied from django.contrib.admin.forms.AdminAuthenticationForm """ error_messages = { 'required': _("Please log in again, because your session has expired."), } this_is_the_login_form = forms.BooleanField( widget=forms.HiddenInput, initial=1, error_messages=error_messages ) def clean(self): username = self.cleaned_data.get('username') password = self.cleaned_data.get('password') message = ERROR_MESSAGE if username and password: self.user_cache = authenticate(username=username, password=password) if self.user_cache is None: raise ValidationError(message % { 'username': self.username_field.verbose_name }) elif not self.user_cache.is_active or not self.user_cache.is_staff: raise ValidationError(message % { 'username': self.username_field.verbose_name }) return self.cleaned_data class Admin2UserCreationForm(UserCreationForm): pass class Admin2UserChangeForm(UserChangeForm): def __init__(self, *args, **kwargs): super(Admin2UserChangeForm, self).__init__(*args, **kwargs) print(self.fields['password'].help_text) self.fields['password'].help_text = _("Raw passwords are not stored, so there is no way to see this user's password, but you can change the password using this form." % self.get_update_password_url()) def get_update_password_url(self): if self.instance and self.instance.pk: return reverse_lazy('admin2:password_change', args=[self.instance.pk]) return 'password/'