def generar_reporte(config: ReportesConfig):
    '''
    Genera el reporte pdf y envia el email al finalizar
    '''
    reporte_json = generar_reporte_json(config)

    url_completa = _GENERADOR_PDF_HOST + config.url_generar_reporte
    get_logger().info(f'Ejecutando REST con url -> {url_completa}')

    try:
        headers = {'content-type': 'application/json'}
        resultado = requests.post(url_completa,
                                  data=json.dumps(reporte_json),
                                  headers=headers)
    except Exception as e:
        mensaje = 'Error desconocido en el servicio de para generar el reporte'
        get_logger().error(mensaje, exc_info=True)
        get_logger().exception(e)
        raise AppException(Errores.SERVICIO_GENERAR_REPORTE, mensaje)

    if resultado.status_code != 200:
        mensaje = f'Error servicio generar reporte -> URL: {url_completa}, STATUS: {resultado.status_code}, BODY: {resultado.text}'
        raise AppException(Errores.SERVICIO_GENERAR_REPORTE, mensaje)

    contenido_reporte = resultado.content

    _enviar_email(config, contenido_reporte)
    _guardar_reporte_en_git(config, contenido_reporte)
def html_a_pdf(carpeta: Carpeta, datos: dict, nombre_html: str,
               nombre_pdf: str) -> bytes:
    '''
    Genera un reporte en pdf aplicando los datos al modelo
    Devuelve el contenido del archivo generado
    '''
    html = carpeta.buscar_archivo(nombre_html)
    if html is None:
        mensaje = f'El archivo {nombre_html} no existe'
        raise AppException(Errores.ARCHIVO_NO_EXISTE, mensaje)

    html_renderizado = _renderizar_archivo(html, datos, f'{uuid.uuid4()}.html')

    archivo_service.guardar_archivo(carpeta, html_renderizado)

    directorio_pdf = archivos_util.ruta_tipo_carpeta(TipoCarpeta.PDF.value,
                                                     carpeta.nombre)
    archivos_util.crear_directorio_si_no_existe(directorio_pdf)

    ruta_pdf = os.path.join(directorio_pdf, nombre_pdf)
    ruta_html = archivos_util.ruta_archivo(carpeta.tipo.value, carpeta.nombre,
                                           html_renderizado.nombre)

    pdfkit.from_file(ruta_html, ruta_pdf)

    archivo_service.borrar_contenido(carpeta, html_renderizado.nombre)

    return archivos_util.obtener_archivo(directorio_pdf, nombre_pdf)
def borrar_contenido(carpeta_nombre: str, tipo_carpeta_nombre: str, archivo_nombre: str):
    try:
        tipo_carpeta = TipoCarpeta.desde_str(tipo_carpeta_nombre)

    except Exception:
        mensaje = f'No se reconoce el tipo de carpeta {tipo_carpeta_nombre}'
        raise AppException(Errores.TIPO_CARPETA_NO_VALIDO, mensaje)

    if tipo_carpeta == TipoCarpeta.MODELO:
        mensaje = f'No esta permitido el borrado manual de los archivos del tipo MODELO'
        raise AppException(Errores.BORRADO_DE_MODELO_NO_PERMITIDO, mensaje)

    carpeta_existe = carpeta_service.obtener_por_nombre(carpeta_nombre, False)
    if not carpeta_existe:
        mensaje = f'La carpeta {carpeta_nombre} NO existe'
        raise AppException(Errores.CARPETA_NO_EXISTE, mensaje)

    archivo_service.borrar_contenido_por_tipo(tipo_carpeta, carpeta_nombre,
                                              archivo_nombre)
    return ''
def obtener_archivo(carpeta_nombre: str, tipo_carpeta_nombre: str, archivo_nombre: str):
    try:
        tipo_carpeta = TipoCarpeta.desde_str(tipo_carpeta_nombre)

    except Exception:
        mensaje = f'No se reconoce el tipo de carpeta {tipo_carpeta_nombre}'
        raise AppException(Errores.TIPO_CARPETA_NO_VALIDO, mensaje)

    carpeta_existe = carpeta_service.obtener_por_nombre(carpeta_nombre, False)
    if not carpeta_existe:
        mensaje = f'La carpeta {carpeta_nombre} NO existe'
        raise AppException(Errores.CARPETA_NO_EXISTE, mensaje)

    contenido = archivo_service.obtener_contenido_por_tipo_y_nombre(
        tipo_carpeta, carpeta_nombre, archivo_nombre)

    return send_file(BytesIO(contenido),
                     mimetype='application/octet-stream',
                     as_attachment=True,
                     attachment_filename=archivo_nombre)
