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()