282 lines
7.1 KiB
Python
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()
|