forms.py 6.41 KB
# coding=utf-8
import re
from django import forms
from django.utils.translation import ugettext_lazy as _
from rolepermissions.shortcuts import assign_role
from django.contrib.auth import update_session_auth_hash
from django.core.validators import validate_email
from django.core.exceptions import ValidationError

from resubmit.widgets import ResubmitFileWidget

from .models import User

class Validation(forms.ModelForm):
	MIN_PASS_LENGTH = 8
	MAX_UPLOAD_SIZE = 2*1024*1024

	def clean_email(self):
		email = self.cleaned_data.get('email', '')

		try:
			validate_email( email )
			v_email = re.compile('[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}')
			if v_email.fullmatch(email) is None:
				self._errors['email'] = [_('You must insert an email address')]

				return ValueError
			return email
		except ValidationError:
			self._errors['email'] = [_('You must insert an email address')]

			return ValueError

	def clean_image(self):
		image = self.cleaned_data.get('image', False)

		if image:
			if hasattr(image, '_size'):
				if image._size > self.MAX_UPLOAD_SIZE:
					self._errors['image'] = [_("The image is too large. It should have less than 2MB.")]

					return ValueError

		return image

	def clean_password2(self):
		password = self.cleaned_data.get("new_password")
		password2 = self.cleaned_data.get("password2")

		if password and password2 and password != password2:
			self._errors['password2'] = [_('The confirmation password is incorrect.')]

			return ValueError

		return password2

class RegisterUserForm(Validation):
    new_password = forms.CharField(label=_('Password'), widget = forms.PasswordInput(render_value = True, attrs = {'placeholder': _('Password') + ' *'}))
    password2 = forms.CharField(label = _('Confirm Password'), widget = forms.PasswordInput(render_value = True, attrs = {'placeholder': _('Confirm Password') + ' *'}))

    is_edit = False

    def save(self, commit=True):
        super(RegisterUserForm, self).save(commit=False)

        self.instance.set_password(self.cleaned_data['new_password'])

        self.instance.save()

        return self.instance

    class Meta:
        model = User
        fields = ['email', 'username', 'last_name', 'social_name', 'image', 'show_email', ]
        widgets = {
        	'email': forms.EmailInput(attrs = {'placeholder': _('Email') + ' *'}),
        	'username': forms.TextInput(attrs = {'placeholder': _('Name') + ' *'}),
        	'last_name': forms.TextInput(attrs = {'placeholder': _('Last Name') + ' *'}),
        	'social_name': forms.TextInput(attrs = {'placeholder': _('Social Name')}),
			'image': ResubmitFileWidget(attrs={'accept':'image/*'}),
        }

class ProfileForm(Validation):
	is_edit = True

	def save(self, commit=True):
		super(ProfileForm, self).save(commit=False)

		self.instance.save()

		return self.instance

	class Meta:
		model = User
		fields = ['email', 'username', 'last_name', 'social_name', 'description', 'show_email', 'image']
		widgets = {
			'email': forms.EmailInput,
			'description': forms.Textarea,
			'username': forms.TextInput(attrs = {'readonly': 'readonly'}),
			'last_name': forms.TextInput(attrs = {'readonly': 'readonly'}),
			'image': ResubmitFileWidget(attrs={'accept':'image/*'}),
		}

class UserForm(Validation):
	is_edit = False

	def __init__(self, *args, **kwargs):
		is_update = kwargs.pop('is_edit', False)

		super(UserForm, self).__init__(*args, **kwargs)

		self.is_edit = is_update

	new_password = forms.CharField(label = _('Password'), widget = forms.PasswordInput(render_value = True), required = False)
	password2 = forms.CharField(label = _('Confirm Password'), widget = forms.PasswordInput(render_value = True), required = False)


	def save(self, commit=True):
		super(UserForm, self).save(commit=False)

		if not self.is_edit or self.cleaned_data['new_password'] != '':
			self.instance.set_password(self.cleaned_data['new_password'])

		self.instance.save()

		return self.instance

	class Meta:
		model = User
		fields = ['email', 'username', 'last_name', 'social_name', 'description', 'show_email', 'image', 'is_staff', 'is_active',]
		widgets = {
			'email': forms.EmailInput,
			'description': forms.Textarea,
			'image': ResubmitFileWidget(attrs={'accept':'image/*'}),
		}

class ChangePassForm(Validation):
	def __init__(self, *args, **kwargs):
		self.user = kwargs.pop('user', None)
		self.request = kwargs.pop('request', None)
		super(ChangePassForm, self).__init__(*args, **kwargs)

	is_edit = False

	new_password = forms.CharField(label=_('New Password'), widget = forms.PasswordInput(render_value=True), required = True)
	password2 = forms.CharField(label = _('Confirm Password'), widget = forms.PasswordInput(render_value=True), required = True)

	def clean_password(self):
		password = self.cleaned_data.get('password', None)

		if not self.user.check_password(password):
			self._errors['password'] = [_('The value inputed does not match with your actual password.')]

			return ValueError

		return password

	def save(self, commit=True):
		super(ChangePassForm, self).save(commit=False)

		self.instance.set_password(self.cleaned_data['new_password'])

		update_session_auth_hash(self.request, self.instance)

		self.instance.save()

		return self.instance

	class Meta:
		model = User
		fields = ['password']
		labels = {
			'password': _('Actual Password')
		}
		widgets = {
			'password': forms.PasswordInput
		}

class PassResetRequest(forms.Form):
	email = forms.EmailField(label = _('Email'), max_length = 254, widget = forms.EmailInput(attrs = {'placeholder': _('Email') + ' *'}))

	def clean_email(self):
		email = self.cleaned_data.get('email', '')

		try:
			validate_email( email )
			v_email = re.compile('[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}')
			if v_email.fullmatch(email) is None:
				self._errors['email'] = [_('You must insert an email address')]

				return ValueError
			return email
		except ValidationError:
			self._errors['email'] = [_('You must insert a valid email address')]

			return ValueError

class SetPasswordForm(Validation):
	is_edit = False

	new_password = forms.CharField(label=_('New Password'), widget = forms.PasswordInput(render_value=True), required = True)
	password2 = forms.CharField(label = _('Confirm Password'), widget = forms.PasswordInput(render_value=True), required = True)

	class Meta:
		model = User
		fields = []