source: seguimiento_proyectos/sepai/users/views.py @ de2ff87

desarrollo
Last change on this file since de2ff87 was de2ff87, checked in by lhernandez <lhernandez@…>, 7 años ago

Desarrollado el modulo para registrar proyecto, por validar campos del formulario, preparando plataforma para los siguientes modulos.

  • Propiedad mode establecida a 100755
File size: 15.8 KB
Línea 
1# -*- encoding: utf-8 -*-
2"""!
3Vista que controla los procesos de los usuarios
4
5@author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
6@copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
7@date 09-01-2017
8@version 1.0.0
9"""
10from django.core import serializers
11from django import forms
12from django.db.models import Q
13from django.conf import settings
14from django.contrib import messages
15from django.contrib.auth import (
16    authenticate, logout, login
17)
18
19from django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION
20from django.contrib.auth.models import (
21    Group, Permission, User
22)
23from django.contrib.auth.views import redirect_to_login
24from django.contrib.auth.mixins import (
25    LoginRequiredMixin
26)
27from django.contrib.contenttypes.models import ContentType
28from django.contrib.messages.views import SuccessMessageMixin
29from django.core.exceptions import PermissionDenied
30from django.core.urlresolvers import (
31    reverse_lazy, reverse
32)
33
34from django.shortcuts import (
35    render, redirect, get_object_or_404
36)
37from django.views.generic import TemplateView
38from django.views.generic.base import RedirectView
39from django.views.generic.edit import (
40    FormView, UpdateView
41)
42from multi_form_view import MultiModelFormView
43
44from .forms import (
45    FormularioLogin, FormularioAdminRegistro, FormularioUpdate,
46    FormularioAdminRegPerfil, FormularioRegistroComun
47)
48
49from .utils import (
50    LoginRequeridoPerAuth
51)
52
53from .models import UserProfile
54
55
56
57class LoginView(FormView):
58    """!
59    Muestra el formulario de ingreso a la aplicación SEPAI
60
61    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
62    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
63    @date 09-01-2017
64    @version 1.0.0
65    """
66    form_class = FormularioLogin
67    template_name = 'users/login.html'
68    success_url = '/inicio/'
69    model = UserProfile
70
71    def form_valid(self, form):
72        """
73        Valida el formulario de logeo
74        @return: Dirige a la pantalla inicial de la plataforma
75        """
76        usuario = form.cleaned_data['usuario']
77        contrasena = form.cleaned_data['contrasena']
78        if '@' in usuario:
79            try:
80                usuario = User.objects.get(email=usuario).username
81            except:
82                messages.error(self.request, 'No existe este correo: %s \
83                                              asociado a una cuenta' % (usuario))
84        usuario = authenticate(username=usuario, password=contrasena)
85        if usuario is not None:
86            login(self.request, usuario)
87            self.request.session['permisos'] = list(usuario.get_all_permissions())
88            try:
89                grupos = usuario.groups.all()
90                grupo = []
91                if len(grupos) > 1:
92                    for g in grupos:
93                        grupo += str(g),
94                else:
95                    grupo = str(usuario.groups.get())
96            except:
97                grupo = "No pertenece a un grupo"
98
99            self.request.session['grupos'] = grupo
100
101            if self.request.POST.get('remember_me') is not None:
102                # Session expira a los dos meses si no se deslogea
103                self.request.session.set_expiry(1209600)
104            messages.info(self.request, 'Bienvenido %s has ingresado a el \
105                                         SEPAI con el usuario %s \
106                                         ' % (usuario.first_name,
107                                              usuario.username))
108        else:
109            user = User.objects.filter(username=form.cleaned_data['usuario'])
110            if user:
111                user = user.get()
112                if not user.is_active:
113                    self.success_url = reverse_lazy('users:login')
114                    messages.error(self.request, 'La cuenta esta inactiva \
115                                                consulte con un adminitrador')
116                else:
117                    self.success_url = reverse_lazy('users:login')
118                    messages.warning(self.request, 'Verifique su nombre y contraseña\
119                                                 y vuelve a intertar')
120
121        return super(LoginView, self).form_valid(form)
122
123
124class LogOutView(RedirectView):
125    """!
126    Salir de la apliacion
127
128    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
129    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
130    @date 09-01-2017
131    @version 1.0.0
132    """
133    permanent = False
134    query_string = True
135
136    def get_redirect_url(self):
137        """!
138        Dirige a la pantalla del login
139        @return: A la url del login
140        """
141        logout(self.request)
142        return reverse_lazy('users:login')
143
144
145class ListUsersView(LoginRequeridoPerAuth, TemplateView):
146    """!
147    Listar usuarios de la apliacion
148
149    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
150    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
151    @date 09-01-2017
152    @version 1.0.0
153    """
154    template_name = "users/user_list.html"
155    model = User
156    success_url = reverse_lazy('users:lista_users')
157    group_required = [u"Administradores"]
158
159    def __init__(self):
160        super(ListUsersView, self).__init__()
161
162
163    def post(self, *args, **kwargs):
164        '''
165        Cambia el estado activo a el usuario
166        @return: Dirige a la tabla que muestra los usuarios de la apliacion
167        '''
168        accion = self.request.POST
169        activar = accion.get('activar', None)
170        inactivar = accion.get('inactivar', None)
171        estado = False
172
173        if activar is not None:
174            user = activar
175            estado = True
176        elif inactivar is not None:
177            user = inactivar
178            estado = False
179        else:
180            messages.error(self.request, "Esta intentando hacer una accion incorrecta")     
181        try:
182            user_act = self.model.objects.get(pk=user)
183            user_act.is_active = estado
184            user_act.save()
185            if estado:
186                messages.success(self.request, "Se ha activado el usuario: %s" % (str(user_act)))
187            else:
188                messages.warning(self.request, "Se ha inactivado el usuario: %s" % (str(user_act)))
189        except:
190            messages.info(self.request, "El usuario no existe")
191        return redirect(self.success_url)
192
193
194class StartView(LoginRequiredMixin, TemplateView):
195    """!
196    Muestra el inicio de la plataforma
197
198    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
199    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
200    @date 09-01-2017
201    @version 1.0.0
202    @return: El template inicial de la plataforma
203    """
204    template_name = "home.html"
205
206    def dispatch(self, request, *args, **kwargs):
207        """
208        Envia una alerta al usuario que intenta acceder sin estar logeado
209        @return: Direcciona al login en caso de no poseer permisos, en caso contrario usa la clase
210        """
211        if not request.user.is_authenticated:
212            messages.warning(self.request, "Debes iniciar Sessón")
213            return self.handle_no_permission()
214        return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
215
216
217    def get_context_data(self, **kwargs):
218        """Use this to add extra context."""
219        try:
220            perfil = UserProfile.objects.select_related().get(fk_user=self.request.user.id)
221        except:
222            perfil = None
223        context = super(StartView, self).get_context_data(**kwargs)
224        context['userprofile'] = perfil
225        return context
226
227
228class RegisterView(LoginRequeridoPerAuth, MultiModelFormView):
229    """!
230    Muestra el formulario de registro de usuarios
231
232    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
233    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
234    @date 09-01-2017
235    @version 1.0.0
236    """
237    template_name = "users/register.html"
238    form_classes = {
239      'user': FormularioAdminRegistro,
240      'user_perfil': FormularioAdminRegPerfil,
241    }
242    success_url = reverse_lazy('users:home')
243    model = Group
244    model_permi = Permission
245    group_required = [u"Administradores"]
246    record_id=None
247
248    def get_context_data(self, **kwargs):
249        """
250        Carga el formulario en la vista,para registrar usuarios
251        @return: El contexto con los objectos para la vista
252        """
253        return super(RegisterView, self).get_context_data(**kwargs)
254
255    def forms_valid(self, forms, **kwargs):
256        """
257        Valida el formulario de registro del perfil de usuario
258        @return: Dirige con un mensaje de exito a el home
259        """
260        nuevo_usuario = forms['user'].save()
261        nuevo_perfil = forms['user_perfil'].save(commit=False)
262        nuevo_perfil.fk_user = nuevo_usuario
263        nuevo_perfil.save()
264        usuario = forms['user'].cleaned_data['username']
265        grupos = forms['user'].cleaned_data['groups']
266        for group in grupos:
267            # Agrega a el usuario al(los) grupo(s) seleccionado(s)
268            nuevo_usuario.groups.add(group.pk)
269        model_user = ContentType.objects.get_for_model(User).pk
270        LogEntry.objects.log_action(
271            user_id=self.request.user.id,
272            content_type_id=model_user,
273            object_id=nuevo_usuario.id,
274            object_repr=str(nuevo_usuario.username),
275            action_flag=ADDITION)
276        messages.success(self.request, "Usuario %s creado con exito\
277                                       " % (str(usuario)))
278        return super(RegisterView, self).forms_valid(forms)
279
280
281class RegisterComunView(MultiModelFormView):
282    """!
283    Muestra el formulario de registro de usuarios
284
285    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
286    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
287    @date 09-01-2017
288    @version 1.0.0
289    """
290    template_name = "users/register.html"
291    form_classes = {
292      'user': FormularioAdminRegistro,
293      'user_perfil': FormularioAdminRegPerfil,
294    }
295    success_url = reverse_lazy('users:login')
296    model = Group
297    model_permi = Permission
298    record_id=None
299
300    def get_context_data(self, **kwargs):
301        """
302        Carga el formulario en la vista,para registrar usuarios
303        @return: El contexto con los objectos para la vista
304        """
305        return super(RegisterComunView, self).get_context_data(**kwargs)
306
307    def forms_valid(self, forms, **kwargs):
308        """
309        Valida el formulario de registro del perfil de usuario
310        @return: Dirige con un mensaje de exito a el login
311        """
312        nuevo_usuario = forms['user'].save()
313        nuevo_perfil = forms['user_perfil'].save(commit=False)
314        nuevo_perfil.fk_user = nuevo_usuario
315        nuevo_perfil.save()
316        usuario = forms['user'].cleaned_data['username']
317        model_user = ContentType.objects.get_for_model(User).pk
318        LogEntry.objects.log_action(
319            user_id=str(nuevo_perfil.pk),
320            content_type_id=model_user,
321            object_id=nuevo_usuario.id,
322            object_repr=str(nuevo_usuario.username),
323            action_flag=ADDITION)
324        messages.info(self.request, "Usuario %s creado con exito, debes esperar \
325                                        que el Administrador valide el registro\
326                                       " % (str(usuario)))
327        return super(RegisterComunView, self).forms_valid(forms)
328
329    def forms_invalid(self, forms, **kwargs):
330        messages.error(self.request, forms)
331        return super(RegisterComunView, self).forms_invalid(forms)
332
333
334
335
336class ModalsPerfil(LoginRequeridoPerAuth, MultiModelFormView):
337    """!
338    Construye el modals para la actualizacion del usuario
339
340    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
341    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
342    @date 09-01-2017
343    @version 1.0.0
344    """
345    model = UserProfile
346    form_classes = {
347      'user': FormularioUpdate,
348      'user_perfil': FormularioAdminRegPerfil,
349    }
350    template_name = 'users/modal_userPerfil.html'
351    success_url = reverse_lazy('users:lista_users')
352    success_message = 'Usuario Actualizado con exito'
353    group_required = [u"Administradores"]
354    record_id = None
355
356
357    def get_context_data(self, **kwargs):
358        """
359        Carga el formulario en la vista,para registrar usuarios
360        @return: El contexto con los objectos para la vista
361        """
362        context = super(ModalsPerfil, self).get_context_data(**kwargs)
363        self.record_id = self.kwargs.get('pk', None)
364        try:
365            record = self.model.objects.select_related().get(fk_user=self.record_id)
366        except UserProfile.DoesNotExist:
367            record = None
368        context['upUser'] = record
369        return context
370
371    def get_objects(self, **kwargs):
372        """
373        Carga el formulario en la vista,para actualizar el perfil del  usuario
374        @return: El contexto con los objectos para la vista
375        """
376        self.record_id = self.kwargs.get('pk', None)
377        try:
378            record = self.model.objects.select_related().get(fk_user=self.record_id)
379        except UserProfile.DoesNotExist:
380            record = None
381        return {
382          'user_perfil': record,
383          'user': record.fk_user if record else None}
384
385    def get_success_url(self):
386        return reverse('users:lista_users')
387
388    def forms_valid(self, forms, **kwargs):
389        """
390        Valida el formulario de registro del perfil de usuario
391        @return: Dirige con un mensaje de exito a el home
392        """
393        self.record_id = self.kwargs.get('pk', None)
394        if self.record_id is not None:
395            objeto = get_object_or_404(User, pk=self.record_id)
396            update_usuario = FormularioUpdate(self.request.POST, instance=objeto)
397            update_perfil = FormularioAdminRegPerfil(self.request.POST, instance=objeto)
398
399            messages.success(self.request, "Usuario %s Actualizado con exito\
400                                           " % (str(objeto.username)))
401        return super(ModalsPerfil, self).forms_valid(forms)
402
403
404class NotFoundView(TemplateView):
405    """!
406    Dirige a la plantilla de pagina no funciona
407
408    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
409    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
410    @date 09-01-2017
411    @version 1.0.0
412    """
413    template_name = "404.html"
414
415
416class Forbidden(TemplateView):
417    """!
418    Dirige a la plantilla en la que no tiene permiso
419
420    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
421    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>
422    GNU Public License versión 2 (GPLv2)</a>
423    @date 09-01-2017
424    @version 1.0.0
425    """
426    template_name = "403.html"
427
428
429class ErrorServerView(TemplateView):
430    """!
431    Dirige a la plantilla de que existe un error en el servidor
432
433    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
434    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>
435    GNU Public License versión 2 (GPLv2)</a>
436    @date 09-01-2017
437    @version 1.0.0
438    """
439    template_name = "500.html"
440
441
442class RecentActivityAjaxView(LoginRequiredMixin, TemplateView):
443    """docstring for ClassName"""
444    template_name = "users/recent_activity.html"
445    model = LogEntry
446
447    def get_context_data(self, **kwargs):
448        """!
449        Carga las actividades recientes del usuario
450        @return: El objeto con las actividades recientes del usuario
451        """
452        user = self.request.GET.get('user')
453        log = self.model.objects.select_related().all().order_by("id")
454        context = super(RecentActivityAjaxView, self).get_context_data(**kwargs)
455        context['log'] = log
456        return context
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.