from Controllers.Postgres.engine import Base from sqlalchemy import Column, Integer, String, Float, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy_mixins.serialize import SerializeMixin from sqlalchemy_mixins.repr import ReprMixin from sqlalchemy_mixins.smartquery import SmartQueryMixin from sqlalchemy_mixins.activerecord import ActiveRecordMixin class BasicMixin( Base, ActiveRecordMixin, SerializeMixin, ReprMixin, SmartQueryMixin, ): __abstract__ = True __repr__ = ReprMixin.__repr__ id = mapped_column(Integer, primary_key=True) class Product(BasicMixin): __tablename__ = 'products' name = Column(String, unique=True) price = Column(Float) class Category(BasicMixin): __tablename__ = 'categories' name = Column(String, unique=True) class Supplier(BasicMixin): __tablename__ = 'suppliers' name = Column(String, unique=True) rating = Column(Float) class ShippingAddress(BasicMixin): __tablename__ = 'shipping_addresses' address_line_1 = Column(String, unique=True) city = Column(String) zip_code = Column(String) class Order(BasicMixin): __tablename__ = 'orders' order_date = Column(String) total_amount = Column(Float) user_id = Column(Integer, ForeignKey('users.id')) shipping_address_id = Column(Integer, ForeignKey('shipping_addresses.id')) user = relationship("User", back_populates="orders") shipping_address = relationship("ShippingAddress") class User(BasicMixin): __tablename__ = 'users' username = Column(String, unique=True) account_balance = Column(Float) preferred_category_id = Column(Integer, ForeignKey('categories.id')) last_ordered_product_id = Column(Integer, ForeignKey('products.id')) supplier_rating_id = Column(Integer, ForeignKey('suppliers.id')) preferred_category = relationship("Category") last_ordered_product = relationship("Product") supplier_rating = relationship("Supplier") orders = relationship("Order", back_populates="user")