Files
madcraig/ssh_display.py
2026-05-04 19:15:00 +02:00

282 lines
7.1 KiB
Python

import os
import sys
import textwrap
import models
def limpiar():
os.system('clear' if os.name != 'nt' else 'cls')
def pausa():
try:
input("\n [ENTER para continuar]")
except (EOFError, KeyboardInterrupt):
pass
def leer_linea(prompt, por_defecto=''):
try:
if por_defecto:
val = input(f" {prompt} [{por_defecto}]: ").strip()
return val if val else por_defecto
return input(f" {prompt}: ").strip()
except (EOFError, KeyboardInterrupt):
return None
def cabecera(titulo=""):
limpiar()
print()
print("=" * 64)
print(" MadCraig :: Madrid, Espana :: Terminal / SSH")
if titulo:
print(f" {titulo}")
print("=" * 64)
print()
def formatear_anuncio(a, idx=None):
prefijo = f" [{idx}] " if idx is not None else " "
lineas = []
lineas.append(f"{prefijo}[{a['categoria'].upper()}] {a['fecha']} (ID: {a['id']})")
lineas.append(f" Titulo: {a['titulo']}")
lineas.append(f" Contacto: {a['contacto']}")
lineas.append(" " + "-" * 58)
for parrafo in textwrap.wrap(a['contenido'], width=58):
lineas.append(f" {parrafo}")
lineas.append(" " + "=" * 58)
return "\n".join(lineas)
def menu_principal():
cabecera("Menu Principal")
print(" [L] Listar todos los anuncios")
print(" [C] Filtrar por categoria")
print(" [B] Buscar anuncios")
print(" [N] Nuevo anuncio")
print(" [M] Modificar anuncio")
print(" [E] Eliminar anuncio")
print(" [V] Ver anuncio por ID")
print(" [S] Salir")
print()
try:
op = input(" Opcion: ").strip().lower()
except (EOFError, KeyboardInterrupt):
op = 's'
return op
def pantalla_listar(anuncios=None, titulo="Anuncios"):
if anuncios is None:
anuncios = models.listar_anuncios()
cabecera(titulo)
if not anuncios:
print(" No hay anuncios.")
pausa()
return
for i, a in enumerate(anuncios, start=1):
print(formatear_anuncio(a, idx=i))
print()
print(f" Total: {len(anuncios)} anuncio(s)")
pausa()
def pantalla_filtrar_categoria():
cabecera("Filtrar por categoria")
categorias = models.listar_categorias()
if not categorias:
print(" No hay categorias disponibles.")
pausa()
return
print(" Categorias disponibles:")
for i, cat in enumerate(categorias, start=1):
print(f" [{i}] {cat}")
print()
cat = leer_linea("Nombre de la categoria")
if cat is None:
return
if not cat:
print(" Categoria vacia, mostrando todos.")
pausa()
pantalla_listar()
return
anuncios = models.listar_anuncios(categoria=cat)
pantalla_listar(anuncios, f"Categoria '{cat}'")
def pantalla_buscar():
cabecera("Buscar anuncios")
termino = leer_linea("Buscar (titulo/contenido)")
if termino is None:
return
if not termino:
print(" Busqueda vacia, mostrando todos.")
pausa()
pantalla_listar()
return
anuncios = models.listar_anuncios(busqueda=termino)
pantalla_listar(anuncios, f"Resultados para '{termino}'")
def pantalla_nuevo():
cabecera("Nuevo anuncio")
titulo = leer_linea("Titulo")
if titulo is None:
return
if not titulo:
print(" El titulo es obligatorio. Cancelado.")
pausa()
return
contenido = leer_linea("Contenido")
if contenido is None:
return
if not contenido:
print(" El contenido es obligatorio. Cancelado.")
pausa()
return
categoria = leer_linea("Categoria", "general")
if categoria is None:
return
contacto = leer_linea("Contacto", "madrid@craigslist.local")
if contacto is None:
return
aid = models.crear_anuncio(titulo, contenido, categoria, contacto)
print(f"\n Anuncio creado con ID {aid}.")
pausa()
def pantalla_editar():
cabecera("Modificar anuncio")
sid = leer_linea("ID del anuncio a modificar")
if sid is None:
return
if not sid.isdigit():
print(" ID no valido.")
pausa()
return
a = models.obtener_anuncio(int(sid))
if not a:
print(" Anuncio no encontrado.")
pausa()
return
print()
print(formatear_anuncio(a))
print()
print(" Deja en blanco para mantener el valor actual.")
print()
titulo = leer_linea("Nuevo titulo", a['titulo'])
if titulo is None:
return
contenido = leer_linea("Nuevo contenido", a['contenido'])
if contenido is None:
return
categoria = leer_linea("Nueva categoria", a['categoria'])
if categoria is None:
return
contacto = leer_linea("Nuevo contacto", a['contacto'])
if contacto is None:
return
campos = {}
if titulo != a['titulo']:
campos['titulo'] = titulo
if contenido != a['contenido']:
campos['contenido'] = contenido
if categoria != a['categoria']:
campos['categoria'] = categoria
if contacto != a['contacto']:
campos['contacto'] = contacto
if not campos:
print(" No se realizaron cambios.")
pausa()
return
if models.actualizar_anuncio(int(sid), **campos):
print(" Anuncio actualizado correctamente.")
else:
print(" No se pudo actualizar.")
pausa()
def pantalla_eliminar():
cabecera("Eliminar anuncio")
sid = leer_linea("ID del anuncio a eliminar")
if sid is None:
return
if not sid.isdigit():
print(" ID no valido.")
pausa()
return
a = models.obtener_anuncio(int(sid))
if not a:
print(" Anuncio no encontrado.")
pausa()
return
print()
print(formatear_anuncio(a))
print()
try:
conf = input(" Confirmar eliminacion [s/N]: ").strip().lower()
except (EOFError, KeyboardInterrupt):
conf = 'n'
if conf == 's':
if models.borrar_anuncio(int(sid)):
print(" Anuncio eliminado.")
else:
print(" No se pudo eliminar.")
else:
print(" Cancelado.")
pausa()
def pantalla_ver():
cabecera("Ver anuncio")
sid = leer_linea("ID del anuncio")
if sid is None:
return
if not sid.isdigit():
print(" ID no valido.")
pausa()
return
a = models.obtener_anuncio(int(sid))
if not a:
print(" Anuncio no encontrado.")
pausa()
return
print()
print(formatear_anuncio(a))
pausa()
def main():
models.init_db()
while True:
op = menu_principal()
if op == 'l':
pantalla_listar()
elif op == 'c':
pantalla_filtrar_categoria()
elif op == 'b':
pantalla_buscar()
elif op == 'n':
pantalla_nuevo()
elif op == 'm':
pantalla_editar()
elif op == 'e':
pantalla_eliminar()
elif op == 'v':
pantalla_ver()
elif op == 's':
cabecera("Hasta luego!")
sys.exit(0)
else:
print(" Opcion no valida.")
pausa()
if __name__ == '__main__':
main()