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

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

Modificado templates para implementar la funcionalidad del registro de sub-proyectos asociados a un poryecto, preparando modelo de datos para el sub-proyecto.

  • Propiedad mode establecida a 100644
File size: 16.3 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
12from django.conf import settings
13from django.contrib.auth.mixins import LoginRequiredMixin
14from django.contrib import messages
15from django.shortcuts import (
16    render, redirect, render_to_response
17)
18from django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION
19from django.contrib.contenttypes.models import ContentType
20from django.http import HttpResponse, Http404
21from django.template import RequestContext
22from django.core.files.storage import default_storage
23from django.core.files.base import ContentFile
24from django.core.urlresolvers import reverse_lazy, reverse
25from django.views.generic import ListView, TemplateView
26from django.views.generic.detail import DetailView
27from django.views.generic.edit import (
28    CreateView,
29    UpdateView,
30    DeleteView
31)
32from dal import autocomplete
33from multi_form_view import MultiModelFormView
34
35from .utils import (
36    listObjetivoHistoricoNacional, listObjetivoEstrategico,
37    listObjetivoGenerales
38)
39
40from .models import *
41from .forms import *
42
43from utils.forms import (
44    UploadFileForm
45)
46
47from users.utils import (
48    LoginRequeridoPerAuth
49)
50
51from users.models import UserProfile
52
53
54## Carga de datos del archivo csv a la base de datos
55def carga_masiva_csv(ruta_archivo_hist, ruta_archivo_naci, ruta_archivo_estr, ruta_archivo_genr):
56    n_reg_obj_hist = CargaMasivaObjetivosHistoricos.import_from_filename(ruta_archivo_hist)
57    n_reg_obj_naci = CargaMasivaObjetivosNacional.import_from_filename(ruta_archivo_naci)
58    n_reg_obj_estr = CargaMasivaObjetivosEstrategico.import_from_filename(ruta_archivo_estr)
59    n_reg_obj_genr = CargaMasivaObjetivosGeneral.import_from_filename(ruta_archivo_genr)
60
61    return n_reg_obj_hist, n_reg_obj_naci, n_reg_obj_estr, n_reg_obj_genr
62
63
64def cargaObjetivos(request):
65    """!
66    Funcion que permite cargar un archivo csv desde la interfaz del Administrador
67
68    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
69    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
70    @date 09-01-2017
71    @version 1.0.0
72    """
73    form = UploadFileForm()
74    context = {'form': form}
75    if request.method == 'POST':
76        form = UploadFileForm(request.POST, request.FILES)
77        if form.is_valid():
78            archivo_objetivos = request.FILES['cargar']
79            extension_objetivos = str(archivo_objetivos).split('.')
80            longitud_historico = len(extension_objetivos)
81            if extension_objetivos[longitud_historico - 1] == 'csv':
82                data_historico = archivo_objetivos.readlines()
83                formato_cabeceras = False
84                mensaje_error = ""
85                for cabecera_historico in range(0, 1):
86                    separador_historico = data_historico[cabecera_historico].split(b"|")
87                    if (separador_historico[0]).decode('UTF-8') == "OBJETIVOS HISTÓRICOS" \
88                    and (separador_historico[1]).decode('UTF-8') == "OBJETIVOS NACIONALES" and \
89                    (separador_historico[2]).decode('UTF-8') == "OBJETIVOS ESTRATÉGICOS" and \
90                    (separador_historico[3]).decode('UTF-8') == "OBJETIVOS GENERALES\n":
91                        formato_cabeceras = True
92                    else:
93                        formato_cabeceras = False
94                        mensaje_error_historico = "Existe un error en la cabecera del csv, del formato del Plan de la Patria\n"
95            else:
96                mensaje_error = "El formato de archivo debe ser csv"
97                messages.error(request, mensaje_error)
98            if formato_cabeceras:
99                datos_obj = listObjetivoHistoricoNacional(data_historico)
100                datos_obj_est = listObjetivoEstrategico(data_historico, datos_obj[1])
101                datos_obj_gene =listObjetivoGenerales(data_historico, datos_obj_est)
102                archivo_obj_hist = ''.join(datos_obj[0])
103                archivo_obj_naci = ''.join(datos_obj[1])
104                archivo_obj_est = ''.join(datos_obj_est)
105                archivo_obj_gene = ''.join(datos_obj_gene)
106                #path_historico = default_storage.save('tmp/formato_historico.csv', ContentFile(archivo_obj_hist))
107                #path_nacional = default_storage.save('tmp/formato_nacional.csv', ContentFile(archivo_obj_naci))
108                #path_estrategico = default_storage.save('tmp/formato_estrategico.csv', ContentFile(archivo_obj_est))
109                #path_general = default_storage.save('tmp/formato_general.csv', ContentFile(archivo_obj_gene))
110                #ruta_historico = os.path.join(settings.MEDIA_ROOT, path_historico)
111                #ruta_nacional = os.path.join(settings.MEDIA_ROOT, path_nacional)
112                #ruta_estrategico = os.path.join(settings.MEDIA_ROOT, path_estrategico)
113                #ruta_general = os.path.join(settings.MEDIA_ROOT, path_general)
114                #carga_masiva_csv(ruta_historico, ruta_nacional, ruta_estrategico, ruta_general)
115                #path_historico = default_storage.delete('tmp/formato_historico.csv')
116                #path_nacional = default_storage.delete('tmp/formato_nacional.csv')
117                #path_estrategico = default_storage.delete('tmp/formato_estrategico.csv')
118                #path_general = default_storage.delete('tmp/formato_general.csv')
119                messages.success(request, 'La data se cargo con exito')
120            else:
121                messages.error(request, mensaje_error_historico)
122        else:
123            return render(request, 'utils/cargar_historica.html', context)
124
125        context = {'form': form}
126        return render(request, 'utils/cargar_historica.html', context)
127
128    else:
129        return render(request, 'utils/cargar_historica.html', context)
130
131
132class AlcanceAutocomplete(autocomplete.Select2QuerySetView):
133    """!
134    Clase que crea el autocompletado del alcance de los proyectos en un select
135
136    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
137    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
138    @date 09-01-2017
139    @version 1.0.0
140    """
141
142    def get_queryset(self):
143        # No se olvide de filtrar los resultados en función del visitante !
144        if not self.request.user.is_authenticated():
145            return Alcance.objects.none()
146
147        qs = Alcance.objects.all()
148        if self.q:
149            qs = qs.filter(opcion_alcance__istartswith=self.q)
150
151        return qs
152
153class OptionsMangProjectsView(LoginRequeridoPerAuth, TemplateView):
154    """!
155    Lista las opciones para la gestion de proyectos
156
157    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
158    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
159    @date 09-01-2017
160    @version 1.0.0
161    """
162    template_name = "proyectos/gestion_proyectos.html"
163    group_required = [u"Administradores", u"Usuarios Supervisores", u"Usuarios Enlace" ]
164
165    def __init__(self):
166        super(OptionsMangProjectsView, self).__init__()
167
168    def get_context_data(self, **kwargs):
169        """Use this to add extra context."""
170        try:
171            perfil = UserProfile.objects.select_related().get(fk_user=self.request.user.id)
172        except:
173            perfil = None
174        try:
175            proyectos = Proyecto.objects.all()
176        except:
177            proyectos = None
178        context = super(OptionsMangProjectsView, self).get_context_data(**kwargs)
179        context['userprofile'] = perfil
180        context['proyectos'] = proyectos
181        return context
182
183
184
185
186class ProjectsList(LoginRequeridoPerAuth, ListView):
187    """!
188    Clase que lista los proyectos
189
190    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
191    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
192    @date 09-01-2017
193    @version 1.0.0
194    """
195    model = Proyecto
196    success_url = reverse_lazy('projects:consultar_subproyectos')
197    record_id=None
198    group_required = [u"Administradores", u"Usuarios Supervisores", u"Usuarios Enlace" ]
199
200    def __init__(self):
201        super(ProjectsList, self).__init__()
202
203
204    def get_context_data(self, **kwargs):
205        context = super(ProjectsList, self).get_context_data(**kwargs)
206        context['projects_list'] = Proyecto.objects.filter(fk_user=self.request.user.id, activo=True).values("nombre", "pk")
207        for i in context['projects_list']:
208            i["contar_pro"] = SubProyecto.objects.filter(fk_proyecto=i["pk"]).count()
209        return context
210
211
212class ProyectoRegisterView(LoginRequeridoPerAuth, MultiModelFormView):
213    """!
214    Clase para crear los proyectos
215
216    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
217    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
218    @date 09-01-2017
219    @version 1.0.0
220    """
221    template_name = 'proyectos/proyecto_form.html'
222    model = Proyecto
223    form_classes = {
224      'proyecto': FormularioRegProyecto,
225      'obj_proy': FormsetObj,
226      'resp_tec': FormularioRespTec,
227      'resp_gere': FormularioRespGere,
228    }
229    success_url = reverse_lazy('projects:crear_proyectos')
230    record_id=None
231    group_required = [u"Administradores", u"Usuarios Supervisores", u"Usuarios Enlace" ]
232
233    def __init__(self):
234        super(ProyectoRegisterView, self).__init__()
235
236    def get_objects(self):
237        self.record_id = self.kwargs.get('record_id', None)
238        try:
239            record = ObjetivosEspecificosProy.objects.get(fk_proyecto=self.record_id)
240        except ObjetivosEspecificosProy.DoesNotExist:
241            record = None
242        return {
243          'obj_proy': record,
244          'proyecto': record.fk_proyecto if record else None,
245          'resp_tec': record.fk_proyecto if record else None,
246          'resp_gere': record.fk_proyecto if record else None,
247        }
248
249    def get_context_data(self, **kwargs):
250        """Use this to add extra context."""
251        try:
252            perfil = UserProfile.objects.select_related().get(fk_user=self.request.user.id)
253        except:
254            perfil = None
255        try:
256            proyectos = Proyecto.objects.filter(fk_user=self.request.user.id, activo=True)
257        except:
258            proyectos = None
259        context = super(ProyectoRegisterView, self).get_context_data(**kwargs)
260        context['userprofile'] = perfil
261        context['proyectos'] = proyectos
262        return context
263
264    def forms_valid(self, forms, **kwargs):
265        """
266        Valida el formulario del proyecto
267        @return: Dirige con un mensaje de exito al registro de proyecto
268        """
269        nuevo_project = forms['proyecto'].save()
270        objetivo_es = self.form_classes['obj_proy'](self.request.POST, instance=nuevo_project)
271        if objetivo_es.is_valid():
272            objetivo_es.save()
273        nuevo_resp_tec = forms['resp_tec'].save(commit=False)
274        nuevo_resp_gen = forms['resp_gere'].save(commit=False)
275        nuevo_resp_tec.fk_proyecto = nuevo_project
276        nuevo_resp_tec.save()
277        nuevo_resp_gen.fk_proyecto = nuevo_project
278        nuevo_resp_gen.save()
279        model_proyecto = ContentType.objects.get_for_model(Proyecto).pk
280        LogEntry.objects.log_action(
281            user_id=self.request.user.id,
282            content_type_id=model_proyecto,
283            object_id=nuevo_project.pk,
284            object_repr=str(nuevo_project.nombre),
285            action_flag=ADDITION)
286        messages.success(self.request, "El usaurio %s, ha creado con exito,\
287                                        el proyecto %s" %
288                         (str(self.request.user),
289                          str(nuevo_project)))
290        return redirect(self.success_url)
291
292    def forms_invalid(self, forms, **kwargs):
293        messages.error(self.request, "%s, %s, %s, %s" %
294                       (str(forms['proyecto'].errors.as_data()),
295                        str(forms['obj_proy'].errors.as_data()),
296                        str(forms['resp_tec'].errors.as_data()),
297                        str(forms['resp_gere'].errors.as_data())))
298        return super(ProyectoRegisterView, self).forms_invalid(forms)
299
300
301class ProyectoUpdate(UpdateView):
302    """!
303    Clase para editar o actualizar un proyecto
304
305    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
306    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
307    @date 09-01-2017
308    @version 1.0.0
309    """
310    model = Proyecto
311    success_url = reverse_lazy('projects:consultar_proyectos')
312    fields = [
313                'fk_alcance', 'fk_sector', 'codigo', 'nombre',
314                'justificacion', 'objetivo_general',
315                'objetivos_especificos', 'monto_proyecto', 'fecha_inicio',
316                'fecha_culminacion'
317             ]
318
319
320class SubProjectsList(ListView):
321    """!
322    Clase para listar o consultar los subproyectos
323
324    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
325    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
326    @date 09-01-2017
327    @version 1.0.0
328    """
329    model = SubProyecto
330
331    def __init__(self):
332        super(SubProjectsList, self).__init__()
333
334
335class SubProyectoCreation(CreateView):
336    """!
337    Clase que crear los subproyectos
338
339    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
340    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
341    @date 09-01-2017
342    @version 1.0.0
343    """
344    model = SubProyecto
345    success_url = reverse_lazy('projects:consultar_subproyectos')
346    fields = [
347                'fk_proyecto', 'parroquia', 'codigo', 'nombre',
348                'descripcion_bien_servicio', 'unidad_medida',
349                'meta', 'fecha_inicio', 'fecha_culminacion', 'comunidad',
350                'monto_subproyecto'
351             ]
352
353
354class SubProyectoUpdate(UpdateView):
355    """!
356    Clase que permite actualizar o editar los subproyectos
357
358    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
359    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
360    @date 09-01-2017
361    @version 1.0.0
362    """
363    model = SubProyecto
364    success_url = reverse_lazy('projects:consultar_subproyectos')
365    fields = [
366                'fk_proyecto', 'parroquia', 'codigo', 'nombre',
367                'descripcion_bien_servicio', 'unidad_medida',
368                'meta', 'fecha_inicio', 'fecha_culminacion', 'comunidad',
369                'monto_subproyecto'
370             ]
371
372
373class ActividadList(ListView):
374    """!
375    Clase que permite listar o consular las actividades
376
377    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
378    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
379    @date 09-01-2017
380    @version 1.0.0
381    """
382    model = Actividad
383
384    def __init__(self):
385        super(ActividadList, self).__init__()
386
387
388class ActividadCreation(CreateView):
389    """!
390    Clase que permite crear las actividades
391
392    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
393    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
394    @date 09-01-2017
395    @version 1.0.0
396    """
397    model = Actividad
398    success_url = reverse_lazy('projects:consultar_actividades')
399    fields = [
400                'fk_subproyecto', 'descripcion', 'unidad_medida', 'fecha_inicio',
401                'fecha_culminacion', 'horas_estimadas_ejecucion',
402                'costo_estimadao_ejecucion', 'peso_actividad',
403                'cantidad_estimada_trabajo'
404             ]
405
406
407class ActividadUpdate(UpdateView):
408    """!
409    Clase que permite actualizar o editar las actividades
410
411    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
412    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
413    @date 09-01-2017
414    @version 1.0.0
415    """
416    success_url = reverse_lazy('projects:consultar_actividades')
417    fields = [
418                'fk_subproyecto', 'descripcion', 'unidad_medida', 'fecha_inicio',
419                'fecha_culminacion', 'horas_estimadas_ejecucion',
420                'costo_estimadao_ejecucion', 'peso_actividad',
421                'cantidad_estimada_trabajo'
422             ]
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.