"""
Rutas/Endpoints para el módulo de materiales.
"""
from flask import flash, redirect, render_template, request, url_for
from app.exceptions import ConflictError, NotFoundError, ValidationError
from . import materials_bp
from .forms import MaterialForm
from .services import MaterialService
@materials_bp.route("/", methods=["GET"])
def list_materials():
"""
Muestra la lista de materiales del catálogo.
Returns:
HTML: Página con la lista de materiales
"""
materials = MaterialService.get_all()
return render_template("materials/list.html", materials=materials)
@materials_bp.route("/create", methods=["GET", "POST"])
def create_material():
"""
Muestra el formulario y crea un nuevo material.
GET: Renderiza el formulario de creación.
POST: Valida el formulario, crea el material y redirige.
Returns:
GET - HTML: Página con el formulario
POST - Redirect: Redirige con mensaje flash
"""
form = MaterialForm()
if form.validate_on_submit():
data = {
"name": form.name.data,
"description": form.description.data,
}
try:
MaterialService.create(data)
flash("Material creado exitosamente", "success")
return redirect(url_for("materials.create_material"))
except ConflictError as e:
flash(e.message, "error")
return render_template("materials/create.html", form=form)
@materials_bp.route("/<int:id_material>/edit", methods=["GET", "POST"])
def edit_material(id_material: int):
"""
Muestra el formulario y actualiza un material existente.
GET: Renderiza el formulario con los datos actuales.
POST: Valida el formulario, actualiza el material y redirige.
Returns:
GET - HTML: Página con el formulario de edición
POST - Redirect: Redirige con mensaje flash
"""
try:
material = MaterialService.get_by_id(id_material)
except NotFoundError as e:
flash(e.message, "error")
return redirect(url_for("materials.list_materials"))
form = MaterialForm()
if form.validate_on_submit():
data = {
"name": form.name.data,
"description": form.description.data,
}
try:
MaterialService.update(id_material, data)
flash("Material actualizado exitosamente", "success")
return redirect(url_for("materials.list_materials"))
except (ConflictError, ValidationError) as e:
flash(e.message, "error")
elif request.method == "GET":
# Pre-poblar el formulario
form.name.data = material.name
form.description.data = material.description
return render_template("materials/edit.html", form=form, material=material)
@materials_bp.route("/<int:id_material>/delete", methods=["POST"])
def delete_material(id_material: int):
"""
Ejecuta la eliminación lógica de un material.
Returns:
Redirect: Redirige a la lista con mensaje flash
"""
try:
MaterialService.delete(id_material)
flash("Material eliminado exitosamente", "success")
except NotFoundError as e:
flash(e.message, "error")
return redirect(url_for("materials.list_materials"))