source: consulta_publica/users/forms.py @ 32be06f

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

Agregado el campo de universidades para actualizar perfil, y como campo en los reportes, se agregó también la funcionalidad de guardar en la vista, así como también su filtro en los reportes

  • Propiedad mode establecida a 100644
File size: 19.7 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
204    universidad = forms.ChoiceField(
205        widget=forms.Select(attrs={'class': 'form-control input-md',}),
206        label="Institución",required = False
207        )
208   
209    ## participacion
210    participacion = forms.ChoiceField(
211        widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'habilitar_colectivo(this.value);'}),
212        label="Participación",choices=(('','Seleccione...'),)+PARTICIPACION
213        )
214   
215    ## colectivo
216    colectivo = forms.CharField(max_length=100,
217        widget=forms.TextInput(attrs={'class': 'form-control input-md','readonly':True}),
218        label="Colectivo al que pertenece", required = False
219        )
220   
221    ## estado
222    estado = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',
223        'onchange': "actualizar_combo(this.value,'base','Municipio','entidad','codigo','nombre','id_municipio')"}))
224   
225    ## municipio
226    municipio = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md','disabled':'disabled',
227        'onchange': "actualizar_combo(this.value,'base','Parroquia','municipio','codigo','nombre','id_parroquia')"}))
228   
229    ## parroquia
230    parroquia = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md','disabled':'disabled'}))
231
232    ## Campo del captcha
233    captcha = CaptchaField()
234   
235    def clean_password_repeat(self):
236        """!
237        Método que valida si las contraseñas coinciden
238   
239        @author Rodrigo Boet (rboet at cenditel.gob.ve)
240        @copyright GNU/GPLv2
241        @date 01-03-2017
242        @param self <b>{object}</b> Objeto que instancia la clase
243        @return Retorna el campo con la validacion
244        """
245        password = self.cleaned_data['password']
246        password_repeat = self.cleaned_data['password_repeat']
247        if(password_repeat!=password):
248            raise forms.ValidationError("La contraseña no coincide")
249        return password_repeat
250   
251    def clean_cedula(self):
252        """!
253        Método que valida si la cedula es única
254   
255        @author Rodrigo Boet (rboet at cenditel.gob.ve)
256        @copyright GNU/GPLv2
257        @date 01-03-2017
258        @param self <b>{object}</b> Objeto que instancia la clase
259        @return Retorna el campo con la validacion
260        """
261        cedula = self.cleaned_data['cedula']
262        if(validate_cedula(cedula)):
263            raise forms.ValidationError("La cédula ingresada ya existe")
264        return cedula
265   
266    def clean_email(self):
267        """!
268        Método que valida si el correo es única
269   
270        @author Rodrigo Boet (rboet at cenditel.gob.ve)
271        @copyright GNU/GPLv2
272        @date 01-03-2017
273        @param self <b>{object}</b> Objeto que instancia la clase
274        @return Retorna el campo con la validacion
275        """
276        email = self.cleaned_data['email']
277        if(validate_email(email)):
278            raise forms.ValidationError("El correo ingresado ya existe")
279        return email
280   
281    def clean_colectivo(self):
282        """!
283        Método que valida el campo colectivo
284   
285        @author Rodrigo Boet (rboet at cenditel.gob.ve)
286        @copyright GNU/GPLv2
287        @date 24-05-2017
288        @param self <b>{object}</b> Objeto que instancia la clase
289        @return Retorna el campo con la validacion
290        """
291        colectivo = self.cleaned_data['colectivo']
292        participacion = self.cleaned_data['participacion']
293        if(participacion=='CO' and colectivo==''):
294            raise forms.ValidationError("Debe ingresar el nombre del colectivo")
295        return colectivo
296   
297    def clean_sector_trabajador(self):
298        """!
299        Método que valida el sector trabajador
300   
301        @author Rodrigo Boet (rboet at cenditel.gob.ve)
302        @copyright GNU/GPLv2
303        @date 24-05-2017
304        @param self <b>{object}</b> Objeto que instancia la clase
305        @return Retorna el campo con la validacion
306        """
307        sector = self.cleaned_data['sector']
308        sector_trabajador = self.cleaned_data['sector_trabajador']
309        if(sector=='TR' and sector_trabajador==''):
310            raise forms.ValidationError("Debe ingresar el sector dónde trabaja")
311        return sector_trabajador
312   
313    def clean_sector_estudiante(self):
314        """!
315        Método que valida el sector estudiante
316   
317        @author Rodrigo Boet (rboet at cenditel.gob.ve)
318        @copyright GNU/GPLv2
319        @date 24-05-2017
320        @param self <b>{object}</b> Objeto que instancia la clase
321        @return Retorna el campo con la validacion
322        """
323        sector = self.cleaned_data['sector']
324        sector_estudiante = self.cleaned_data['sector_estudiante']
325        if(sector=='ES' and sector_estudiante==''):
326            raise forms.ValidationError("Debe ingresar el sector dónde estudia")
327        return sector_estudiante
328   
329    def clean_universidad(self):
330        """!
331        Método que valida las universidades
332   
333        @author Rodrigo Boet (rboet at cenditel.gob.ve)
334        @copyright GNU/GPLv2
335        @date 08-09-2017
336        @param self <b>{object}</b> Objeto que instancia la clase
337        @return Retorna el campo con la validacion
338        """
339        universidad = self.cleaned_data['universidad']
340        sector_estudiante = self.cleaned_data['sector_estudiante']
341        if(universidad=='' and sector_estudiante!=''):
342            raise forms.ValidationError("Debe ingresar la institución de donde proviene")
343        return universidad
344       
345       
346    class Meta:
347        model = User
348        exclude = ['is_staff','is_active','date_joined']
349       
350class PerfilForm(forms.ModelForm):
351    """!
352    Formulario del perfil
353
354    @author Rodrigo Boet (rboet at cenditel.gob.ve)
355    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
356    @date 24-04-2017
357    @version 1.0.0
358    """
359    def __init__(self, *args, **kwargs):
360        """!
361        Metodo que sobreescribe cuando se inicializa el formulario
362   
363        @author Rodrigo Boet (rboet at cenditel.gob.ve)
364        @copyright GNU/GPLv2
365        @date 24-04-2017
366        @param self <b>{object}</b> Objeto que instancia la clase
367        @param args <b>{list}</b> Lista de los argumentos
368        @param kwargs <b>{dict}</b> Diccionario con argumentos
369        @return Retorna el formulario validado
370        """
371        super(PerfilForm, self).__init__(*args, **kwargs)
372       
373        self.fields['estado'].choices = cargar_entidad()
374        self.fields['municipio'].choices = cargar_municipios()
375        self.fields['parroquia'].choices = cargar_parroquias()
376        self.fields['universidad'].choices = cargar_universidades()
377       
378        if 'participacion' in self.data and self.data['participacion']=='CO':
379            self.fields['colectivo'].widget.attrs.pop('readonly')
380   
381    ## cedula
382    cedula = CedulaField()
383   
384    ## estado
385    estado = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',
386        'onchange': "actualizar_combo(this.value,'base','Municipio','entidad','codigo','nombre','id_municipio')"}))
387   
388    ## municipio
389    municipio = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',
390        'onchange': "actualizar_combo(this.value,'base','Parroquia','municipio','codigo','nombre','id_parroquia')"}))
391   
392    ## parroquia
393    parroquia = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',}))
394   
395    ## sector
396    sector = forms.ChoiceField(
397        widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'mostrar_sector(this.value);'}),
398        label="Sector",choices=(('','Seleccione...'),)+SECTORES
399        )
400   
401    ## sector trabajador
402    sector_trabajador = forms.ChoiceField(
403        widget=forms.Select(attrs={'class': 'form-control input-md'}),
404        label="Sector Trabajador",choices=(('','Seleccione...'),)+SECTOR_TRABAJADOR,
405        required = False
406        )
407   
408    ## sector estudiante
409    sector_estudiante = forms.ChoiceField(
410        widget=forms.Select(attrs={'class': 'form-control input-md',}),
411        label="Sector Estudiante",choices=(('','Seleccione...'),)+SECTOR_ESTUDIANTE,
412        required = False
413        )
414   
415    ## Universidad
416    universidad = forms.ChoiceField(
417        widget=forms.Select(attrs={'class': 'form-control input-md',}),
418        label="Institución",required = False
419        )
420   
421    ## participacion
422    participacion = forms.ChoiceField(
423        widget=forms.Select(attrs={'class': 'form-control input-md','onchange':'habilitar_colectivo(this.value);'}),
424        label="Participación",choices=(('','Seleccione...'),)+PARTICIPACION
425        )
426   
427    ## colectivo
428    colectivo = forms.CharField(max_length=100,
429        widget=forms.TextInput(attrs={'class': 'form-control input-md','readonly':True}),
430         label="Colectivo al que pertenece", required = False
431        )
432   
433    def clean_colectivo(self):
434        """!
435        Método que valida el campo colectivo
436   
437        @author Rodrigo Boet (rboet at cenditel.gob.ve)
438        @copyright GNU/GPLv2
439        @date 24-05-2017
440        @param self <b>{object}</b> Objeto que instancia la clase
441        @return Retorna el campo con la validacion
442        """
443        colectivo = self.cleaned_data['colectivo']
444        participacion = self.cleaned_data['participacion']
445        if(participacion=='CO' and colectivo==''):
446            raise forms.ValidationError("Debe ingresar el nombre del colectivo")
447        return colectivo
448   
449    def clean_sector_trabajador(self):
450        """!
451        Método que valida el sector trabajador
452   
453        @author Rodrigo Boet (rboet at cenditel.gob.ve)
454        @copyright GNU/GPLv2
455        @date 24-05-2017
456        @param self <b>{object}</b> Objeto que instancia la clase
457        @return Retorna el campo con la validacion
458        """
459        sector = self.cleaned_data['sector']
460        sector_trabajador = self.cleaned_data['sector_trabajador']
461        if(sector=='TR' and sector_trabajador==''):
462            raise forms.ValidationError("Debe ingresar el sector dónde trabaja")
463        return sector_trabajador
464   
465    def clean_sector_estudiante(self):
466        """!
467        Método que valida el sector estudiante
468   
469        @author Rodrigo Boet (rboet at cenditel.gob.ve)
470        @copyright GNU/GPLv2
471        @date 24-05-2017
472        @param self <b>{object}</b> Objeto que instancia la clase
473        @return Retorna el campo con la validacion
474        """
475        sector = self.cleaned_data['sector']
476        sector_estudiante = self.cleaned_data['sector_estudiante']
477        if(sector=='ES' and sector_estudiante==''):
478            raise forms.ValidationError("Debe ingresar el sector dónde estudia")
479        return sector_estudiante
480   
481    class Meta:
482        model = Perfil
483        exclude = ['user','parroquia']
484       
485       
486class PasswordResetForm(PasswordResetForm):
487    """!
488    Clase del formulario de resetear contraseña
489
490    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
491    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
492    @date 02-05-2017
493    @version 1.0.0
494    """
495
496    def __init__(self, *args, **kwargs):
497        super(PasswordResetForm, self).__init__(*args, **kwargs)
498        self.fields['email'].widget.attrs.update({'class': 'form-control',
499                                                  'placeholder': 'Correo'})
500
501    def clean(self):
502        cleaned_data = super(PasswordResetForm, self).clean()
503        email = cleaned_data.get("email")
504
505        if email:
506            msg = "Error no existe el email"
507            try:
508                User.objects.get(email=email)
509            except:
510                self.add_error('email', msg)
511               
512               
513
514class PasswordConfirmForm(SetPasswordForm):
515    """!
516    Formulario para confirmar la constraseña
517
518    @author Rodrigo Boet (rboet at cenditel.gob.ve)
519    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
520    @date 15-05-2017
521    @version 1.0.0
522    """
523    def __init__(self, *args, **kwargs):
524        super(PasswordConfirmForm, self).__init__(*args, **kwargs)
525        self.fields['new_password1'].widget.attrs.update({'class': 'form-control',
526                                                  'placeholder': 'Contraseña Nueva'})
527        self.fields['new_password2'].widget.attrs.update({'class': 'form-control',
528                                                  'placeholder': 'Repita su Contraseña'})
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.