frist commit
This commit is contained in:
+281
@@ -0,0 +1,281 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user