148 lines
5.8 KiB
Python
148 lines
5.8 KiB
Python
"""
|
|
Created on 03.10.2011
|
|
|
|
@author: Christian
|
|
"""
|
|
|
|
from captcha.fields import ReCaptchaField
|
|
from django import forms
|
|
from django.conf import settings
|
|
from django.contrib import auth
|
|
from django.contrib.sites.models import Site
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from utils.massmailer import MassMailer
|
|
from . import models
|
|
|
|
|
|
class MembershipForm(forms.ModelForm):
|
|
"""Form for users to change their own user data."""
|
|
error_css_class = 'error'
|
|
required_css_class = 'required'
|
|
birthday = forms.DateField(
|
|
label=_('birthday'),
|
|
required=False,
|
|
help_text=_('Input format: yyyy-mm-dd')
|
|
)
|
|
email = forms.EmailField(label=_('Email'), required=True)
|
|
|
|
class Meta:
|
|
"""get the user model dyamicly"""
|
|
model = auth.get_user_model()
|
|
fields = (
|
|
'username', 'gender', 'first_name', 'last_name', 'email', 'avatar',
|
|
'website', 'membership', 'birthday', 'telephone', 'street_name',
|
|
'post_code', 'city'
|
|
)
|
|
|
|
def clean_birthday(self):
|
|
"""If the user wants to be a member the birthday field is mandatory."""
|
|
if self.cleaned_data['membership'] \
|
|
and not self.cleaned_data['birthday']:
|
|
raise forms.ValidationError(_('For your membership, we need this. \
|
|
Please fill out this field yet.'))
|
|
return self.cleaned_data['birthday']
|
|
|
|
def clean_street_name(self):
|
|
"""If the user wants to be a member the address is mandatory."""
|
|
if self.cleaned_data['membership'] \
|
|
and not self.cleaned_data['street_name']:
|
|
raise forms.ValidationError(_('For your membership, we need this. \
|
|
Please fill out this field yet.'))
|
|
return self.cleaned_data['street_name']
|
|
|
|
def clean_post_code(self):
|
|
"""If the user wants to be a member the address is mandatory."""
|
|
if self.cleaned_data['membership'] \
|
|
and not self.cleaned_data['post_code']:
|
|
raise forms.ValidationError(_('For your membership, we need this. \
|
|
Please fill out this field yet.'))
|
|
return self.cleaned_data['post_code']
|
|
|
|
def clean_city(self):
|
|
"""If the user wants to be a member the address is mandatory."""
|
|
if self.cleaned_data['membership'] and not self.cleaned_data['city']:
|
|
raise forms.ValidationError(_('For your membership, we need this. \
|
|
Please fill out this field yet.'))
|
|
return self.cleaned_data['city']
|
|
|
|
|
|
class RegistrationForm(MembershipForm):
|
|
"""Form to register a new user account.
|
|
|
|
Validates that the requested username and email is not already in use,
|
|
requires the password to be entered twice to catch typos.
|
|
Also sends an activation request per mail, to validate the email.
|
|
"""
|
|
password1 = forms.CharField(
|
|
widget=forms.PasswordInput(), label=_('password'))
|
|
password2 = forms.CharField(
|
|
widget=forms.PasswordInput(), label=_('password (again)'))
|
|
recaptcha = ReCaptchaField()
|
|
|
|
class Meta:
|
|
"""Metadata to localize and customize the ModelForm."""
|
|
model = auth.get_user_model()
|
|
fields = ('first_name', 'last_name', 'username', 'email',
|
|
'username', 'gender', 'first_name', 'last_name', 'email',
|
|
'avatar',
|
|
'website', 'membership', 'birthday', 'telephone',
|
|
'street_name',
|
|
'post_code', 'city'
|
|
)
|
|
|
|
def clean_username(self):
|
|
"""Validate that the username is not already in use."""
|
|
try:
|
|
auth.get_user_model().objects.get(
|
|
username__iexact=self.cleaned_data['username']
|
|
)
|
|
except auth.get_user_model().DoesNotExist:
|
|
return self.cleaned_data['username']
|
|
raise forms.ValidationError(_(u'This username is already taken. \
|
|
Please choose another.'))
|
|
|
|
def clean_email(self):
|
|
"""Validate that the supplied email address is unique for the site."""
|
|
if auth.get_user_model().objects.filter(
|
|
email__iexact=self.cleaned_data['email']):
|
|
raise forms.ValidationError(_(u'This email address is already in \
|
|
use. Please supply a different email address.'))
|
|
return self.cleaned_data['email']
|
|
|
|
def clean_password2(self):
|
|
"""Check that the password has been entered identical for two times."""
|
|
password1 = self.cleaned_data.get("password1", "")
|
|
password2 = self.cleaned_data["password2"]
|
|
if password1 != password2:
|
|
raise forms.ValidationError(
|
|
_("The two password fields didn't match."))
|
|
return password2
|
|
|
|
def save(self, commit=True):
|
|
""" Create the new User, set him/her inactive, create an acitivation
|
|
request for the user and send him/her an activation email.
|
|
|
|
:param commit: commit the SQL and send the email if True
|
|
:return: the created User Object
|
|
"""
|
|
user = super(RegistrationForm, self).save(commit=False)
|
|
user.set_password(self.cleaned_data["password1"])
|
|
user.is_active = False
|
|
if commit:
|
|
user.save()
|
|
activation_request = models.ActivationRequest.objects \
|
|
.create_pending_registration(user)
|
|
mailer = MassMailer(
|
|
subject='Deine Anmeldung auf %s' % Site.objects.get_current(),
|
|
txt_template='membership/email/activation_email.txt',
|
|
context={
|
|
'user': activation_request.user,
|
|
'site': Site.objects.get_current(),
|
|
'activation_key': activation_request.activation_key,
|
|
'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS,
|
|
}
|
|
)
|
|
mailer.send(recipients=[activation_request.user])
|
|
return user
|