fmartingr
/
shelfzilla
Archived
1
0
Fork 0
This repository has been archived on 2021-06-29. You can view files and clone it, but cannot push or open issues or pull requests.
shelfzilla/shelfzilla/apps/account/forms.py

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