/account/forms.py

https://github.com/NickyMouse/myway · Python · 84 lines · 54 code · 13 blank · 17 comment · 7 complexity · 576864d2d968b98d5196d7d632e0cd76 MD5 · raw file

  1. import random, hashlib, datetime
  2. from django import forms
  3. from django.contrib.auth.models import User
  4. from django.utils.translation import ugettext_lazy as _
  5. from django.core.exceptions import ValidationError
  6. from models import UserProfile
  7. def validate_username_not_exist(value):
  8. try:
  9. User.objects.get(username=value)
  10. except User.DoesNotExist:
  11. return
  12. raise ValidationError(_("The username is already taken"))
  13. class RegistrationForm(forms.ModelForm):
  14. """
  15. Form for registering a new user account
  16. """
  17. username = forms.RegexField(label = _("Username"), max_length = 40, required = True,
  18. regex = r'^[\w.@+-_]+',
  19. help_text = _("Required. 40 characters or fewer. Letters, digits and @/./+/-/_ only."),
  20. error_messages={
  21. 'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters"),
  22. })
  23. email = forms.EmailField(label = _("Email"), max_length=40, required=True)
  24. password1 = forms.CharField(label = _("Password"), required=True, widget = forms.PasswordInput)
  25. password2 = forms.CharField(label = _("Password Confirmation"), required=True, widget = forms.PasswordInput)
  26. # Optional fields
  27. last_name = forms.CharField(label = _("Last Name"), max_length=40, required=False)
  28. first_name = forms.CharField(label = _("First Name"), max_length=40, required=False)
  29. class Meta:
  30. model = User
  31. fields = ("username", "email", "last_name", "first_name")
  32. def clean_username(self):
  33. """
  34. Verify username not existed in database
  35. """
  36. username = self.cleaned_data["username"]
  37. try:
  38. User.objects.get(username=username)
  39. except User.DoesNotExist:
  40. return username
  41. raise ValidationError(_("A user with that username already exists."))
  42. def clean_password2(self):
  43. """
  44. Verify password2 is the same as password1
  45. """
  46. password1 = self.cleaned_data.get("password1", "")
  47. password2 = self.cleaned_data["password2"]
  48. if password1 != password2:
  49. raise ValidationError(_("The two password field didn't match"))
  50. return password2
  51. def save(self, commit=True):
  52. """
  53. Save User and related UserProfile object into database
  54. NOTICE: saved user has is_active set as False by default. A user account will be activated only
  55. if the user clicks confirmation link sent to his/her mailbox.
  56. """
  57. user = super(RegistrationForm, self).save(commit=False)
  58. password = self.cleaned_data['password2']
  59. user.set_password(password)
  60. user.is_active = False
  61. if commit:
  62. user.save()
  63. # Build user profile and activation key
  64. salt = hashlib.new('sha',str(random.random())).hexdigest()[:-5]
  65. activation_key = hashlib.new('sha',salt+user.username).hexdigest()
  66. expire_time = datetime.datetime.today() + datetime.timedelta(2)
  67. profile = UserProfile(user=user, activation_key=activation_key, expire_time=expire_time)
  68. if commit:
  69. profile.save()
  70. return user, profile