def importa_contactos(self, base_datos_contacto, campos_telefonicos, columna_id_externo):
        """
        Tercer paso de la creación de una BaseDatosContacto.
        Este método se encarga de generar los objectos Contacto por cada linea
        del archivo de importación especificado para la base de datos de
        contactos.
        """

        assert (base_datos_contacto.estado in
                (BaseDatosContacto.ESTADO_EN_DEFINICION,
                 BaseDatosContacto.ESTADO_DEFINIDA_ACTUALIZADA))

        ids_externos = base_datos_contacto.contactos.values_list('id_externo', flat=True)
        ids_externos = set(ids_externos)
        ids_nuevos_contactos = []

        try:
            estructura_archivo = self.legacy_parser.get_estructura_archivo(base_datos_contacto)
            posicion_primer_telefono = estructura_archivo[0].index(campos_telefonicos[0])
            cantidad_contactos = 0
            if base_datos_contacto.cantidad_contactos:
                cantidad_contactos = base_datos_contacto.cantidad_contactos
            numero_fila = 0
            for lista_dato in estructura_archivo[1:]:
                numero_fila += 1
                telefono, datos, id_externo = self._obtener_telefono_y_datos(
                    lista_dato, posicion_primer_telefono, columna_id_externo)
                cantidad_contactos += 1
                if id_externo is not None and id_externo != '':
                    # El id_externo no puede estar repetido
                    if id_externo in ids_externos:
                        base_datos_contacto.contactos.filter(id__in=ids_nuevos_contactos).delete()
                        raise(CreacionBaseDatosServiceIdExternoError(numero_fila,
                                                                     columna_id_externo,
                                                                     lista_dato,
                                                                     id_externo))
                    else:
                        ids_externos.add(id_externo)

                contacto = Contacto.objects.create(
                    telefono=telefono,
                    datos=datos,
                    bd_contacto=base_datos_contacto,
                    id_externo=id_externo
                )
                ids_nuevos_contactos.append(contacto.id)
        except OmlParserMaxRowError:
            base_datos_contacto.contactos.filter(id__in=ids_nuevos_contactos).delete()
            raise OmlError(_("Archivo excede máximo de filas permitidas"))

        except OmlParserCsvImportacionError:
            base_datos_contacto.contactos.filter(id__in=ids_nuevos_contactos).delete()
            raise OmlError(_("Error al parsear el archivo csv"))

        base_datos_contacto.cantidad_contactos = cantidad_contactos

        base_datos_contacto.save()

        self.define_base_datos_contactos(base_datos_contacto)
예제 #2
0
    def _procesa_campos_telefono(self, campos_telefono_str) -> list:
        ct = campos_telefono_str \
            .strip() \
            .lstrip(',') \
            .rstrip(',') \
            .split(',')
        campos_telefono = [self._sanear_nombre_de_columna(x) for x in ct]

        if len(campos_telefono) == 0:
            raise OmlError(_('lista de campos teléfono vacia'))
        for campo_t in campos_telefono:
            if campo_t not in self.base_datos_contacto_service.parser.columnas:
                raise OmlError(_('campo de teléfono no coincide con nombre de columna'))

        return campos_telefono
    def crear_bd_contactos(self, archivo, nombre_archivo, nombre_bd) -> int:
        model_base_contactos = BaseDatosContacto()
        if self._existe_bd_contactos(nombre_bd):
            raise (OmlError(
                _("Ya existe una base de datos de contactos con ese nombre")))
        self.parser = BaseDatosContactoArchivoCSVParser(
            nombre_archivo, archivo)

        if not self.parser.es_valida_extension(
        ) or not self.parser.es_valido_archivo():
            file_invalid_msg = _(
                "El archivo especificado para realizar la importación de "
                "contactos no es válido.")
            raise (OmlArchivoImportacionInvalidoError(file_invalid_msg))

        if not self.parser.headers_no_repetidos():
            raise OmlParserRepeatedColumnsError(
                _("El archivo a procesar tiene nombres de columnas "
                  "repetidos."))

        model_base_contactos.archivo_importacion = archivo
        model_base_contactos.nombre_archivo_importacion = nombre_archivo
        model_base_contactos.nombre = nombre_bd
        model_base_contactos.save()

        return model_base_contactos.id
