source: seguimiento_proyectos/sepai/proyectos/views.py @ a7b5a73

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

Cambio minimo

  • Propiedad mode establecida a 100644
File size: 35.5 KB
Línea 
1# -*- encoding: utf-8 -*-
2"""!
3Vista que controla los procesos de los proyectos
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"""
10
11import os
12import json
13from django.conf import settings
14from django.contrib.auth.mixins import LoginRequiredMixin
15from django.contrib import messages
16from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
17from django.core.serializers import serialize
18from django.shortcuts import (
19    render, redirect, render_to_response
20)
21from django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION
22from django.contrib.contenttypes.models import ContentType
23from django.http import HttpResponse, Http404
24from django.template import RequestContext
25from django.core.files.storage import default_storage
26from django.core.files.base import ContentFile
27from django.core.urlresolvers import reverse_lazy, reverse
28from django.views.generic import ListView, TemplateView, FormView
29from django.views.generic.detail import DetailView
30from django.views.generic.edit import (
31    CreateView,
32    UpdateView,
33    DeleteView
34)
35from dal import autocomplete
36from multi_form_view import MultiModelFormView
37
38from .utils import (
39    listObjetivoHistoricoNacional, listObjetivoEstrategico,
40    listObjetivoGenerales
41)
42
43from .models import *
44from .forms import *
45
46from utils.forms import (
47    UploadFileForm
48)
49
50from users.utils import (
51    LoginRequeridoPerAuth
52)
53
54from users.models import UserProfile
55
56
57## Carga de datos del archivo csv a la base de datos
58def carga_masiva_csv(ruta_archivo_hist, ruta_archivo_naci, ruta_archivo_estr, ruta_archivo_genr):
59    n_reg_obj_hist = CargaMasivaObjetivosHistoricos.import_from_filename(ruta_archivo_hist)
60    n_reg_obj_naci = CargaMasivaObjetivosNacional.import_from_filename(ruta_archivo_naci)
61    n_reg_obj_estr = CargaMasivaObjetivosEstrategico.import_from_filename(ruta_archivo_estr)
62    n_reg_obj_genr = CargaMasivaObjetivosGeneral.import_from_filename(ruta_archivo_genr)
63
64    return n_reg_obj_hist, n_reg_obj_naci, n_reg_obj_estr, n_reg_obj_genr
65
66
67def cargaObjetivos(request):
68    """!
69    Funcion que permite cargar un archivo csv desde la interfaz del Administrador
70
71    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
72    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
73    @date 09-01-2017
74    @version 1.0.0
75    """
76    form = UploadFileForm()
77    context = {'form': form}
78    if request.method == 'POST':
79        form = UploadFileForm(request.POST, request.FILES)
80        if form.is_valid():
81            archivo_objetivos = request.FILES['cargar']
82            extension_objetivos = str(archivo_objetivos).split('.')
83            longitud_historico = len(extension_objetivos)
84            if extension_objetivos[longitud_historico - 1] == 'csv':
85                data_historico = archivo_objetivos.readlines()
86                formato_cabeceras = False
87                mensaje_error = ""
88                for cabecera_historico in range(0, 1):
89                    separador_historico = data_historico[cabecera_historico].split(b"|")
90                    if (separador_historico[0]).decode('UTF-8') == "OBJETIVOS HISTÓRICOS" \
91                    and (separador_historico[1]).decode('UTF-8') == "OBJETIVOS NACIONALES" and \
92                    (separador_historico[2]).decode('UTF-8') == "OBJETIVOS ESTRATÉGICOS" and \
93                    (separador_historico[3]).decode('UTF-8') == "OBJETIVOS GENERALES\n":
94                        formato_cabeceras = True
95                    else:
96                        formato_cabeceras = False
97                        mensaje_error_historico = "Existe un error en la cabecera del csv, del formato del Plan de la Patria\n"
98            else:
99                mensaje_error = "El formato de archivo debe ser csv"
100                messages.error(request, mensaje_error)
101            if formato_cabeceras:
102                datos_obj = listObjetivoHistoricoNacional(data_historico)
103                datos_obj_est = listObjetivoEstrategico(data_historico, datos_obj[1])
104                datos_obj_gene =listObjetivoGenerales(data_historico, datos_obj_est)
105                archivo_obj_hist = ''.join(datos_obj[0])
106                archivo_obj_naci = ''.join(datos_obj[1])
107                archivo_obj_est = ''.join(datos_obj_est)
108                archivo_obj_gene = ''.join(datos_obj_gene)
109                #path_historico = default_storage.save('tmp/formato_historico.csv', ContentFile(archivo_obj_hist))
110                #path_nacional = default_storage.save('tmp/formato_nacional.csv', ContentFile(archivo_obj_naci))
111                #path_estrategico = default_storage.save('tmp/formato_estrategico.csv', ContentFile(archivo_obj_est))
112                #path_general = default_storage.save('tmp/formato_general.csv', ContentFile(archivo_obj_gene))
113                #ruta_historico = os.path.join(settings.MEDIA_ROOT, path_historico)
114                #ruta_nacional = os.path.join(settings.MEDIA_ROOT, path_nacional)
115                #ruta_estrategico = os.path.join(settings.MEDIA_ROOT, path_estrategico)
116                #ruta_general = os.path.join(settings.MEDIA_ROOT, path_general)
117                #carga_masiva_csv(ruta_historico, ruta_nacional, ruta_estrategico, ruta_general)
118                #path_historico = default_storage.delete('tmp/formato_historico.csv')
119                #path_nacional = default_storage.delete('tmp/formato_nacional.csv')
120                #path_estrategico = default_storage.delete('tmp/formato_estrategico.csv')
121                #path_general = default_storage.delete('tmp/formato_general.csv')
122                messages.success(request, 'La data se cargo con exito')
123            else:
124                messages.error(request, mensaje_error_historico)
125        else:
126            return render(request, 'utils/cargar_historica.html', context)
127
128        context = {'form': form}
129        return render(request, 'utils/cargar_historica.html', context)
130
131    else:
132        return render(request, 'utils/cargar_historica.html', context)
133
134
135class AlcanceAutocomplete(autocomplete.Select2QuerySetView):
136    """!
137    Clase que crea el autocompletado del alcance de los proyectos en un select
138
139    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
140    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
141    @date 09-01-2017
142    @version 1.0.0
143    """
144
145    def get_queryset(self):
146        # No se olvide de filtrar los resultados en función del visitante !
147        if not self.request.user.is_authenticated():
148            return Alcance.objects.none()
149
150        qs = Alcance.objects.all()
151        if self.q:
152            qs = qs.filter(opcion_alcance__istartswith=self.q)
153
154        return qs
155
156class OptionsMangProjectsView(LoginRequeridoPerAuth, TemplateView):
157    """!
158    Lista las opciones para la gestion de proyectos
159
160    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
161    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
162    @date 09-01-2017
163    @version 1.0.0
164    """
165    template_name = "proyectos/gestion_proyectos.html"
166    group_required = [u"Administradores", u"Usuarios Supervisores", u"Usuarios Enlace" ]
167
168    def __init__(self):
169        super(OptionsMangProjectsView, self).__init__()
170
171    def get_context_data(self, **kwargs):
172        """Use this to add extra context."""
173        try:
174            perfil = UserProfile.objects.select_related().get(fk_user=self.request.user.id)
175        except:
176            perfil = None
177        try:
178            proyectos = Proyecto.objects.all()
179        except:
180            proyectos = None
181        context = super(OptionsMangProjectsView, self).get_context_data(**kwargs)
182        context['userprofile'] = perfil
183        context['proyectos'] = proyectos
184        return context
185
186
187
188
189class ProjectsList(LoginRequeridoPerAuth, ListView):
190    """!
191    Clase que lista los proyectos
192
193    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
194    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
195    @date 09-01-2017
196    @version 1.0.0
197    """
198    model = Proyecto
199    success_url = reverse_lazy('projects:consultar_subproyectos')
200    record_id=None
201    group_required = [u"Administradores", u"Usuarios Supervisores", u"Usuarios Enlace" ]
202
203    def __init__(self):
204        super(ProjectsList, self).__init__()
205
206
207    def get_context_data(self, **kwargs):
208        context = super(ProjectsList, self).get_context_data(**kwargs)
209        context['projects_list'] = Proyecto.objects.filter(fk_user=self.request.user.id, activo=True).values("nombre", "pk")
210        for i in context['projects_list']:
211            i["contar_pro"] = SubProyecto.objects.filter(fk_proyecto=i["pk"]).count()
212        return context
213
214
215class ProyectoRegisterView(LoginRequeridoPerAuth, MultiModelFormView):
216    """!
217    Clase para crear los proyectos
218
219    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
220    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
221    @date 09-01-2017
222    @version 1.0.0
223    """
224    template_name = 'proyectos/proyecto_form.html'
225    model = Proyecto
226    form_classes = {
227      'proyecto': FormularioRegProyecto,
228      'obj_proy': FormsetObj,
229      'resp_tec': FormularioRespTec,
230      'resp_gere': FormularioRespGere,
231    }
232    success_url = reverse_lazy('projects:crear_proyectos')
233    record_id=None
234    group_required = [u"Administradores", u"Usuarios Supervisores", u"Usuarios Enlace" ]
235
236    def __init__(self):
237        super(ProyectoRegisterView, self).__init__()
238
239    def get_objects(self):
240        self.record_id = self.kwargs.get('record_id', None)
241        try:
242            record = ObjetivosEspecificosProy.objects.get(fk_proyecto=self.record_id)
243        except ObjetivosEspecificosProy.DoesNotExist:
244            record = None
245        return {
246          'obj_proy': record,
247          'proyecto': record.fk_proyecto if record else None,
248          'resp_tec': record.fk_proyecto if record else None,
249          'resp_gere': record.fk_proyecto if record else None,
250        }
251
252    def get_context_data(self, **kwargs):
253        """Use this to add extra context."""
254        try:
255            perfil = UserProfile.objects.select_related().get(fk_user=self.request.user.id)
256        except:
257            perfil = None
258        try:
259            proyectos = Proyecto.objects.filter(fk_user=self.request.user.id, activo=True)
260        except:
261            proyectos = None
262        context = super(ProyectoRegisterView, self).get_context_data(**kwargs)
263        context['userprofile'] = perfil
264        context['proyectos'] = proyectos
265        return context
266
267    def forms_valid(self, forms, **kwargs):
268        """
269        Valida el formulario del proyecto
270        @return: Dirige con un mensaje de exito al registro de proyecto
271        """
272        nuevo_project = forms['proyecto'].save()
273        objetivo_es = self.form_classes['obj_proy'](self.request.POST, instance=nuevo_project)
274        if objetivo_es.is_valid():
275            objetivo_es.save()
276        nuevo_resp_tec = forms['resp_tec'].save(commit=False)
277        nuevo_resp_gen = forms['resp_gere'].save(commit=False)
278        nuevo_resp_tec.fk_proyecto = nuevo_project
279        nuevo_resp_tec.save()
280        nuevo_resp_gen.fk_proyecto = nuevo_project
281        nuevo_resp_gen.save()
282        model_proyecto = ContentType.objects.get_for_model(Proyecto).pk
283        LogEntry.objects.log_action(
284            user_id=self.request.user.id,
285            content_type_id=model_proyecto,
286            object_id=nuevo_project.pk,
287            object_repr=str(nuevo_project.nombre),
288            action_flag=ADDITION)
289        messages.success(self.request, "El usaurio %s, ha creado con exito,\
290                                        el proyecto %s" %
291                         (str(self.request.user),
292                          str(nuevo_project)))
293        return redirect(self.success_url)
294
295    def forms_invalid(self, forms, **kwargs):
296        messages.error(self.request, "%s, %s, %s, %s" %
297                       (str(forms['proyecto'].errors.as_data()),
298                        str(forms['obj_proy'].errors.as_data()),
299                        str(forms['resp_tec'].errors.as_data()),
300                        str(forms['resp_gere'].errors.as_data())))
301        return super(ProyectoRegisterView, self).forms_invalid(forms)
302
303
304class ProyectoUpdate(UpdateView):
305    """!
306    Clase para editar o actualizar un proyecto
307
308    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
309    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
310    @date 09-01-2017
311    @version 1.0.0
312    """
313    model = Proyecto
314    success_url = reverse_lazy('projects:consultar_proyectos')
315    fields = [
316                'fk_alcance', 'fk_sector', 'codigo', 'nombre',
317                'justificacion', 'objetivo_general',
318                'objetivos_especificos', 'monto_proyecto', 'fecha_inicio',
319                'fecha_culminacion'
320             ]
321
322
323class SubProjectsList(ListView):
324    """!
325    Clase para listar o consultar los subproyectos
326
327    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
328    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
329    @date 09-01-2017
330    @version 1.0.0
331    """
332    model = SubProyecto
333
334    def __init__(self):
335        super(SubProjectsList, self).__init__()
336
337
338class SubProyectoCreation(LoginRequeridoPerAuth, MultiModelFormView):
339    """!
340    Clase que crear los subproyectos
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    template_name = 'proyectos/subproyecto_form.html'
348    model = SubProyecto
349    success_url = reverse_lazy('projects:consultar_subproyectos')
350    form_classes = {
351      'subproyecto': FormularioSubProyecto,
352      'fase': FormularioFaseSubPro,
353      'meta': FormularioRespTec,
354    }
355    group_required = [u"Administradores", u"Usuarios Supervisores",
356                      u"Usuarios Enlace"]
357    record_id = None
358
359    def __init__(self):
360        super(SubProyectoCreation, self).__init__()
361
362    def get_objects(self):
363        self.record_id = self.kwargs.get('record_id', None)
364        try:
365            record = FaseSubproyecto.objects.get(fk_subproyecto=self.record_id)
366        except FaseSubproyecto.DoesNotExist:
367            record = None
368        return {
369          'subproyecto': record,
370          'fase':  None,
371          'meta': record.fk_subproyecto if record else None,
372        }
373
374    def get_context_data(self, **kwargs):
375        """Use this to add extra context."""
376        try:
377            perfil = UserProfile.objects.select_related().get(fk_user=self.request.user.id)
378        except:
379            perfil = None
380        try:
381            proyectos = Proyecto.objects.filter(fk_user=self.request.user.id, activo=True)
382        except:
383            proyectos = None
384        context = super(SubProyectoCreation, self).get_context_data(**kwargs)
385        context['userprofile'] = perfil
386        context['proyectos'] = proyectos
387        return context
388
389
390
391
392class SubProyectoUpdate(UpdateView):
393    """!
394    Clase que permite actualizar o editar los subproyectos
395
396    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
397    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
398    @date 09-01-2017
399    @version 1.0.0
400    """
401    model = SubProyecto
402    success_url = reverse_lazy('projects:consultar_subproyectos')
403    fields = [
404                'fk_proyecto', 'parroquia', 'codigo', 'nombre',
405                'descripcion_bien_servicio', 'unidad_medida',
406                'meta', 'fecha_inicio', 'fecha_culminacion', 'comunidad',
407                'monto_subproyecto'
408             ]
409
410
411class ActividadList(ListView):
412    """!
413    Clase que permite listar o consular las actividades
414
415    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
416    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
417    @date 09-01-2017
418    @version 1.0.0
419    """
420    model = Actividad
421
422    def __init__(self):
423        super(ActividadList, self).__init__()
424
425
426class ActividadCreation(CreateView):
427    """!
428    Clase que permite crear las actividades
429
430    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
431    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
432    @date 09-01-2017
433    @version 1.0.0
434    """
435    model = Actividad
436    success_url = reverse_lazy('projects:consultar_actividades')
437    fields = [
438                'fk_subproyecto', 'descripcion', 'unidad_medida', 'fecha_inicio',
439                'fecha_culminacion', 'horas_estimadas_ejecucion',
440                'costo_estimadao_ejecucion', 'peso_actividad',
441                'cantidad_estimada_trabajo'
442             ]
443
444
445class ActividadUpdate(UpdateView):
446    """!
447    Clase que permite actualizar o editar las actividades
448
449    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
450    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
451    @date 09-01-2017
452    @version 1.0.0
453    """
454    success_url = reverse_lazy('projects:consultar_actividades')
455    fields = [
456                'fk_subproyecto', 'descripcion', 'unidad_medida', 'fecha_inicio',
457                'fecha_culminacion', 'horas_estimadas_ejecucion',
458                'costo_estimadao_ejecucion', 'peso_actividad',
459                'cantidad_estimada_trabajo'
460             ]
461
462
463class TablerSubProyectos(LoginRequeridoPerAuth, FormView):
464    """!
465    Clase que permite controlar el formulario para los subproyectos
466
467    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
468    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
469    @date 28-09-2017
470    @version 1.0.0
471    """
472    template_name = 'proyectos/tablero_subproyecto_form.html'
473    form_class = FormularioSubProyecto
474    group_required = [u"Administradores", u"Usuarios Supervisores",
475                      u"Usuarios Enlace"]
476    success_url = None
477    record_id = None
478
479    def __init__(self):
480        super(TablerSubProyectos, self).__init__()
481
482    def get_context_data(self, **kwargs):
483        """Use this to add extra context."""
484        proyecto = self.kwargs.get('pk', None)
485        context = super(TablerSubProyectos, self).get_context_data(**kwargs)
486        try:
487            perfil = UserProfile.objects.select_related().get(fk_user=self.request.user.id)
488        except:
489            perfil = None
490        try:
491            proyectos = Proyecto.objects.get(pk=proyecto, activo=True)
492        except:
493            proyectos = None
494
495        sub_proyecto_list = SubProyecto.objects.filter(fk_proyecto=proyecto)
496
497        paginator = Paginator(sub_proyecto_list, 6) # Show 3 sub proyectos per page
498
499        page = self.request.GET.get('page')
500        try:
501            sub = paginator.page(page)
502        except PageNotAnInteger:
503            # If page is not an integer, deliver first page.
504            sub = paginator.page(1)
505        except EmptyPage:
506            # If page is out of range (e.g. 9999), deliver last page of results.
507            sub = paginator.page(paginator.num_pages)
508        rango = range(0, sub.paginator.num_pages)
509        context['userprofile'] = perfil
510        context['proyectos'] = proyectos
511        context['subproyectos'] = sub
512        fases_list = []
513        for subs in sub:
514            fases_list += FaseSubproyecto.objects.select_related().filter(fk_subproyecto=subs.pk),
515        metas_list = []
516        for fase in fases_list:
517            for fas in fase:
518                metas_list += MetaFaseSubproyecto.objects.select_related().filter(fk_fase=fas.pk),
519        context['fases'] = fases_list
520        context['metas'] = metas_list
521        context['rango'] = rango
522        return context
523
524    def form_valid(self, form, **kwargs):
525        """
526        Valida el formulario de subproyecto
527        @return: Dirige con un mensaje de exito al registro de proyecto
528        """
529        proyecto = self.kwargs.get('pk', None)
530        try:
531            proyectos = Proyecto.objects.get(pk=proyecto, activo=True)
532        except:
533            proyectos = None
534        form.instance.fk_proyecto = proyectos
535        nuevo_subproyecto = form.save()
536        self.success_url = reverse_lazy('projects:crear_subproyectos_tablero', kwargs = {'pk' : proyecto, })
537        context = {}
538        context['subproyecto'] = {'id':str(nuevo_subproyecto.pk),
539                                  'nombre': str(nuevo_subproyecto),
540                                  }
541        return HttpResponse(json.dumps(context), content_type="application/json")
542
543    def form_invalid(self, form, **kwargs):
544        return super(TablerSubProyectos, self).form_invalid(form)
545
546
547class TablerFaseProyectos(LoginRequeridoPerAuth, FormView):
548    """!
549    Clase que permite controlar el formulario para las fases
550
551    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
552    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
553    @date 28-09-2017
554    @version 1.0.0
555    """
556    template_name = 'proyectos/tablero_fases_sub.html'
557    form_class = FormularioFaseSubPro
558    group_required = [u"Administradores", u"Usuarios Supervisores",
559                      u"Usuarios Enlace"]
560    success_url = None
561    record_id = None
562
563    def __init__(self):
564        super(TablerFaseProyectos, self).__init__()
565
566    def get_context_data(self, **kwargs):
567        """Use this to add extra context."""
568        proyecto = self.kwargs.get('pk', None)
569        sub_proyecto = self.kwargs.get('pk_sub', None)
570        try:
571            perfil = UserProfile.objects.select_related().get(fk_user=self.request.user.id)
572            proyectos = Proyecto.objects.get(pk=proyecto, activo=True)
573            sub_proyectos = SubProyecto.objects.get(pk=sub_proyecto, activo=True)
574        except:
575            proyectos = None
576            perfil = None
577            sub_proyectos = None
578        context = super(TablerFaseProyectos, self).get_context_data(**kwargs)
579        context['userprofile'] = perfil
580        context['proyectos'] = proyectos
581        context['sub_proy'] = sub_proyectos
582        return context
583
584    def form_valid(self, form, **kwargs):
585        """
586        Valida el formulario del proyecto
587        @return: Dirige con un mensaje de exito al registro de proyecto
588        """
589        proyecto = self.kwargs.get('pk', None)
590        sub_proyecto = self.kwargs.get('pk_sub', None)
591        try:
592            proyectos = Proyecto.objects.get(pk=proyecto, activo=True)
593            sub_proyectos = SubProyecto.objects.get(pk=sub_proyecto, activo=True)
594        except:
595            proyectos = None
596            sub_proyectos = None
597        form.instance.fk_subproyecto = sub_proyectos
598        nueva_fase = form.save(commit=True)
599        self.success_url = reverse_lazy('projects:crear_subproyectos_tablero', kwargs = {'pk' : proyecto, })
600        context = {}
601        context['fase'] = {'id':str(nueva_fase.pk),
602                                  'nombre': str(nueva_fase),
603                                  }
604        return HttpResponse(json.dumps(context), content_type="application/json")
605
606    def form_invalid(self, form, **kwargs):
607        return super(TablerFaseProyectos, self).form_invalid(form)
608
609
610class TableMetaFasesView(LoginRequeridoPerAuth, FormView):
611    """!
612    Clase que permite controlar el formulario para las metas
613
614    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
615    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
616    @date 28-09-2017
617    @version 1.0.0
618    """
619    template_name = 'proyectos/tablero_metas_fas.html'
620    form_class = FormularioMetaFases
621    group_required = [u"Administradores", u"Usuarios Supervisores",
622                      u"Usuarios Enlace"]
623    success_url = None
624    record_id = None
625
626    def __init__(self):
627        super(TableMetaFasesView, self).__init__()
628
629    def get_context_data(self, **kwargs):
630        """Use this to add extra context."""
631        proyecto = self.kwargs.get('pk', None)
632        sub_proyecto = self.kwargs.get('pk_sub', None)
633        fase = self.kwargs.get('pk_fase', None)
634        try:
635            perfil = UserProfile.objects.select_related().get(fk_user=self.request.user.id)
636            proyectos = Proyecto.objects.get(pk=proyecto, activo=True)
637            sub_proyectos = SubProyecto.objects.get(pk=sub_proyecto, activo=True)
638            fases = FaseSubproyecto.objects.get(pk=fase)
639        except:
640            proyectos = None
641            perfil = None
642            sub_proyectos = None
643            fases = None
644        context = super(TableMetaFasesView, self).get_context_data(**kwargs)
645        context['userprofile'] = perfil
646        context['proyectos'] = proyectos
647        context['sub_proy'] = sub_proyectos
648        context['fases'] = fases
649        return context
650
651    def form_valid(self, form, **kwargs):
652        """
653        Valida el formulario del proyecto
654        @return: Dirige con un mensaje de exito al registro de proyecto
655        """
656        proyecto = self.kwargs.get('pk', None)
657        sub_proyecto = self.kwargs.get('pk_sub', None)
658        fase = self.kwargs.get('pk_fase', None)
659        try:
660            perfil = UserProfile.objects.select_related().get(fk_user=self.request.user.id)
661            proyectos = Proyecto.objects.get(pk=proyecto, activo=True)
662            sub_proyectos = SubProyecto.objects.get(pk=sub_proyecto, activo=True)
663            fases = FaseSubproyecto.objects.get(pk=fase)
664        except:
665            proyectos = None
666            perfil = None
667            sub_proyectos = None
668            fases = None
669        form.instance.fk_fase = fases
670        nueva_meta = form.save(commit=True)
671        self.success_url = reverse_lazy('projects:crear_subproyectos_tablero', kwargs = {'pk' : proyecto, })
672        context = {}
673        context['meta'] = {'id':str(nueva_meta.pk),
674                            'nombre': str(nueva_meta),
675                                  }
676        return HttpResponse(json.dumps(context), content_type="application/json")
677
678    def form_invalid(self, form, **kwargs):
679        return super(TableMetaFasesView, self).form_invalid(form)
680
681
682
683class AjaxRecivCreateSubPro(LoginRequeridoPerAuth, FormView):
684    template_name = "proyectos/ajax_tablero.html"
685    form_class = FormularioSubProyecto
686    success_url = reverse_lazy('projects:ajax_crear_subproyectos_tablero')
687    group_required = [u"Administradores", u"Usuarios Supervisores",
688                      u"Usuarios Enlace"]
689
690    def form_valid(self, form, **kwargs):
691        """Use this to add extra context."""
692        super(AjaxRecivCreateSubPro, self).form_valid(form, **kwargs)
693
694
695class RecursoFisicoRegisterView(LoginRequeridoPerAuth, MultiModelFormView):
696    """!
697    Clase para registrar recursos fisicos seccion trabajador y capacitacion
698
699    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
700    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
701    @date 09-01-2017
702    @version 1.0.0
703    """
704    template_name = 'proyectos/recursos_fisicos_form.html'
705    form_classes = {
706      'trabajadores': FormularioRecurFisTra,
707      'capacitacion': FormsetCaptacion,
708    }
709    record_id=None
710    group_required = [u"Administradores", u"Usuarios Supervisores",
711                      u"Usuarios Enlace"]
712
713    def get_objects(self):
714        self.record_id = self.kwargs.get('record_id', None)
715        try:
716            record = RecursoFisicoCapacitacion.objects.get(fk_recurso_fisico_trabajador=self.record_id)
717        except RecursoFisicoCapacitacion.DoesNotExist:
718            record = None
719        return {
720          'capacitacion': record,
721          'trabajadores': record.fk_recurso_fisico_trabajador if record else None,
722        }
723
724    def forms_valid(self, forms, **kwargs):
725        """
726        Valida el formulario de recursos fisicos trabajadore y capacitación
727        @return: Dirige con un mensaje de exito al registro de proyecto
728        """
729        sub_proyecto = self.kwargs.get('pk', None)
730        try:
731            sub_proye_obj = SubProyecto.objects.get(pk=sub_proyecto, activo=True)
732        except:
733            sub_proye_obj = None
734            messages.erro(self.request, "Esta intentando guardar un recurso \
735                                         Fisico que no posee relacion con \
736                                         algun subproyecto")
737            success_url = reverse_lazy('projects:gestion_proyectos')
738            return redirect(success_url)
739        success_url = reverse_lazy('projects:subproyectos_recursos_fisicos',
740                                   kwargs={'pk': sub_proye_obj.fk_proyecto.pk})
741        nuevo_trabajadores = forms['trabajadores'].save(commit=False)
742        nuevo_trabajadores.fk_subproyecto = sub_proye_obj
743        nuevo_trabajadores.save()
744        capacitaciones = self.form_classes['capacitacion'](self.request.POST, instance=nuevo_trabajadores)
745        if capacitaciones.is_valid():
746            capacitaciones.save()
747            model_capacitacion = ContentType.objects.get_for_model(RecursoFisicoCapacitacion).pk
748            LogEntry.objects.log_action(
749                user_id=self.request.user.id,
750                content_type_id=model_capacitacion,
751                object_id=capacitaciones,
752                object_repr=str(capacitaciones),
753                action_flag=ADDITION)
754        cantidad_empleo_dir_ind = nuevo_trabajadores.empleos_directos + nuevo_trabajadores.empleos_indirectos
755        model_trabajdores = ContentType.objects.get_for_model(RecursoFisicoTrabajadores).pk
756        LogEntry.objects.log_action(
757            user_id=self.request.user.id,
758            content_type_id=model_trabajdores,
759            object_id=nuevo_trabajadores.pk,
760            object_repr=str(cantidad_empleo_dir_ind),
761            action_flag=ADDITION)
762        messages.success(self.request, "El usaurio %s, ha creado con exito,\
763                                        el recurso Fisico para el subproyecto \
764                                        %s" %
765                         (str(self.request.user),
766                          str(sub_proye_obj)))
767        return redirect(success_url)
768
769
770class RecursoFinanIngreRegisterView(LoginRequeridoPerAuth, MultiModelFormView):
771    """!
772    Clase para registrar recursos financieros seccion ingresos
773
774    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
775    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
776    @date 09-01-2017
777    @version 1.0.0
778    """
779    template_name = 'proyectos/recursos_financieros_ingresos_form.html'
780    model = Proyecto
781    form_classes = {
782      'ingresos': FormularioRecurFinIngre,
783      'tablero': FormsetTablaIngreso,
784      'inversion': FormularioRecurFinInv,
785    }
786    success_url = reverse_lazy('projects:crear_subproyectos_tablero')
787    group_required = [u"Administradores", u"Usuarios Supervisores",
788                      u"Usuarios Enlace"]
789
790    def get_context_data(self, **kwargs):
791        """Use this to add extra context."""
792        sub_proyecto = self.kwargs.get('pk', None)
793        try:
794            sub_proyectos = SubProyecto.objects.get(pk=sub_proyecto, activo=True)
795        except:
796            sub_proyectos = None
797        context = super(RecursoFinanIngreRegisterView, self).get_context_data(**kwargs)
798        context['sub_proy'] = sub_proyectos
799        return context
800
801    def forms_valid(self, forms, **kwargs):
802        """
803        Valida el formulario de recursos financieros ingresos e inversión
804        @return: Dirige con un mensaje de exito al registro de proyecto
805        """
806        sub_proyecto = self.kwargs.get('pk', None)
807        try:
808            sub_proyectos = SubProyecto.objects.get(pk=sub_proyecto, activo=True)
809        except:
810            sub_proyectos = None
811        nuevo_ingreso = forms['ingresos'].save(commit=False)
812        nuevo_ingreso.fk_subproyecto = sub_proyectos
813        nuevo_ingreso.save()
814        model_ingreso = ContentType.objects.get_for_model(RecursoFinancieroIngreso).pk
815        LogEntry.objects.log_action(
816            user_id=self.request.user.id,
817            content_type_id=model_ingreso,
818            object_id=nuevo_ingreso.pk,
819            object_repr=str(nuevo_ingreso.organismo),
820            action_flag=ADDITION)
821        nuevo_tablero = self.form_classes['tablero'](self.request.POST, instance=nuevo_ingreso)
822        if nuevo_tablero.is_valid():
823            nuevo_tablero.save()
824            model_tablero = ContentType.objects.get_for_model(TablaIngreso).pk
825            LogEntry.objects.log_action(
826                user_id=self.request.user.id,
827                content_type_id=model_tablero,
828                object_id=nuevo_tablero,
829                object_repr=str(nuevo_tablero),
830                action_flag=ADDITION)
831        nueva_inversion = forms['inversion'].save(commit=False)
832        nueva_inversion.fk_subproyecto = sub_proyectos
833        nueva_inversion.save()
834        model_inversion = ContentType.objects.get_for_model(RecursoFinancieroInversion).pk
835        LogEntry.objects.log_action(
836            user_id=self.request.user.id,
837            content_type_id=model_inversion,
838            object_id=nueva_inversion.pk,
839            object_repr=str(nueva_inversion.nombre),
840            action_flag=ADDITION)
841        messages.success(self.request, "El usaurio %s, ha creado con exito,\
842                                        el recurso Financiero para el subproyecto \
843                                        %s" %
844                         (str(self.request.user),
845                          str(sub_proyectos)))
846        success_url = reverse_lazy('projects:subproyectos_recursos_financieros',
847                                   kwargs={'pk': sub_proyecto})
848        return redirect(success_url)
849
850    def forms_invalid(self, forms, **kwargs):
851        messages.error(self.request, "%s, %s, %s" %
852                       (str(forms['ingresos'].errors),
853                        str(forms['tablero'].errors),
854                        str(forms['inversion'].errors)))
855        return super(RecursoFinanIngreRegisterView, self).forms_invalid(forms)
856
857
858class FinanciamientoInversionAddView(LoginRequeridoPerAuth, FormView):
859    form_class = FormularioRecurFinIngre
860    group_required = [u"Administradores", u"Usuarios Supervisores",
861                      u"Usuarios Enlace"]
862
863    def post(self, request, **kwargs):
864        context = {}
865        sub_proyecto = self.kwargs.get('pk', None)
866        pk_sub = SubProyecto.objects.get(pk=sub_proyecto)
867        add_inversion = self.form_class(request.POST, instance=pk_sub)
868        if add_inversion.is_valid():
869            fuente = str(add_inversion.cleaned_data['fk_financiemiento'])
870            organismo = str(add_inversion.cleaned_data['organismo'])
871            regularidad = str(add_inversion.cleaned_data['fk_regularidad'])
872            items = add_inversion.cleaned_data['num_desembolsos']
873            record = {'fuente': fuente, 'organismo': organismo,
874                      'items': items, 'regularidad': regularidad}
875            context['data'] = {'mensaje': "Se lleno el tablero con %s numeros de desembolsos" % (items), 'validado': True,
876                               'record': record}
877
878            add_inversion.fk_subproyecto = pk_sub.pk
879
880            form_tablero = FormsetTablaIngreso()
881            form_tablero.extra = items-1
882            context['formset_tablero'] = str(form_tablero)
883        else:
884            context['data'] = {'mensaje': "Existe un error en el formulario de ingreso %s" % str(add_inversion.errors.as_data()), 'validado': False}
885        return HttpResponse(json.dumps(context),
886                            content_type="application/json")
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.