source: seiven/gestion_informacion/ajax.py @ c079de3

Last change on this file since c079de3 was c079de3, checked in by Luis Barrios <nikeven@…>, 7 años ago

modificada descarga de archivo para precios

  • Propiedad mode establecida a 100644
File size: 6.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    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
54    @date 25-05-2017
55    @param request <b>{object}</b> Objeto que contiene la petición
56    @return Devuelve un HttpResponse con el JSON correspondiente al archivo a descargar
57    """
58
59    ## Nombre de la aplicación o módulo
60    app = request.GET.get('app', None)
61
62    ## Nombre del modelo en el cual se va a buscar la información a incluir en el archivo
63    mod = request.GET.get('mod', None)
64
65    response = HttpResponse(content_type='application/vnd.ms-excel')
66
67    filter = request.GET.get('filter', None)
68
69    if filter:
70        filter = json.loads(filter)
71
72    if app and mod:
73        modelo = apps.get_model(app, mod)
74        workbook = xlwt.Workbook()
75        sheet = workbook.add_sheet("Datos",cell_overwrite_ok=True)
76        instance = modelo()
77        datos = instance.gestion_init(**filter)
78        i = 0
79        for con in datos['fields']:
80            index_col= 0
81            style='align: horiz center; align: vert center;'
82            for cabecera in con:
83                if 'color' in cabecera:   
84                    style += 'pattern: pattern solid, fore_colour %s;' % cabecera['color']
85                if 'text_color' in cabecera:
86                    style += 'font: color %s, bold True;' % cabecera['text_color']
87                font_bold = xlwt.easyxf(style)
88                sheet.write(i, index_col, cabecera['tag'], font_bold)
89                sheet.set_shrink()
90               
91                if 'cabecera' in cabecera:
92                    sheet.col(i).width = int (333 * (len(cabecera['tag']) + 1))
93               
94                if 'combine' in cabecera and cabecera['combine'] > 0:
95                    sheet.merge(i, i, index_col, (index_col + (cabecera['combine']-1)), font_bold)
96                    index_col = cabecera['combine'] + index_col
97
98                if 'dominio'in cabecera:
99                    sheet.write(i, 2, cabecera['tag'], font_bold)
100                if 'combine_row' in cabecera:
101                    sheet.write_merge(i, i+10, 0,0, cabecera['tag'],font_bold)
102                if 'combine_row1' in cabecera:
103                    sheet.write_merge(i, i+10, 1,1, cabecera['tag'],font_bold)
104                else:
105                    index_col += 1           
106            i += 1
107
108        nombre = app + "_" + datos['output']
109        response['Content-Disposition'] = 'attachment; filename=%s.xls' % nombre
110        workbook.save(response)
111
112    return response
113
114
115@login_required
116@transaction.atomic
117def cargar_datos(request):
118    """!
119    Función para cargar los datos de carga masiva
120
121    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)/ Rodrigo Boet (rboet at cenditel.gob.ve)
122    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
123    @date 11-08-2016
124    @param request <b>{object}</b> Objeto que contiene la petición
125    @return Devuelve un HttpResponse con el JSON correspondiente al estado de la petición
126    """
127    message = ''
128    try:
129        if not request.is_ajax():
130
131            return HttpResponse(json.dumps({'result': False, 'message': str(MSG_NOT_AJAX)}))
132
133        ## Nombre de la aplicación o módulo
134        app = request.POST.get('app', None)
135
136        ## Nombre del modelo en el cual se va a buscar la información a incluir en el archivo
137        mod = request.POST.get('mod', None)
138
139        ## Archivo que se va a cargar
140        archivo = request.FILES['file']
141
142        filter = json.loads("{%s}" % request.POST.get('filter', ''))
143
144        if app and mod and archivo:
145            ## Archivo que se va a cargar
146            archivo = request.FILES['file']
147
148            ## Extensión del archivo a procesar
149            extension = str(archivo).split(".")[-1]
150
151            content = get_data(archivo.read(), extension)
152
153            procesar_datos = cargar_datos_masivos(app=app, mod=mod, user=request.user, file_content=content,**filter)
154           
155            return HttpResponse(json.dumps({
156                'result': True,
157                'message': str(_("Los datos indicados se están cargando, será notificado mediante correo electrónico "
158                               "sobre el resultado de los mismos. El tiempo estimado sobre los resultados dependerá de "
159                               "la cantidad de datos suministrados en el archivo. Por favor sea paciente. "
160                               "En caso de no haber recibido respuesta en más de 24 hrs., por favor intente nuevamente "
161                               "o contacte al administrador del sistema."))
162            }))
163        return HttpResponse(json.dumps({'result': False, 'message': str(_('Faltan Párametros'))}))
164
165    except Exception as e:
166        message = _("Ocurrió un error en la carga de datos.")
167        if settings.DEBUG:
168            message = str(message) + str(e)
169            import traceback, sys
170            exc_type, exc_value, exc_traceback = sys.exc_info()
171
172    return HttpResponse(json.dumps({'result': False, 'message': str(message)}))
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.