pegavisao / app.py
Roudrigus's picture
Update app.py
aa048d9 verified
# app.py
# -*- coding: utf-8 -*-
import os
import sys
import streamlit as st
# ==========================
# Bootstrap de caminho (prioriza módulos locais do projeto)
# ==========================
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
if PROJECT_ROOT not in sys.path:
sys.path.insert(0, PROJECT_ROOT)
# ==========================
# Configurações básicas (compatível com 'Config' e 'config')
# ==========================
APP_TITLE = "Academia ARM — Cursos"
APP_ICON = "🎓"
APP_LAYOUT = "wide"
try:
# Primeiro tenta com 'Config' (maiúsculo)
from Config.settings import APP_TITLE as _TITLE, APP_ICON as _ICON, APP_LAYOUT as _LAYOUT
APP_TITLE, APP_ICON, APP_LAYOUT = _TITLE, _ICON, _LAYOUT
except ModuleNotFoundError:
try:
# Fallback para 'config' (minúsculo)
from config.settings import APP_TITLE as _TITLE, APP_ICON as _ICON, APP_LAYOUT as _LAYOUT
APP_TITLE, APP_ICON, APP_LAYOUT = _TITLE, _ICON, _LAYOUT
except ModuleNotFoundError:
# Mantém os defaults definidos acima
pass
# ==========================
# Configuração da página (deve vir antes de qualquer outro comando Streamlit)
# ==========================
st.set_page_config(page_title=APP_TITLE, page_icon=APP_ICON, layout=APP_LAYOUT)
# ==========================
# Utils.ensure_dirs (opcional)
# ==========================
def _try_import_utils():
try:
from utils import ensure_dirs # type: ignore
return ensure_dirs
except Exception as e:
st.warning(
"⚠️ Não foi possível importar `utils.ensure_dirs`. "
"Se você não precisa criar diretórios locais, pode ignorar. "
f"Detalhes: {e}"
)
return lambda: None # no-op
ensure_dirs = _try_import_utils()
# ==========================
# db.init_db (opcional) — caso você tenha um init local ou remoto
# ==========================
def _try_import_db():
try:
from db import init_db # type: ignore
return init_db
except Exception as e:
st.warning(
"⚠️ Não foi possível importar `db.init_db`. "
"Se você usa persistência via Hugging Face Dataset, "
"verifique o módulo `db.py` ou `database/hfdb.py`. "
f"Detalhes: {e}"
)
return lambda: None # no-op
init_db = _try_import_db()
# ==========================
# Integração com Hugging Face Dataset (opcional, recomendado)
# ==========================
def _try_import_hfdb():
try:
from database.hfdb import ensure_db_file, load_data, save_data # type: ignore
return ensure_db_file, load_data, save_data, None
except Exception as e:
return None, None, None, e
ensure_db_file, load_data, save_data, hfdb_err = _try_import_hfdb()
# ==========================
# Páginas
# ==========================
def _try_import_pages():
page_aluno = None
page_admin = None
aluno_err = admin_err = None
try:
import aluno as _aluno # type: ignore
page_aluno = _aluno
except Exception as e:
aluno_err = e
try:
import admin as _admin # type: ignore
page_admin = _admin
except Exception as e:
admin_err = e
return page_aluno, aluno_err, page_admin, admin_err
page_aluno, aluno_import_err, page_admin, admin_import_err = _try_import_pages()
# ==========================
# Boot do App
# ==========================
# Cria diretórios locais (se aplicável)
try:
ensure_dirs()
except Exception as e:
st.warning(f"⚠️ Falha ao preparar diretórios locais: {e}")
# Inicialização genérica (se existente)
try:
init_db()
except Exception as e:
st.error("❌ Falha ao inicializar o banco de dados/persistência (init_db).")
st.exception(e)
# Se hfdb estiver disponível, garante arquivo e carrega estado inicial
DB_STATE = None
if ensure_db_file and load_data:
try:
ensure_db_file()
DB_STATE = load_data()
except Exception as e:
st.error("❌ Não foi possível preparar/carregar o arquivo de banco no Dataset (HF).")
st.exception(e)
elif hfdb_err:
st.info(
"ℹ️ Persistência via Hugging Face Dataset não habilitada. "
"Crie `database/hfdb.py` e configure os Secrets/Variables para persistência."
)
# Estados padrão
st.session_state.setdefault("is_admin", False)
st.session_state.setdefault("admin_user", None)
st.session_state.setdefault("aluno_logged_in", False)
st.session_state.setdefault("aluno_nome", "")
st.session_state.setdefault("aluno_email", "")
st.session_state.setdefault("cal_ver", 0)
# ==========================
# (Opcional) Debug de ambiente — remova depois que tudo estiver OK
# ==========================
def _debug_env():
with st.expander("🔎 Debug rápido (ambiente)", expanded=False):
st.write("HF_DATASET_PATH:", os.getenv("HF_DATASET_PATH"))
st.write("HF_DB_FILE:", os.getenv("HF_DB_FILE"))
st.write("HF_TOKEN presente?:", bool(os.getenv("HF_TOKEN")))
st.write("hfdb import error:", str(hfdb_err) if hfdb_err else None)
st.write("DB_STATE inicial carregado?:", DB_STATE is not None)
# ==========================
# Router
# ==========================
def main() -> None:
st.title(APP_TITLE)
_debug_env() # pode remover depois
# Indica se houve problemas de import nas páginas
if aluno_import_err:
st.warning(f"⚠️ Módulo `aluno` não pôde ser carregado: {aluno_import_err}")
if admin_import_err:
st.warning(f"⚠️ Módulo `admin` não pôde ser carregado: {admin_import_err}")
# Exibe um snapshot mínimo dos dados (se hfdb estiver ativo)
if DB_STATE is not None:
with st.expander("🗄️ Snapshot do banco (somente leitura)", expanded=False):
try:
st.json(DB_STATE)
except Exception:
st.write(DB_STATE)
tab_aluno, tab_admin = st.tabs(["👩‍🎓 Aluno", "🛠️ Admin"])
with tab_aluno:
if page_aluno and hasattr(page_aluno, "render"):
try:
# Se a página do aluno quiser usar o estado/handlers de persistência:
# ela pode aceitar parâmetros (se você preferir esse padrão):
# page_aluno.render(DB_STATE, load_data, save_data)
page_aluno.render()
except Exception as e:
st.error("Ocorreu um erro ao carregar a aba **Aluno**. Os demais menus continuam disponíveis.")
st.exception(e)
else:
st.info("A aba **Aluno** ainda não está disponível. Verifique o arquivo `aluno.py` e a função `render()`.")
with tab_admin:
if page_admin and hasattr(page_admin, "render"):
try:
# Idem comentário acima — você pode padronizar assinatura: render(db, load_fn, save_fn)
page_admin.render()
except Exception as e:
st.error("Ocorreu um erro ao carregar a aba **Admin**.")
st.exception(e)
else:
st.info("A aba **Admin** ainda não está disponível. Verifique o arquivo `admin.py` e a função `render()`.")
if __name__ == "__main__":
main()