Conjunto de cambios e9477bd en seiven para economico


Ignorar:
Fecha y hora:
08/12/2016 17:14:04 (hace 7 años)
Autor:
Ing. Roldan D. Vargas G <rvargas@…>
Branches:
master, carga
Children:
2b509cc
Parents:
dc618c3
Mensaje:

carga de datos en el modelo de precios. se agrega función lambda para chequear el dato numérico de un campo. Se agrega plantilla de correo con información de la carga de datos. Instrucciones javascript para descargar y cargar archivos

Ubicación:
economico
Ficheros:
2 editados

Leyenda

No modificado
Añadido
Eliminado
  • economico/models.py

    ref6d66a re9477bd  
    1515from django.db import models
    1616from django.utils import six
     17from django.conf import settings
    1718from django.utils.encoding import python_2_unicode_compatible
    1819from django.utils.translation import ugettext_lazy as _
    1920
    20 from base.constant import DOMINIO, PERIOCIDAD, TRIMESTRES, MESES, ECONOMICO_SUB_AREA
     21from base.constant import (
     22    DOMINIO, PERIOCIDAD, TRIMESTRES, MESES, ECONOMICO_SUB_AREA, CONVERT_MES, EMAIL_SUBJECT_LOAD_DATA
     23)
     24from base.functions import enviar_correo, check_val_data
    2125
    2226import pyexcel
     
    2630__docstring__ = "DoxyGen"
    2731
     32administrador, admin_email = '', ''
     33if settings.ADMINS:
     34    administrador = settings.ADMINS[0][0]
     35    admin_email = settings.ADMINS[0][1]
     36
    2837
    2938@python_2_unicode_compatible
     
    4251
    4352    ## Ciudad del registro. La información registrada es solo para el tipo de dominio por ciudad
    44     ciudad = models.CharField(max_length=3, choices=DOMINIO[1:], null=True, verbose_name=_("Ciudad"))
     53    ciudad = models.CharField(max_length=3, choices=DOMINIO[1:], null=True, default=None, verbose_name=_("Ciudad"))
     54
     55    class Meta:
     56        unique_together = ("anho", "mes")
    4557
    4658    def gestion_init(self, *args, **kwargs): #ciudad=None, anho_base=None, mes_ini=None, mes_fin=None, anho_ini=None, anho_fin=None
    4759
    4860        grupo_label = str(PreciosGrupo._meta.verbose_name)
    49         grupo_count_fields = PreciosGrupo._meta.get_fields()[:-3].__len__()
     61        grupo_count_fields = PreciosGrupo._meta.get_fields()[:-4].__len__()
    5062        sector_label = str(PreciosSector._meta.verbose_name)
    51         sector_count_fields = PreciosSector._meta.get_fields()[:-3].__len__()
     63        sector_count_fields = PreciosSector._meta.get_fields()[:-4].__len__()
    5264        naturaleza_label = str(PreciosNaturaleza._meta.verbose_name)
    53         naturaleza_count_fields = PreciosNaturaleza._meta.get_fields()[:-3].__len__()
     65        naturaleza_count_fields = PreciosNaturaleza._meta.get_fields()[:-4].__len__()
    5466        servicios_label = str(PreciosServicios._meta.verbose_name)
    55         servicios_count_fields = PreciosServicios._meta.get_fields()[:-3].__len__()
     67        servicios_count_fields = PreciosServicios._meta.get_fields()[:-4].__len__()
    5668        inflacionario_label = str(PreciosInflacionario._meta.verbose_name)
    57         inflacionario_count_fields = PreciosInflacionario._meta.get_fields()[:-3].__len__()
     69        inflacionario_count_fields = PreciosInflacionario._meta.get_fields()[:-4].__len__()
    5870        productos_label = str(PreciosProductos._meta.verbose_name)
    59         productos_count_fields = PreciosProductos._meta.get_fields()[:-3].__len__()
     71        productos_count_fields = PreciosProductos._meta.get_fields()[:-4].__len__()
    6072        fields = [
    6173            [
     
    7284            []
    7385        ]
    74         relations, data, exclude_fields = [], [], ['id', 'anho_base', 'real_precios_id']
     86        relations, data, exclude_fields = [], [], ['id', 'anho_base', 'real_precios_id', 'base']
    7587
    7688        if not 'dominio' in kwargs or not kwargs['dominio'] == 'C':
     
    149161        return {'cabecera': fields, 'relations': relations, 'data': data, 'output': 'precios'}
    150162
    151     def gestion_process(self, file, *args, **kwargs):
    152         print(file)
     163    def gestion_process(self, file, user, *args, **kwargs):
    153164        load_file = pyexcel.get_sheet(file_name=file)
    154         print(load_file.content)
    155         return {'result': True, 'message': str(_("archivo correcto"))}
     165        anho_base, i, col_ini, errors, result, message = '', 0, 2, '', True, ''
     166        load_data_msg = str(_("Datos Cargados"))
     167
     168        for row in load_file.row[2:]:
     169            try:
     170                # Asigna el año base del registro
     171                anho_b = anho_base = row[0] if i == 0 else anho_base
     172
     173                # Asigna el año de la fila que se esta procesando
     174                anho = row[0]
     175
     176                # Asigna el número de mes
     177                mes = [CONVERT_MES[m] for m in CONVERT_MES if m.find(row[1]) >= 0][0]
     178
     179                # Asigna la ciudad si el dominio no es nacional
     180                ciudad = row[2] if 'dominio' in kwargs and kwargs['dominio'] == 'C' else None
     181
     182                # Asigna el INPC total para el año base
     183                inpc = row[3] if self.ciudad else row[2]
     184
     185                # Condición que indica si el registro corresponde al año base
     186                base = True if i == 0 else False
     187
     188                # Gestión para los datos básicos de precios
     189                real_p, created = Precios.objects.update_or_create(anho=anho, mes=mes, ciudad=ciudad, defaults={
     190                    'anho_base': anho_b, 'inpc': inpc
     191                })
     192
     193
     194                # Gestión de datos para el Índice por Grupos
     195                PreciosGrupo.objects.update_or_create(real_precios=real_p, defaults={
     196                    'base': base,
     197                    'alimento_bebida': check_val_data(row[4] if self.ciudad else row[3]),
     198                    'bebida_tabaco': check_val_data(row[5] if self.ciudad else row[4]),
     199                    'vestido_calzado': check_val_data(row[6] if self.ciudad else row[5]),
     200                    'alquiler_vivienda': check_val_data(row[7] if self.ciudad else row[6]),
     201                    'servicio_vivienda': check_val_data(row[8] if self.ciudad else row[7]),
     202                    'equipamiento_hogar': check_val_data(row[9] if self.ciudad else row[8]),
     203                    'salud': check_val_data(row[10] if self.ciudad else row[9]),
     204                    'transporte': check_val_data(row[11] if self.ciudad else row[10]),
     205                    'comunicaciones': check_val_data(row[12] if self.ciudad else row[11]),
     206                    'esparcimiento': check_val_data(row[13] if self.ciudad else row[12]),
     207                    'educacion': check_val_data(row[14] if self.ciudad else row[13]),
     208                    'restaurant_hotel': check_val_data(row[15] if self.ciudad else row[14]),
     209                    'bienes_servicios': check_val_data(row[16] if self.ciudad else row[15])
     210                })
     211
     212                # Gestión de datos para el Índice por Sector de Origen
     213                PreciosSector.objects.update_or_create(real_precios=real_p, defaults={
     214                    'base': base,
     215                    'durables': check_val_data(row[17] if self.ciudad else row[16]),
     216                    'semi_durables': check_val_data(row[18] if self.ciudad else row[17]),
     217                    'no_durables': check_val_data(row[19] if self.ciudad else row[18])
     218                })
     219
     220                # Gestión de datos para el Índice por Naturaleza y Durabilidad
     221                PreciosNaturaleza.objects.update_or_create(real_precios=real_p, defaults={
     222                    'base': base,
     223                    'bienes': check_val_data(row[20] if self.ciudad else row[19]),
     224                    'agricolas': check_val_data(row[21] if self.ciudad else row[20]),
     225                    'pesquero': check_val_data(row[22] if self.ciudad else row[21]),
     226                    'agroindustrial': check_val_data(row[23] if self.ciudad else row[22]),
     227                    'otros': check_val_data(row[24] if self.ciudad else row[23])
     228                })
     229
     230                # Gestión de datos para el Índice por Servicios
     231                PreciosServicios.objects.update_or_create(real_precios=real_p, defaults={
     232                    'base': base,
     233                    'total': check_val_data(row[25] if self.ciudad else row[24]),
     234                    'basicos': check_val_data(row[26] if self.ciudad else row[25]),
     235                    'otros': check_val_data(row[27] if self.ciudad else row[26])
     236                })
     237
     238                # Gestion de datos para el Índice por Núcleo Inflacionario
     239                PreciosInflacionario.objects.update_or_create(real_precios=real_p, defaults={
     240                    'base': base,
     241                    'nucleo': check_val_data(row[28] if self.ciudad else row[27]),
     242                    'alimentos': check_val_data(row[29] if self.ciudad else row[28]),
     243                    'textiles': check_val_data(row[30] if self.ciudad else row[29]),
     244                    'bienes': check_val_data(row[31] if self.ciudad else row[30]),
     245                    'servicios': check_val_data(row[32] if self.ciudad else row[31])
     246                })
     247
     248                # Gestión de datos para el Índice de Productos Controlados y No Controlados
     249                PreciosProductos.objects.update_or_create(real_precios=real_p, defaults={
     250                    'base': base,
     251                    'controlados': check_val_data(row[33] if self.ciudad else row[32]),
     252                    'no_controlados': check_val_data(row[34] if self.ciudad else row[33])
     253                })
     254
     255            except Exception as e:
     256                errors = errors + "<li>%s</li>" % str(e)
     257
     258            i += 1
     259
     260        if errors:
     261            message = str(_("Error procesando datos. Verifique su correo para detalles del error"))
     262            load_data_msg = str(_("Error al procesar datos"))
     263
     264
     265        ## Envia correo electronico al usuario indicando el estatus de la carga de datos
     266        enviar_correo(user.email, 'gestion.informacion.load.mail', EMAIL_SUBJECT_LOAD_DATA, {
     267            'load_data_msg': load_data_msg, 'administrador': administrador, 'admin_email': admin_email,
     268            'errors': errors
     269        })
     270
     271        return {'result': result, 'message': message}
    156272
    157273
     
    211327    )
    212328
     329    base = models.BooleanField(default=False, verbose_name=_("Indicador base"))
     330
    213331    real_precios = models.ForeignKey(Precios, verbose_name=_("Sector Real"))
    214332
     
    232350    )
    233351
     352    base = models.BooleanField(default=False, verbose_name=_("Indicador base"))
     353
    234354    real_precios = models.ForeignKey(Precios, verbose_name=_("Sector Real"))
    235355
     
    260380        max_digits=18, decimal_places=2, default=0.0, verbose_name=_("Otros manufacturados")
    261381    )
     382
     383    base = models.BooleanField(default=False, verbose_name=_("Indicador base"))
    262384
    263385    real_precios = models.ForeignKey(Precios, verbose_name=_("Sector Real"))
     
    281403    )
    282404
     405    base = models.BooleanField(default=False, verbose_name=_("Indicador base"))
     406
    283407    real_precios = models.ForeignKey(Precios, verbose_name=_("Sector Real"))
    284408
     
    308432    )
    309433
     434    base = models.BooleanField(default=False, verbose_name=_("Indicador base"))
     435
    310436    real_precios = models.ForeignKey(Precios, verbose_name=_("Sector Real"))
    311437
     
    322448        max_digits=18, decimal_places=2, default=0.0, verbose_name=_("No Controlados")
    323449    )
     450
     451    base = models.BooleanField(default=False, verbose_name=_("Indicador base"))
    324452
    325453    real_precios = models.ForeignKey(Precios, verbose_name=_("Sector Real"))
  • economico/templates/economico.precios.html

    ref6d66a re9477bd  
    6666{% block extra_footer %}
    6767    <script>
     68        /**
     69         * Función que configura los filtros de acuerdo a la selección del usuario
     70         */
    6871        function set_filters() {
    6972            var filters = $("#filters"), json_filter = '';
     
    99102            }
    100103        }
    101         $(document).ready(function() {
    102             $('#{{ form.dominio.auto_id }}').on('change', function() {
    103                 $(this).val().split('dominio: ' + $(this).val() + ",").join("");
    104                 if ($(this).val() != "") {
    105                     var filters = $("#filters");
    106                     filters.val(filters.val() + 'dominio: ' + $(this).val() + ',');
    107                 }
    108             });
    109 
    110             $('.download-file').on('click', function(e) {
    111                 e.preventDefault();
    112                 set_filters();
    113             });
    114 
    115             $('.upload-file').on('click', function(e) {
    116                 e.preventDefault();
    117 
    118                 var file = $("#file"), form_upload = $('#form-upload-file');
    119                 file.click();
    120                 file.on('change', function(e) {
    121                     e.preventDefault();
    122                     form_upload.ajaxForm({
    123                         beforeSubmit: function(arr, $form, options) {
    124                             set_filters();
    125                         },
    126                         type: 'post',
    127                         dataType: 'json',
    128                         success: function(response) {
    129                             if (response.result) {
    130                                 bootbox.alert(response.message);
    131                             }
    132                             else {
    133                                 bootbox.alert(response.message);
    134                             }
    135                         },
    136                         error: function(jqxhr, textStatus, error) {
    137                             var err = textStatus + ", " + error;
    138                             bootbox.alert( MSG_PETICION_AJAX_FALLIDA + err );
    139                             console.log(MSG_PETICION_AJAX_FALLIDA + err);
    140                         }
    141                     });
    142 
    143                     form_upload.submit();
    144                 });
    145 
    146             });
    147         });
    148104    </script>
    149105{% endblock %}
Nota: Vea TracChangeset para ayuda en el uso del visor de conjuntos de cambios.