def _descargar_csv(url_completa: str) -> bytes:
    '''
    Descargar el csv de la pagina de taiga mediante un GET pasandole la URL
    '''
    get_logger().info(f'Descargando CSV con url -> {url_completa}')

    respuesta = requests.get(url_completa)

    if not respuesta.ok:
        mensaje = f'El servicio de Taiga no respondio un 200 -> http: {respuesta.status_code}, {respuesta.text}'
        raise AppException(Errores.ERROR_API_TAIGA, mensaje)

    return respuesta.content
Esempio n. 6
0
def _obtener_carpeta_y_archivo(nombre_carpeta: str,
                               nombre_archivo: str) -> Tuple[Carpeta, Archivo]:
    '''
    Obtiene la carpeta y el archivo correspondiente
    '''
    carpeta = carpeta_service.obtener_por_nombre(nombre_carpeta, False)
    archivo = carpeta.buscar_archivo(nombre_archivo)

    if not archivo:
        mensaje = f'La carpeta {nombre_carpeta} no posee el archivo {nombre_archivo}'
        raise AppException('ARCHIVO_NO_ENCONTRADO', mensaje)

    return carpeta, archivo
Esempio n. 7
0
def nuevo_contenido_archivo(nombre_carpeta, nombre_archivo):

    carpeta = carpeta_service.obtener_por_nombre(nombre_carpeta, False)
    archivo = carpeta.buscar_archivo(nombre_archivo)

    if archivo != None:
        mensaje = f'El archivo con nombre {nombre_archivo}, ya existe'
        raise AppException(Errores.ARCHIVO_YA_EXISTENTE, mensaje)

    archivo_nuevo = Archivo(nombre_archivo, request.get_data())
    carpeta.agregar_archivo(archivo_nuevo)

    carpeta_service.actualizar(carpeta)

    return '', HTTPStatus.CREATED
Esempio n. 8
0
def buscar_por_nombre(nombre: str) -> Carpeta:
    '''
    Busca un Carpeta por nombre
    '''
    directorio = archivos_util.ruta_tipo_carpeta(TipoCarpeta.MODELO.value,
                                                 nombre)

    if not os.path.exists(directorio):
        mensaje = f'La carpeta {nombre} NO existe'
        raise AppException(Errores.CARPETA_NO_EXISTE, mensaje)

    metadata_contenido = archivos_util.obtener_archivo(directorio,
                                                       _METADATA_NOMBRE)
    metadata_dict = json.loads(metadata_contenido.decode('utf8'))

    return Carpeta.from_dict(metadata_dict)
def texto_a_texto(carpeta: Carpeta, datos: dict, nombre_entrada: str,
                  nombre_salida: str) -> bytes:
    '''
    Genera un reporte en pdf aplicando los datos al modelo.
    Devuelve el contenido del archivo generado
    '''
    entrada = carpeta.buscar_archivo(nombre_entrada)
    if entrada is None:
        mensaje = f'El archivo {nombre_entrada} no existe'
        raise AppException(Errores.ARCHIVO_NO_EXISTE, mensaje)

    archivo_salida = _renderizar_archivo(entrada, datos, nombre_salida)

    archivo_service.guardar_archivo_generado(carpeta, TipoCarpeta.MD,
                                             archivo_salida)

    return archivo_salida.contenido
Esempio n. 10
0
def crear(carpeta: Carpeta) -> UUID:
    '''
    Crea una Carpeta en la base local de archivos
    '''
    ruta_carpeta = archivos_util.ruta_tipo_carpeta(carpeta.tipo.value,
                                                   carpeta.nombre)

    nombre_en_uso = carpeta.nombre in archivos_util.listado_archivos_directorio_base(
    )
    if nombre_en_uso:
        mensaje = f'El nombre {carpeta.nombre} ya esta en uso'
        raise AppException(Errores.NOMBRE_EN_USO, mensaje)

    carpeta.id = uuid4()

    carpeta_dict = carpeta.to_dict()
    for archivo in carpeta_dict['archivos']:
        del archivo['contenido']

    contenido = json.dumps(carpeta_dict).encode('utf8')

    archivos_util.guardar_archivo(ruta_carpeta, _METADATA_NOMBRE, contenido)

    return carpeta.id
def _validar_existencia_ruta(ruta: str):
    if not os.path.exists(ruta):
        mensaje = f'La rura {ruta} NO existe'
        raise AppException(Errores.RUTA_NO_EXISTE, mensaje)
Esempio n. 12
0
def handle_business_exception(ae: AppException):
    logger.warning(ae.to_dict())
    return ae.respuesta_json()
Esempio n. 13
0
def error():
    raise AppException('PRUEBA', 'Rompimos todo vieja!')