import string import random from django.contrib.auth.forms import AuthenticationForm from django.utils.translation import ugettext_lazy as _ from django.core.exceptions import ObjectDoesNotExist from django import forms from django.contrib.auth.models import User from django.conf import settings from oscar.core.loading import get_profile_class def generate_username(): uname = ''.join([random.choice(string.letters + string.digits + '_') for i in range(30)]) try: User.objects.get(username=uname) return generate_username() except User.DoesNotExist: return uname class EmailAuthenticationForm(AuthenticationForm): """ Extends the standard django AuthenticationForm, to support 75 character usernames. 75 character usernames are needed to support the EmailOrUsername auth backend. """ username = forms.EmailField(label=_('Email Address')) class EmailUserCreationForm(forms.ModelForm): email = forms.EmailField(label=_('Email Address')) password1 = forms.CharField(label=_('Password'), widget=forms.PasswordInput) password2 = forms.CharField(label=_('Confirm Password'), widget=forms.PasswordInput) class Meta: model = User fields = ('email',) def clean_email(self): email = self.cleaned_data['email'] try: User.objects.get(email=email) except User.DoesNotExist: return email raise forms.ValidationError(_("A user with that email address already exists.")) def clean_password2(self): password1 = self.cleaned_data.get('password1', '') password2 = self.cleaned_data.get('password2', '') if password1 != password2: raise forms.ValidationError(_("The two password fields didn't match.")) return password2 def save(self, commit=True): user = super(EmailUserCreationForm, self).save(commit=False) user.set_password(self.cleaned_data['password1']) user.username = generate_username() if commit: user.save() return user class SearchByDateRangeForm(forms.Form): date_from = forms.DateField(required=False, label="From") date_to = forms.DateField(required=False, label="To") def clean(self): if self.is_valid() and not self.cleaned_data['date_from'] and not self.cleaned_data['date_to']: raise forms.ValidationError(_("At least one date field is required.")) return super(SearchByDateRangeForm, self).clean() def description(self): if not self.is_bound: return 'All orders' date_from = self.cleaned_data['date_from'] date_to = self.cleaned_data['date_to'] if date_from and date_to: return 'Orders placed between %s and %s' % (date_from, date_to) elif date_from and not date_to: return 'Orders placed since %s' % date_from elif not date_from and date_to: return 'Orders placed until %s' % date_to def get_filters(self): date_from = self.cleaned_data['date_from'] date_to = self.cleaned_data['date_to'] if date_from and date_to: return {'date_placed__range': [date_from, date_to]} elif date_from and not date_to: return {'date_placed__gt': date_from} elif not date_from and date_to: return {'date_placed__lt': date_to} return {} class _UserForm(forms.ModelForm): def __init__(self, user, *args, **kwargs): self.user = user kwargs['instance'] = user super(_UserForm, self).__init__(*args, **kwargs) class Meta: model = User exclude = ('username', 'password', 'is_staff', 'is_superuser', 'is_active', 'last_login', 'date_joined', 'user_permissions', 'groups') if hasattr(settings, 'AUTH_PROFILE_MODULE'): Profile = get_profile_class() class _UserProfileForm(forms.ModelForm): first_name = forms.CharField(label='First name', max_length=128) last_name = forms.CharField(label='Last name', max_length=128) email = forms.EmailField(label='Email address') # Fields from user model user_fields = ('first_name', 'last_name', 'email') def __init__(self, user, *args, **kwargs): self.user = user try: instance = user.get_profile() except ObjectDoesNotExist: # User has no profile, try a blank one instance = Profile(user=user) kwargs['instance'] = instance super(_UserProfileForm, self).__init__(*args, **kwargs) # Add user fields self.fields['first_name'].initial = self.instance.user.first_name self.fields['last_name'].initial = self.instance.user.last_name self.fields['email'].initial = self.instance.user.email # Ensure user fields are above profile order = list(self.user_fields) for field_name in self.fields.keys(): if field_name not in self.user_fields: order.append(field_name) self.fields.keyOrder = order class Meta: model = Profile exclude = ('user',) def save(self, *args, **kwargs): user = self.instance.user user.first_name = self.cleaned_data['first_name'] user.last_name = self.cleaned_data['last_name'] user.email = self.cleaned_data['email'] user.save() return super(ProfileForm, self).save(*args,**kwargs) ProfileForm = _UserProfileForm else: ProfileForm = _UserForm