97 lines
3.0 KiB
Python
97 lines
3.0 KiB
Python
from django import forms
|
|
from django.contrib.auth import authenticate
|
|
from django.db import transaction
|
|
from django.contrib.auth.forms import (
|
|
PasswordChangeForm as DjangoPasswordChangeForm
|
|
)
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from . import models
|
|
|
|
|
|
class LoginForm(forms.Form):
|
|
username = forms.CharField(max_length=75, label=_('Username'))
|
|
password = forms.CharField(
|
|
max_length=255, widget=forms.PasswordInput, label=_('Password'))
|
|
|
|
def authenticate(self):
|
|
result = None
|
|
|
|
if self.cleaned_data:
|
|
username = self.cleaned_data['username']
|
|
password = self.cleaned_data['password']
|
|
|
|
result = authenticate(username=username, password=password)
|
|
|
|
return result
|
|
|
|
def clean(self):
|
|
data = self.cleaned_data
|
|
|
|
if not self.errors:
|
|
user = self.authenticate()
|
|
|
|
if user is not None:
|
|
if not user.is_active:
|
|
raise forms.ValidationError(
|
|
_("This account is disabled.")
|
|
)
|
|
else:
|
|
raise forms.ValidationError(
|
|
_('User with those credentials was not found.')
|
|
)
|
|
|
|
return data
|
|
|
|
|
|
class PasswordChangeForm(DjangoPasswordChangeForm):
|
|
pass
|
|
|
|
|
|
class RegistrationForm(forms.ModelForm):
|
|
"""
|
|
Custom for for registering an user
|
|
"""
|
|
password1 = forms.CharField(label=_('Password'),
|
|
widget=forms.PasswordInput)
|
|
password2 = forms.CharField(label=_('Repeat password'),
|
|
widget=forms.PasswordInput)
|
|
access_code = forms.CharField(label=_('Invitation code'), required=True)
|
|
|
|
class Meta:
|
|
model = models.User
|
|
fields = ('email', 'username', )
|
|
|
|
def get_access_code(self):
|
|
try:
|
|
return models.AccessCode.objects.get(
|
|
code=self.cleaned_data['access_code'])
|
|
except models.AccessCode.DoesNotExist:
|
|
return False
|
|
|
|
def clean_access_code(self):
|
|
code = self.get_access_code()
|
|
if not code or (code and not code.usable):
|
|
raise forms.ValidationError(_('Invitation code is not valid'))
|
|
|
|
return self.cleaned_data['access_code']
|
|
|
|
def clean_password2(self):
|
|
# Check that the two password entries match
|
|
password1 = self.cleaned_data.get("password1")
|
|
password2 = self.cleaned_data.get("password2")
|
|
if password1 and password2 and password1 != password2:
|
|
raise forms.ValidationError("Passwords don't match")
|
|
return password2
|
|
|
|
def save(self, commit=True):
|
|
# Save the provided password in hashed format
|
|
with transaction.atomic():
|
|
user = super(RegistrationForm, self).save(commit=False)
|
|
access_code = self.get_access_code()
|
|
user.access_code = access_code
|
|
user.set_password(self.cleaned_data["password1"])
|
|
if commit:
|
|
user.save()
|
|
return user
|