Conjunto de cambios 2037da0 en seiven para gestion_informacion


Ignorar:
Fecha y hora:
22/06/2017 10:03:11 (hace 7 años)
Autor:
Luis Barrios <nikeven@…>
Branches:
master, carga
Children:
0c669e7
Parents:
47a9788
Mensaje:

Modificado la carga masiva

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"""
     2Sistema Estadístico Integral de Venezuela - (SEIVEN)
    23
    3 # Register your models here.
     4Copyleft (@) 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>
     12from __future__ import unicode_literals
     13
     14__licence__ = "GNU Public License v2"
     15__revision__ = ""
     16__docstring__ = "DoxyGen"
  • gestion_informacion/ajax.py

    r17dcd3a r2037da0  
    44Copyleft (@) 2015 CENDITEL nodo Mérida - https://mpv.cenditel.gob.ve/seiven
    55"""
    6 ## @namespace gestion_informacion.ajax
     6## @namespace carga_masiva.ajax
    77#
    8 # Contiene las clases, atributos, métodos y/o funciones a implementar para la gestión de información
     8# Contiene las clases, atributos, métodos y/o funciones a implementar para los modelos del área económica
    99# @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
    1010# @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
     
    1313from __future__ import unicode_literals, absolute_import
    1414
    15 import os
    16 
     15import sys
    1716from django.http import HttpResponse
     17from django.utils.html import format_html
     18from django.utils.translation import ugettext_lazy as _
    1819from 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
    1923from django.apps import apps
    2024from django.conf import settings
    21 from django.core.files.storage import default_storage
    22 from django.core.files.base import ContentFile
     25from pyexcel_io import get_data
     26from datetime import datetime
    2327
    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 )
     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
    2831
    2932import logging
    3033import json
     34import pyexcel
     35import csv
    3136import xlwt
     37
     38from base.functions import enviar_correo
    3239
    3340__licence__ = "GNU Public License v2"
     
    3542__docstring__ = "DoxyGen"
    3643
     44logger = logging.getLogger("carga_masiva")
    3745
    38 logger = logging.getLogger("carga_masiva")
    3946
    4047@login_required
     
    4552    @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
    4653    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
    47     @date 03-11-2016
     54    @date 25-05-2017
    4855    @param request <b>{object}</b> Objeto que contiene la petición
    4956    @return Devuelve un HttpResponse con el JSON correspondiente al archivo a descargar
    5057    """
    51     try:
    52         if not request.is_ajax():
    53             return HttpResponse(json.dumps({'result': False, 'message': str(MSG_NOT_AJAX)}))
    5458
    55         ## Nombre de la aplicación o módulo
    56         app = request.GET.get('app', None)
     59    ## Nombre de la aplicación o módulo
     60    app = request.GET.get('app', None)
    5761
    58         ## Nombre del modelo en el cual se va a buscar la información a incluir en el archivo
    59         mod = request.GET.get('mod', None)
     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)
    6064
    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')
    6366
    64         if filter:
    65             filter = json.loads(filter)
     67    filter = request.GET.get('filter', None)
    6668
    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)
    7371
    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
    8793
    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)
    9497
    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
    11499
    115100
    116101@login_required
    117 def cargar_archivo(request):
     102@transaction.atomic
     103def cargar_datos(request):
    118104    """!
    119     Función que permite cargar datos en la aplicacion
     105    Función para cargar los datos de carga masiva
    120106
    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)
    122108    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
    123     @date 07-12-2016
     109    @date 11-08-2016
    124110    @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 datos
     111    @return Devuelve un HttpResponse con el JSON correspondiente al estado de la petición
    126112    """
     113    message = ''
    127114    try:
    128115        if not request.is_ajax():
     116
    129117            return HttpResponse(json.dumps({'result': False, 'message': str(MSG_NOT_AJAX)}))
    130118
     
    135123        mod = request.POST.get('mod', None)
    136124
    137         ## Filtro para el registro de datos
     125        ## Archivo que se va a cargar
     126        archivo = request.FILES['file']
     127
    138128        filter = json.loads("{%s}" % request.POST.get('filter', ''))
    139129
    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']
    142133
    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]
    147136
    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)
    151138
    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'))}))
    154150
    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()
    157157
    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  
    44Copyleft (@) 2015 CENDITEL nodo Mérida - https://mpv.cenditel.gob.ve/seiven
    55"""
    6 ## @namespace gestion_informacion.urls
     6## @namespace carga_masiva.urls
    77#
    8 # Contiene las urls del módulo para la gestión de información
     8# Contiene las clases, atributos, métodos y/o funciones a implementar para los modelos del área económica
    99# @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)
    1010# @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
     
    1313from __future__ import unicode_literals
    1414from django.conf.urls import url
    15 from . import ajax as gestion_ajax
    1615
     16from .ajax import descargar_archivo, cargar_datos
    1717
    18 urlpatterns = [
    19 
    20 ]
    21 
     18__licence__ = "GNU Public License v2"
     19__revision__ = ""
     20__docstring__ = "DoxyGen"
    2221
    2322## 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'),
     23urlpatterns = [
     24    url(r'^ajax/descargar_archivo/?$', descargar_archivo, name='cm_descargar_archivo'),
     25    url(r'^ajax/cargar_datos/?$', cargar_datos, name='cm_cargar_datos'),
    2726]
Nota: Vea TracChangeset para ayuda en el uso del visor de conjuntos de cambios.