source: seguimiento_proyectos/sepai/proyectos/views.py @ 8c18ab8

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

Implementado logs para cuando se genere un proyecto

  • Propiedad mode establecida a 100644
File size: 15.7 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(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
197    def __init__(self):
198        super(ProjectsList, self).__init__()
199
200
201class ProyectoRegisterView(LoginRequeridoPerAuth, MultiModelFormView):
202    """!
203    Clase para crear los proyectos
204
205    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
206    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
207    @date 09-01-2017
208    @version 1.0.0
209    """
210    template_name = 'proyectos/proyecto_form.html'
211    model = Proyecto
212    form_classes = {
213      'proyecto': FormularioRegProyecto,
214      'obj_proy': FormsetObj,
215      'resp_tec': FormularioRespTec,
216      'resp_gere': FormularioRespGere,
217    }
218    success_url = reverse_lazy('projects:crear_proyectos')
219    record_id=None
220    group_required = [u"Administradores", u"Usuarios Supervisores", u"Usuarios Enlace" ]
221
222    def __init__(self):
223        super(ProyectoRegisterView, self).__init__()
224
225    def get_objects(self):
226        self.record_id = self.kwargs.get('record_id', None)
227        try:
228            record = ObjetivosEspecificosProy.objects.get(fk_proyecto=self.record_id)
229        except ObjetivosEspecificosProy.DoesNotExist:
230            record = None
231        return {
232          'obj_proy': record,
233          'proyecto': record.fk_proyecto if record else None,
234          'resp_tec': record.fk_proyecto if record else None,
235          'resp_gere': record.fk_proyecto if record else None,
236        }
237
238    def get_context_data(self, **kwargs):
239        """Use this to add extra context."""
240        try:
241            perfil = UserProfile.objects.select_related().get(fk_user=self.request.user.id)
242        except:
243            perfil = None
244        try:
245            proyectos = Proyecto.objects.all()
246        except:
247            proyectos = None
248        context = super(ProyectoRegisterView, self).get_context_data(**kwargs)
249        context['userprofile'] = perfil
250        context['proyectos'] = proyectos
251        return context
252
253    def forms_valid(self, forms, **kwargs):
254        """
255        Valida el formulario del proyecto
256        @return: Dirige con un mensaje de exito al registro de proyecto
257        """
258        nuevo_project = forms['proyecto'].save()
259        objetivo_es = self.form_classes['obj_proy'](self.request.POST, instance=nuevo_project)
260        if objetivo_es.is_valid():
261            objetivo_es.save()
262        nuevo_resp_tec = forms['resp_tec'].save(commit=False)
263        nuevo_resp_gen = forms['resp_gere'].save(commit=False)
264        nuevo_resp_tec.fk_proyecto = nuevo_project
265        nuevo_resp_tec.save()
266        nuevo_resp_gen.fk_proyecto = nuevo_project
267        nuevo_resp_gen.save()
268        model_proyecto = ContentType.objects.get_for_model(Proyecto).pk
269        LogEntry.objects.log_action(
270            user_id=self.request.user.id,
271            content_type_id=model_proyecto,
272            object_id=nuevo_project.pk,
273            object_repr=str(nuevo_project.nombre),
274            action_flag=ADDITION)
275        messages.success(self.request, "El usaurio %s, ha creado con exito,\
276                                        el proyecto %s" %
277                         (str(self.request.user),
278                          str(nuevo_project)))
279        return redirect(self.success_url)
280
281    def forms_invalid(self, forms, **kwargs):
282        messages.error(self.request, "%s, %s, %s, %s" %
283                       (str(forms['proyecto'].errors.as_data()),
284                        str(forms['obj_proy'].errors.as_data()),
285                        str(forms['resp_tec'].errors.as_data()),
286                        str(forms['resp_gere'].errors.as_data())))
287        return super(ProyectoRegisterView, self).forms_invalid(forms)
288
289
290class ProyectoUpdate(UpdateView):
291    """!
292    Clase para editar o actualizar un proyecto
293
294    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
295    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
296    @date 09-01-2017
297    @version 1.0.0
298    """
299    model = Proyecto
300    success_url = reverse_lazy('projects:consultar_proyectos')
301    fields = [
302                'fk_alcance', 'fk_sector', 'codigo', 'nombre',
303                'justificacion', 'objetivo_general',
304                'objetivos_especificos', 'monto_proyecto', 'fecha_inicio',
305                'fecha_culminacion'
306             ]
307
308
309class SubProjectsList(ListView):
310    """!
311    Clase para listar o consultar los subproyectos
312
313    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
314    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
315    @date 09-01-2017
316    @version 1.0.0
317    """
318    model = SubProyecto
319
320    def __init__(self):
321        super(SubProjectsList, self).__init__()
322
323
324class SubProyectoCreation(CreateView):
325    """!
326    Clase que crear los subproyectos
327
328    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
329    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
330    @date 09-01-2017
331    @version 1.0.0
332    """
333    model = SubProyecto
334    success_url = reverse_lazy('projects:consultar_subproyectos')
335    fields = [
336                'fk_proyecto', 'parroquia', 'codigo', 'nombre',
337                'descripcion_bien_servicio', 'unidad_medida',
338                'meta', 'fecha_inicio', 'fecha_culminacion', 'comunidad',
339                'monto_subproyecto'
340             ]
341
342
343class SubProyectoUpdate(UpdateView):
344    """!
345    Clase que permite actualizar o editar los subproyectos
346
347    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
348    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
349    @date 09-01-2017
350    @version 1.0.0
351    """
352    model = SubProyecto
353    success_url = reverse_lazy('projects:consultar_subproyectos')
354    fields = [
355                'fk_proyecto', 'parroquia', 'codigo', 'nombre',
356                'descripcion_bien_servicio', 'unidad_medida',
357                'meta', 'fecha_inicio', 'fecha_culminacion', 'comunidad',
358                'monto_subproyecto'
359             ]
360
361
362class ActividadList(ListView):
363    """!
364    Clase que permite listar o consular las actividades
365
366    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
367    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
368    @date 09-01-2017
369    @version 1.0.0
370    """
371    model = Actividad
372
373    def __init__(self):
374        super(ActividadList, self).__init__()
375
376
377class ActividadCreation(CreateView):
378    """!
379    Clase que permite crear las actividades
380
381    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
382    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
383    @date 09-01-2017
384    @version 1.0.0
385    """
386    model = Actividad
387    success_url = reverse_lazy('projects:consultar_actividades')
388    fields = [
389                'fk_subproyecto', 'descripcion', 'unidad_medida', 'fecha_inicio',
390                'fecha_culminacion', 'horas_estimadas_ejecucion',
391                'costo_estimadao_ejecucion', 'peso_actividad',
392                'cantidad_estimada_trabajo'
393             ]
394
395
396class ActividadUpdate(UpdateView):
397    """!
398    Clase que permite actualizar o editar las actividades
399
400    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
401    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
402    @date 09-01-2017
403    @version 1.0.0
404    """
405    success_url = reverse_lazy('projects:consultar_actividades')
406    fields = [
407                'fk_subproyecto', 'descripcion', 'unidad_medida', 'fecha_inicio',
408                'fecha_culminacion', 'horas_estimadas_ejecucion',
409                'costo_estimadao_ejecucion', 'peso_actividad',
410                'cantidad_estimada_trabajo'
411             ]
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.