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 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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 django.core import validators
  10. from oscar.core.loading import get_profile_class
  11. def generate_username():
  12. uname = ''.join([random.choice(string.letters + string.digits + '_') for i in range(30)])
  13. try:
  14. User.objects.get(username=uname)
  15. return generate_username()
  16. except User.DoesNotExist:
  17. return uname
  18. class EmailAuthenticationForm(AuthenticationForm):
  19. """
  20. Extends the standard django AuthenticationForm, to support 75 character
  21. usernames. 75 character usernames are needed to support the EmailOrUsername
  22. auth backend.
  23. """
  24. username = forms.EmailField(label=_('Email Address'))
  25. class CommonPasswordValidator(validators.BaseValidator):
  26. # See http://www.smartplanet.com/blog/business-brains/top-20-most-common-passwords-of-all-time-revealed-8216123456-8216princess-8216qwerty/4519
  27. forbidden_passwords = [
  28. 'password',
  29. '1234',
  30. '12345'
  31. '123456',
  32. '123456y',
  33. '123456789',
  34. 'iloveyou',
  35. 'princess',
  36. 'monkey',
  37. 'rockyou',
  38. 'babygirl',
  39. 'monkey',
  40. 'qwerty',
  41. '654321',
  42. 'dragon',
  43. 'pussy',
  44. 'baseball',
  45. 'football',
  46. 'letmein',
  47. 'monkey',
  48. '696969',
  49. 'abc123',
  50. 'qwe123',
  51. 'qweasd',
  52. 'mustang',
  53. 'michael',
  54. 'shadow',
  55. 'master',
  56. 'jennifer',
  57. '111111',
  58. '2000',
  59. 'jordan',
  60. 'superman'
  61. 'harley'
  62. ]
  63. message = _("Please choose a less common password")
  64. code = 'password'
  65. def __init__(self, password_file=None):
  66. self.limit_value = password_file
  67. def clean(self, value):
  68. return value.strip()
  69. def compare(self, value, limit):
  70. return value in self.forbidden_passwords
  71. def get_forbidden_passwords(self):
  72. if self.limit_value is None:
  73. return self.forbidden_passwords
  74. class EmailUserCreationForm(forms.ModelForm):
  75. email = forms.EmailField(label=_('Email Address'))
  76. password1 = forms.CharField(label=_('Password'), widget=forms.PasswordInput,
  77. validators=[validators.MinLengthValidator(6),
  78. CommonPasswordValidator()])
  79. password2 = forms.CharField(label=_('Confirm Password'), widget=forms.PasswordInput)
  80. class Meta:
  81. model = User
  82. fields = ('email',)
  83. def clean_email(self):
  84. email = self.cleaned_data['email'].lower()
  85. try:
  86. User.objects.get(email=email)
  87. except User.DoesNotExist:
  88. return email
  89. raise forms.ValidationError(_("A user with that email address already exists."))
  90. def clean_password2(self):
  91. password1 = self.cleaned_data.get('password1', '')
  92. password2 = self.cleaned_data.get('password2', '')
  93. if password1 != password2:
  94. raise forms.ValidationError(_("The two password fields didn't match."))
  95. return password2
  96. def save(self, commit=True):
  97. user = super(EmailUserCreationForm, self).save(commit=False)
  98. user.set_password(self.cleaned_data['password1'])
  99. user.username = generate_username()
  100. if commit:
  101. user.save()
  102. return user
  103. class SearchByDateRangeForm(forms.Form):
  104. date_from = forms.DateField(required=False, label="From")
  105. date_to = forms.DateField(required=False, label="To")
  106. def clean(self):
  107. if self.is_valid() and not self.cleaned_data['date_from'] and not self.cleaned_data['date_to']:
  108. raise forms.ValidationError(_("At least one date field is required."))
  109. return super(SearchByDateRangeForm, self).clean()
  110. def description(self):
  111. if not self.is_bound or not self.is_valid():
  112. return 'All orders'
  113. date_from = self.cleaned_data['date_from']
  114. date_to = self.cleaned_data['date_to']
  115. if date_from and date_to:
  116. return 'Orders placed between %s and %s' % (date_from, date_to)
  117. elif date_from and not date_to:
  118. return 'Orders placed since %s' % date_from
  119. elif not date_from and date_to:
  120. return 'Orders placed until %s' % date_to
  121. def get_filters(self):
  122. date_from = self.cleaned_data['date_from']
  123. date_to = self.cleaned_data['date_to']
  124. if date_from and date_to:
  125. return {'date_placed__range': [date_from, date_to]}
  126. elif date_from and not date_to:
  127. return {'date_placed__gt': date_from}
  128. elif not date_from and date_to:
  129. return {'date_placed__lt': date_to}
  130. return {}
  131. class UserForm(forms.ModelForm):
  132. def __init__(self, user, *args, **kwargs):
  133. self.user = user
  134. kwargs['instance'] = user
  135. super(UserForm, self).__init__(*args, **kwargs)
  136. class Meta:
  137. model = User
  138. exclude = ('username', 'password', 'is_staff', 'is_superuser',
  139. 'is_active', 'last_login', 'date_joined',
  140. 'user_permissions', 'groups')
  141. if hasattr(settings, 'AUTH_PROFILE_MODULE'):
  142. Profile = get_profile_class()
  143. class UserAndProfileForm(forms.ModelForm):
  144. first_name = forms.CharField(label=_('First name'), max_length=128)
  145. last_name = forms.CharField(label=_('Last name'), max_length=128)
  146. email = forms.EmailField(label=_('Email address'))
  147. # Fields from user model
  148. user_fields = ('first_name', 'last_name', 'email')
  149. def __init__(self, user, *args, **kwargs):
  150. self.user = user
  151. try:
  152. instance = user.get_profile()
  153. except ObjectDoesNotExist:
  154. # User has no profile, try a blank one
  155. instance = Profile(user=user)
  156. kwargs['instance'] = instance
  157. super(UserAndProfileForm, self).__init__(*args, **kwargs)
  158. # Add user fields
  159. self.fields['first_name'].initial = self.instance.user.first_name
  160. self.fields['last_name'].initial = self.instance.user.last_name
  161. self.fields['email'].initial = self.instance.user.email
  162. # Ensure user fields are above profile
  163. order = list(self.user_fields)
  164. for field_name in self.fields.keys():
  165. if field_name not in self.user_fields:
  166. order.append(field_name)
  167. self.fields.keyOrder = order
  168. class Meta:
  169. model = Profile
  170. exclude = ('user',)
  171. def save(self, *args, **kwargs):
  172. user = self.instance.user
  173. user.first_name = self.cleaned_data['first_name']
  174. user.last_name = self.cleaned_data['last_name']
  175. user.email = self.cleaned_data['email']
  176. user.save()
  177. return super(ProfileForm, self).save(*args,**kwargs)
  178. ProfileForm = UserAndProfileForm
  179. else:
  180. ProfileForm = UserForm