Spaces:
Paused
Paused
| """ | |
| Edição das páginas HTML (institucionais) direto pelo painel admin. | |
| Só as páginas "seguras" de editar entram na lista abaixo — ou seja, as que | |
| não dependem de variáveis dinâmicas complexas passadas pelo backend (busca, | |
| imóvel, admin*) para funcionar. Editar essas por aqui, sem cuidado com as | |
| tags {% %} e {{ }}, quebraria a busca/anúncios/login para todo mundo. | |
| Cada página tem um identificador curto (usado na API e no seletor do painel) | |
| mapeado para o arquivo real em /templates. | |
| """ | |
| import os | |
| from fastapi import HTTPException | |
| from app.config import BASE_DIR | |
| TEMPLATES_DIR = os.path.join(BASE_DIR, "templates") | |
| # id -> (arquivo em /templates, nome amigável, descrição curta) | |
| PAGINAS_EDITAVEIS = { | |
| "inicio": ("index.html", "Página inicial", "A home do site (/)"), | |
| "sobre": ("sobre.html", "Sobre", "/sobre.html"), | |
| "servicos": ("servicos.html", "Serviços", "/servicos.html"), | |
| "contato": ("contato.html", "Contato", "/contato.html"), | |
| "404": ("404.html", "Página não encontrada (404)", "Exibida quando a URL não existe"), | |
| "header": ("_header.html", "Cabeçalho", "Aparece no topo de todas as páginas do site"), | |
| "footer": ("_footer.html", "Rodapé", "Aparece no rodapé de todas as páginas do site"), | |
| } | |
| def listar_paginas() -> list: | |
| return [ | |
| {"id": pid, "nome": nome, "descricao": desc} | |
| for pid, (_, nome, desc) in PAGINAS_EDITAVEIS.items() | |
| ] | |
| def _caminho(pagina_id: str) -> str: | |
| entrada = PAGINAS_EDITAVEIS.get(pagina_id) | |
| if not entrada: | |
| raise HTTPException(status_code=404, detail="Página não encontrada ou não editável por aqui.") | |
| return os.path.join(TEMPLATES_DIR, entrada[0]) | |
| def ler_pagina(pagina_id: str) -> str: | |
| caminho = _caminho(pagina_id) | |
| if not os.path.exists(caminho): | |
| raise HTTPException(status_code=404, detail="Arquivo da página não existe no servidor.") | |
| with open(caminho, "r", encoding="utf-8") as f: | |
| return f.read() | |
| def salvar_pagina(pagina_id: str, conteudo: str, jinja_env=None) -> None: | |
| caminho = _caminho(pagina_id) | |
| if not conteudo or not conteudo.strip(): | |
| raise HTTPException(status_code=400, detail="O conteúdo da página não pode ficar vazio.") | |
| # Valida a sintaxe Jinja (tags {% %} / {{ }}) antes de gravar, para não | |
| # derrubar a página pro público com um erro de digitação no template. | |
| if jinja_env is not None: | |
| try: | |
| jinja_env.parse(conteudo) | |
| except Exception as e: | |
| raise HTTPException(status_code=400, detail=f"HTML/Jinja inválido — nada foi salvo: {e}") | |
| # Guarda uma cópia da versão anterior (um nível de backup) antes de sobrescrever. | |
| if os.path.exists(caminho): | |
| try: | |
| with open(caminho, "r", encoding="utf-8") as f: | |
| anterior = f.read() | |
| with open(caminho + ".bak", "w", encoding="utf-8") as f: | |
| f.write(anterior) | |
| except OSError: | |
| pass # backup é best-effort, não deve impedir o salvamento | |
| with open(caminho, "w", encoding="utf-8") as f: | |
| f.write(conteudo) | |