jamiepine/voicebox · warning · ValueError

Cannot delete built-in presets

Error message

Cannot delete built-in presets

What it means

delete_preset() refuses to remove any row with is_builtin True. Built-in presets are managed by application seed data and are not user-deletable. The check runs before db.delete().

Source

Thrown at backend/services/effects.py:116

        chain_dicts = [e.model_dump() for e in data.effects_chain]
        error = validate_effects_chain(chain_dicts)
        if error:
            raise ValueError(error)
        preset.effects_chain = json.dumps(chain_dicts)

    db.commit()
    db.refresh(preset)
    return _preset_response(preset)


def delete_preset(preset_id: str, db: Session) -> bool:
    """Delete a user effect preset. Cannot delete built-in presets."""
    preset = db.query(DBEffectPreset).filter_by(id=preset_id).first()
    if not preset:
        return False
    if preset.is_builtin:
        raise ValueError("Cannot delete built-in presets")

    db.delete(preset)
    db.commit()
    return True

View on GitHub (pinned to 51f49dea19)

Solutions

  1. Hide the delete control for presets where is_builtin is true.
  2. Filter the deletable list to is_builtin == False.
  3. If a built-in must be hidden, add a visibility flag instead of deleting it.

Example fix

# before
delete_preset(builtin_id, db)  # raises

# after — only delete user presets
p = get_preset(pid, db)
if p and not p.is_builtin:
    delete_preset(pid, db)
Defensive patterns

Strategy: validation

Validate before calling

from backend.services.effects import get_preset

def is_deletable(preset_id, db) -> bool:
    p = get_preset(preset_id, db)
    return p is not None and not p.is_builtin

Type guard

def is_builtin_preset(p) -> bool:
    return bool(getattr(p, "is_builtin", False))

Try / catch

try:
    delete_preset(preset_id, db)
except ValueError as e:
    if "built-in" in str(e):
        # return 403, suppress the delete control in UI
        ...
    raise

Prevention

When it happens

Trigger: DELETE /presets/{id} where {id} resolves to a built-in preset (is_builtin=True).

Common situations: Bulk-delete UI; user trying to 'clean up' the default preset list; DELETE on a preset whose id was assumed to be user-owned.

Related errors


AI-assisted analysis of jamiepine/voicebox@51f49dea19 (2026-08-12). Data as JSON: /api/errors/347636a0cc9320eb. Report an issue: GitHub.