Parcial 4: Aplicando patrones de diseño, Enunciado y Resuelto en PYthon by Yuscu Mejia
Ejercicio: Gestión de Permisos en Instagram
Introducción
¡Hola! Soy Yuscu Mejía y hoy vamos a implementar un sistema de gestión de permisos inspirado en Instagram utilizando el patrón de diseño State.
Ejercicio: Crear un Sistema de Gestión de Permisos

Imagina que estás desarrollando un sistema de gestión de permisos para Instagram con Yuscu Mejía con la dirección de la creación de esa funcionalidad. Los usuarios pueden tener diferentes estados según sus permisos: Visitante, Usuario Básico, Moderador, y Administrador. Cada estado permite o restringe ciertas acciones que el usuario puede realizar dentro de la aplicación.
Requisitos:
- Visitante: Puede ver contenido público, pero no puede editar ni comentar. Si decide registrarse, se convierte en Usuario Básico.
- Usuario Básico: Puede ver contenido, comentar, y editar su propio contenido. Puede solicitar ser Moderador.
- Moderador: Además de las acciones de un Usuario Básico, puede eliminar comentarios de otros usuarios. Puede ser promovido a Administrador por otro Administrador.
- Administrador: Tiene control total sobre el sistema. Puede crear o eliminar usuarios, cambiar permisos, y modificar todo el contenido. Puede degradar a un Moderador o Usuario Básico si lo considera necesario.
Objetivo del ejercicio:
Implementa el patrón State para gestionar los diferentes roles y permisos en el sistema. Cada clase de estado (Visitante, Usuario Básico, Moderador, Administrador) debe implementar las acciones permitidas (por ejemplo, ver contenido, comentar, editar contenido, etc.). Debes definir transiciones entre los estados, por ejemplo, un Visitante puede registrarse para convertirse en Usuario Básico, y un Moderador puede ser promovido a Administrador o degradado. Los métodos deben reflejar los permisos de cada estado, por ejemplo, si un Visitante intenta comentar, la aplicación debería dar un mensaje de error.
Ayuda:
Se recomienda crear una clase llamada Contenido.
Te damos una ayuda extra dándote la clase Actor:
from abc import ABC, abstractmethod
class Actor:
def __init__(self, nombre, dni):
self.estado = Visitante(self)
self.nombre = nombre
self.dni = dni
def cambiarEstado(self, nuevoestado):
self.estado = nuevoestado
def verContenido(self, contenido):
self.estado.verContenido(contenido)
def comentar(self, contenido, comentario):
self.estado.comentar(contenido, comentario)
def editar(self, contenido, nuevo_contenido):
self.estado.editar(contenido, nuevo_contenido)
def eliminarComentario(self, contenido):
self.estado.eliminarComentario(contenido)
def registrar(self):
self.estado.registrar()
def promoverAModerador(self, usuario):
self.estado.promoverAModerador(usuario)
def promoverAAdministrador(self, usuario):
self.estado.promoverAAdministrador(usuario)
Solución:
from abc import ABC, abstractmethod
class Actor:
def __init__(self, nombre, dni):
self.estado = Visitante(self)
self.nombre = nombre
self.dni = dni
def cambiarEstado(self, nuevoestado):
self.estado = nuevoestado
def verContenido(self, contenido):
self.estado.verContenido(contenido)
def comentar(self, contenido, comentario):
self.estado.comentar(contenido, comentario)
def editar(self, contenido, nuevo_contenido):
self.estado.editar(contenido, nuevo_contenido)
def eliminarComentario(self, contenido):
self.estado.eliminarComentario(contenido)
def registrar(self):
self.estado.registrar()
def promoverAModerador(self, usuario):
self.estado.promoverAModerador(usuario)
def promoverAAdministrador(self, usuario):
self.estado.promoverAAdministrador(usuario)
class Contenido:
def __init__(self, actor, contenido, tipo):
self.propietario = actor.dni
self.contenido = contenido
self.tipo = tipo
self.comentarios = [] # Lista para almacenar los comentarios
def getContenido(self):
return self.contenido
def esPropietario(self, actor):
return self.propietario == actor.dni
def esPublico(self):
return self.tipo == "publico"
def agregarComentario(self, comentario):
"""Agrega un comentario a la lista de comentarios."""
self.comentarios.append(comentario)
print(f"Comentario agregado: {comentario}")
def eliminarComentarios(self):
"""Elimina todos los comentarios, vaciando la lista."""
self.comentarios.clear()
print("Todos los comentarios han sido eliminados.")
class Estado(ABC):
def __init__(self, actor):
self.actor = actor
@abstractmethod
def verContenido(self, contenido):
pass
@abstractmethod
def comentar(self, contenido, comentario):
pass
@abstractmethod
def editar(self, contenido, nuevo_contenido):
pass
@abstractmethod
def eliminarComentario(self, contenido):
pass
@abstractmethod
def registrar(self):
pass
@abstractmethod
def promoverAModerador(self, usuario):
pass
@abstractmethod
def promoverAAdministrador(self, usuario):
pass
class Visitante(Estado):
def verContenido(self, contenido):
if contenido.esPublico():
print("Contenido público: ", contenido.getContenido())
else:
print("No puedes ver el contenido privado. Necesitas registrarte.")
def comentar(self, contenido, comentario):
print("No puedes comentar. Necesitas registrarte.")
def editar(self, contenido, nuevo_contenido):
print("No puedes editar el contenido. Necesitas registrarte.")
def eliminarComentario(self, contenido):
print("No tienes permisos para eliminar comentarios.")
def registrar(self):
print("Te has registrado con éxito.")
self.actor.cambiarEstado(UsuarioBasico(self.actor))
def promoverAModerador(self, usuario):
print("No tienes permisos para promover a alguien.")
def promoverAAdministrador(self, usuario):
print("No tienes permisos para promover a alguien.")
class UsuarioBasico(Visitante):
def verContenido(self, contenido):
print("Contenido: ", contenido.getContenido())
def comentar(self, contenido, comentario):
contenido.agregarComentario(comentario)
def editar(self, contenido, nuevo_contenido):
if contenido.esPropietario(self.actor):
contenido.contenido = nuevo_contenido
print("Contenido editado con éxito.")
else:
print("No puedes editar contenido que no es tuyo.")
def eliminarComentario(self, contenido):
if contenido.esPropietario(self.actor):
contenido.eliminarComentarios()
print("Todos los comentarios de tu contenido han sido eliminados.")
else:
print("No tienes permiso para eliminar comentarios en contenido que no es tuyo.")
def registrar(self):
print("Ya estás registrado.")
class Moderador(UsuarioBasico):
def eliminarComentario(self, contenido):
contenido.eliminarComentarios()
print("Todos los comentarios del contenido han sido eliminados.")
def editar(self, contenido, nuevo_contenido):
contenido.contenido = nuevo_contenido
print("El contenido ha sido editado por el moderador.")
class Administrador(Moderador):
def promoverAModerador(self, usuario):
usuario.cambiarEstado(Moderador(usuario))
print(f"{usuario.nombre} ha sido promovido a moderador.")
def promoverAAdministrador(self, usuario):
usuario.cambiarEstado(Administrador(usuario))
print(f"{usuario.nombre} ha sido promovido a administrador.")
# Ejemplo de uso
visitante = Actor("Juan", "111")
otrovisitante = Actor("Maria", "222")
contenido_publico = Contenido(visitante, "Foto pública", "publico")
contenido_privado = Contenido(otrovisitante, "Foto privada", "privado")
visitante.verContenido(contenido_publico)
visitante.registrar()
visitante.comentar(contenido_publico, "¡Qué buena foto!")
Práctica
Te invito a ver el resuelto de este ejercicio en nuestro canal de YouTube:
Recorda si te gusta los videos, te agradeceria si le pones un comentario o un like para saber si subir mas videos! 😮
Si no sabes que comentar, comenta con: estoy avanzando rapido con el curso de Programacion python 🙂 asi te detectaremos que viniste de aca, para una estadistica si conviene o no subir videos

