You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

forms.py 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import string
  2. import random
  3. from django.contrib.auth.forms import AuthenticationForm
  4. from django.utils.translation import ugettext_lazy as _
  5. from django.core.exceptions import ObjectDoesNotExist
  6. from django import forms
  7. from django.contrib.auth.models import User
  8. from django.conf import settings
  9. from oscar.core.loading import get_profile_class
  10. def generate_username():
  11. uname = ''.join([random.choice(string.letters + string.digits + '_') for i in range(30)])
  12. try:
  13. User.objects.get(username=uname)
  14. return generate_username()
  15. except User.DoesNotExist:
  16. return uname
  17. class EmailAuthenticationForm(AuthenticationForm):
  18. """
  19. Extends the standard django AuthenticationForm, to support 75 character
  20. usernames. 75 character usernames are needed to support the EmailOrUsername
  21. auth backend.
  22. """
  23. username = forms.EmailField(label=_('Email Address'))
  24. class EmailUserCreationForm(forms.ModelForm):
  25. email = forms.EmailField(label=_('Email Address'))
  26. password1 = forms.CharField(label=_('Password'), widget=forms.PasswordInput)
  27. password2 = forms.CharField(label=_('Confirm Password'), widget=forms.PasswordInput)
  28. class Meta:
  29. model = User
  30. fields = ('email',)
  31. def clean_email(self):
  32. email = self.cleaned_data['email']
  33. try:
  34. User.objects.get(email=email)
  35. except User.DoesNotExist:
  36. return email
  37. raise forms.ValidationError(_("A user with that email address already exists."))
  38. def clean_password2(self):
  39. password1 = self.cleaned_data.get('password1', '')
  40. password2 = self.cleaned_data.get('password2', '')
  41. if password1 != password2:
  42. raise forms.ValidationError(_("The two password fields didn't match."))
  43. return password2
  44. def save(self, commit=True):
  45. user = super(EmailUserCreationForm, self).save(commit=False)
  46. user.set_password(self.cleaned_data['password1'])
  47. user.username = generate_username()
  48. if commit:
  49. user.save()
  50. return user
  51. class SearchByDateRangeForm(forms.Form):
  52. date_from = forms.DateField(required=False, label="From")
  53. date_to = forms.DateField(required=False, label="To")
  54. def clean(self):
  55. if self.is_valid() and not self.cleaned_data['date_from'] and not self.cleaned_data['date_to']:
  56. raise forms.ValidationError(_("At least one date field is required."))
  57. return super(SearchByDateRangeForm, self).clean()
  58. def description(self):
  59. if not self.is_bound:
  60. return 'All orders'
  61. date_from = self.cleaned_data['date_from']
  62. date_to = self.cleaned_data['date_to']
  63. if date_from and date_to:
  64. return 'Orders placed between %s and %s' % (date_from, date_to)
  65. elif date_from and not date_to:
  66. return 'Orders placed since %s' % date_from
  67. elif not date_from and date_to:
  68. return 'Orders placed until %s' % date_to
  69. def get_filters(self):
  70. date_from = self.cleaned_data['date_from']
  71. date_to = self.cleaned_data['date_to']
  72. if date_from and date_to:
  73. return {'date_placed__range': [date_from, date_to]}
  74. elif date_from and not date_to:
  75. return {'date_placed__gt': date_from}
  76. elif not date_from and date_to:
  77. return {'date_placed__lt': date_to}
  78. return {}
  79. class _UserForm(forms.ModelForm):
  80. def __init__(self, user, *args, **kwargs):
  81. self.user = user
  82. kwargs['instance'] = user
  83. super(_UserForm, self).__init__(*args, **kwargs)
  84. class Meta:
  85. model = User
  86. exclude = ('username', 'password', 'is_staff', 'is_superuser',
  87. 'is_active', 'last_login', 'date_joined',
  88. 'user_permissions', 'groups')
  89. if hasattr(settings, 'AUTH_PROFILE_MODULE'):
  90. Profile = get_profile_class()
  91. class _UserProfileForm(forms.ModelForm):
  92. first_name = forms.CharField(label='First name', max_length=128)
  93. last_name = forms.CharField(label='Last name', max_length=128)
  94. email = forms.EmailField(label='Email address')
  95. # Fields from user model
  96. user_fields = ('first_name', 'last_name', 'email')
  97. def __init__(self, user, *args, **kwargs):
  98. self.user = user
  99. try:
  100. instance = user.get_profile()
  101. except ObjectDoesNotExist:
  102. # User has no profile, try a blank one
  103. instance = Profile(user=user)
  104. kwargs['instance'] = instance
  105. super(_UserProfileForm, self).__init__(*args, **kwargs)
  106. # Add user fields
  107. self.fields['first_name'].initial = self.instance.user.first_name
  108. self.fields['last_name'].initial = self.instance.user.last_name
  109. self.fields['email'].initial = self.instance.user.email
  110. # Ensure user fields are above profile
  111. order = list(self.user_fields)
  112. for field_name in self.fields.keys():
  113. if field_name not in self.user_fields:
  114. order.append(field_name)
  115. self.fields.keyOrder = order
  116. class Meta:
  117. model = Profile
  118. exclude = ('user',)
  119. def save(self, *args, **kwargs):
  120. user = self.instance.user
  121. user.first_name = self.cleaned_data['first_name']
  122. user.last_name = self.cleaned_data['last_name']
  123. user.email = self.cleaned_data['email']
  124. user.save()
  125. return super(ProfileForm, self).save(*args,**kwargs)
  126. ProfileForm = _UserProfileForm
  127. else:
  128. ProfileForm = _UserForm