fix: QR menu branding fields — display name, header image, empty-to-hide

- menu_display_name is now separate from the site's internal name (was
  incorrectly showing the sysadmin-only site name on the public menu).
- Header image now resolves against the cloud API origin instead of
  the menu-app's own origin, fixing the broken-image icon.
- Tagline/blurb/hours now genuinely hide when cleared: the sysadmin
  save handler was converting empty fields to null, which the PUT
  endpoint's exclude_none silently drops instead of clearing.
- Added a settable blurb (EN/GR) below the tagline, previously
  hardcoded ("Fresh seasonal plates, served with care.").
- Collapsed hours from two fields (EN/GR) to one — opening hours don't
  vary by language.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-19 10:44:28 +03:00
parent f5736b85cb
commit a73f081ca1
7 changed files with 101 additions and 59 deletions

View File

@@ -45,9 +45,13 @@ def _run_migrations():
"ALTER TABLE sites ADD COLUMN menu_mode VARCHAR NOT NULL DEFAULT 'order'",
"ALTER TABLE sites ADD COLUMN menu_tagline_en VARCHAR",
"ALTER TABLE sites ADD COLUMN menu_tagline_gr VARCHAR",
"ALTER TABLE sites ADD COLUMN menu_hours_en VARCHAR",
"ALTER TABLE sites ADD COLUMN menu_hours_gr VARCHAR",
"ALTER TABLE sites ADD COLUMN menu_hours_en VARCHAR", # superseded by menu_hours, kept for history
"ALTER TABLE sites ADD COLUMN menu_hours_gr VARCHAR", # superseded by menu_hours, kept for history
"ALTER TABLE sites ADD COLUMN menu_header_image_url VARCHAR",
"ALTER TABLE sites ADD COLUMN menu_display_name VARCHAR",
"ALTER TABLE sites ADD COLUMN menu_blurb_en VARCHAR",
"ALTER TABLE sites ADD COLUMN menu_blurb_gr VARCHAR",
"ALTER TABLE sites ADD COLUMN menu_hours VARCHAR",
]
for sql in migrations:
try:

View File

@@ -26,8 +26,10 @@ class Site(Base):
# QR menu branding/config
menu_mode = Column(String, nullable=False, default="order") # "order" | "view_only"
menu_display_name = Column(String, nullable=True)
menu_tagline_en = Column(String, nullable=True)
menu_tagline_gr = Column(String, nullable=True)
menu_hours_en = Column(String, nullable=True)
menu_hours_gr = Column(String, nullable=True)
menu_blurb_en = Column(String, nullable=True)
menu_blurb_gr = Column(String, nullable=True)
menu_hours = Column(String, nullable=True)
menu_header_image_url = Column(String, nullable=True)

View File

@@ -39,9 +39,10 @@ def get_menu(site_slug: str, db: Session = Depends(get_db)):
data = json.loads(snapshot.snapshot_json)
data["menu_mode"] = site.menu_mode
data["restaurant"] = {
"name": site.name,
"name": site.menu_display_name,
"tagline": {"en": site.menu_tagline_en, "gr": site.menu_tagline_gr},
"hours": {"en": site.menu_hours_en, "gr": site.menu_hours_gr},
"blurb": {"en": site.menu_blurb_en, "gr": site.menu_blurb_gr},
"hours": site.menu_hours,
"headerImageUrl": site.menu_header_image_url,
}
return data

View File

@@ -16,10 +16,12 @@ class SiteUpdate(BaseModel):
license_expires_at: datetime | None = None
waiter_domain: str | None = None
menu_mode: str | None = None
menu_display_name: str | None = None
menu_tagline_en: str | None = None
menu_tagline_gr: str | None = None
menu_hours_en: str | None = None
menu_hours_gr: str | None = None
menu_blurb_en: str | None = None
menu_blurb_gr: str | None = None
menu_hours: str | None = None
class SiteOut(BaseModel):
@@ -38,10 +40,12 @@ class SiteOut(BaseModel):
last_seen_local_ip: str | None
waiter_domain: str | None
menu_mode: str
menu_display_name: str | None
menu_tagline_en: str | None
menu_tagline_gr: str | None
menu_hours_en: str | None
menu_hours_gr: str | None
menu_blurb_en: str | None
menu_blurb_gr: str | None
menu_hours: str | None
menu_header_image_url: str | None
model_config = {"from_attributes": True}