Backend: table groups with prefix/color, auto-numbering, has_active_order flag
TableGroup gains prefix and color columns for display in the PWA zone filter. Table creation now assigns a global auto-increment number; batch creation uses group-local label numbering (avoids gaps/conflicts when adding to existing groups). DELETE table now blocks if an active order exists (soft or hard delete). Hard delete cascades past orders before removing the table row. list_tables enriches each TableOut with has_active_order computed server-side. TableOut no longer requires number in the input payload; TableCreate simplified. Migration runner refactored to give each ALTER TABLE its own connection so a no-op (column already exists) doesn't leave a dirty transaction blocking later migrations. New migrations added for all new columns. Order.print_logs relationship gains cascade="all, delete-orphan" so print logs are removed when an order is deleted. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -19,25 +19,29 @@ from routers import auth, tables, products, orders, waiters, reports, system
|
||||
|
||||
|
||||
def _run_migrations():
|
||||
"""Apply additive schema changes that create_all won't handle."""
|
||||
"""Apply additive schema changes that create_all won't handle.
|
||||
Each migration gets its own connection so a no-op (column already exists)
|
||||
doesn't leave a dirty transaction that blocks subsequent migrations."""
|
||||
from sqlalchemy import text
|
||||
with engine.connect() as conn:
|
||||
# Add extra_cost to product_ingredients if missing
|
||||
|
||||
migrations = [
|
||||
"ALTER TABLE product_ingredients ADD COLUMN extra_cost REAL NOT NULL DEFAULT 0.0",
|
||||
"ALTER TABLE products ADD COLUMN image_url VARCHAR",
|
||||
"ALTER TABLE tables ADD COLUMN group_id INTEGER REFERENCES table_groups(id)",
|
||||
"ALTER TABLE table_groups ADD COLUMN prefix VARCHAR",
|
||||
"ALTER TABLE table_groups ADD COLUMN color VARCHAR",
|
||||
"ALTER TABLE products ADD COLUMN sort_order INTEGER NOT NULL DEFAULT 0",
|
||||
"ALTER TABLE product_preference_sets ADD COLUMN default_choice_id INTEGER",
|
||||
"ALTER TABLE product_preference_choices ADD COLUMN sub_choices TEXT",
|
||||
"ALTER TABLE product_preference_choices ADD COLUMN disables_subset INTEGER NOT NULL DEFAULT 0",
|
||||
"ALTER TABLE product_preference_sets ADD COLUMN shared_subset TEXT",
|
||||
"ALTER TABLE product_options ADD COLUMN sub_choices TEXT",
|
||||
]
|
||||
for sql in migrations:
|
||||
try:
|
||||
conn.execute(text("ALTER TABLE product_ingredients ADD COLUMN extra_cost REAL NOT NULL DEFAULT 0.0"))
|
||||
conn.commit()
|
||||
except Exception:
|
||||
pass
|
||||
# Add image_url to products if missing
|
||||
try:
|
||||
conn.execute(text("ALTER TABLE products ADD COLUMN image_url VARCHAR"))
|
||||
conn.commit()
|
||||
except Exception:
|
||||
pass
|
||||
# Add group_id to tables if missing (added in Phase 3 table groups)
|
||||
try:
|
||||
conn.execute(text("ALTER TABLE tables ADD COLUMN group_id INTEGER REFERENCES table_groups(id)"))
|
||||
conn.commit()
|
||||
with engine.connect() as conn:
|
||||
conn.execute(text(sql))
|
||||
conn.commit()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
Reference in New Issue
Block a user