source: consulta_publica/users/forms.py @ ade132c

estudiantesgeneralplan_patria
Last change on this file since ade132c was ade132c, checked in by rudmanmrrod <rudman22@…>, 7 años ago

Agregado y validado campo de universidades (sólo si el usuaio es del sector estudiantil)

  • Propiedad mode establecida a 100644
File size: 19.5 KB
Línea 
1# -*- coding: utf-8 -*-
2"""
3Sistema de Consulta Pública
4
5Copyleft (@) 2017 CENDITEL nodo Mérida - https://planificacion.cenditel.gob.ve/trac/wiki/ModeladoTopicos_2017
6"""
7## @package participacion.forms
8#
9# Formulario correspondiente a la aplicación participación
10# @author Rodrigo Boet (rboet at cenditel.gob.ve)
11# @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
12# (CENDITEL) nodo Mérida - Venezuela</a>
13# @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
14# @version 1.0
15from django import forms
16from django.forms import ModelForm
17from django.contrib.auth import authenticate
18from django.contrib.auth.models import User
19from django.forms.fields import (
20    CharField, BooleanField
21)
22from django.forms.widgets import (
23    PasswordInput, CheckboxInput
24)
25from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm
26from base.fields import CedulaField
27from base.functions import (
28    cargar_entidad, cargar_municipios, cargar_parroquias,
29    validate_cedula, validate_email, cargar_universidades
30    )
31from base.models import Municipio, Parroquia
32from base.constant import SECTORES, PARTICIPACION, SECTOR_ESTUDIANTE, SECTOR_TRABAJADOR
33from .models import Perfil
34from captcha.fields import CaptchaField
35
36
37class LoginForm(forms.Form):
38    """!
39    Clase del formulario de logeo
40
41    @author Rodrigo Boet (rboet at cenditel.gob.ve)
42    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
43    @date 01-03-2017
44    @version 1.0.0
45    """
46    ## Campo de la constraseña
47    contrasena = CharField()
48   
49    ## Nombre del usuario
50    usuario = CharField()
51   
52    ## Formulario de recordarme
53    remember_me = BooleanField()
54
55    ## Campo del captcha
56    captcha = CaptchaField()
57
58    def __init__(self, *args, **kwargs):
59        """!
60        Metodo que sobreescribe cuando se inicializa el formulario
61   
62        @author Rodrigo Boet (rboet at cenditel.gob.ve)
63        @copyright GNU/GPLv2
64        @date 01-03-2017
65        @param self <b>{object}</b> Objeto que instancia la clase
66        @param args <b>{list}</b> Lista de los argumentos
67        @param kwargs <b>{dict}</b> Diccionario con argumentos
68        @return Retorna el formulario validado
69        """
70        super(LoginForm, self).__init__(*args, **kwargs)
71        self.fields['contrasena'].widget = PasswordInput()
72        self.fields['contrasena'].widget.attrs.update({'class': 'form-control',
73        'placeholder': 'Contraseña'})
74        self.fields['usuario'].widget.attrs.update({'class': 'form-control',
75        'placeholder': 'Nombre de Usuario'})
76        self.fields['remember_me'].label = "Recordar"
77        self.fields['remember_me'].widget = CheckboxInput()
78        self.fields['remember_me'].required = False
79        self.fields['captcha'].label = "Captcha"
80       
81    def clean(self):
82        """!
83        Método que valida si el usuario a autenticar es valido
84   
85        @author Rodrigo Boet (rboet at cenditel.gob.ve)
86        @copyright GNU/GPLv2
87        @date 21-04-2017
88        @param self <b>{object}</b> Objeto que instancia la clase
89        @return Retorna el campo con los errores
90        """
91        usuario = self.cleaned_data['usuario']
92        contrasena = self.cleaned_data['contrasena']
93        usuario = authenticate(username=usuario,password=contrasena)
94        if(not usuario):
95            msg = "Verifique su usuario o contraseña"
96            self.add_error('usuario', msg)
97       
98    class Meta:
99        fields = ('usuario', 'contrasena', 'remember_me')
100
101
102class UserRegisterForm(forms.ModelForm):
103    """!
104    Formulario de Registro
105
106    @author Rodrigo Boet (rboet at cenditel.gob.ve)
107    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
108    @date 20-04-2017
109    @version 1.0.0
110    """
111    def __init__(self, *args, **kwargs):
112        """!
113        Metodo que sobreescribe cuando se inicializa el formulario
114   
115        @author Rodrigo Boet (rboet at cenditel.gob.ve)
116        @copyright GNU/GPLv2
117        @date 01-03-2017
118        @param self <b>{object}</b> Objeto que instancia la clase
119        @param args <b>{list}</b> Lista de los argumentos
120        @param kwargs <b>{dict}</b> Diccionario con argumentos
121        @return Retorna el formulario validado
122        """
123        super(UserRegisterForm, self).__init__(*args, **kwargs)
124       
125        # Si se ha seleccionado un estado establece el listado de municipios y elimina el atributo disable
126        if 'estado' in self.data and self.data['estado']:
127            self.fields['municipio'].widget.attrs.pop('disabled')
128            self.fields['municipio'].queryset=Municipio.objects.filter(entidad=self.data['estado'])
129
130            # Si se ha seleccionado un municipio establece el listado de parroquias y elimina el atributo disable
131            if 'municipio' in self.data and self.data['municipio']:
132                self.fields['parroquia'].widget.attrs.pop('disabled')
133                self.fields['parroquia'].queryset=Parroquia.objects.filter(municipio=self.data['municipio'])
134       
135        if 'participacion' in self.data and self.data['participacion']=='CO':
136            self.fields['colectivo'].widget.attrs.pop('readonly')
137       
138        self.fields['estado'].choices = cargar_entidad()
139        self.fields['municipio'].choices = cargar_municipios()
140        self.fields['parroquia'].choices = cargar_parroquias()
141        self.fields['universidad'].choices = cargar_universidades()
142       
143   
144    ## Nombre de usuario
145    username = forms.CharField(max_length=30,
146        widget=forms.TextInput(attrs={'class': 'form-control input-md',}),
147        label="Nombre de Usuario"
148        )
149   
150    ## Contraseña
151    password = forms.CharField(max_length=20,
152        widget=forms.TextInput(attrs={'class': 'form-control input-md','type':'password'}),
153        label="Constraseña"
154        )
155   
156    ## Repita la Contraseña
157    password_repeat = forms.CharField(max_length=20,
158        widget=forms.TextInput(attrs={'class': 'form-control input-md','type':'password'}),
159        label="Repita su constraseña"
160        )
161   
162    ## nombre
163    nombre = forms.CharField(max_length=100,
164        widget=forms.TextInput(attrs={'class': 'form-control input-md',}),
165        label="Nombre"
166        )
167   
168    ## apellido
169    apellido = forms.CharField(max_length=100,
170        widget=forms.TextInput(attrs={'class': 'form-control input-md',}),
171        label="Apellido"
172        )
173   
174    ## correo
175    email = forms.EmailField(
176        widget=forms.TextInput(attrs={'class': 'form-control input-md',}),
177        label="Correo"
178        )
179   
180    ## cedula
181    cedula = CedulaField()
182   
183    ## sector
184    sector = forms.ChoiceField(
185        widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'mostrar_sector(this.value);'}),
186        label="Sector",choices=(('','Seleccione...'),)+SECTORES
187        )
188   
189    ## sector trabajador
190    sector_trabajador = forms.ChoiceField(
191        widget=forms.Select(attrs={'class': 'form-control input-md'}),
192        label="Sector Trabajador",choices=(('','Seleccione...'),)+SECTOR_TRABAJADOR,
193        required = False
194        )
195   
196    ## sector estudiante
197    sector_estudiante = forms.ChoiceField(
198        widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'mostrar_universidad(this.value)'}),
199        label="Sector Estudiante",choices=(('','Seleccione...'),)+SECTOR_ESTUDIANTE,
200        required = False
201        )
202   
203    universidad = forms.ChoiceField(
204        widget=forms.Select(attrs={'class': 'form-control input-md',}),
205        label="Institución",required = False
206        )
207   
208    ## participacion
209    participacion = forms.ChoiceField(
210        widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'habilitar_colectivo(this.value);'}),
211        label="Participación",choices=(('','Seleccione...'),)+PARTICIPACION
212        )
213   
214    ## colectivo
215    colectivo = forms.CharField(max_length=100,
216        widget=forms.TextInput(attrs={'class': 'form-control input-md','readonly':True}),
217        label="Colectivo al que pertenece", required = False
218        )
219   
220    ## estado
221    estado = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',
222        'onchange': "actualizar_combo(this.value,'base','Municipio','entidad','codigo','nombre','id_municipio')"}))
223   
224    ## municipio
225    municipio = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md','disabled':'disabled',
226        'onchange': "actualizar_combo(this.value,'base','Parroquia','municipio','codigo','nombre','id_parroquia')"}))
227   
228    ## parroquia
229    parroquia = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md','disabled':'disabled'}))
230
231    ## Campo del captcha
232    captcha = CaptchaField()
233   
234    def clean_password_repeat(self):
235        """!
236        Método que valida si las contraseñas coinciden
237   
238        @author Rodrigo Boet (rboet at cenditel.gob.ve)
239        @copyright GNU/GPLv2
240        @date 01-03-2017
241        @param self <b>{object}</b> Objeto que instancia la clase
242        @return Retorna el campo con la validacion
243        """
244        password = self.cleaned_data['password']
245        password_repeat = self.cleaned_data['password_repeat']
246        if(password_repeat!=password):
247            raise forms.ValidationError("La contraseña no coincide")
248        return password_repeat
249   
250    def clean_cedula(self):
251        """!
252        Método que valida si la cedula es única
253   
254        @author Rodrigo Boet (rboet at cenditel.gob.ve)
255        @copyright GNU/GPLv2
256        @date 01-03-2017
257        @param self <b>{object}</b> Objeto que instancia la clase
258        @return Retorna el campo con la validacion
259        """
260        cedula = self.cleaned_data['cedula']
261        if(validate_cedula(cedula)):
262            raise forms.ValidationError("La cédula ingresada ya existe")
263        return cedula
264   
265    def clean_email(self):
266        """!
267        Método que valida si el correo es única
268   
269        @author Rodrigo Boet (rboet at cenditel.gob.ve)
270        @copyright GNU/GPLv2
271        @date 01-03-2017
272        @param self <b>{object}</b> Objeto que instancia la clase
273        @return Retorna el campo con la validacion
274        """
275        email = self.cleaned_data['email']
276        if(validate_email(email)):
277            raise forms.ValidationError("El correo ingresado ya existe")
278        return email
279   
280    def clean_colectivo(self):
281        """!
282        Método que valida el campo colectivo
283   
284        @author Rodrigo Boet (rboet at cenditel.gob.ve)
285        @copyright GNU/GPLv2
286        @date 24-05-2017
287        @param self <b>{object}</b> Objeto que instancia la clase
288        @return Retorna el campo con la validacion
289        """
290        colectivo = self.cleaned_data['colectivo']
291        participacion = self.cleaned_data['participacion']
292        if(participacion=='CO' and colectivo==''):
293            raise forms.ValidationError("Debe ingresar el nombre del colectivo")
294        return colectivo
295   
296    def clean_sector_trabajador(self):
297        """!
298        Método que valida el sector trabajador
299   
300        @author Rodrigo Boet (rboet at cenditel.gob.ve)
301        @copyright GNU/GPLv2
302        @date 24-05-2017
303        @param self <b>{object}</b> Objeto que instancia la clase
304        @return Retorna el campo con la validacion
305        """
306        sector = self.cleaned_data['sector']
307        sector_trabajador = self.cleaned_data['sector_trabajador']
308        if(sector=='TR' and sector_trabajador==''):
309            raise forms.ValidationError("Debe ingresar el sector dónde trabaja")
310        return sector_trabajador
311   
312    def clean_sector_estudiante(self):
313        """!
314        Método que valida el sector estudiante
315   
316        @author Rodrigo Boet (rboet at cenditel.gob.ve)
317        @copyright GNU/GPLv2
318        @date 24-05-2017
319        @param self <b>{object}</b> Objeto que instancia la clase
320        @return Retorna el campo con la validacion
321        """
322        sector = self.cleaned_data['sector']
323        sector_estudiante = self.cleaned_data['sector_estudiante']
324        if(sector=='ES' and sector_estudiante==''):
325            raise forms.ValidationError("Debe ingresar el sector dónde estudia")
326        return sector_estudiante
327   
328    def clean_universidad(self):
329        """!
330        Método que valida las universidades
331   
332        @author Rodrigo Boet (rboet at cenditel.gob.ve)
333        @copyright GNU/GPLv2
334        @date 08-09-2017
335        @param self <b>{object}</b> Objeto que instancia la clase
336        @return Retorna el campo con la validacion
337        """
338        universidad = self.cleaned_data['universidad']
339        sector_estudiante = self.cleaned_data['sector_estudiante']
340        if(universidad=='' and sector_estudiante!=''):
341            raise forms.ValidationError("Debe ingresar la institución de donde proviene")
342        return universidad
343       
344       
345    class Meta:
346        model = User
347        exclude = ['is_staff','is_active','date_joined']
348       
349class PerfilForm(forms.ModelForm):
350    """!
351    Formulario del perfil
352
353    @author Rodrigo Boet (rboet at cenditel.gob.ve)
354    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
355    @date 24-04-2017
356    @version 1.0.0
357    """
358    def __init__(self, *args, **kwargs):
359        """!
360        Metodo que sobreescribe cuando se inicializa el formulario
361   
362        @author Rodrigo Boet (rboet at cenditel.gob.ve)
363        @copyright GNU/GPLv2
364        @date 24-04-2017
365        @param self <b>{object}</b> Objeto que instancia la clase
366        @param args <b>{list}</b> Lista de los argumentos
367        @param kwargs <b>{dict}</b> Diccionario con argumentos
368        @return Retorna el formulario validado
369        """
370        super(PerfilForm, self).__init__(*args, **kwargs)
371       
372        self.fields['estado'].choices = cargar_entidad()
373        self.fields['municipio'].choices = cargar_municipios()
374        self.fields['parroquia'].choices = cargar_parroquias()
375       
376        if 'participacion' in self.data and self.data['participacion']=='CO':
377            self.fields['colectivo'].widget.attrs.pop('readonly')
378   
379    ## cedula
380    cedula = CedulaField()
381   
382    ## estado
383    estado = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',
384        'onchange': "actualizar_combo(this.value,'base','Municipio','entidad','codigo','nombre','id_municipio')"}))
385   
386    ## municipio
387    municipio = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',
388        'onchange': "actualizar_combo(this.value,'base','Parroquia','municipio','codigo','nombre','id_parroquia')"}))
389   
390    ## parroquia
391    parroquia = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',}))
392   
393    ## sector
394    sector = forms.ChoiceField(
395        widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'mostrar_sector(this.value);'}),
396        label="Sector",choices=(('','Seleccione...'),)+SECTORES
397        )
398   
399    ## sector trabajador
400    sector_trabajador = forms.ChoiceField(
401        widget=forms.Select(attrs={'class': 'form-control input-md'}),
402        label="Sector Trabajador",choices=(('','Seleccione...'),)+SECTOR_TRABAJADOR,
403        required = False
404        )
405   
406    ## sector estudiante
407    sector_estudiante = forms.ChoiceField(
408        widget=forms.Select(attrs={'class': 'form-control input-md',}),
409        label="Sector Estudiante",choices=(('','Seleccione...'),)+SECTOR_ESTUDIANTE,
410        required = False
411        )
412   
413    ## participacion
414    participacion = forms.ChoiceField(
415        widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'habilitar_colectivo(this.value);'}),
416        label="Participación",choices=(('','Seleccione...'),)+PARTICIPACION
417        )
418   
419    ## colectivo
420    colectivo = forms.CharField(max_length=100,
421        widget=forms.TextInput(attrs={'class': 'form-control input-md','readonly':True}),
422         label="Colectivo al que pertenece", required = False
423        )
424   
425    def clean_colectivo(self):
426        """!
427        Método que valida el campo colectivo
428   
429        @author Rodrigo Boet (rboet at cenditel.gob.ve)
430        @copyright GNU/GPLv2
431        @date 24-05-2017
432        @param self <b>{object}</b> Objeto que instancia la clase
433        @return Retorna el campo con la validacion
434        """
435        colectivo = self.cleaned_data['colectivo']
436        participacion = self.cleaned_data['participacion']
437        if(participacion=='CO' and colectivo==''):
438            raise forms.ValidationError("Debe ingresar el nombre del colectivo")
439        return colectivo
440   
441    def clean_sector_trabajador(self):
442        """!
443        Método que valida el sector trabajador
444   
445        @author Rodrigo Boet (rboet at cenditel.gob.ve)
446        @copyright GNU/GPLv2
447        @date 24-05-2017
448        @param self <b>{object}</b> Objeto que instancia la clase
449        @return Retorna el campo con la validacion
450        """
451        sector = self.cleaned_data['sector']
452        sector_trabajador = self.cleaned_data['sector_trabajador']
453        if(sector=='TR' and sector_trabajador==''):
454            raise forms.ValidationError("Debe ingresar el sector dónde trabaja")
455        return sector_trabajador
456   
457    def clean_sector_estudiante(self):
458        """!
459        Método que valida el sector estudiante
460   
461        @author Rodrigo Boet (rboet at cenditel.gob.ve)
462        @copyright GNU/GPLv2
463        @date 24-05-2017
464        @param self <b>{object}</b> Objeto que instancia la clase
465        @return Retorna el campo con la validacion
466        """
467        sector = self.cleaned_data['sector']
468        sector_estudiante = self.cleaned_data['sector_estudiante']
469        if(sector=='ES' and sector_estudiante==''):
470            raise forms.ValidationError("Debe ingresar el sector dónde estudia")
471        return sector_estudiante
472   
473    class Meta:
474        model = Perfil
475        exclude = ['user','parroquia']
476       
477       
478class PasswordResetForm(PasswordResetForm):
479    """!
480    Clase del formulario de resetear contraseña
481
482    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
483    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
484    @date 02-05-2017
485    @version 1.0.0
486    """
487
488    def __init__(self, *args, **kwargs):
489        super(PasswordResetForm, self).__init__(*args, **kwargs)
490        self.fields['email'].widget.attrs.update({'class': 'form-control',
491                                                  'placeholder': 'Correo'})
492
493    def clean(self):
494        cleaned_data = super(PasswordResetForm, self).clean()
495        email = cleaned_data.get("email")
496
497        if email:
498            msg = "Error no existe el email"
499            try:
500                User.objects.get(email=email)
501            except:
502                self.add_error('email', msg)
503               
504               
505
506class PasswordConfirmForm(SetPasswordForm):
507    """!
508    Formulario para confirmar la constraseña
509
510    @author Rodrigo Boet (rboet at cenditel.gob.ve)
511    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
512    @date 15-05-2017
513    @version 1.0.0
514    """
515    def __init__(self, *args, **kwargs):
516        super(PasswordConfirmForm, self).__init__(*args, **kwargs)
517        self.fields['new_password1'].widget.attrs.update({'class': 'form-control',
518                                                  'placeholder': 'Contraseña Nueva'})
519        self.fields['new_password2'].widget.attrs.update({'class': 'form-control',
520                                                  'placeholder': 'Repita su Contraseña'})
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.