예제 #4
0
 def _comprueba_campo_id_externo(self, id_externo):
     id_externo = self._sanear_nombre_de_columna(id_externo)
     if id_externo is not None and \
             id_externo not in self.base_datos_contacto_service.parser.columnas:
         raise OmlError(
             _('campo de id externo no coincide con nombre de columna'))
     return id_externo
예제 #5
0
    def _obtiene_parametro(self, request, nombre_parametro, parametro_opcional=False) -> str:
        param = request.data.get(nombre_parametro, None)
        if param is not None or parametro_opcional is True:
            return param

        message = _('falta parámetro:') + nombre_parametro
        raise OmlError(message)
예제 #6
0
    def _ami_manager(self, action, content):
        if self.disconnected:
            raise OmlError(
                message='La conexión del Asterisk Manager ya ha sido cerrada')
        if not self.manager.connected():
            raise OmlError(message='El Asterisk Manager no ha sido conectado')

        error = False
        data_returned = ''
        try:
            data_returned = self._ami_action(action, content)
        except ManagerSocketException as e:
            logger.exception("Error connecting to the manager: {0}".format(e))
            error = True
        except ManagerAuthException as e:
            logger.exception("Error logging in to the manager: {0}".format(e))
            error = True
        except ManagerException as e:
            logger.exception("Error {0}".format(e))
            error = True
        return data_returned, error
예제 #7
0
def get_class(full_name):
    """Devuelve clase  o func referenciada por `full_name`"""
    splitted = full_name.split(r".")
    if len(splitted) < 2:
        raise OmlError(
            "La clase/func sepecificada no es valida: '{0}'".format(full_name))
    module_name = ".".join(splitted[0:-1])
    class_or_func_name = splitted[-1]

    try:

        try:
            module = __import__(module_name)
        except ImportError as e:
            msg = "No se pudo importar el modulo '{0}'".format(module_name)
            logger.warn(msg)
            raise OmlError(msg, e)

        for sub_module_name in splitted[1:-1]:
            module = getattr(module, sub_module_name)

        try:
            clazz = getattr(module, class_or_func_name)
        except AttributeError as e:
            msg = "El modulo '{0}' no posee la clase o func '{1}'".format(
                module_name, class_or_func_name)
            logger.warn(msg)
            raise OmlError(msg, e)

    except OmlError:
        raise

    except Exception as e:
        msg = "No se pudo obtener la clase o func '{0}'".format(full_name)
        logger.warn(msg)
        raise OmlError(msg, e)

    return clazz
예제 #8
0
    def crea_lista_rapida(self, archivo, nombre_archivo, nombre_lista):
        """ Creacion de la lista rapida en el modelo
        """
        if self._existe_lista_rapida(nombre_lista):
            raise (OmlError(
                _("Ya existe una lista rapida de contactos con ese nombre")))

        model_lista_rapida = ListasRapidas()

        model_lista_rapida.archivo_importacion = archivo
        model_lista_rapida.nombre_archivo_importacion = nombre_archivo
        model_lista_rapida.nombre = nombre_lista
        model_lista_rapida.save()

        return model_lista_rapida.id
예제 #9
0
    def valida_lista_rapida(self, archivo, nombre_archivo, nombre_lista):
        if self._existe_lista_rapida(nombre_lista):
            raise (OmlError(
                _("Ya existe una lista de contactos rapida con ese nombre")))
        self.parser = ListaRapidaArchivoCSVParser(nombre_archivo, archivo)

        if not self.parser.es_valida_extension(
        ) or not self.parser.es_valido_archivo():
            file_invalid_msg = _(
                "El archivo especificado para realizar la importación de "
                "contactos no es válido.")
            raise (OmlArchivoImportacionInvalidoError(file_invalid_msg))

        if not self.parser.headers_no_repetidos():
            raise OmlParserRepeatedColumnsError(
                _("El archivo a procesar tiene nombres de columnas "
                  "repetidos."))