5. Aplicación patrón de diseño Python - Jacoroch/PocketGymbro-Project GitHub Wiki

Objetivo

El objetivo de esta implementación es aplicar el Prototype Pattern para simplificar la creación de copias de rutinas semanales de ejercicio. Esto permite que los usuarios puedan duplicar rutinas existentes y hacer pequeños ajustes de forma más eficiente.

Descripción de los Cambios

Creación de la Clase RoutinePrototype

Se creó una nueva clase RoutinePrototype en el archivo prototypes.py. Esta clase facilita la clonación de instancias del modelo Rutina_Semanal, lo que permite duplicar rutinas con modificaciones opcionales.

Ubicación: gymapp/prototypes.py

import copy
from .models import Rutina_Semanal

class RoutinePrototype:
    def __init__(self, original_routine):
        self.original_routine = original_routine

    def clone(self, user=None, modifications=None):
        """
        Clone the routine and apply any modifications.
        """
        # Create a deep copy of the original routine
        cloned_routine = copy.deepcopy(self.original_routine)
        
        # If a new user is provided, assign the routine to this user
        if user:
            cloned_routine.user = user

        # Apply any other modifications provided
        if modifications:
            for key, value in modifications.items():
                setattr(cloned_routine, key, value)

        # Reset ID to create a new entry in the database
        cloned_routine.id = None
        cloned_routine.save()
        
        return cloned_routine

Responsabilidades de RoutinePrototype:

Proporcionar una forma fácil de clonar una rutina semanal. Permitir modificaciones opcionales a la rutina clonada (como cambiar el usuario o algunos atributos). Gestionar la lógica de duplicación y persistencia de la nueva rutina en la base de datos. Refactorización de las Views para Clonar Rutinas

Se añadió una nueva view clone_routine en views.py, la cual utiliza la clase RoutinePrototype para crear un clon de una rutina semanal existente.

Ubicación: gymapp/views.py

from .prototypes import RoutinePrototype

@login_required
def clone_routine(request, routine_id):
    # Obtener la rutina original
    original_routine = get_object_or_404(Rutina_Semanal, id=routine_id, user=request.user)
    
    # Crear el prototipo de la rutina
    routine_prototype = RoutinePrototype(original_routine)
    
    # Clonar la rutina (con modificaciones si se especifican)
    cloned_routine = routine_prototype.clone(user=request.user)

    # Redirigir a la vista de la nueva rutina o página principal
    return redirect('view_routine', routine_id=cloned_routine.id)

Flujo de clone_routine:

Obtiene la rutina original que se desea clonar. Crea una instancia de RoutinePrototype basada en la rutina original. Llama al método clone() del prototipo para duplicar la rutina. Redirige al usuario a la vista de la nueva rutina clonada o a la página principal. Ventajas del Prototype Pattern en Esta Funcionalidad

Centralización de la Lógica de Clonación:

La lógica para duplicar una rutina está centralizada en la clase RoutinePrototype, lo que facilita mantener y modificar esta funcionalidad en un solo lugar.

Facilidad de Uso y Extensión:

Si se requiere cambiar la lógica de clonación (como añadir validaciones o campos adicionales), solo se necesita modificar la clase RoutinePrototype.

Reutilización y Consistencia:

La clase RoutinePrototype puede reutilizarse para cualquier tipo de clonación de rutinas en la aplicación, garantizando que todas las copias sigan la misma estructura y reglas. Cómo Extender la Funcionalidad

Si en el futuro se necesita clonar otros objetos similares (como dietas diarias o semanales), simplemente se puede crear un nuevo prototipo siguiendo la estructura del RoutinePrototype, manteniendo consistencia y simplicidad en la lógica de clonación.

Ejemplo de Uso de la Nueva Funcionalidad

Un usuario que desea duplicar una rutina semanal específica, por ejemplo, para hacer pequeños ajustes (como cambiar ejercicios o días de descanso). El usuario selecciona la opción para clonar la rutina, y la nueva rutina clonada se genera utilizando el RoutinePrototype. La rutina clonada se presenta al usuario como una nueva entidad independiente, lista para ser editada o utilizada.