regluit/libraryauth/forms.py

118 lines
4.1 KiB
Python

import logging
from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import PasswordResetForm
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
from registration.forms import RegistrationFormUniqueEmail
from .emailcheck import is_disposable
from .models import Library
logger = logging.getLogger(__name__)
class UserData(forms.Form):
username = forms.RegexField(
label=_("New Username"),
max_length=30,
regex=r'^[\w.@+-]+$',
help_text=_("30 characters or fewer."),
error_messages={
'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")
}
)
oldusername = None
allow_same = False
def clean_username(self):
username = self.data["username"]
if username != self.oldusername:
users = User.objects.filter(username__iexact=username)
for user in users:
raise forms.ValidationError(_("Another user with that username already exists."))
return username
if not self.allow_same:
raise forms.ValidationError(_("Your username is already "+username))
class UserNamePass(UserData):
password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
password2 = forms.CharField(
label=_("Password confirmation"),
widget=forms.PasswordInput,
help_text=_("Enter the same password as above, for verification.")
)
allow_same = True
def clean_password2(self):
password1 = self.cleaned_data.get("password1", "")
password2 = self.cleaned_data["password2"]
if password1 != password2:
raise forms.ValidationError(_("The two passwords don't match."))
return password2
class RegistrationFormNoDisposableEmail(RegistrationFormUniqueEmail):
def clean_email(self):
"""
Check the supplied email address against a list of known disposable
webmail domains.
"""
cleaned_email = super(RegistrationFormNoDisposableEmail, self).clean_email()
logger.info('cleaning email')
if is_disposable(cleaned_email):
raise forms.ValidationError(_("Please supply a permanent email address."))
return cleaned_email
class SocialAwarePasswordResetForm(PasswordResetForm):
def get_users(self, email):
"""
Send the reset form even if the user password is not usable
"""
active_users = get_user_model()._default_manager.filter(
email__iexact=email, is_active=True)
return active_users
def clean_email(self):
email = self.cleaned_data['email']
if not get_user_model().objects.filter(email__iexact=email, is_active=True).exists():
raise forms.ValidationError("There aren't ungluers with that email address!")
return email
class NewLibraryForm(forms.ModelForm):
username = forms.RegexField(
label=_("Library Username"),
max_length=30,
regex=r'^[\w.@+-]+$',
help_text=_("30 characters or fewer."),
error_messages={
'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")
},
initial='',
)
email = forms.EmailField(
label=_("notification email address for library"),
max_length=100,
error_messages={'required': 'Please enter an email address for the library.'},
)
def clean_username(self):
username = self.cleaned_data['username']
try:
user = User.objects.get(username=username)
raise forms.ValidationError(_(
"That username is already in use, please choose another."
))
except User.DoesNotExist:
self.instance.user = User(username=username)
return username
class Meta:
model = Library
fields = 'name', 'backend', 'email', 'username'
widgets = {'name':forms.TextInput(attrs={'size':'40'})}
class LibraryForm(forms.ModelForm):
class Meta:
model = Library
fields = 'name', 'backend',