# -*- coding: utf-8 -*-
"""
Sistema de Consulta Pública
Copyleft (@) 2017 CENDITEL nodo Mérida - https://planificacion.cenditel.gob.ve/trac/wiki/ModeladoTopicos_2017
"""
## @package participacion.forms
#
# Formulario correspondiente a la aplicación participación
# @author Rodrigo Boet (rboet at cenditel.gob.ve)
# @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
# (CENDITEL) nodo Mérida - Venezuela
# @copyright GNU Public License versión 2 (GPLv2)
# @version 1.0
from django import forms
from django.forms import ModelForm
from django.contrib.auth import authenticate
from django.contrib.auth.models import User
from django.forms.fields import (
CharField, BooleanField
)
from django.forms.widgets import (
PasswordInput, CheckboxInput
)
from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm
from base.fields import CedulaField
from base.functions import (
cargar_entidad, cargar_municipios, cargar_parroquias,
validate_cedula, validate_email, cargar_universidades
)
from base.models import Municipio, Parroquia
from base.constant import SECTORES, PARTICIPACION, SECTOR_ESTUDIANTE, SECTOR_TRABAJADOR
from .models import Perfil
from captcha.fields import CaptchaField
class LoginForm(forms.Form):
"""!
Clase del formulario de logeo
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 01-03-2017
@version 1.0.0
"""
## Campo de la constraseña
contrasena = CharField()
## Nombre del usuario
usuario = CharField()
## Formulario de recordarme
remember_me = BooleanField()
## Campo del captcha
captcha = CaptchaField()
def __init__(self, *args, **kwargs):
"""!
Metodo que sobreescribe cuando se inicializa el formulario
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 01-03-2017
@param self {object} Objeto que instancia la clase
@param args {list} Lista de los argumentos
@param kwargs {dict} Diccionario con argumentos
@return Retorna el formulario validado
"""
super(LoginForm, self).__init__(*args, **kwargs)
self.fields['contrasena'].widget = PasswordInput()
self.fields['contrasena'].widget.attrs.update({'class': 'form-control',
'placeholder': 'Contraseña'})
self.fields['usuario'].widget.attrs.update({'class': 'form-control',
'placeholder': 'Nombre de Usuario'})
self.fields['remember_me'].label = "Recordar"
self.fields['remember_me'].widget = CheckboxInput()
self.fields['remember_me'].required = False
self.fields['captcha'].label = "Captcha"
def clean(self):
"""!
Método que valida si el usuario a autenticar es valido
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 21-04-2017
@param self {object} Objeto que instancia la clase
@return Retorna el campo con los errores
"""
usuario = self.cleaned_data['usuario']
contrasena = self.cleaned_data['contrasena']
usuario = authenticate(username=usuario,password=contrasena)
if(not usuario):
msg = "Verifique su usuario o contraseña"
self.add_error('usuario', msg)
class Meta:
fields = ('usuario', 'contrasena', 'remember_me')
class UserRegisterForm(forms.ModelForm):
"""!
Formulario de Registro
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 20-04-2017
@version 1.0.0
"""
def __init__(self, *args, **kwargs):
"""!
Metodo que sobreescribe cuando se inicializa el formulario
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 01-03-2017
@param self {object} Objeto que instancia la clase
@param args {list} Lista de los argumentos
@param kwargs {dict} Diccionario con argumentos
@return Retorna el formulario validado
"""
super(UserRegisterForm, self).__init__(*args, **kwargs)
# Si se ha seleccionado un estado establece el listado de municipios y elimina el atributo disable
if 'estado' in self.data and self.data['estado']:
self.fields['municipio'].widget.attrs.pop('disabled')
self.fields['municipio'].queryset=Municipio.objects.filter(entidad=self.data['estado'])
# Si se ha seleccionado un municipio establece el listado de parroquias y elimina el atributo disable
if 'municipio' in self.data and self.data['municipio']:
self.fields['parroquia'].widget.attrs.pop('disabled')
self.fields['parroquia'].queryset=Parroquia.objects.filter(municipio=self.data['municipio'])
if 'participacion' in self.data and self.data['participacion']=='CO':
self.fields['colectivo'].widget.attrs.pop('readonly')
self.fields['estado'].choices = cargar_entidad()
self.fields['municipio'].choices = cargar_municipios()
self.fields['parroquia'].choices = cargar_parroquias()
self.fields['universidad'].choices = cargar_universidades()
## Nombre de usuario
username = forms.CharField(max_length=30,
widget=forms.TextInput(attrs={'class': 'form-control input-md',}),
label="Nombre de Usuario"
)
## Contraseña
password = forms.CharField(max_length=20,
widget=forms.TextInput(attrs={'class': 'form-control input-md','type':'password'}),
label="Constraseña"
)
## Repita la Contraseña
password_repeat = forms.CharField(max_length=20,
widget=forms.TextInput(attrs={'class': 'form-control input-md','type':'password'}),
label="Repita su constraseña"
)
## nombre
nombre = forms.CharField(max_length=100,
widget=forms.TextInput(attrs={'class': 'form-control input-md',}),
label="Nombre"
)
## apellido
apellido = forms.CharField(max_length=100,
widget=forms.TextInput(attrs={'class': 'form-control input-md',}),
label="Apellido"
)
## correo
email = forms.EmailField(
widget=forms.TextInput(attrs={'class': 'form-control input-md',}),
label="Correo"
)
## cedula
cedula = CedulaField()
## sector
sector = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'mostrar_sector(this.value);'}),
label="Sector",choices=(('','Seleccione...'),)+SECTORES
)
## sector trabajador
sector_trabajador = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-control input-md'}),
label="Sector Trabajador",choices=(('','Seleccione...'),)+SECTOR_TRABAJADOR,
required = False
)
## sector estudiante
sector_estudiante = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'mostrar_universidad(this.value)'}),
label="Sector Estudiante",choices=(('','Seleccione...'),)+SECTOR_ESTUDIANTE,
required = False
)
universidad = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-control input-md',}),
label="Institución",required = False
)
## participacion
participacion = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'habilitar_colectivo(this.value);'}),
label="Participación",choices=(('','Seleccione...'),)+PARTICIPACION
)
## colectivo
colectivo = forms.CharField(max_length=100,
widget=forms.TextInput(attrs={'class': 'form-control input-md','readonly':True}),
label="Colectivo al que pertenece", required = False
)
## estado
estado = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',
'onchange': "actualizar_combo(this.value,'base','Municipio','entidad','codigo','nombre','id_municipio')"}))
## municipio
municipio = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md','disabled':'disabled',
'onchange': "actualizar_combo(this.value,'base','Parroquia','municipio','codigo','nombre','id_parroquia')"}))
## parroquia
parroquia = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md','disabled':'disabled'}))
## Campo del captcha
captcha = CaptchaField()
def clean_password_repeat(self):
"""!
Método que valida si las contraseñas coinciden
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 01-03-2017
@param self {object} Objeto que instancia la clase
@return Retorna el campo con la validacion
"""
password = self.cleaned_data['password']
password_repeat = self.cleaned_data['password_repeat']
if(password_repeat!=password):
raise forms.ValidationError("La contraseña no coincide")
return password_repeat
def clean_cedula(self):
"""!
Método que valida si la cedula es única
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 01-03-2017
@param self {object} Objeto que instancia la clase
@return Retorna el campo con la validacion
"""
cedula = self.cleaned_data['cedula']
if(validate_cedula(cedula)):
raise forms.ValidationError("La cédula ingresada ya existe")
return cedula
def clean_email(self):
"""!
Método que valida si el correo es única
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 01-03-2017
@param self {object} Objeto que instancia la clase
@return Retorna el campo con la validacion
"""
email = self.cleaned_data['email']
if(validate_email(email)):
raise forms.ValidationError("El correo ingresado ya existe")
return email
def clean_colectivo(self):
"""!
Método que valida el campo colectivo
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-05-2017
@param self {object} Objeto que instancia la clase
@return Retorna el campo con la validacion
"""
colectivo = self.cleaned_data['colectivo']
participacion = self.cleaned_data['participacion']
if(participacion=='CO' and colectivo==''):
raise forms.ValidationError("Debe ingresar el nombre del colectivo")
return colectivo
def clean_sector_trabajador(self):
"""!
Método que valida el sector trabajador
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-05-2017
@param self {object} Objeto que instancia la clase
@return Retorna el campo con la validacion
"""
sector = self.cleaned_data['sector']
sector_trabajador = self.cleaned_data['sector_trabajador']
if(sector=='TR' and sector_trabajador==''):
raise forms.ValidationError("Debe ingresar el sector dónde trabaja")
return sector_trabajador
def clean_sector_estudiante(self):
"""!
Método que valida el sector estudiante
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-05-2017
@param self {object} Objeto que instancia la clase
@return Retorna el campo con la validacion
"""
sector = self.cleaned_data['sector']
sector_estudiante = self.cleaned_data['sector_estudiante']
if(sector=='ES' and sector_estudiante==''):
raise forms.ValidationError("Debe ingresar el sector dónde estudia")
return sector_estudiante
def clean_universidad(self):
"""!
Método que valida las universidades
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 08-09-2017
@param self {object} Objeto que instancia la clase
@return Retorna el campo con la validacion
"""
universidad = self.cleaned_data['universidad']
sector_estudiante = self.cleaned_data['sector_estudiante']
if(universidad=='' and sector_estudiante!=''):
raise forms.ValidationError("Debe ingresar la institución de donde proviene")
return universidad
class Meta:
model = User
exclude = ['is_staff','is_active','date_joined']
class PerfilForm(forms.ModelForm):
"""!
Formulario del perfil
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 24-04-2017
@version 1.0.0
"""
def __init__(self, *args, **kwargs):
"""!
Metodo que sobreescribe cuando se inicializa el formulario
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-04-2017
@param self {object} Objeto que instancia la clase
@param args {list} Lista de los argumentos
@param kwargs {dict} Diccionario con argumentos
@return Retorna el formulario validado
"""
super(PerfilForm, self).__init__(*args, **kwargs)
self.fields['estado'].choices = cargar_entidad()
self.fields['municipio'].choices = cargar_municipios()
self.fields['parroquia'].choices = cargar_parroquias()
if 'participacion' in self.data and self.data['participacion']=='CO':
self.fields['colectivo'].widget.attrs.pop('readonly')
## cedula
cedula = CedulaField()
## estado
estado = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',
'onchange': "actualizar_combo(this.value,'base','Municipio','entidad','codigo','nombre','id_municipio')"}))
## municipio
municipio = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',
'onchange': "actualizar_combo(this.value,'base','Parroquia','municipio','codigo','nombre','id_parroquia')"}))
## parroquia
parroquia = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',}))
## sector
sector = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'mostrar_sector(this.value);'}),
label="Sector",choices=(('','Seleccione...'),)+SECTORES
)
## sector trabajador
sector_trabajador = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-control input-md'}),
label="Sector Trabajador",choices=(('','Seleccione...'),)+SECTOR_TRABAJADOR,
required = False
)
## sector estudiante
sector_estudiante = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-control input-md',}),
label="Sector Estudiante",choices=(('','Seleccione...'),)+SECTOR_ESTUDIANTE,
required = False
)
## participacion
participacion = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'habilitar_colectivo(this.value);'}),
label="Participación",choices=(('','Seleccione...'),)+PARTICIPACION
)
## colectivo
colectivo = forms.CharField(max_length=100,
widget=forms.TextInput(attrs={'class': 'form-control input-md','readonly':True}),
label="Colectivo al que pertenece", required = False
)
def clean_colectivo(self):
"""!
Método que valida el campo colectivo
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-05-2017
@param self {object} Objeto que instancia la clase
@return Retorna el campo con la validacion
"""
colectivo = self.cleaned_data['colectivo']
participacion = self.cleaned_data['participacion']
if(participacion=='CO' and colectivo==''):
raise forms.ValidationError("Debe ingresar el nombre del colectivo")
return colectivo
def clean_sector_trabajador(self):
"""!
Método que valida el sector trabajador
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-05-2017
@param self {object} Objeto que instancia la clase
@return Retorna el campo con la validacion
"""
sector = self.cleaned_data['sector']
sector_trabajador = self.cleaned_data['sector_trabajador']
if(sector=='TR' and sector_trabajador==''):
raise forms.ValidationError("Debe ingresar el sector dónde trabaja")
return sector_trabajador
def clean_sector_estudiante(self):
"""!
Método que valida el sector estudiante
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-05-2017
@param self {object} Objeto que instancia la clase
@return Retorna el campo con la validacion
"""
sector = self.cleaned_data['sector']
sector_estudiante = self.cleaned_data['sector_estudiante']
if(sector=='ES' and sector_estudiante==''):
raise forms.ValidationError("Debe ingresar el sector dónde estudia")
return sector_estudiante
class Meta:
model = Perfil
exclude = ['user','parroquia']
class PasswordResetForm(PasswordResetForm):
"""!
Clase del formulario de resetear contraseña
@author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 02-05-2017
@version 1.0.0
"""
def __init__(self, *args, **kwargs):
super(PasswordResetForm, self).__init__(*args, **kwargs)
self.fields['email'].widget.attrs.update({'class': 'form-control',
'placeholder': 'Correo'})
def clean(self):
cleaned_data = super(PasswordResetForm, self).clean()
email = cleaned_data.get("email")
if email:
msg = "Error no existe el email"
try:
User.objects.get(email=email)
except:
self.add_error('email', msg)
class PasswordConfirmForm(SetPasswordForm):
"""!
Formulario para confirmar la constraseña
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 15-05-2017
@version 1.0.0
"""
def __init__(self, *args, **kwargs):
super(PasswordConfirmForm, self).__init__(*args, **kwargs)
self.fields['new_password1'].widget.attrs.update({'class': 'form-control',
'placeholder': 'Contraseña Nueva'})
self.fields['new_password2'].widget.attrs.update({'class': 'form-control',
'placeholder': 'Repita su Contraseña'})