source: firmaeventos/eventos/views.py @ 601f993

Last change on this file since 601f993 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
Line 
1# -*- encoding: utf-8 -*-
2
3import os
4import requests
5from django.conf import settings
6from django.contrib import messages
7from django.contrib.auth.mixins import LoginRequiredMixin
8from django.core.files.base import ContentFile
9from django.core.files.storage import default_storage
10from django.core.urlresolvers import reverse_lazy
11from django.http import JsonResponse
12from django.utils.decorators import method_decorator
13from django.views.decorators.csrf import csrf_exempt
14from django.shortcuts import (
15    redirect
16)
17from django.views import View
18from django.views.generic import (
19    ListView, FormView
20)
21from django.views.generic.edit import UpdateView
22from django.views.generic.detail import DetailView
23
24from multi_form_view import MultiModelFormView
25
26from .forms import *
27from participantes.forms import (
28    FormsetParticipanteEvento
29)
30from .models import Evento
31from participantes.models import (
32    Participante, ParticipanteEvento
33)
34
35
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
41
42class RegisterEvent(LoginRequiredMixin, FormView):
43    """!
44    Muestra el formulario de registro de usuarios
45
46    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
47    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
48    @date 20-11-2017
49    @version 1.0.0
50    """
51
52    template_name = "register.event.html"
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:
62            context['form2'] = self.form_participante(queryset=Participante.objects.none())
63        return context
64
65    def post(self, request, *args, **kwargs):
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        """
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)
93                messages.error(self.request, "Error al conectar al servidor y subir\
94                                              el archivo a la api Murachi")
95                return redirect(self.success_url)
96        try:
97
98            if self.form_class(request.POST).is_valid() and nuevo_participante.is_valid():
99                nuevo_evento = self.form_class(request.POST, request.FILES).save(commit=False)
100                nuevo_evento.serial = consulta_api
101
102                for form in nuevo_participante:
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()
110                # Control para guardar y asignar participantes al evento
111                for form in nuevo_participante:
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()
126                messages.success(self.request, "El usuario %s, ha creado con exito,\
127                                            un nuevo evento %s" %
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)
137            messages.error(self.request, "Esta intentando realizar una\
138                                          acción incorrecta")
139
140        return redirect(self.success_url)
141
142
143class ListEvent(ListView):
144    """!
145    Muestra el listado de eventos
146
147    @author Rodrigo Boet (rboet at cenditel.gob.ve)
148    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
149    @date 20-11-2017
150    @version 1.0.0
151    """
152    model = Evento
153    template_name = "evento.list.html"
154    paginate_by = 5
155
156
157class SignEvent(FormView):
158    """!
159    Muestra el formulario para buscar y luego firmar documento
160
161    @author Rodrigo Boet (rboet at cenditel.gob.ve)
162    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
163    @date 20-11-2017
164    @version 1.0.0
165    """
166    form_class = FirmaEventoForm
167    template_name = "evento.firma.html"
168
169    def get_context_data(self, **kwargs):
170        """!
171        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
172
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']))
181        return super(SignEvent, self).get_context_data(**kwargs)
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):
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        """
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
219
220
221@method_decorator(csrf_exempt, name='dispatch')
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
233    def get(self, request, event_id):
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
245        if event_id is not None:
246            try:
247                evento_pro = self.model.objects.get(pk=event_id)
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
267    def post(self, request, event_id):
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        """
277        if event_id is not None:
278            try:
279                evento = self.model.objects.get(pk=event_id)
280                evento.procesando = not evento.procesando
281                evento.save()
282                validado = True
283            except:
284                print(e)
285                validado = False
286
287        return JsonResponse(validado, safe=False)
288
289
290class UpdateFileEvent(LoginRequiredMixin, FormView):
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'
302    success_url = reverse_lazy('events:list_events')
303
304    def get_context_data(self, **kwargs):
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        """
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
322        firma = ParticipanteEvento.objects.filter(fk_evento=evento, firma=True).count()
323        if firma >= 1:
324            valida = True
325        else:
326            valida = False
327
328        context['object'] = evento
329        context['valida'] = valida
330        return context
331
332    def form_valid(self, form):
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        """
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\
352                                          esté evento")
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)
369            messages.error(self.request, "Error al conectar al servidor y subir\
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()
379            messages.success(self.request, "El usuario %s, ha actualizado con exito,\
380                                            el evento %s" %
381                                 (str(self.request.user),
382                                  str(event)))
383        else:
384            messages.error(self.request, "Error al actualizar, debes llenar\
385                                          todos los campos, incluyendo la\
386                                          configuración de la firma")
387        return redirect(self.success_url)
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):
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        """
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):
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        """
435        evento = int(self.kwargs['pk'])
436        update_participante = self.form_participante(request.POST)
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:
442                    instance = form.save(commit=False)
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'))
452
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.