0262ed3d97
- Sidebar bottom-left now shows the signed-in user; clicking opens a menu with Settings and Sign out. New /settings page: account info + change password (POST /auth/change-password, re-verifies current password). Export/restore/ delete are stubbed there for the next pass. - Per-tree default/home person: tree.home_person_id (migration) + TreeUpdate/ Read; the tree and family views open focused on it; the person page gets a "Set as default" control and "Default person" badge. Cleared if that person is deleted. Complements the account-level "this is me" link. - Tree visualization now fills the content area (AppShell drops the max-width column on the /tree route); other pages stay centered. - Audit records are coerced JSON-safe (UUIDs/enums), so PATCHing UUID fields like home_person_id audits cleanly. 50 backend tests pass; migration up/down verified; frontend builds. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
34 lines
823 B
Python
34 lines
823 B
Python
"""tree.home_person_id (per-tree default/home person)
|
|
|
|
Revision ID: c7e1a4f2d3b8
|
|
Revises: b3d5f8a1c920
|
|
Create Date: 2026-06-07
|
|
|
|
"""
|
|
from collections.abc import Sequence
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision: str = "c7e1a4f2d3b8"
|
|
down_revision: str | None = "b3d5f8a1c920"
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.add_column("trees", sa.Column("home_person_id", sa.Uuid(), nullable=True))
|
|
op.create_foreign_key(
|
|
"fk_trees_home_person_id",
|
|
"trees",
|
|
"persons",
|
|
["home_person_id"],
|
|
["id"],
|
|
ondelete="SET NULL",
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_constraint("fk_trees_home_person_id", "trees", type_="foreignkey")
|
|
op.drop_column("trees", "home_person_id")
|