source: firmaeventos/eventos/views.py @ fcce998

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

Movido comentario de la vista de registro

  • Property mode set to 100755
File size: 15.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
41class RegisterEvent(LoginRequiredMixin, FormView):
42    """!
43    Muestra el formulario de registro de usuarios
44
45    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
46    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
47    @date 20-11-2017
48    @version 1.0.0
49    """
50
51    template_name = "register.event.html"
52    form_class = EventoForm
53    form_participante = FormsetParticipanteEvento
54    success_url = reverse_lazy('base:inicio')
55
56    def get_context_data(self, **kwargs):
57        context = super(RegisterEvent, self).get_context_data(**kwargs)
58        if 'form' not in context:
59            context['form'] = self.form_class()
60        if 'form2' not in context:
61            context['form2'] = self.form_participante(queryset=Participante.objects.none())
62        return context
63
64    def post(self, request, *args, **kwargs):
65        nuevo_participante = self.form_participante(request.POST)
66        consulta_api = None
67        if len(request.FILES)>0:
68            file =  request.FILES['file']
69            handle_uploaded_file(request.FILES['file'], file)
70            ruta = '%s/%s' % (settings.TMP, file)
71            file = open(ruta, 'rb')
72            files = {'file': file}
73            try:
74                r = requests.post('https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/cargar', verify=False, headers={'Authorization': 'Basic YWRtaW46YWRtaW4='}, files=files)
75                consulta_api = r.json()['fileId']
76                # elimina el archivo si fue creado en la carpeta tmp
77                file.close()
78                os.unlink(ruta)
79            except Exception as e:
80                print (e)
81                file.close()
82                os.unlink(ruta)
83                messages.error(self.request, "Error al conectar al servidor y subir\
84                                              el archivo a la api Murachi")
85                return redirect(self.success_url)
86        try:
87
88            if self.form_class(request.POST).is_valid() and nuevo_participante.is_valid():
89                nuevo_evento = self.form_class(request.POST, request.FILES).save(commit=False)
90                nuevo_evento.serial = consulta_api
91
92                for form in nuevo_participante:
93                    instance = form.save(commit=False)
94                    if instance.nombres == '' or instance.apellidos == '' or instance.pasaporte == '':
95                        messages.error(self.request, "Ninguno de los campos del\
96                                                      participante puede estar\
97                                                      vacio excepto el correo")
98                        return redirect(self.success_url)
99                nuevo_evento.save()
100                # Control para guardar y asignar participantes al evento
101                for form in nuevo_participante:
102                    if form.cleaned_data.get('DELETE') and form.instance.pk:
103                        form.instance.delete()
104                    else:
105                        instance = form.save(commit=False)
106                        parametros = {
107                                        'nombres': instance.nombres,
108                                        'apellidos': instance.apellidos,
109                                        'correo': instance.correo
110                                        }
111                        nuevo_participante, create = Participante.objects.update_or_create(pasaporte=instance.pasaporte, defaults=parametros)
112                        asigna_evento = ParticipanteEvento(
113                                        fk_participante=nuevo_participante,
114                                        fk_evento=nuevo_evento)
115                        asigna_evento.save()
116                messages.success(self.request, "El usuario %s, ha creado con exito,\
117                                            un nuevo evento %s" %
118                                 (str(self.request.user),
119                                  str(nuevo_evento)))
120            else:
121                messages.error(self.request, "Existe un error en el\
122                                              Formualario %s %s" %
123                               (self.form_class(request.POST).errors,
124                                self.form_participante(request.POST).errors))
125        except Exception as e:
126            print (e)
127            messages.error(self.request, "Esta intentando realizar una\
128                                          acción incorrecta")
129
130        return redirect(self.success_url)
131
132
133class ListEvent(ListView):
134    """!
135    Muestra el listado de eventos
136
137    @author Rodrigo Boet (rboet at cenditel.gob.ve)
138    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
139    @date 20-11-2017
140    @version 1.0.0
141    """
142    model = Evento
143    template_name = "evento.list.html"
144    paginate_by = 5
145
146
147class SignEvent(FormView):
148    """!
149    Muestra el formulario para buscar y luego firmar documento
150
151    @author Rodrigo Boet (rboet at cenditel.gob.ve)
152    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
153    @date 20-11-2017
154    @version 1.0.0
155    """
156    form_class = FirmaEventoForm
157    template_name = "evento.firma.html"
158
159    def get_context_data(self, **kwargs):
160        """!
161        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
162
163        @author Rodrigo Boet (rboet at cenditel.gob.ve)
164        @copyright GNU/GPLv3
165        @date 20-11-2017
166        @param self <b>{object}</b> Objeto que instancia la clase
167        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
168        @return Retorna los datos de contexto
169        """
170        kwargs['nombre_evento'] = Evento.objects.get(pk=int(self.kwargs['pk']))
171        return super(SignEvent, self).get_context_data(**kwargs)
172
173
174class DetailEvent(DetailView):
175    """!
176    Muestra el detalle del evento
177
178    @author Rodrigo Boet (rboet at cenditel.gob.ve)
179    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
180    @date 20-11-2017
181    @version 1.0.0
182    """
183    model = Evento
184    template_name = "evento.detail.html"
185
186    def get_context_data(self, **kwargs):
187        evento = int(self.kwargs['pk'])
188        context = super(DetailEvent, self).get_context_data(**kwargs)
189        try:
190            participante_evento = ParticipanteEvento.objects.select_related().filter(fk_evento=evento)
191            falta_porfirma = participante_evento.filter(firma=False).count()
192        except Exception as e:
193            print(e)
194            participante_evento = None
195            falta_porfirma = None
196        context['participantes'] = participante_evento
197        context['num_firma'] = falta_porfirma
198        return context
199
200@method_decorator(csrf_exempt, name='dispatch')
201class EventoProcesado(View):
202    """!
203    Clase que permite consultar si el evento se encuentra disponible para firmar
204
205    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
206    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
207    @date 27-11-2017
208    @version 1.0.0
209    """
210    model = Evento
211
212    def get(self, request, event_id):
213        """!
214        Metodo que permite verificar si el documento esta procesado
215
216        @author Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
217        @copyright GNU/GPLv3
218        @date 27-11-2017
219        @param request <b>{object}</b> Objeto que contiene la petición
220        @return Retorna un Json con la respuesta
221        """
222        mensaje = ''
223        procesando = False
224        if event_id is not None:
225            try:
226                evento_pro = self.model.objects.get(pk=event_id)
227            except:
228                print(e)
229                procesando = True
230                mensaje += 'No se encuentra un evento con ese serial'
231        else:
232            evento_pro = None
233            procesando = True
234            mensaje += 'No puedes enviar un evento vacio'
235
236        if evento_pro.procesando:
237            procesando = True
238            mensaje += 'No puedes firmar el documento, en este momento\
239                        se encuentra ocupado por otro Usuario'
240        else:
241            procesando = False
242            mensaje += 'Puedes Firmar el Documento'
243        data = {'validate': procesando, 'mensaje': mensaje}
244        return JsonResponse(data, safe=False)
245
246    def post(self, request, event_id):
247        """!
248        Metodo que permite cambiar el valor procesado al  evento
249
250        @author Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
251        @copyright GNU/GPLv3
252        @date 27-11-2017
253        @param request <b>{object}</b> Objeto que contiene la petición
254        @return Retorna un Json con la respuesta
255        """
256        if event_id is not None:
257            try:
258                evento = self.model.objects.get(pk=event_id)
259                evento.procesando = not evento.procesando
260                evento.save()
261                validado = True
262            except:
263                print(e)
264                validado = False
265
266        return JsonResponse(validado, safe=False)
267
268
269class UpdateFileEvent(LoginRequiredMixin, FormView):
270    """!
271    Clase que permite actualizar subir un archivo a un evento que no se haya cargado
272
273    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
274    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
275    @date 27-11-2017
276    @version 1.0.0
277    """
278    model = Evento
279    form_class = UpdateFileEventoForm
280    template_name = 'evento.update.html'
281    success_url = reverse_lazy('events:list_events')
282
283    def get_context_data(self, **kwargs):
284        evento = int(self.kwargs['event_id'])
285        context = super(UpdateFileEvent, self).get_context_data(**kwargs)
286        try:
287            evento = self.model.objects.select_related().get(pk=evento)
288        except Exception as e:
289            print(e)
290            evento = None
291        context['object'] = evento
292        return context
293
294    def form_valid(self, form):
295        print(form)
296        file =  self.request.FILES['file']
297        posx = form.cleaned_data['pos_x']
298        posy = form.cleaned_data['pos_y']
299        pag = form.cleaned_data['pag']
300        consulta_api = None
301        try:
302            event = Evento.objects.get(pk=int(self.kwargs['event_id']))
303        except Exception as e:
304            print(e)
305            messages.error(self.request, "Error, no se encuentra registrado\
306                                          esté evento")
307            return redirect(self.success_url)
308
309        print(posx)
310        handle_uploaded_file(self.request.FILES['file'], file)
311        ruta = '%s/%s' % (settings.TMP, file)
312        file = open(ruta, 'rb')
313        files = {'file': file}
314        try:
315            r = requests.post('https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/cargar', verify=False, headers={'Authorization': 'Basic YWRtaW46YWRtaW4='}, files=files)
316            consulta_api = r.json()['fileId']
317            # elimina el archivo si fue creado en la carpeta tmp
318            file.close()
319            os.unlink(ruta)
320        except Exception as e:
321            print (e)
322            file.close()
323            os.unlink(ruta)
324            messages.error(self.request, "Error al conectar al servidor y subir\
325                                          el archivo a la api Murachi")
326            return redirect(self.success_url)
327
328        if event is not None and consulta_api is not None:
329            event.serial = consulta_api
330            event.pos_x = posx
331            event.pos_y = posy
332            event.pag = pag
333            event.save()
334            messages.success(self.request, "El usuario %s, ha actualizado con exito,\
335                                            el evento %s" %
336                                 (str(self.request.user),
337                                  str(event)))
338        else:
339            messages.error(self.request, "Error al actualizar, debes llenar\
340                                          todos los campos, incluyendo la\
341                                          configuración de la firma")
342        return redirect(self.success_url)
343
344
345class UpdateEventView(LoginRequiredMixin, UpdateView):
346    """!
347    Clase que permite actualizar los datos de un evento
348
349    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
350    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
351    @date 28-11-2017
352    @version 1.0.0
353    """
354    model = Evento
355    form_class = UpdateEventoForm
356    template_name = 'evento.update.participantes.html'
357    success_url = reverse_lazy('events:list_events')
358    form_participante = FormsetParticipanteEvento
359
360    def get_context_data(self, **kwargs):
361        context = super(UpdateEventView, self).get_context_data(**kwargs)
362        if 'form' not in context:
363            context['form'] = self.form_class()
364        if 'form2' not in context:
365            evento = int(self.kwargs['pk'])
366            participante_evento = Participante.objects.filter(participanteevento__fk_evento=evento)
367            context['form2'] = self.form_participante(queryset=participante_evento)
368        return context
369
370    def post(self, request, *args, **kwargs):
371        print('entra en el valid')
372        evento = int(self.kwargs['pk'])
373        update_participante = self.form_participante(request.POST)
374        print(update_participante)
375        if self.form_class(request.POST).is_valid() and update_participante.is_valid():
376            evento = self.model.objects.get(pk=evento)
377            update_evento = self.form_class(request.POST, instance=evento).save(commit=False)
378            update_evento.save()
379
380        # Control para guardar y asignar participantes al evento
381
382            for form in update_participante:
383                if form.cleaned_data.get('DELETE') and form.instance.pk:
384                    form.instance.delete()
385                else:
386                    instance = form.save(commit=False)
387                    parametros = {
388                                    'nombres': instance.nombres,
389                                    'apellidos': instance.apellidos,
390                                    'correo': instance.correo
391                                    }
392                    update_participante, create = Participante.objects.update_or_create(pasaporte=instance.pasaporte, defaults=parametros)
393                    asigna_evento = ParticipanteEvento(
394                                    fk_participante=update_participante,
395                                    fk_evento=update_evento)
396                    #asigna_evento.save()
397
398            messages.success(request, "Se actualizó el evento %s" % (update_evento))
399        return redirect(self.success_url)
400        #return super(UpdateEventView, self).form_valid(form)
401
402    #def form_invalid(self, form, **kwargs):
403    #    return super(UpdateEventView, self).form_invalid(form)
Note: See TracBrowser for help on using the repository browser.