Created
February 9, 2024 18:32
-
-
Save cibervicho/b45bfc5d6f99580f1945e3f5a8c85bf9 to your computer and use it in GitHub Desktop.
Reto 5, día Viernes (9-Feb-2024)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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