source: sapic/users/views.py @ b05044c

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

Optimizado Update del perfil de usuario

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