Conjunto de cambios 2037da0 en seiven para gestion_informacion
- Fecha y hora:
- 22/06/2017 10:03:11 (hace 7 años)
- Branches:
- master, carga
- Children:
- 0c669e7
- Parents:
- 47a9788
- Ubicación:
- gestion_informacion
- Ficheros:
-
- 1 añadido
- 3 editados
Leyenda
- No modificado
- Añadido
- Eliminado
-
gestion_informacion/admin.py
r38a0912 r2037da0 1 from django.contrib import admin 1 """ 2 Sistema Estadístico Integral de Venezuela - (SEIVEN) 2 3 3 # Register your models here. 4 Copyleft (@) 2015 CENDITEL nodo Mérida - https://mpv.cenditel.gob.ve/seiven 5 """ 6 ## @namespace carga_masiva.admin# 7 # Contiene las clases, atributos, métodos y/o funciones a implementar para los modelos del área económica 8 # @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) 9 # @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres 10 # (CENDITEL) nodo Mérida - Venezuela</a> 11 # @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> 12 from __future__ import unicode_literals 13 14 __licence__ = "GNU Public License v2" 15 __revision__ = "" 16 __docstring__ = "DoxyGen" -
gestion_informacion/ajax.py
r17dcd3a r2037da0 4 4 Copyleft (@) 2015 CENDITEL nodo Mérida - https://mpv.cenditel.gob.ve/seiven 5 5 """ 6 ## @namespace gestion_informacion.ajax6 ## @namespace carga_masiva.ajax 7 7 # 8 # Contiene las clases, atributos, métodos y/o funciones a implementar para l a gestión de información8 # Contiene las clases, atributos, métodos y/o funciones a implementar para los modelos del área económica 9 9 # @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) 10 10 # @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres … … 13 13 from __future__ import unicode_literals, absolute_import 14 14 15 import os 16 15 import sys 17 16 from django.http import HttpResponse 17 from django.utils.html import format_html 18 from django.utils.translation import ugettext_lazy as _ 18 19 from django.contrib.auth.decorators import login_required 20 from django.core.files.storage import default_storage 21 from django.core.files.base import ContentFile 22 from django.db import transaction 19 23 from django.apps import apps 20 24 from django.conf import settings 21 from django.core.files.storage import default_storage22 from d jango.core.files.base import ContentFile25 from pyexcel_io import get_data 26 from datetime import datetime 23 27 24 from base.messages import ( 25 MSG_NOT_AJAX, MSG_NOT_DOWNLOAD_FILE, MSG_NOT_UPLOAD_FILE, MSG_UPLOAD_FILE_SUCCESS, MSG_CREATED_FILE_SUCCESS, 26 MSG_CREATED_FILE_ERROR 27 ) 28 from base.constant import EMAIL_SUBJECT_CM_RESULT 29 from base.messages import MSG_NOT_AJAX, MSG_NOT_UPLOAD_FILE, MSG_NOT_DOWNLOAD_FILE 30 from gestion_informacion.tasks import cargar_datos_masivos 28 31 29 32 import logging 30 33 import json 34 import pyexcel 35 import csv 31 36 import xlwt 37 38 from base.functions import enviar_correo 32 39 33 40 __licence__ = "GNU Public License v2" … … 35 42 __docstring__ = "DoxyGen" 36 43 44 logger = logging.getLogger("carga_masiva") 37 45 38 logger = logging.getLogger("carga_masiva")39 46 40 47 @login_required … … 45 52 @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) 46 53 @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> 47 @date 03-11-201654 @date 25-05-2017 48 55 @param request <b>{object}</b> Objeto que contiene la petición 49 56 @return Devuelve un HttpResponse con el JSON correspondiente al archivo a descargar 50 57 """ 51 try:52 if not request.is_ajax():53 return HttpResponse(json.dumps({'result': False, 'message': str(MSG_NOT_AJAX)}))54 58 55 56 59 ## Nombre de la aplicación o módulo 60 app = request.GET.get('app', None) 57 61 58 59 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) 60 64 61 ## Filtro para la consulta de datos a descargar 62 filter = request.GET.get('filter', None) 65 response = HttpResponse(content_type='application/vnd.ms-excel') 63 66 64 if filter: 65 filter = json.loads(filter) 67 filter = request.GET.get('filter', None) 66 68 67 if app and mod: 68 modelo = apps.get_model(app, mod) 69 workbook = xlwt.Workbook() 70 sheet = workbook.add_sheet("Datos", cell_overwrite_ok=True) 71 instance = modelo() 72 contenido = instance.gestion_init(**filter) 69 if filter: 70 filter = json.loads(filter) 73 71 74 row = 0 75 ## Loop que permite agregar datos al archivo a descargar 76 for con in contenido['fields']: 77 index_col, style = 0, 'align: horiz center;' 78 for col in con: 79 if 'color' in col: 80 style += 'pattern: pattern solid, fore_colour %s;' % col['color'] 81 if 'text_color' in col: 82 style += 'font: color %s, bold True;' % col['text_color'] 83 custom_style = xlwt.easyxf(style) 84 sheet.write(row, index_col, col['tag'], custom_style) 85 if 'cabecera' in col: 86 sheet.col(index_col).width = int(333 * (len(col['tag']) + 1)) 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 87 93 88 if 'combine' in col and col['combine'] > 0: 89 sheet.merge(row, row, index_col, (index_col + (col['combine']-1)), custom_style) 90 index_col = col['combine'] + index_col 91 else: 92 index_col += 1 93 row += 1 94 nombre = app + "_" + datos['output'] 95 response['Content-Disposition'] = 'attachment; filename=%s.xls' % nombre 96 workbook.save(response) 94 97 95 # Ruta y nombre del archivo a generar 96 archivo = "%s/%s.xls" % (settings.GESTION_INFORMACION_FILES, contenido['output']) 97 98 # Guarda el contenido de la hoja de cálculo al archivo indicado 99 workbook.save(archivo) 100 101 # Nombre del archivo a utilizar para la descarga 102 open_file = "%s.xls" % contenido['output'] 103 104 return HttpResponse(json.dumps({ 105 'resultado': True, 'archivo': open_file, 'message': str(MSG_CREATED_FILE_SUCCESS) 106 })) 107 108 return HttpResponse(json.dumps({'resultado': False, 'error': str(MSG_NOT_DOWNLOAD_FILE)})) 109 except Exception as e: 110 message = MSG_CREATED_FILE_ERROR 111 if settings.DEBUG: 112 message = "%s. ERROR: %s" % (message, e) 113 return HttpResponse(json.dumps({'result': False, 'error': str(message)})) 98 return response 114 99 115 100 116 101 @login_required 117 def cargar_archivo(request): 102 @transaction.atomic 103 def cargar_datos(request): 118 104 """! 119 Función que permite cargar datos en la aplicacion105 Función para cargar los datos de carga masiva 120 106 121 @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) 107 @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)/ Rodrigo Boet (rboet at cenditel.gob.ve) 122 108 @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> 123 @date 07-12-2016109 @date 11-08-2016 124 110 @param request <b>{object}</b> Objeto que contiene la petición 125 @return Devuelve un HttpResponse con el JSON correspondiente al resultado en la carga de datos111 @return Devuelve un HttpResponse con el JSON correspondiente al estado de la petición 126 112 """ 113 message = '' 127 114 try: 128 115 if not request.is_ajax(): 116 129 117 return HttpResponse(json.dumps({'result': False, 'message': str(MSG_NOT_AJAX)})) 130 118 … … 135 123 mod = request.POST.get('mod', None) 136 124 137 ## Filtro para el registro de datos 125 ## Archivo que se va a cargar 126 archivo = request.FILES['file'] 127 138 128 filter = json.loads("{%s}" % request.POST.get('filter', '')) 139 129 140 ## Archivo con los datos a procesar 141 file = request.FILES['file'] 130 if app and mod and archivo: 131 ## Archivo que se va a cargar 132 archivo = request.FILES['file'] 142 133 143 ## Codición que evalúa si se procede a registrar datos 144 if app and mod and file: 145 ruta = '%s/%s' % (settings.GESTION_INFORMACION_FILES, str(file)) 146 archivo = default_storage.save(ruta, ContentFile(file.read())) 134 ## Extensión del archivo a procesar 135 extension = str(archivo).split(".")[-1] 147 136 148 modelo = apps.get_model(app, mod) 149 instance = modelo() 150 process = instance.gestion_process(archivo, request.user, **filter) 137 content = get_data(archivo.read(), extension) 151 138 152 # elimina el archivo después de cargar los datos 153 os.unlink(ruta) 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'))})) 154 150 155 if process['result']: 156 return HttpResponse(json.dumps({'result': True, 'message': str(MSG_UPLOAD_FILE_SUCCESS)})) 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 157 158 return HttpResponse(json.dumps({'result': False, 'message': process['message']})) 159 160 return HttpResponse(json.dumps({'result': True, 'message': str(MSG_UPLOAD_FILE_SUCCESS)})) 161 except Exception as e: 162 message = MSG_NOT_UPLOAD_FILE 163 if settings.DEBUG: 164 message = "%s. ERROR: %s" % (message, e) 165 return HttpResponse(json.dumps({'result': False, 'error': str(message)})) 158 return HttpResponse(json.dumps({'result': False, 'message': str(message)})) -
gestion_informacion/urls.py
ref6d66a r2037da0 4 4 Copyleft (@) 2015 CENDITEL nodo Mérida - https://mpv.cenditel.gob.ve/seiven 5 5 """ 6 ## @namespace gestion_informacion.urls6 ## @namespace carga_masiva.urls 7 7 # 8 # Contiene las urls del módulo para la gestión de información8 # Contiene las clases, atributos, métodos y/o funciones a implementar para los modelos del área económica 9 9 # @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) 10 10 # @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres … … 13 13 from __future__ import unicode_literals 14 14 from django.conf.urls import url 15 from . import ajax as gestion_ajax16 15 16 from .ajax import descargar_archivo, cargar_datos 17 17 18 urlpatterns = [ 19 20 ] 21 18 __licence__ = "GNU Public License v2" 19 __revision__ = "" 20 __docstring__ = "DoxyGen" 22 21 23 22 ## URLs de peticiones AJAX 24 urlpatterns += [25 url(r'^ajax/descargar_archivo/?$', gestion_ajax.descargar_archivo, name='descargar_archivo'),26 url(r'^ajax/cargar_ archivo/?$', gestion_ajax.cargar_archivo, name='cargar_archivo'),23 urlpatterns = [ 24 url(r'^ajax/descargar_archivo/?$', descargar_archivo, name='cm_descargar_archivo'), 25 url(r'^ajax/cargar_datos/?$', cargar_datos, name='cm_cargar_datos'), 27 26 ]
Nota: Vea TracChangeset
para ayuda en el uso del visor de conjuntos de cambios.