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
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
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
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
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)
def handle_business_exception(ae: AppException): logger.warning(ae.to_dict()) return ae.respuesta_json()
def error(): raise AppException('PRUEBA', 'Rompimos todo vieja!')