Esta es una aplicación de práctica para conceptos de OOP en Python. La aplicación es un cuaderno de notas simple con las siguientes características:
- Agregar una nota con un título, el texto de la nota y la importancia de la nota (HIGH, MEDIUM, LOW). El sistema debe asignar un identificador único a cada nota.
- Listar todas las notas.
- Agregar etiquetas a las notas.
- Listar todas las notas importantes (Las que tienen importancia HIGH o MEDIUM).
- Eliminar una nota por su identificador.
- Mostrar notas por etiqueta.
- Mostrar la etiqueta con más notas.
Tu tarea es implementar las clases del modelo en el archivo app/notebook.py y las
clases de la interfaz de usuario en el archivo app/console.py.
Considera los siguientes aspectos para la implementación:
-
La clase debe tener las siguientes constantes:
HIGHde tipostrcon valor'HIGH'.MEDIUMde tipostrcon valor'MEDIUM'.LOWde tipostrcon valor'LOW'.
Puedes consultar el documento de estudio Conceptos de POO para más información sobre constantes en clases. O tambiénn puedes consultar en Internet sobre constantes en clases en Python.
-
La clase debe tener los siguientes atributos:
codede tipostrinicializado con un parámetro en el constructor.titlede tipostrinicializado con un parámetro en el constructor.textde tipostrinicializado con un parámetro en el constructor.importancede tipostrinicializado con un parámetro en el constructor.creation_datede tipodatetime. Este atributo no se inicializa con parámetro en el constructor y tiene como valor por defecto la fecha y hora actual.Consejo: Puedes usar la función
datetime.now()del módulodatetimepara obtener la fecha y hora actual.tagsde tipolist[str]. Este atributo no se inicializa en el constructor y tiene como valor por defecto una lista vacía.
-
La clase debe tener un método de instancia
add_tagque recibe un parámetrotagde tipostry agrega la etiqueta al atributotags. El método no debe agregar la etiqueta si ya está en el atributotags. -
La clase debe tener un método de instancia
__str__que devuelve unstrcon el siguiente formato:Date: {creation_date} {title}: {text}
Donde
{creation_date}debe ser reemplazado con la fecha de creación de la nota y{title}y{text}deben ser reemplazados con el título y texto de la nota.
-
La clase debe tener un atributo
notesde tipolist[Note]. No debe ser inicializado con un parámetro en el constructor y debe tener como valor por defecto una lista vacía. -
La clase debe tener un método de instancia
add_noteque recibe los parámetrostitlede tipostr,textde tipostreimportancede tipostry devuelve unintcon el código de la nota. El método debe hacer lo siguiente:- Generar un nuevo código para la nota. El código debe ser un entero único mayor que 0. Puedes usar la función
lenpara obtener el número de notas y agregar 1 para obtener el nuevo código. Debes tener cuidado de no agregar un código repetido. - Crear un nuevo objeto
Notecon los parámetros recibidos y el código generado. - Agregar la nueva nota al atributo
notes. - Devolver el código de la nota.
- Generar un nuevo código para la nota. El código debe ser un entero único mayor que 0. Puedes usar la función
-
La clase debe tener un método de instancia
delete_noteque recibe el parámetrocodede tipoint. El método debe eliminar la nota con el código recibido como parámetro del atributonotes. -
La clase debe tener un método de instancia
important_notesque devuelve unalist[Note]con las notas que tienen la importanciaHIGHoMEDIUM. -
La clase debe tener un método de instancia
notes_by_tagque recibe el parámetrotagde tipostry devuelve unalist[Note]con las notas que tienen la etiqueta recibida como parámetro. -
La clase debe tener un método de instancia
tag_with_most_notesque devuelve unstrcon la etiqueta que aparece más en las notas. Si hay múltiples etiquetas con el mismo número de notas, devuelve la primera etiqueta en orden alfabético.
La interfaz de usuario debe tener un menú con las siguientes opciones:
- Agregar nota
- Listar notas
- Agregar etiqueta a nota
- Listar notas importantes
- Eliminar nota
- Mostrar notas por etiqueta
- Mostrar etiqueta con más notas
- Salir
Cada opción se debe implementar como un método de una clase que representa la interfaz por consola.
Además, se debe implementar un método que tenga el ciclo principal de la aplicación. El ciclo debe mostrar el menú y ejecutar la opción seleccionada por el usuario. El ciclo debe terminar cuando el usuario seleccione la opción de salir.
Consejo: Si vas a utilizar alguna librería externa para manejar la interfaz de usuario, asegúrate de instalarla en el entorno virtual de tu proyecto. Puedes usar el comando
uv add <nombre_paquete>para instalar paquetes en tu entorno virtual.
Crea un script principal en el archivo main.py en el cual definas el código necesario para iniciar la
ejecución de la aplicación.