from datetime import date
from django import forms
+from django.conf import settings
+from django.contrib.auth import authenticate
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from philo.contrib.waldo.tokens import REGISTRATION_TIMEOUT_DAYS
-LOGIN_FORM_KEY = 'this_is_the_login_form'
-LoginForm = type('LoginForm', (AuthenticationForm,), {
- LOGIN_FORM_KEY: forms.BooleanField(widget=forms.HiddenInput, initial=True)
-})
-
-
class EmailInput(forms.TextInput):
input_type = 'email'
class RegistrationForm(UserCreationForm):
email = forms.EmailField(widget=EmailInput)
+ try:
+ from recaptcha_django import ReCaptchaField
+ except ImportError:
+ pass
+ else:
+ if 'recaptcha_django.middleware.ReCaptchaMiddleware' in settings.MIDDLEWARE_CLASSES:
+ recaptcha = ReCaptchaField()
def clean_username(self):
username = self.cleaned_data['username']
new_user = User.objects.create_user(username, email, password)
new_user.is_active = False
new_user.save()
- return new_user
\ No newline at end of file
+ return new_user
+
+
+class UserAccountForm(forms.ModelForm):
+ first_name = User._meta.get_field('first_name').formfield(required=True)
+ last_name = User._meta.get_field('last_name').formfield(required=True)
+ email = User._meta.get_field('email').formfield(required=True, widget=EmailInput)
+
+ def __init__(self, user, *args, **kwargs):
+ kwargs['instance'] = user
+ super(UserAccountForm, self).__init__(*args, **kwargs)
+
+ class Meta:
+ model = User
+ fields = ('first_name', 'last_name', 'email')
+
+
+class WaldoAuthenticationForm(AuthenticationForm):
+ ERROR_MESSAGE = _("Please enter a correct username and password. Note that both fields are case-sensitive.")
+
+ def clean(self):
+ username = self.cleaned_data['username']
+ password = self.cleaned_data['password']
+ message = self.ERROR_MESSAGE
+
+ if username and password:
+ self.user_cache = authenticate(username=username, password=password)
+ if self.user_cache is None:
+ if u'@' in username:
+ # Maybe they entered their email? Look it up, but still raise a ValidationError.
+ try:
+ user = User.objects.get(email=username)
+ except (User.DoesNotExist, User.MultipleObjectsReturned):
+ pass
+ else:
+ if user.check_password(password):
+ message = _("Your e-mail address is not your username. Try '%s' instead.") % user.username
+ raise ValidationError(message)
+ elif not self.user_cache.is_active:
+ raise ValidationError(message)
+ self.check_for_test_cookie()
+ return self.cleaned_data
+
+ def check_for_test_cookie(self):
+ # This method duplicates the Django 1.3 AuthenticationForm method.
+ if self.request and not self.request.session.test_cookie_worked():
+ raise forms.ValidationError(
+ _("Your Web browser doesn't appear to have cookies enabled. "
+ "Cookies are required for logging in."))
\ No newline at end of file