Volver a la wiki

Stencils duplicados en paleta (bug restore, ronda funcional 13-08-2026)

Descripción

Durante la ronda funcional de mantenimiento del 13-08-2026, se descubrió que la paleta de stencils del editor de racks mostraba ~148 entradas cuando el catálogo real son 57 stencils.

La causa: la función apply_full_restore_from_zip() en racks/api/export/restore.py creaba stencils sin comprobar si ya existían. Cada restauración repetida de un backup duplicaba el catálogo completo.

Síntomas en PROD

Root cause

Línea 150 en restore.py usaba Stencil.objects.create() incondicionalmente:

Stencil.objects.create(
    organization=org,
    name=s["name"],
    category=s.get("category", ""),
    image_path=s.get("image_path", ""),
    ...
)

Contrasta con las BoxCategory (3 líneas más arriba) que ya usaban get_or_create().

Fix aplicado (v1.66.8)

Cambio a get_or_create() con unique lógico organization + name + image_path:

_, created = Stencil.objects.get_or_create(
    organization=org,
    name=s["name"],
    image_path=s.get("image_path", ""),
    defaults={
        "category": s.get("category", ""),
        "default_u_height": s.get("default_u_height", 1),
        "manufacturer": s.get("manufacturer", ""),
        "extra_data": s.get("extra_data", ""),
    },
)
if created:
    counts["stencils"] += 1

Contrato de idempotencia: test nuevo en tests/api/test_backup_restore_async.py::test_stencils_no_se_duplican_al_restaurar_dos_veces verifica que restaurar el mismo backup dos veces genera exactamente 1 Stencil en la BD.

Remediación de datos

Deuda técnica declarada

La hipótesis del duplicado del pack global (ids 150–174, que aparecieron 2 veces) es razonada pero no observada directamente:

Impacto usuario

Ninguno visible: mismo comportamiento, pero catálogo limpio. El editor sigue funcionando igual, solo con la paleta correcta (57 stencils en lugar de 148).

Véase también

Subir