source: seiven/usuario/forms.py

carga
Last change on this file was 862cf76, checked in by Ing. Roldan D. Vargas G <rvargas@…>, 7 años ago

formulario y vista para modificación de datos del perfil de usuario

  • Propiedad mode establecida a 100644
File size: 16.0 KB
Línea 
1"""
2Sistema Estadístico Integral de Venezuela - (SEIVEN)
3
4Copyleft (@) 2015 CENDITEL nodo Mérida - https://mpv.cenditel.gob.ve/seiven
5"""
6## @namespace forms.models
7#
8# Contiene las clases, atributos y métodos para los formularios a implementar en el módulo de usuario
9# @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
10# @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
11# (CENDITEL) nodo Mérida - Venezuela</a>
12# @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
13from __future__ import unicode_literals, absolute_import
14
15import logging
16
17from base.constant import (
18    TIPO_DOCUMENTO_IDENTIFICACION, TIPO_DOCUMENTO_IDENTIFICACION_LIST, FORTALEZA_CONTRASENHA, OCUPACION
19)
20from base.fields import TipoDocumentoField
21from base.forms import TipoDocumentoForm, ClaveForm, CaptchaForm, CorreoForm
22from captcha.fields import CaptchaField, CaptchaTextInput
23from django import forms
24from django.contrib.auth.models import User
25from django.forms import (
26    ModelForm, TextInput, EmailInput, CharField, EmailField, PasswordInput,
27    Select, ModelChoiceField, ChoiceField
28)
29from django.utils.encoding import python_2_unicode_compatible
30from django.utils.translation import ugettext_lazy as _
31
32from base.models import Institucion
33from base.widgets import TipoDocumentoWidgetReadOnly
34from .models import UserProfile
35
36"""!
37Contiene el objeto que registra la vitacora de eventos del módulo usuario.
38(configuración en el settings de la aplicación)
39"""
40logger = logging.getLogger("usuario")
41
42
43@python_2_unicode_compatible
44class AutenticarForm(TipoDocumentoForm, ClaveForm, CaptchaForm):
45    """!
46    Clase que muestra el formulario de registro de usuarios. Extiende de las clases RifForm, ClaveForm y CaptchaForm
47
48    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
49    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
50    @date 19-08-2016
51    @version 1.0.0
52    """
53
54    class Meta:
55        fields = ['tipo_documento', 'clave', 'captcha']
56
57
58@python_2_unicode_compatible
59class OlvidoClaveForm(TipoDocumentoForm, CorreoForm, CaptchaForm):
60    """!
61    Clase que muestra el formulario para envío de correo electrónico con enlace para la modificación de clave
62
63    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
64    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
65    @date 19-08-2016
66    @version 1.0.0
67    """
68
69    def clean_correo(self):
70        correo = self.cleaned_data['correo']
71
72        if not User.objects.filter(email=correo):
73            raise forms.ValidationError(_("El correo indicado no existe"))
74
75        return correo
76
77
78class ModificarClaveForm(ClaveForm, CaptchaForm, forms.Form):
79    """!
80    Clase que muestra el formulario para la modificación de claves
81
82    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
83    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
84    @date 19-08-2016
85    @version 1.0.0
86    """
87
88    ## Confirmación de contraseña de acceso
89    verificar_contrasenha = CharField(
90        label=_("Verificar Contraseña"),
91        max_length=128,
92        widget=PasswordInput(
93            attrs={
94                'class': 'form-control input-sm', 'placeholder': _("Contraseña de acceso"),
95                'data-rule-required': 'true', 'data-toggle': 'tooltip', 'size': '50',
96                'title': _("Indique nuevamente la contraseña de aceso al sistema")
97            }
98        )
99    )
100
101    def clean_clave(self):
102        """!
103        Método que permite validar el campo de password
104
105        @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
106        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
107        @date 19-08-2016
108        @param self <b>{object}</b> Objeto que instancia la clase
109        @return Devuelve un mensaje de error en caso de que la fortaleza de la contraseña sea inferior al minimo
110                establecido
111        """
112        password_meter = self.data['passwordMeterId']
113        if int(password_meter) < FORTALEZA_CONTRASENHA:
114            raise forms.ValidationError(_("La contraseña es débil"))
115        return self.cleaned_data['clave']
116
117    def clean_verificar_contrasenha(self):
118        """!
119        Método que permite validar el campo de verificar_contrasenha
120
121        @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
122        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
123        @date 19-08-2016
124        @param self <b>{object}</b> Objeto que instancia la clase
125        @return Devuelve un mensaje de error en caso de que la contrasenha no pueda ser verificada
126        """
127        verificar_contrasenha = self.cleaned_data['verificar_contrasenha']
128        contrasenha = self.data['clave']
129        if contrasenha != verificar_contrasenha:
130            raise forms.ValidationError(_("La contraseña no es la misma"))
131
132        return verificar_contrasenha
133
134
135@python_2_unicode_compatible
136class RegistroForm(ModelForm):
137    """!
138    Clase que muestra el formulario de registro de usuarios
139
140    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
141    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
142    @date 21-04-2016
143    @version 2.0.0
144    """
145
146    ## Tipo de documento de identificación
147    tipo_documento = TipoDocumentoField()
148
149    ## Nombre del usuario
150    nombre = CharField(
151        label=_("Nombre"),
152        max_length=30,
153        widget=TextInput(
154            attrs={
155                'class': 'form-control input-sm', 'placeholder': _("Nombres del usuario"), 'data-rule-required': 'true',
156                'data-toggle': 'tooltip', 'title': _("Indique el Nombre"), 'size': '50'
157            }
158        )
159    )
160
161    ## Apellido del usuario
162    apellido = CharField(
163        label=_("Apellido"),
164        max_length=30,
165        widget=TextInput(
166            attrs={
167                'class': 'form-control input-sm', 'placeholder': _("Apellidos del usuario"),
168                'data-rule-required': 'true',
169                'data-toggle': 'tooltip', 'title': _("Indique el Apellido"), 'size': '50'
170            }
171        )
172    )
173
174    ## Correo electrónico de contacto con el usuario
175    correo = EmailField(
176        label=_("Correo Electrónico"),
177        max_length=75,
178        widget=EmailInput(
179            attrs={
180                'class': 'form-control input-sm email-mask', 'placeholder': _("Correo electronico"),
181                'data-toggle': 'tooltip', 'size': '50', 'data-rule-required': 'true',
182                'title': _("Indique el correo electrónico de contacto con el usuario. "
183                           "No se permiten correos de hotmail")
184            }
185        )
186    )
187
188    ## Listado de instituciones registradas en el sistema
189    institucion = ModelChoiceField(
190        label=_(u"Institución"), queryset=Institucion.objects.all(), empty_label=_(u"Seleccione..."),
191        widget=Select(attrs={
192            'class': 'select2 select2-offscreen form-control', 'data-toggle': 'tooltip',
193            'title': _(u"Seleccione la institución del usuario a registrar")
194        })
195    )
196
197    ## Listado de instituciones registradas en el sistema
198    ocupacion = ChoiceField(
199        label=_(u"Ocupacion"), choices=OCUPACION,
200        widget=Select(attrs={
201            'class': 'select2 select2-offscreen form-control', 'data-toggle': 'tooltip',
202            'title': _(u"Seleccione la ocupación del usuario a registrar")
203        })
204    )
205
206    ## Contraseña del usuario
207    password = CharField(
208        label=_("Contraseña"),
209        max_length=128,
210        widget=PasswordInput(
211            attrs={
212                'class': 'form-control input-sm', 'placeholder': _("Contraseña de acceso"),
213                'data-rule-required': 'true', 'data-toggle': 'tooltip', 'size': '50',
214                'title': _("Indique una contraseña de aceso al sistema"), 'onkeyup': 'passwordStrength(this.value)'
215            }
216        )
217    )
218
219    ## Confirmación de contraseña de acceso
220    verificar_contrasenha = CharField(
221        label=_("Verifique Contraseña"),
222        max_length=128,
223        widget=PasswordInput(
224            attrs={
225                'class': 'form-control input-sm', 'placeholder': _("Contraseña de acceso"),
226                'data-rule-required': 'true', 'data-toggle': 'tooltip', 'size': '50',
227                'title': _("Indique nuevamente la contraseña de aceso al sistema")
228            }
229        )
230    )
231
232    ## Campo para la validación del captcha
233    captcha = CaptchaField(
234        label=_(u"Captcha"), widget=CaptchaTextInput(attrs={
235            'class': 'form-control input-sm', 'placeholder': _("Texto de la imagen"),
236            'style': 'min-width: 0; width: auto; display: inline;', 'data-toggle': 'tooltip',
237            'title': _(u"Indique el texto de la imagen")
238        })
239    )
240
241    class Meta:
242        model = User
243        exclude = ['fecha_modpass', 'username', 'first_name', 'last_name', 'email', 'date_joined']
244
245
246    def clean_tipo_documento(self):
247        """!
248        Método que permite validar el campo del tipo de documento de identificacion del usuario
249
250        @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
251        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
252        @date 19-08-2016
253        @param self <b>{object}</b> Objeto que instancia la clase
254        @return Devuelve un mensaje de error en caso de que el tipo de documento no sea válido,
255                en caso contrario devuelve el valor actual del campo
256        """
257        tipo_documento = self.cleaned_data['tipo_documento']
258
259        if tipo_documento[0] not in TIPO_DOCUMENTO_IDENTIFICACION_LIST:
260            raise forms.ValidationError(_("Tipo de Documento de Identificación incorrecto"))
261        elif User.objects.filter(username=tipo_documento):
262            raise forms.ValidationError(_("El Documento de Identificación ya se encuentra registrado"))
263        elif not tipo_documento[1:].isdigit():
264            raise  forms.ValidationError(_("El Documento de Identificación no es correcto"))
265
266        return tipo_documento
267
268    def clean_correo(self):
269        """!
270        Método que permite validar el campo de correo electronico
271
272        @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
273        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
274        @date 19-08-2016
275        @param self <b>{object}</b> Objeto que instancia la clase
276        @return Devuelve un mensaje de error en caso de que el correo electronico ya se encuentre registrado
277        """
278        correo = self.cleaned_data['correo']
279
280        if User.objects.filter(email=correo):
281            raise forms.ValidationError(_("El correo ya esta registrado"))
282
283        return correo
284
285    def clean_password(self):
286        """!
287        Método que permite validar el campo de password
288
289        @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
290        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
291        @date 19-08-2016
292        @param self <b>{object}</b> Objeto que instancia la clase
293        @return Devuelve un mensaje de error en caso de que la fortaleza de la contraseña sea inferior al minimo
294                establecido
295        """
296        password_meter = self.data['passwordMeterId']
297        if int(password_meter) < FORTALEZA_CONTRASENHA:
298            raise forms.ValidationError(_("La contraseña es débil"))
299        return self.cleaned_data['password']
300
301    def clean_verificar_contrasenha(self):
302        """!
303        Método que permite validar el campo de verificar_contrasenha
304
305        @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
306        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
307        @date 19-08-2016
308        @param self <b>{object}</b> Objeto que instancia la clase
309        @return Devuelve un mensaje de error en caso de que la contrasenha no pueda ser verificada
310        """
311        verificar_contrasenha = self.cleaned_data['verificar_contrasenha']
312        contrasenha = self.data['password']
313        if contrasenha != verificar_contrasenha:
314            raise forms.ValidationError(_("La contraseña no es la misma"))
315
316        return verificar_contrasenha
317
318
319@python_2_unicode_compatible
320class PerfilForm(RegistroForm):
321    """!
322    Clase que muestra el formulario del perfil del usuario
323
324    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
325    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
326    @date 07-05-2016
327    @version 2.0.0
328    """
329
330    class Meta:
331        model = User
332        fields = [
333            'tipo_documento', 'institucion', 'ocupacion', 'nombre', 'apellido', 'correo', 'password',
334            'verificar_contrasenha', 'captcha'
335        ]
336
337
338    def __init__(self, *args, **kwargs):
339        """!
340        Método que inicializa la clase del formulario PerfilForm
341
342        @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
343        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
344        @date 19-08-2016
345        @param self <b>{object}</b> Objeto que instancia la clase
346        @param *args <b>{tupla}</b> Tupla de valores, inicialmente vacia
347        @param *kwargs <b>{dict}</b> Diccionario de datos, inicialmente vacio
348        """
349        super(PerfilForm, self).__init__(*args, **kwargs)
350        self.fields['password'].required = False
351        self.fields['verificar_contrasenha'].required = False
352        if self.data.__contains__('password') and self.data['password'] != '':
353            self.fields['password'].required = True
354            self.fields['verificar_contrasenha'].required = True
355        self.fields['tipo_documento'].required = False
356        self.fields['tipo_documento'].widget = TipoDocumentoWidgetReadOnly()
357        self.fields['password'].help_text = 'passwordMeterId'
358
359
360    def clean_tipo_documento(self):
361        """!
362        Método que permite validar el campo de tipo de documento de identificacion
363
364        @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
365        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
366        @date 19-08-2016
367        @param self <b>{object}</b> Objeto que instancia la clase
368        @return Devuelve los datos del campo sin validacion, ya que es de solo lectura a nivel informativo
369        """
370        return self.cleaned_data['tipo_documento']
371
372    def clean_correo(self):
373        """!
374        Método que permite validar el campo de correo electronico
375
376        @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
377        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
378        @date 19-08-2016
379        @param self <b>{object}</b> Objeto que instancia la clase
380        @return Devuelve un mensaje de error en caso de que el correo electronico ya se encuentre registrado
381        """
382        correo = self.cleaned_data['correo']
383        tipo_documento = self.cleaned_data['tipo_documento']
384
385        if User.objects.filter(email=correo).exclude(username=tipo_documento):
386            raise forms.ValidationError(_("El correo ya esta registrado"))
387
388        return correo
389
390    def clean_password(self):
391        """!
392        Método que permite validar el campo de contraseña
393
394        @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
395        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
396        @date 19-08-2016
397        @param self <b>{object}</b> Objeto que instancia la clase
398        @return Devuelve un mensaje de error en caso de que la fortaleza de la contraseña no sea la adecuada
399        """
400        if self.cleaned_data['password'] != '':
401            password_meter = self.data['passwordMeterId']
402            if int(password_meter) < FORTALEZA_CONTRASENHA:
403                raise forms.ValidationError(_("La contraseña es débil"))
404
405        return self.cleaned_data['password']
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.