87d53db0cb
First step of decoupling artist identity/storage/display. migration 0077 drops uq_artist_name so the display name is free text (two genuinely different creators can share a name); the slug stays the immutable, unique storage/identity key (the on-disk path component — untouched, so nothing moves). ArtistService.rename + PATCH /api/artists/<id> change the name ONLY. Frontend: inline pencil-edit on the artist header (mirrors TagCard), slug/route unaffected so no navigation. Fixes the operator's 'no surface to rename an artist' + the name-collision fragility. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
33 lines
1.2 KiB
Python
33 lines
1.2 KiB
Python
"""drop uq_artist_name — decouple display name from identity/storage
|
|
|
|
Revision ID: 0077
|
|
Revises: 0076
|
|
Create Date: 2026-07-04
|
|
|
|
Artist model fragility fix (milestone #130). One `slug` column was doing
|
|
identity + storage-path + display, and BOTH `name` and `slug` were UNIQUE, so
|
|
the display name couldn't be edited freely and two genuinely different creators
|
|
collided. Decouple: `slug` stays the immutable, unique storage/identity key (the
|
|
on-disk path component — untouched here); `name` becomes freely editable, NON-
|
|
unique display text. This migration only drops the `uq_artist_name` constraint;
|
|
no data moves and no path changes.
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
|
|
revision: str = "0077"
|
|
down_revision: Union[str, None] = "0076"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.drop_constraint("uq_artist_name", "artist", type_="unique")
|
|
|
|
|
|
def downgrade() -> None:
|
|
# Re-adding the UNIQUE would fail if duplicate names now exist; callers that
|
|
# need to reverse this must dedupe names first.
|
|
op.create_unique_constraint("uq_artist_name", "artist", ["name"])
|