Skip to content

Instantly share code, notes, and snippets.

@cibervicho
Created February 9, 2024 18:32
Show Gist options
  • Save cibervicho/b45bfc5d6f99580f1945e3f5a8c85bf9 to your computer and use it in GitHub Desktop.
Save cibervicho/b45bfc5d6f99580f1945e3f5a8c85bf9 to your computer and use it in GitHub Desktop.
Reto 5, día Viernes (9-Feb-2024)
# Reto 5, día Viernes (9-Feb-2024)
# ==============================
#
# Listo, llegamos al reto número 5 de la semana. Nuestro programa ya funciona sumamente bien. Ya podemos
# crear, listar y editar usarios.
#
# Sin embargo, muy probablemente el código que tengamos hasta ahora pueda mejorar significativamente, es
# por ello que, para el reto de hoy vamos a definir 5 nuevas funciones; esto con la finalidad de poder
# separar nuestro código y que este sea fácil de leer, comprender y sobre todo mantener.
#
# Las 5 nuevas funciones serán las siguientes.
# new_user
# show_user
# edit_user
# delete_user
# list_users
#
# Las funciones, como bien sus nombre nos indican, nos permitirán seperar nuestra lógica para poder crear
# nuevos usuarios, consultarlos, editarlos, eliminarlos (Que es una nueva acción) y listarlos.
#
# Con Excepción de list_users, cada una de estas funciones deberá recibir como parámetro el ID de usuario
# con el cual se desea trabajar.
#
# Un pro Tip. Recuerda que las opciones puedas almacenarlas en como llaves en un diccionario y que, quizás,
# puedas almacenar las funciones en valores de esas llaves.
import os
MENU = [
" LISTADO DE OPCIONES",
" -------------------\n",
" 1. Listar usuarios",
" 2. [C] Agregar usuario",
" 3. [R] Ver informacion de usuarios",
" 4. [U] Editar usuarios",
" 5. [D] Eliminar usuarios",
" 9. Salir del programa\n",
"\n Elige una opcion:",
]
INSTRUCCIONES = [
"\nINSTRUCCIONES:",
" 1. longitud de nombre, apellidos e email deben ser entre 5 y 50 caracteres",
" 2. longitud de telefono deben ser igual a 10 digitos\n"
]
OPCIONES_HABILITADAS = ('1', '2', '3', '4', '5', '9')
CAMPOS_DE_USUARIO = ("NOMBRE", "APELLIDO", "TELEFONO", "EMAIL")
# Diccionario principal donde vamos a almacenar los usuarios registrados
# {
# usuario_id #1: {
# 'nombre': str,
# 'apellido': str,
# 'telefono': str,
# 'email': str,
# },
# .
# .
# .
# usuario_id #N: {
# 'nombre': str,
# 'apellido': str,
# 'telefono': str,
# 'email': str,
# },
# }
usuarios_dict = {}
# Lista de todos los IDs de los usuarios registrados
usuarios_id_list = []
def valid_text(text: str, type: str) -> bool:
# Valida si el texto es una cadena.
if not isinstance(text, str):
print(f" -> ERROR: El '{type}' debe ser una cadena de texto.")
print(" Intenta nuevamente.")
return False
# Valida si la longitud del texto es entre 5 y 50 caracteres
if len(text) < 5 or len(text) > 50:
print(f" -> ERROR: El '{type}' debe ser de una longitud minima de 5 y maxima de 50.")
print(" Longitud actual: " + str(len(text)) +". Intenta nuevamente.")
return False
return True
def valid_phone(text: str) -> bool:
# Valida si el número es una cadena.
if not isinstance(text, str):
print(" -> ERROR: El 'telefono' debe ser una cadena de texto numerica.")
print(" Intenta nuevamente.")
return False
# Valida si el número tiene la longitud correcta.
if len(text) != 10:
print(" -> ERROR: El 'telefono' debe ser de 10 digitos exactamente")
print(" Numero de digitos actual: " + str(len(text)) +". Intenta nuevamente.")
return False
# Valida si el número solo contiene dígitos.
for caracter in text:
if not caracter.isdigit():
print(" -> ERROR: El 'telefono' debe ser una cadena de texto numerica.")
print(" Intenta nuevamente.")
return False
return True
def valid_email(text: str) -> bool:
# Valida si el email es una cadena de texto
if not valid_text(text=text, type="email"):
return False
# Valida si el email contiene un arroba (@).
if "@" not in text:
print(" -> ERROR: El 'email' no es valido porque no contiene '@'.")
print(" Intenta nuevamente.")
return False
# Valida si el email tiene un nombre de usuario y un dominio.
nombre_usuario, dominio = text.split("@")
if not nombre_usuario:
print(" -> ERROR: El 'email' no es valido porque no contiene nombre de usuario.")
print(" Intenta nuevamente.")
return False
if not dominio:
print(" -> ERROR: El 'email' no es valido porque no contiene dominio.")
print(" Intenta nuevamente.")
return False
# Valida si el nombre de usuario solo contiene letras, números, guiones bajos y puntos.
for caracter in nombre_usuario:
if not caracter.isalnum() and caracter not in ["_", "."]:
print(" -> ERROR: El 'email' no es valido porque el nombre de usuario solo debe contener letras, números, guiones bajos y puntos.")
print(" Intenta nuevamente.")
return False
# Valida si el dominio contiene un punto (.).
if "." not in dominio:
print(" -> ERROR: El 'email' no es valido porque el dominio no contiene punto (.).")
print(" Intenta nuevamente.")
return False
# Valida si el dominio solo contiene letras, números, guiones bajos y puntos.
for caracter in dominio:
if not caracter.isalnum() and caracter not in ["_", "."]:
print(" -> ERROR: El 'email' no es valido porque el dominio solo debe contener letras, números, guiones bajos y puntos.")
print(" Intenta nuevamente.")
return False
return True
def show_user(identificador='0', all=False):
if all: # Mostramos todos los usuarios registrados
for id in usuarios_id_list:
nombre = usuarios_dict[id]['nombre'] + " " + usuarios_dict[id]['apellido']
telefono = usuarios_dict[id]['telefono']
email = usuarios_dict[id]['email']
print(" Id:", id)
print(" Nombre:", nombre)
print(" Telefono:", telefono)
print(" Email:", email)
print("")
print("")
else: # Mostramos solo un usuario
id = int(identificador)
if id not in usuarios_id_list:
print("\n -> ID DE USUARIO [" + str(id) + "] NO ENCONTRADO!\n")
else:
nombre = usuarios_dict[id]['nombre'] + " " + usuarios_dict[id]['apellido']
telefono = usuarios_dict[id]['telefono']
email = usuarios_dict[id]['email']
print("")
print(" Id:", id)
print(" Nombre:", nombre)
print(" Telefono:", telefono)
print(" Email:", email)
print("")
def new_user(usuario_id):
print("Usuario #" + str(usuario_id) + ":")
nombre, apellido, telefono, email = "", "", "", ""
# Iniciamos captura y validacion de usuario
nombre = input("Ingresa el/los nombre(s) del usuario #" + str(usuario_id) + ": ")
while not valid_text(text=nombre, type="nombre"):
nombre = input("Ingresa el/los nombre(s) del usuario #" + str(usuario_id) + ": ")
apellido = input("Ingresa los apellidos del usuario #" + str(usuario_id) + ": ")
while not valid_text(text=apellido, type="apellido"):
apellido = input("Ingresa los apellidos del usuario #" + str(usuario_id) + ": ")
telefono = str(input("Ingresa el telefono del usuario #" + str(usuario_id) + ": "))
while not valid_phone(text=telefono):
telefono = str(input("Ingresa el telefono del usuario #" + str(usuario_id) + ": "))
email = input("ingresa el email del usuario #" + str(usuario_id) + ": ")
while not valid_email(text=email):
email = input("ingresa el email del usuario #" + str(usuario_id) + ": ")
# Guardamos el nuevo usuario
usuarios_id_list.append(usuario_id)
usuarios_dict.update(
{
usuario_id: {
'nombre': nombre,
'apellido': apellido,
'telefono': telefono,
'email': email
}
}
)
print("\n --> Hola " + nombre + " " + apellido + ", en breve recibiras un correo a: " + email + "\n")
def edit_user(usuario_id):
id = int(usuario_id)
if id not in usuarios_id_list:
print("\n -> ID DE USUARIO [" + str(id) + "] NO ENCONTRADO!\n")
else:
show_user(identificador=str(id), all=False)
campo = input("Que campo del usuario deseas editar " + str(CAMPOS_DE_USUARIO) + "?: ")
campo = campo.upper()
if campo not in CAMPOS_DE_USUARIO:
print("\n -> CAMPO [" + campo + "] INVALIDO!")
print(" Opciones:", CAMPOS_DE_USUARIO, "\n")
else:
nombre, apellido, telefono, email = "", "", "", ""
if campo.lower() == "nombre":
nombre = input("Ingresa el/los nombre(s) del usuario #" + str(usuario_id) + ": ")
while not valid_text(text=nombre, type="nombre"):
nombre = input("Ingresa el/los nombre(s) del usuario #" + str(usuario_id) + ": ")
usuarios_dict[id]['nombre'] = nombre
elif campo.lower() == "apellido":
apellido = input("Ingresa los apellidos del usuario #" + str(usuario_id) + ": ")
while not valid_text(text=apellido, type="apellido"):
apellido = input("Ingresa los apellidos del usuario #" + str(usuario_id) + ": ")
usuarios_dict[id]['apellido'] = apellido
elif campo.lower() == "telefono":
telefono = str(input("Ingresa el telefono del usuario #" + str(usuario_id) + ": "))
while not valid_phone(text=telefono):
telefono = str(input("Ingresa el telefono del usuario #" + str(usuario_id) + ": "))
usuarios_dict[id]['telefono'] = telefono
elif campo.lower() == "email":
email = input("ingresa el email del usuario #" + str(usuario_id) + ": ")
while not valid_email(text=email):
email = input("ingresa el email del usuario #" + str(usuario_id) + ": ")
usuarios_dict[id]['email'] = email
else:
print("\n -> CAMPO [" + campo + "] INVALIDO!")
print(" Opciones:", CAMPOS_DE_USUARIO)
print("")
def delete_user(usuario_id):
id = int(usuario_id)
if id not in usuarios_id_list:
print("\n -> ID DE USUARIO [" + str(id) + "] NO ENCONTRADO!\n")
else:
show_user(identificador=str(id), all=False)
opc = ""
while opc not in ["si".upper(), "no".upper()]:
opc = input("Estas segur@ de eliminar este usuario (si/no)?: ")
opc = opc.upper()
if opc not in ["si".upper(), "no".upper()]:
print("\n -> OPCION [" + opc + "] INVALIDA!")
print(" INTENTA NUEVAMENTE\n")
if opc == "SI":
del usuarios_dict[id]
usuarios_id_list.remove(id)
print("\n -> USUARIO ELIMINADO CON EXITO!\n")
print("")
def main():
opcion = 0
while opcion != '9':
os.system('clear')
usuarios_registrados = len(usuarios_dict)
print("Usuarios registrados:", str(usuarios_registrados), "\n")
# Mostramos las opciones del menu
for item in MENU:
print(item)
# Evaluamos la opcion elegida
opcion = str(input("> "))
if opcion not in OPCIONES_HABILITADAS:
print("\n -> OPCION [" + opcion + "] NO RECONOCIDA!\n")
else:
match opcion:
case '1': # Listar usuarios
print("\n", MENU[2].upper(), "\n")
if len(usuarios_dict):
show_user(all=True)
else:
print(" -> NO SE HAN REGISTRADO USUARIOS!\n")
case '2': # Agregar usuario
print("\n", MENU[3].upper(), "\n")
# Mostramos las instrucciones/restricciones
for instruccion in INSTRUCCIONES:
print(instruccion)
# Calculamos el ID del nuevo usuario
if len(usuarios_id_list):
usuario_id = max(usuarios_id_list) + 1
else:
usuario_id = 1
new_user(usuario_id=usuario_id)
case '3': # Ver informacion de usuarios
print("\n", MENU[4].upper(), "\n")
if len(usuarios_dict):
id = input("Selecciona el ID del usuario: ")
if not id.isdigit():
print("\n -> ID DE USUARIO [" + id + "] INVALIDO!\n")
else:
show_user(identificador=id, all=False)
else:
print(" -> NO SE HAN REGISTRADO USUARIOS!\n")
case '4': # Editar usuarios
print("\n", MENU[5].upper(), "\n")
if len(usuarios_dict):
id = input("Selecciona el ID del usuario a editar: ")
if not id.isdigit():
print("\n -> ID DE USUARIO [" + id + "] INVALIDO!\n")
else:
edit_user(usuario_id=id)
else:
print(" -> NO SE HAN REGISTRADO USUARIOS!\n")
case '5': # Eliminar usuarios
print("\n", MENU[6].upper(), "\n")
if len(usuarios_dict):
id = input("Selecciona el ID del usuario a eliminar: ")
if not id.isdigit():
print("\n -> ID DE USUARIO [" + id + "] INVALIDO!\n")
else:
delete_user(usuario_id=id)
else:
print(" -> NO SE HAN REGISTRADO USUARIOS!\n")
case '9': # Salir del programa
print("\n", MENU[7].upper(), "\n")
case _: # Proteccion: Opcion no reconocida. No deberia ocurrir
print("\n -> OPCION [" + opcion + "] NO RECONOCIDA!\n")
_ = input("\nPresione ENTER para continuar...")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment