source: firmaeventos/eventos/views.py @ a818633

Last change on this file since a818633 was a28e55b, checked in by lhernandez <lhernandez@…>, 7 years ago

Implementado Update para agregar o eliminar participantes del evento

  • Property mode set to 100755
File size: 19.9 KB
RevLine 
[a4764f9]1# -*- encoding: utf-8 -*-
2
3import os
4import requests
5from django.conf import settings
[94b3e3f]6from django.contrib import messages
[b8fffff]7from django.contrib.auth.mixins import LoginRequiredMixin
[a4764f9]8from django.core.files.base import ContentFile
9from django.core.files.storage import default_storage
[94b3e3f]10from django.core.urlresolvers import reverse_lazy
[5d88f36]11from django.http import JsonResponse
[452668a]12from django.utils.decorators import method_decorator
13from django.views.decorators.csrf import csrf_exempt
[94b3e3f]14from django.shortcuts import (
[a4764f9]15    redirect
[94b3e3f]16)
[5d88f36]17from django.views import View
[27c0bd4]18from django.views.generic import (
19    ListView, FormView
20)
[9c25cd2]21from django.views.generic.edit import UpdateView
[27c0bd4]22from django.views.generic.detail import DetailView
[8ec6ee3]23
[8fa24c3]24from multi_form_view import MultiModelFormView
[bf47591]25
[8fa24c3]26from .forms import *
27from participantes.forms import (
28    FormsetParticipanteEvento
29)
[66158c7]30from .models import Evento
[b8fffff]31from participantes.models import (
32    Participante, ParticipanteEvento
33)
[8fa24c3]34
[8ec6ee3]35
[a4764f9]36def handle_uploaded_file(file, name):
37    with open('%s/%s' % (settings.TMP, name), 'wb+') as destination:
38        for chunk in file.chunks():
39            destination.write(chunk)
40
[a28e55b]41
[b8fffff]42class RegisterEvent(LoginRequiredMixin, FormView):
[8fa24c3]43    """!
44    Muestra el formulario de registro de usuarios
45
46    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
[5dea5ff]47    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
[8fa24c3]48    @date 20-11-2017
49    @version 1.0.0
50    """
[94b3e3f]51
[8fa24c3]52    template_name = "register.event.html"
[94b3e3f]53    form_class = EventoForm
54    form_participante = FormsetParticipanteEvento
55    success_url = reverse_lazy('base:inicio')
56
57    def get_context_data(self, **kwargs):
58        context = super(RegisterEvent, self).get_context_data(**kwargs)
59        if 'form' not in context:
60            context['form'] = self.form_class()
61        if 'form2' not in context:
[45f784a]62            context['form2'] = self.form_participante(queryset=Participante.objects.none())
[94b3e3f]63        return context
64
65    def post(self, request, *args, **kwargs):
[a28e55b]66        """!
67        Metodo que permite registra y agregar participantes al evento
68
69        @author Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
70        @copyright GNU/GPLv3
71        @date 20-11-2017
72        @param request <b>{object}</b> Objeto que contiene la petición
73        @return Retorna un mensaje de error o exito al success
74        """
[eb2672b]75        nuevo_participante = self.form_participante(request.POST)
76        consulta_api = None
77        if len(request.FILES)>0:
78            file =  request.FILES['file']
79            handle_uploaded_file(request.FILES['file'], file)
80            ruta = '%s/%s' % (settings.TMP, file)
81            file = open(ruta, 'rb')
82            files = {'file': file}
83            try:
84                r = requests.post('https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/cargar', verify=False, headers={'Authorization': 'Basic YWRtaW46YWRtaW4='}, files=files)
85                consulta_api = r.json()['fileId']
86                # elimina el archivo si fue creado en la carpeta tmp
87                file.close()
88                os.unlink(ruta)
89            except Exception as e:
90                print (e)
91                file.close()
92                os.unlink(ruta)
[52a0eb9]93                messages.error(self.request, "Error al conectar al servidor y subir\
[eb2672b]94                                              el archivo a la api Murachi")
95                return redirect(self.success_url)
[a4764f9]96        try:
[9c25cd2]97
[a4764f9]98            if self.form_class(request.POST).is_valid() and nuevo_participante.is_valid():
[d285c11]99                nuevo_evento = self.form_class(request.POST, request.FILES).save(commit=False)
[a4764f9]100                nuevo_evento.serial = consulta_api
[fcce998]101
[a4764f9]102                for form in nuevo_participante:
[9c25cd2]103                    instance = form.save(commit=False)
104                    if instance.nombres == '' or instance.apellidos == '' or instance.pasaporte == '':
105                        messages.error(self.request, "Ninguno de los campos del\
106                                                      participante puede estar\
107                                                      vacio excepto el correo")
108                        return redirect(self.success_url)
109                nuevo_evento.save()
[fcce998]110                # Control para guardar y asignar participantes al evento
[9c25cd2]111                for form in nuevo_participante:
[a4764f9]112                    if form.cleaned_data.get('DELETE') and form.instance.pk:
113                        form.instance.delete()
114                    else:
115                        instance = form.save(commit=False)
116                        parametros = {
117                                        'nombres': instance.nombres,
118                                        'apellidos': instance.apellidos,
119                                        'correo': instance.correo
120                                        }
121                        nuevo_participante, create = Participante.objects.update_or_create(pasaporte=instance.pasaporte, defaults=parametros)
122                        asigna_evento = ParticipanteEvento(
123                                        fk_participante=nuevo_participante,
124                                        fk_evento=nuevo_evento)
125                        asigna_evento.save()
[52a0eb9]126                messages.success(self.request, "El usuario %s, ha creado con exito,\
[eb2672b]127                                            un nuevo evento %s" %
[a4764f9]128                                 (str(self.request.user),
129                                  str(nuevo_evento)))
130            else:
131                messages.error(self.request, "Existe un error en el\
132                                              Formualario %s %s" %
133                               (self.form_class(request.POST).errors,
134                                self.form_participante(request.POST).errors))
135        except Exception as e:
136            print (e)
[52a0eb9]137            messages.error(self.request, "Esta intentando realizar una\
138                                          acción incorrecta")
[a4764f9]139
[94b3e3f]140        return redirect(self.success_url)
[66158c7]141
142
143class ListEvent(ListView):
144    """!
145    Muestra el listado de eventos
146
147    @author Rodrigo Boet (rboet at cenditel.gob.ve)
[5dea5ff]148    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
[66158c7]149    @date 20-11-2017
150    @version 1.0.0
151    """
152    model = Evento
153    template_name = "evento.list.html"
[248b1b4]154    paginate_by = 5
[5d88f36]155
156
[248b1b4]157class SignEvent(FormView):
158    """!
159    Muestra el formulario para buscar y luego firmar documento
160
161    @author Rodrigo Boet (rboet at cenditel.gob.ve)
[5dea5ff]162    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
[248b1b4]163    @date 20-11-2017
164    @version 1.0.0
165    """
166    form_class = FirmaEventoForm
[ae65f8e]167    template_name = "evento.firma.html"
[5d88f36]168
[ae65f8e]169    def get_context_data(self, **kwargs):
170        """!
171        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
[5d88f36]172
[ae65f8e]173        @author Rodrigo Boet (rboet at cenditel.gob.ve)
174        @copyright GNU/GPLv3
175        @date 20-11-2017
176        @param self <b>{object}</b> Objeto que instancia la clase
177        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
178        @return Retorna los datos de contexto
179        """
180        kwargs['nombre_evento'] = Evento.objects.get(pk=int(self.kwargs['pk']))
[16cf088]181        return super(SignEvent, self).get_context_data(**kwargs)
[27c0bd4]182
183
184class DetailEvent(DetailView):
185    """!
186    Muestra el detalle del evento
187
188    @author Rodrigo Boet (rboet at cenditel.gob.ve)
189    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
190    @date 20-11-2017
191    @version 1.0.0
192    """
193    model = Evento
194    template_name = "evento.detail.html"
195
196    def get_context_data(self, **kwargs):
[a28e55b]197        """!
198        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
199
200        @author Rodrigo Boet (rboet at cenditel.gob.ve)
201        @copyright GNU/GPLv3
202        @date 20-11-2017
203        @param self <b>{object}</b> Objeto que instancia la clase
204        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
205        @return Retorna los datos de contexto
206        """
[27c0bd4]207        evento = int(self.kwargs['pk'])
208        context = super(DetailEvent, self).get_context_data(**kwargs)
209        try:
210            participante_evento = ParticipanteEvento.objects.select_related().filter(fk_evento=evento)
211            falta_porfirma = participante_evento.filter(firma=False).count()
212        except Exception as e:
213            print(e)
214            participante_evento = None
215            falta_porfirma = None
216        context['participantes'] = participante_evento
217        context['num_firma'] = falta_porfirma
218        return context
[5d88f36]219
[a28e55b]220
[452668a]221@method_decorator(csrf_exempt, name='dispatch')
[5d88f36]222class EventoProcesado(View):
223    """!
224    Clase que permite consultar si el evento se encuentra disponible para firmar
225
226    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
227    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
228    @date 27-11-2017
229    @version 1.0.0
230    """
231    model = Evento
232
[452668a]233    def get(self, request, event_id):
[5d88f36]234        """!
235        Metodo que permite verificar si el documento esta procesado
236
237        @author Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
238        @copyright GNU/GPLv3
239        @date 27-11-2017
240        @param request <b>{object}</b> Objeto que contiene la petición
241        @return Retorna un Json con la respuesta
242        """
243        mensaje = ''
244        procesando = False
[452668a]245        if event_id is not None:
[5d88f36]246            try:
[452668a]247                evento_pro = self.model.objects.get(pk=event_id)
[5d88f36]248            except:
249                print(e)
250                procesando = True
251                mensaje += 'No se encuentra un evento con ese serial'
252        else:
253            evento_pro = None
254            procesando = True
255            mensaje += 'No puedes enviar un evento vacio'
256
257        if evento_pro.procesando:
258            procesando = True
259            mensaje += 'No puedes firmar el documento, en este momento\
260                        se encuentra ocupado por otro Usuario'
261        else:
262            procesando = False
263            mensaje += 'Puedes Firmar el Documento'
264        data = {'validate': procesando, 'mensaje': mensaje}
265        return JsonResponse(data, safe=False)
266
[452668a]267    def post(self, request, event_id):
[5d88f36]268        """!
269        Metodo que permite cambiar el valor procesado al  evento
270
271        @author Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
272        @copyright GNU/GPLv3
273        @date 27-11-2017
274        @param request <b>{object}</b> Objeto que contiene la petición
275        @return Retorna un Json con la respuesta
276        """
[452668a]277        if event_id is not None:
[5d88f36]278            try:
[452668a]279                evento = self.model.objects.get(pk=event_id)
[5d88f36]280                evento.procesando = not evento.procesando
281                evento.save()
282                validado = True
283            except:
284                print(e)
285                validado = False
[d9b20e6]286
[5d88f36]287        return JsonResponse(validado, safe=False)
[bc3aa92]288
289
[c152e07]290class UpdateFileEvent(LoginRequiredMixin, FormView):
[bc3aa92]291    """!
292    Clase que permite actualizar subir un archivo a un evento que no se haya cargado
293
294    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
295    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
296    @date 27-11-2017
297    @version 1.0.0
298    """
299    model = Evento
300    form_class = UpdateFileEventoForm
301    template_name = 'evento.update.html'
[d9b20e6]302    success_url = reverse_lazy('events:list_events')
303
304    def get_context_data(self, **kwargs):
[a28e55b]305        """!
306        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
307
308        @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
309        @copyright GNU/GPLv3
310        @date 27-11-2017
311        @param self <b>{object}</b> Objeto que instancia la clase
312        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
313        @return Retorna los datos de contexto
314        """
[d9b20e6]315        evento = int(self.kwargs['event_id'])
316        context = super(UpdateFileEvent, self).get_context_data(**kwargs)
317        try:
318            evento = self.model.objects.select_related().get(pk=evento)
319        except Exception as e:
320            print(e)
321            evento = None
[a28e55b]322        firma = ParticipanteEvento.objects.filter(fk_evento=evento, firma=True).count()
323        if firma >= 1:
324            valida = True
325        else:
326            valida = False
327
[d9b20e6]328        context['object'] = evento
[a28e55b]329        context['valida'] = valida
[d9b20e6]330        return context
[bc3aa92]331
[d9b20e6]332    def form_valid(self, form):
[a28e55b]333        """!
334        Metodo que permite validar el formulario y agregar archivo al evento
335
336        @author Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
337        @copyright GNU/GPLv3
338        @date 27-11-2017
339        @param request <b>{object}</b> Objeto que contiene la petición
340        @return Retorna un mensaje de error o exito al success
341        """
[d9b20e6]342        file =  self.request.FILES['file']
343        posx = form.cleaned_data['pos_x']
344        posy = form.cleaned_data['pos_y']
345        pag = form.cleaned_data['pag']
346        consulta_api = None
347        try:
348            event = Evento.objects.get(pk=int(self.kwargs['event_id']))
349        except Exception as e:
350            print(e)
351            messages.error(self.request, "Error, no se encuentra registrado\
[83885cf]352                                          esté evento")
[d9b20e6]353            return redirect(self.success_url)
354
355        handle_uploaded_file(self.request.FILES['file'], file)
356        ruta = '%s/%s' % (settings.TMP, file)
357        file = open(ruta, 'rb')
358        files = {'file': file}
359        try:
360            r = requests.post('https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/cargar', verify=False, headers={'Authorization': 'Basic YWRtaW46YWRtaW4='}, files=files)
361            consulta_api = r.json()['fileId']
362            # elimina el archivo si fue creado en la carpeta tmp
363            file.close()
364            os.unlink(ruta)
365        except Exception as e:
366            print (e)
367            file.close()
368            os.unlink(ruta)
[52a0eb9]369            messages.error(self.request, "Error al conectar al servidor y subir\
[d9b20e6]370                                          el archivo a la api Murachi")
371            return redirect(self.success_url)
372
373        if event is not None and consulta_api is not None:
374            event.serial = consulta_api
375            event.pos_x = posx
376            event.pos_y = posy
377            event.pag = pag
378            event.save()
[52a0eb9]379            messages.success(self.request, "El usuario %s, ha actualizado con exito,\
[d9b20e6]380                                            el evento %s" %
381                                 (str(self.request.user),
382                                  str(event)))
383        else:
[52a0eb9]384            messages.error(self.request, "Error al actualizar, debes llenar\
385                                          todos los campos, incluyendo la\
386                                          configuración de la firma")
[d9b20e6]387        return redirect(self.success_url)
[9c25cd2]388
389
390class UpdateEventView(LoginRequiredMixin, UpdateView):
391    """!
392    Clase que permite actualizar los datos de un evento
393
394    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
395    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
396    @date 28-11-2017
397    @version 1.0.0
398    """
399    model = Evento
400    form_class = UpdateEventoForm
401    template_name = 'evento.update.participantes.html'
402    success_url = reverse_lazy('events:list_events')
403    form_participante = FormsetParticipanteEvento
404
405    def get_context_data(self, **kwargs):
[a28e55b]406        """!
407        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
408
409        @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
410        @copyright GNU/GPLv3
411        @date 28-11-2017
412        @param self <b>{object}</b> Objeto que instancia la clase
413        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
414        @return Retorna los datos de contexto
415        """
[9c25cd2]416        context = super(UpdateEventView, self).get_context_data(**kwargs)
417        if 'form' not in context:
418            context['form'] = self.form_class()
419        if 'form2' not in context:
420            evento = int(self.kwargs['pk'])
421            participante_evento = Participante.objects.filter(participanteevento__fk_evento=evento)
422            context['form2'] = self.form_participante(queryset=participante_evento)
423        return context
424
425    def post(self, request, *args, **kwargs):
[a28e55b]426        """!
427        Metodo que permite actualizar y agregar mas participantes al evento
428
429        @author Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
430        @copyright GNU/GPLv3
431        @date 29-11-2017
432        @param request <b>{object}</b> Objeto que contiene la petición
433        @return Retorna un mensaje de error o exito al success
434        """
[9c25cd2]435        evento = int(self.kwargs['pk'])
436        update_participante = self.form_participante(request.POST)
[a28e55b]437        try:
438            if self.form_class(request.POST).is_valid() and update_participante.is_valid():
439                evento = self.model.objects.get(pk=evento)
440                update_evento = self.form_class(request.POST, instance=evento).save(commit=False)
441                for form in update_participante:
[9c25cd2]442                    instance = form.save(commit=False)
[a28e55b]443                    if instance.nombres == '' or instance.apellidos == '' or instance.pasaporte == '':
444                        messages.error(self.request, "Ninguno de los campos del\
445                                                      participante puede estar\
446                                                      vacio excepto el correo")
447                        return redirect(self.success_url)
448
449                update_evento.save()
450                # Control para guardar y asignar participantes al evento
451                lista_participantes = list(ParticipanteEvento.objects.filter(fk_evento=int(self.kwargs['pk']), firma=False).values('fk_participante__pasaporte'))
[9c25cd2]452
[a28e55b]453                lista_comprobar = []
454                for valor in lista_participantes:
455                    lista_comprobar += valor.values()
456                for form in update_participante:
457                    if form.cleaned_data.get('DELETE') and form.instance.pk:
458                        form.instance.delete()
459                    else:
460                        instance = form.save(commit=False)
461
462                        parametros = {
463                                        'nombres': instance.nombres,
464                                        'apellidos': instance.apellidos,
465                                        'correo': instance.correo
466                                     }
467                        if instance.pasaporte in lista_comprobar:
468                            lista_comprobar.remove(instance.pasaporte)
469                        update_participante, create = Participante.objects.update_or_create(pasaporte=instance.pasaporte, defaults=parametros)
470                        parametro_update = {'fk_participante': update_participante}
471                        update_evento_participante, create_part_event = ParticipanteEvento.objects.update_or_create(fk_evento=update_evento, fk_participante__pasaporte=instance.pasaporte, defaults=parametro_update)
472                        update_evento_participante.save()
473                messages.success(request, "El usuario %s, actualizó el evento %s" % (str(self.request.user), str(update_evento)))
474                for valor in lista_comprobar:
475                    e = ParticipanteEvento.objects.get(fk_evento=update_evento, fk_participante__pasaporte=valor)
476                    e.delete()
477
478            else:
479                messages.error(self.request, "Existe un error en el\
480                                              Formualario %s %s" %
481                               (self.form_class(request.POST).errors,
482                                self.form_participante(request.POST).errors))
483        except Exception as e:
484            print(e)
485            messages.error(self.request, "Esta intentando realizar una\
486                                          acción incorrecta")
487        return redirect(self.success_url)
Note: See TracBrowser for help on using the repository browser.