From e119f4d0ce0567fa7103e6856b47a1346e4eb546 Mon Sep 17 00:00:00 2001 From: Chris Farhood Date: Mon, 4 May 2026 18:36:22 +0000 Subject: [PATCH] fix: add missing relationship stubs to resolve SQLAlchemy mapper errors - Purchase.user relationship to satisfy User.purchases back_populates - Store.user_accounts relationship to satisfy UserStoreAccount.store back_populates Co-Authored-By: Paperclip --- src/receiptwitness/shared/models/stub_purchase.py | 9 ++++++++- src/receiptwitness/shared/models/stub_store.py | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/receiptwitness/shared/models/stub_purchase.py b/src/receiptwitness/shared/models/stub_purchase.py index fb269b8..b872356 100644 --- a/src/receiptwitness/shared/models/stub_purchase.py +++ b/src/receiptwitness/shared/models/stub_purchase.py @@ -9,6 +9,8 @@ import uuid from datetime import date, datetime from decimal import Decimal +from typing import TYPE_CHECKING + from sqlalchemy import ( JSON, Date, @@ -20,10 +22,13 @@ from sqlalchemy import ( UniqueConstraint, func, ) -from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.orm import Mapped, mapped_column, relationship from receiptwitness.shared.models.base import Base, TimestampMixin, UUIDPrimaryKeyMixin +if TYPE_CHECKING: + from receiptwitness.shared.models.user import User + class Purchase(UUIDPrimaryKeyMixin, TimestampMixin, Base): """Stub: a shopping trip/receipt. Full definition in cartsnitch/common.""" @@ -52,6 +57,8 @@ class Purchase(UUIDPrimaryKeyMixin, TimestampMixin, Base): UniqueConstraint("user_id", "store_id", "receipt_id", name="uq_purchase_receipt"), ) + user: Mapped["User"] = relationship(back_populates="purchases") + class PurchaseItem(UUIDPrimaryKeyMixin, TimestampMixin, Base): """Stub: a line item on a receipt. Full definition in cartsnitch/common.""" diff --git a/src/receiptwitness/shared/models/stub_store.py b/src/receiptwitness/shared/models/stub_store.py index c8a61ca..283f6a3 100644 --- a/src/receiptwitness/shared/models/stub_store.py +++ b/src/receiptwitness/shared/models/stub_store.py @@ -7,12 +7,17 @@ UserStoreAccount. The canonical definitions live in cartsnitch/common. import uuid +from typing import TYPE_CHECKING + from sqlalchemy import Float, ForeignKey, String -from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.orm import Mapped, mapped_column, relationship from receiptwitness.shared.constants import StoreSlug from receiptwitness.shared.models.base import Base, TimestampMixin, UUIDPrimaryKeyMixin +if TYPE_CHECKING: + from receiptwitness.shared.models.user import UserStoreAccount + class Store(UUIDPrimaryKeyMixin, TimestampMixin, Base): """Stub: canonical retailer. Full definition in cartsnitch/common.""" @@ -24,6 +29,8 @@ class Store(UUIDPrimaryKeyMixin, TimestampMixin, Base): logo_url: Mapped[str | None] = mapped_column(String(500)) website_url: Mapped[str | None] = mapped_column(String(500)) + user_accounts: Mapped[list["UserStoreAccount"]] = relationship(back_populates="store") + class StoreLocation(UUIDPrimaryKeyMixin, TimestampMixin, Base): """Stub: physical store location. Full definition in cartsnitch/common."""