source: seiven/gestion_informacion/ajax.py @ 2037da0

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

Modificado la carga masiva

  • Propiedad mode establecida a 100644
File size: 6.0 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")
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;'
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                if 'cabecera' in cabecera:
90                    sheet.col(i).width = int (333 * (len(cabecera['tag']) + 1))
91                index_col += 1
92            i += 1
93
94        nombre = app + "_" + datos['output']
95        response['Content-Disposition'] = 'attachment; filename=%s.xls' % nombre
96        workbook.save(response)
97
98    return response
99
100
101@login_required
102@transaction.atomic
103def cargar_datos(request):
104    """!
105    Función para cargar los datos de carga masiva
106
107    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)/ Rodrigo Boet (rboet at cenditel.gob.ve)
108    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
109    @date 11-08-2016
110    @param request <b>{object}</b> Objeto que contiene la petición
111    @return Devuelve un HttpResponse con el JSON correspondiente al estado de la petición
112    """
113    message = ''
114    try:
115        if not request.is_ajax():
116
117            return HttpResponse(json.dumps({'result': False, 'message': str(MSG_NOT_AJAX)}))
118
119        ## Nombre de la aplicación o módulo
120        app = request.POST.get('app', None)
121
122        ## Nombre del modelo en el cual se va a buscar la información a incluir en el archivo
123        mod = request.POST.get('mod', None)
124
125        ## Archivo que se va a cargar
126        archivo = request.FILES['file']
127
128        filter = json.loads("{%s}" % request.POST.get('filter', ''))
129
130        if app and mod and archivo:
131            ## Archivo que se va a cargar
132            archivo = request.FILES['file']
133
134            ## Extensión del archivo a procesar
135            extension = str(archivo).split(".")[-1]
136
137            content = get_data(archivo.read(), extension)
138
139            procesar_datos = cargar_datos_masivos(app=app, mod=mod, user=request.user, file_content=content,**filter)
140           
141            return HttpResponse(json.dumps({
142                'result': True,
143                'message': str(_("Los datos indicados se están cargando, será notificado mediante correo electrónico "
144                               "sobre el resultado de los mismos. El tiempo estimado sobre los resultados dependerá de "
145                               "la cantidad de datos suministrados en el archivo. Por favor sea paciente. "
146                               "En caso de no haber recibido respuesta en más de 24 hrs., por favor intente nuevamente "
147                               "o contacte al administrador del sistema."))
148            }))
149        return HttpResponse(json.dumps({'result': False, 'message': str(_('Faltan Párametros'))}))
150
151    except Exception as e:
152        message = _("Ocurrió un error en la carga de datos.")
153        if settings.DEBUG:
154            message = str(message) + str(e)
155            import traceback, sys
156            exc_type, exc_value, exc_traceback = sys.exc_info()
157
158    return HttpResponse(json.dumps({'result': False, 'message': str(message)}))
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.