skimobiliaria / app /paginas_html.py
Carlexxx
xxx
8072ab3
Raw
History Blame Contribute Delete
3.12 kB
"""
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)