source: seiven/gestion_informacion/ajax.py

Last change on this file was 5bd3e39, checked in by edgoldo <edgetrono@…>, 6 años ago

Modificación en consulta del submódulo PIB. Se incluyen las consultas de los submódulos Agregados Monetarios y Tasas de Interés

  • Propiedad mode establecida a 100644
File size: 7.7 KB
Línea 
1"""
2Sistema Estadístico Integral de Venezuela - (SEIVEN)
3
4Copyleft (@) 2015 CENDITEL nodo Mérida - https://mpv.cenditel.gob.ve/seiven
5"""
6## @namespace carga_masiva.ajax
7#
8# Contiene las clases, atributos, métodos y/o funciones a implementar para los modelos del área económica
9# @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
10# @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
11# (CENDITEL) nodo Mérida - Venezuela</a>
12# @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
13from __future__ import unicode_literals, absolute_import
14
15import sys
16from django.http import HttpResponse
17from django.utils.html import format_html
18from django.utils.translation import ugettext_lazy as _
19from django.contrib.auth.decorators import login_required
20from django.core.files.storage import default_storage
21from django.core.files.base import ContentFile
22from django.db import transaction
23from django.apps import apps
24from django.conf import settings
25from pyexcel_io import get_data
26from datetime import datetime
27
28from base.constant import EMAIL_SUBJECT_CM_RESULT
29from base.messages import MSG_NOT_AJAX, MSG_NOT_UPLOAD_FILE, MSG_NOT_DOWNLOAD_FILE
30from gestion_informacion.tasks import cargar_datos_masivos
31
32import logging
33import json
34import pyexcel
35import csv
36import xlwt
37
38from base.functions import enviar_correo
39
40__licence__ = "GNU Public License v2"
41__revision__ = ""
42__docstring__ = "DoxyGen"
43
44logger = logging.getLogger("carga_masiva")
45
46
47@login_required
48def descargar_archivo(request):
49    """!
50    Función que permite construir y descargar un archivo de procesamiento de datos por lostes
51
52    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
53    @author Ing. Luis Barrios (lbarrios at cenditel.gob.ve)
54    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
55    @date 25-05-2017
56    @date 09-08-2017   
57    @param request <b>{object}</b> Objeto que contiene la petición
58    @return Devuelve un HttpResponse con el JSON correspondiente al archivo a descargar
59    """
60
61    ## Nombre de la aplicación o módulo
62    app = request.GET.get('app', None)
63
64    ## Nombre del modelo en el cual se va a buscar la información a incluir en el archivo
65    mod = request.GET.get('mod', None)
66
67    response = HttpResponse(content_type='application/vnd.ms-excel')
68
69    filter = request.GET.get('filter', None)
70
71    if filter:
72        filter = json.loads(filter)
73
74    if app and mod:
75        modelo = apps.get_model(app, mod)
76        workbook = xlwt.Workbook()
77        sheet = workbook.add_sheet("Datos",cell_overwrite_ok=True)
78        instance = modelo()
79        datos = instance.gestion_init(**filter)
80        i = 0
81        for con in datos['fields']:
82            index_col= 0
83            style='align: horiz center; align: vert center;'
84            for cabecera in con:
85                if 'color' in cabecera:   
86                    style += 'pattern: pattern solid, fore_colour %s;' % cabecera['color']
87                if 'text_color' in cabecera:
88                    style += 'font: color %s, bold True;' % cabecera['text_color']
89                font_bold = xlwt.easyxf(style)
90                sheet.write(i, index_col, cabecera['tag'], font_bold)
91               
92                if 'cabecera' in cabecera:
93                    sheet.col(i).width = int (250 * (len(cabecera['tag']) + 1))
94               
95                #Combina Columnas
96                if 'combine' in cabecera and cabecera['combine'] > 0:
97                    sheet.merge(i, i, index_col, (index_col + (cabecera['combine']-1)), font_bold)
98                    index_col = cabecera['combine'] + index_col-1
99               
100                #Establece los Dominios
101                if 'dominio'in cabecera:
102                    sheet.write(i, cabecera['row'], cabecera['tag'], font_bold)
103               
104                #Combina Filas
105                if 'combine_row' in cabecera:
106                    sheet.write_merge(i, i+10, cabecera['row'],cabecera['row'], cabecera['tag'],font_bold)
107                index_col += 1           
108            i += 1
109
110        nombre = app + "_" + datos['output']
111        response['Content-Disposition'] = 'attachment; filename=%s.xls' % nombre
112        workbook.save(response)
113
114    return response
115
116
117@login_required
118@transaction.atomic
119def cargar_datos(request):
120    """!
121    Función para cargar los datos de carga masiva
122
123    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)/ Rodrigo Boet (rboet at cenditel.gob.ve)
124    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
125    @date 11-08-2016
126    @param request <b>{object}</b> Objeto que contiene la petición
127    @return Devuelve un HttpResponse con el JSON correspondiente al estado de la petición
128    """
129    message = ''
130    try:
131        if not request.is_ajax():
132
133            return HttpResponse(json.dumps({'result': False, 'message': str(MSG_NOT_AJAX)}))
134
135        ## Nombre de la aplicación o módulo
136        app = request.POST.get('app', None)
137
138        ## Nombre del modelo en el cual se va a buscar la información a incluir en el archivo
139        mod = request.POST.get('mod', None)
140
141        ## Archivo que se va a cargar
142        archivo = request.FILES['file']
143
144        filter = json.loads("{%s}" % request.POST.get('filter', ''))
145
146        if app and mod and archivo:
147            ## Archivo que se va a cargar
148            archivo = request.FILES['file']
149
150            ## Extensión del archivo a procesar
151            extension = str(archivo).split(".")[-1]
152
153            content = get_data(archivo.read(), extension)
154
155            procesar_datos = cargar_datos_masivos(app=app, mod=mod, user=request.user, file_content=content,**filter)
156           
157            return HttpResponse(json.dumps({
158                'result': True,
159                'message': str(_("Los datos indicados se están cargando, será notificado mediante correo electrónico "
160                               "sobre el resultado de los mismos."))
161            }))
162        return HttpResponse(json.dumps({'result': False, 'message': str(_('Faltan Párametros'))}))
163
164    except Exception as e:
165        message = _("Ocurrió un error en la carga de datos.")
166        if settings.DEBUG:
167            message = str(message) + str(e)
168            import traceback, sys
169            exc_type, exc_value, exc_traceback = sys.exc_info()
170
171    return HttpResponse(json.dumps({'result': False, 'message': str(message)}))
172
173@login_required
174def consultar_datos(request):
175    """!
176    Función que permite realizar consultas de datos, en base al modelo y opciones de filtrado
177
178    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
179    @author Edgar A. Linares (elinares at cenditel.gob.ve)
180    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
181    @date 30-10-2017
182    @param request <b>{object}</b> Objeto que contiene la petición
183    @return Devuelve un HttpResponse con el JSON correspondiente al estado de la petición
184    """
185    message = ''
186    ## Nombre de la aplicación o módulo
187    app = request.GET.get('app', None)
188
189    ## Nombre del modelo al cual se realizará la consulta
190    mod = request.GET.get('mods', None)
191
192    filter = request.GET.get('filter', None)
193
194    if filter:
195        filter = json.loads(filter)
196
197    if app and mod:
198        modelo = apps.get_model(app, mod)
199        instance = modelo()
200        consulta = instance.gestion_query(**filter)
201
202        return HttpResponse(json.dumps({
203            'result': consulta['result'],
204            'message': consulta['message'],
205            'values': consulta['values']
206        }))
207
208    message = "No existe la aplicación o el modelo"
209    return HttpResponse(json.dumps({'result': False, 'message': str(message)}))
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.