Conjunto de cambios d8d20e7 en seiven para usuario


Ignorar:
Fecha y hora:
22/08/2016 16:42:35 (hace 8 años)
Autor:
Ing. Roldan D. Vargas G <rvargas@…>
Branches:
master, carga
Children:
78a4808
Parents:
d75c603
Mensaje:

se agregan plantillas, funciones, urls y vistas para la gestión de usuarios

Ubicación:
usuario
Ficheros:
2 añadidos
2 editados

Leyenda

No modificado
Añadido
Eliminado
  • usuario/forms.py

    rfbb0f12 rd8d20e7  
    5454        fields = ['tipo_documento', 'clave', 'captcha']
    5555
     56
    5657@python_2_unicode_compatible
    5758class OlvidoClaveForm(TipoDocumentoForm, CorreoForm, CaptchaForm):
  • usuario/views.py

    rfbb0f12 rd8d20e7  
    1 from django.shortcuts import render
     1"""
     2Sistema Estadístico Integral de Venezuela - (SEIVEN)
    23
    3 # Create your views here.
     4Copyleft (@) 2015 CENDITEL nodo Mérida - https://mpv.cenditel.gob.ve/seiven
     5"""
     6## @namespace usuario.views
     7#
     8# Contiene las clases, atributos, métodos y/o funciones a implementar para las vistas del 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
     14
     15import base64
     16import hashlib
     17from datetime import datetime
     18
     19from django.conf import settings
     20from django.contrib import messages
     21from django.contrib.auth import logout, login, authenticate
     22from django.contrib.auth.models import User
     23from django.contrib.messages.views import SuccessMessageMixin
     24from django.core import urlresolvers
     25from django.core.urlresolvers import reverse_lazy, reverse
     26from django.http import HttpResponseRedirect
     27from django.shortcuts import render_to_response
     28from django.template import RequestContext
     29from django.views.generic import CreateView, UpdateView, ListView
     30from django.utils.translation import ugettext_lazy as _
     31
     32from base.constant import REGISTRO_MESSAGE, EMAIL_SUBJECT_REGISTRO
     33from base.functions import enviar_correo
     34from .forms import AutenticarForm, RegistroForm, OlvidoClaveForm, ModificarClaveForm, PerfilForm
     35
     36import logging
     37
     38from .models import UserProfile
     39
     40logger = logging.getLogger("usuario")
     41
     42def hash_user(user, is_new_user=False, is_reset=False):
     43    """!
     44    Función que permite encriptar los datos del usuario
     45
     46    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
     47    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
     48    @date 22-08-2016
     49    @param user <b>{object}</b> Objeto que obtiene los datos del usuario
     50    @param is_new_user <b>{boolean}</b> Indica si es un nuevo usuario
     51    @param is_reset <b>{boolean}</b> Indica si se reinician los datos del usuario
     52    @return Devuelve un enlace cifrado
     53    """
     54
     55    if is_new_user:
     56        date_to_hash = user.date_joined.isoformat()
     57    else:
     58        date_to_hash = user.last_login.isoformat()
     59
     60    username = user.username
     61    password = user.password
     62    date_to_hash = date_to_hash + ("", "|reset")[is_reset]
     63    cadena = username + "|" + password + "|" + date_to_hash
     64
     65    hash = hashlib.sha1(cadena.encode("utf-8")).hexdigest()
     66    return base64.urlsafe_b64encode(bytes(hash, "utf-8"))
     67
     68def acceso(request):
     69    """!
     70    Funcion que gestiona el acceso al sistema
     71
     72    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
     73    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
     74    @date 23-04-2016
     75    @param request <b>{object}</b> Objeto que obtiene la petición
     76    @return Redirecciona al usuario a la pagina correspondiente en caso de que se haya autenticado o no
     77    """
     78    form = AutenticarForm()
     79
     80    if request.method == "POST":
     81        form = AutenticarForm(data=request.POST)
     82
     83        if form.is_valid():
     84            username = "%s%s" % (
     85                request.POST['tipo_documento_0'], request.POST['tipo_documento_1']
     86            )
     87
     88            usuario = authenticate(username=username, password=str(request.POST['clave']))
     89
     90            if usuario is not None:
     91                login(request, usuario)
     92                usr = User.objects.get(username=username)
     93                usr.last_login = datetime.now()
     94                usr.save()
     95            else:
     96                logger.error(str(_("Error al autenticar el usuario [%s]") % username))
     97
     98            logger.info(str(_("Acceso al sistema por el usuario [%s]") % username))
     99            return HttpResponseRedirect(urlresolvers.reverse("inicio"))
     100
     101    return render_to_response('base.template.html', {'form': form}, context_instance=RequestContext(request))
     102
     103
     104def salir(request):
     105    """!
     106    Funcion que gestiona la salida del sistema
     107
     108    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
     109    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
     110    @date 23-04-2016
     111    @param request <b>{object}</b> Objeto que contiene la petición
     112    @return Redirecciona al usuario a la pagina de inicio, si fue desautenticado lo envia a la pagina de acceso
     113    """
     114    user = request.user
     115    if user.is_authenticated():
     116        logout(request)
     117
     118        logger.info("El usuario [%s] salio del sistema" % user)
     119
     120    return HttpResponseRedirect(urlresolvers.reverse("inicio"))
     121
     122
     123class RegistroCreate(SuccessMessageMixin, CreateView):
     124    """!
     125    Clase que registra usuarios en el sistema
     126
     127    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
     128    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
     129    @date 25-04-2016
     130    @version 2.0.0
     131    """
     132    model = User
     133    form_class = RegistroForm
     134    template_name = 'usuario.registro.html'
     135    success_url = reverse_lazy('acceso')
     136    success_message = REGISTRO_MESSAGE
     137
     138    def form_valid(self, form):
     139        """!
     140        Metodo que valida si el formulario es valido, en cuyo caso se procede a registrar los datos del usuario
     141
     142        @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
     143        @copyright GNU/GPLv2
     144        @date 22-08-2016
     145        @param self <b>{object}</b> Objeto que instancia la clase
     146        @param form <b>{object}</b> Objeto que contiene el formulario de registro
     147        @return Retorna el formulario validado
     148        """
     149
     150        self.object = form.save(commit=False)
     151        self.object.username = form.cleaned_data['rif']
     152        self.object.first_name = form.cleaned_data['nombre']
     153        self.object.last_name = form.cleaned_data['apellido']
     154        self.object.set_password(form.cleaned_data['password'])
     155        self.object.email = form.cleaned_data['correo']
     156        self.object.save()
     157
     158        ## Crea el perfil del usuario
     159        UserProfile.objects.create(
     160            nacionalidad=form.cleaned_data['tipo_documento'][0],
     161            cedula=form.cleaned_data['tipo_documento'][1:],
     162            cargo=form.cleaned_data['institucion'],
     163            telefono=form.cleaned_data['ocupacion'],
     164            user=self.object
     165        )
     166
     167        ## Asigna un enlace de verificación en el registro de usuarios
     168        link = self.request.build_absolute_uri("%s?userid=%s&key=%s" % (
     169            urlresolvers.reverse('usuario.views.confirmar_registro'),
     170            self.object.username, hash_user(self.object, is_new_user=True).decode()
     171        ))
     172
     173        administrador, admin_email = '', ''
     174        if settings.ADMINS:
     175            administrador = settings.ADMINS[0][0]
     176            admin_email = settings.ADMINS[0][1]
     177
     178        ## Indica si el correo electrónico fue enviado
     179        enviado = enviar_correo(self.object.email, 'usuario.bienvenida.mail', EMAIL_SUBJECT_REGISTRO, {
     180            'link': link, 'emailapp': settings.EMAIL_FROM, 'administrador': administrador, 'admin_email': admin_email
     181        })
     182
     183        if not enviado:
     184            logger.warning(
     185                str(_("Ocurrió un inconveniente al enviar el correo de registro al usuario [%s]")
     186                    % self.object.username)
     187            )
     188
     189        return super(RegistroCreate, self).form_valid(form)
Nota: Vea TracChangeset para ayuda en el uso del visor de conjuntos de cambios.