source: seguimiento_proyectos/sepai/users/views.py @ 330ec39

desarrollo
Last change on this file since 330ec39 was 330ec39, checked in by Leonel Hernandez <leonelphm@…>, 7 años ago

Verificando Bugs

  • Propiedad mode establecida a 100755
File size: 15.9 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            pass
224        print(perfil)
225        context = super(StartView, self).get_context_data(**kwargs)
226        context['userprofile'] = perfil
227        return context
228
229
230class RegisterView(LoginRequeridoPerAuth, MultiModelFormView):
231    """!
232    Muestra el formulario de registro de usuarios
233
234    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
235    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
236    @date 09-01-2017
237    @version 1.0.0
238    """
239    template_name = "users/register.html"
240    form_classes = {
241      'user': FormularioAdminRegistro,
242      'user_perfil': FormularioAdminRegPerfil,
243    }
244    success_url = reverse_lazy('users:home')
245    model = Group
246    model_permi = Permission
247    group_required = [u"Administradores"]
248    record_id=None
249
250    def get_context_data(self, **kwargs):
251        """
252        Carga el formulario en la vista,para registrar usuarios
253        @return: El contexto con los objectos para la vista
254        """
255        return super(RegisterView, self).get_context_data(**kwargs)
256
257    def forms_valid(self, forms, **kwargs):
258        """
259        Valida el formulario de registro del perfil de usuario
260        @return: Dirige con un mensaje de exito a el home
261        """
262        nuevo_usuario = forms['user'].save()
263        nuevo_perfil = forms['user_perfil'].save(commit=False)
264        nuevo_perfil.fk_user = nuevo_usuario
265        nuevo_perfil.save()
266        usuario = forms['user'].cleaned_data['username']
267        grupos = forms['user'].cleaned_data['groups']
268        for group in grupos:
269            # Agrega a el usuario al(los) grupo(s) seleccionado(s)
270            nuevo_usuario.groups.add(group.pk)
271        model_user = ContentType.objects.get_for_model(User).pk
272        LogEntry.objects.log_action(
273            user_id=self.request.user.id,
274            content_type_id=model_user,
275            object_id=nuevo_usuario.id,
276            object_repr=str(nuevo_usuario.username),
277            action_flag=ADDITION)
278        messages.success(self.request, "Usuario %s creado con exito\
279                                       " % (str(usuario)))
280        return super(RegisterView, self).forms_valid(forms)
281
282
283class RegisterComunView(MultiModelFormView):
284    """!
285    Muestra el formulario de registro de usuarios
286
287    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
288    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
289    @date 09-01-2017
290    @version 1.0.0
291    """
292    template_name = "users/register.html"
293    form_classes = {
294      'user': FormularioAdminRegistro,
295      'user_perfil': FormularioAdminRegPerfil,
296    }
297    success_url = reverse_lazy('users:login')
298    model = Group
299    model_permi = Permission
300    record_id=None
301
302    def get_context_data(self, **kwargs):
303        """
304        Carga el formulario en la vista,para registrar usuarios
305        @return: El contexto con los objectos para la vista
306        """
307        return super(RegisterComunView, self).get_context_data(**kwargs)
308
309    def forms_valid(self, forms, **kwargs):
310        """
311        Valida el formulario de registro del perfil de usuario
312        @return: Dirige con un mensaje de exito a el login
313        """
314        nuevo_usuario = forms['user'].save()
315        nuevo_perfil = forms['user_perfil'].save(commit=False)
316        nuevo_perfil.fk_user = nuevo_usuario
317        nuevo_perfil.save()
318        usuario = forms['user'].cleaned_data['username']
319        model_user = ContentType.objects.get_for_model(User).pk
320        LogEntry.objects.log_action(
321            user_id=str(nuevo_perfil.pk),
322            content_type_id=model_user,
323            object_id=nuevo_usuario.id,
324            object_repr=str(nuevo_usuario.username),
325            action_flag=ADDITION)
326        messages.info(self.request, "Usuario %s creado con exito, debes esperar \
327                                        que el Administrador valide el registro\
328                                       " % (str(usuario)))
329        return super(RegisterComunView, self).forms_valid(forms)
330
331    def forms_invalid(self, forms, **kwargs):
332        messages.danger(self.request, forms.errors)
333        return super(RegisterComunView, self).forms_invalid(forms)
334
335
336
337
338class ModalsPerfil(LoginRequeridoPerAuth, MultiModelFormView):
339    """!
340    Construye el modals para la actualizacion del usuario
341
342    @author Ing. Leonel P. Hernandez M. (lhernandez 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 09-01-2017
345    @version 1.0.0
346    """
347    model = UserProfile
348    form_classes = {
349      'user': FormularioUpdate,
350      'user_perfil': FormularioAdminRegPerfil,
351    }
352    template_name = 'users/modal_userPerfil.html'
353    success_url = reverse_lazy('users:lista_users')
354    success_message = 'Usuario Actualizado con exito'
355    group_required = [u"Administradores"]
356    record_id = None
357
358
359    def get_context_data(self, **kwargs):
360        """
361        Carga el formulario en la vista,para registrar usuarios
362        @return: El contexto con los objectos para la vista
363        """
364        context = super(ModalsPerfil, self).get_context_data(**kwargs)
365        self.record_id = self.kwargs.get('pk', None)
366        try:
367            record = self.model.objects.select_related().get(fk_user=self.record_id)
368        except UserProfile.DoesNotExist:
369            record = None
370        context['upUser'] = record
371        return context
372
373    def get_objects(self, **kwargs):
374        """
375        Carga el formulario en la vista,para actualizar el perfil del  usuario
376        @return: El contexto con los objectos para la vista
377        """
378        self.record_id = self.kwargs.get('pk', None)
379        try:
380            record = self.model.objects.select_related().get(fk_user=self.record_id)
381        except UserProfile.DoesNotExist:
382            record = None
383        return {
384          'user_perfil': record,
385          'user': record.fk_user if record else None}
386
387    def get_success_url(self):
388        return reverse('users:lista_users')
389
390    def forms_valid(self, forms, **kwargs):
391        """
392        Valida el formulario de registro del perfil de usuario
393        @return: Dirige con un mensaje de exito a el home
394        """
395        self.record_id = self.kwargs.get('pk', None)
396        if self.record_id is not None:
397            objeto = get_object_or_404(User, pk=self.record_id)
398            update_usuario = FormularioUpdate(self.request.POST, instance=objeto)
399            update_perfil = FormularioAdminRegPerfil(self.request.POST, instance=objeto)
400
401            messages.success(self.request, "Usuario %s Actualizado con exito\
402                                           " % (str(objeto.username)))
403        return super(ModalsPerfil, self).forms_valid(forms)
404
405
406class NotFoundView(TemplateView):
407    """!
408    Dirige a la plantilla de pagina no funciona
409
410    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
411    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
412    @date 09-01-2017
413    @version 1.0.0
414    """
415    template_name = "404.html"
416
417
418class Forbidden(TemplateView):
419    """!
420    Dirige a la plantilla en la que no tiene permiso
421
422    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
423    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>
424    GNU Public License versión 2 (GPLv2)</a>
425    @date 09-01-2017
426    @version 1.0.0
427    """
428    template_name = "403.html"
429
430
431class ErrorServerView(TemplateView):
432    """!
433    Dirige a la plantilla de que existe un error en el servidor
434
435    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
436    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>
437    GNU Public License versión 2 (GPLv2)</a>
438    @date 09-01-2017
439    @version 1.0.0
440    """
441    template_name = "500.html"
442
443
444class RecentActivityAjaxView(LoginRequiredMixin, TemplateView):
445    """docstring for ClassName"""
446    template_name = "users/recent_activity.html"
447    model = LogEntry
448
449    def get_context_data(self, **kwargs):
450        """!
451        Carga las actividades recientes del usuario
452        @return: El objeto con las actividades recientes del usuario
453        """
454        user = self.request.GET.get('user')
455        log = self.model.objects.select_related().all().order_by("id")
456        context = super(RecentActivityAjaxView, self).get_context_data(**kwargs)
457        context['log'] = log
458        return context
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.