Desk-Back2 / app /db /models.py
Fred808's picture
Upload 32 files
8dafdf7 verified
Raw History Blame Contribute Delete
8.33 kB
from sqlalchemy import Column, Integer, String, Boolean, DateTime, Float, ForeignKey, ARRAY, JSON, Table
from sqlalchemy.orm import relationship, mapped_column, Mapped
from sqlalchemy.dialects.postgresql import JSONB
from datetime import datetime
from typing import List, Optional
from .database import Base
# Association tables for many-to-many relationships
user_roles = Table(
'user_roles',
Base.metadata,
Column('user_id', Integer, ForeignKey('users.id')),
Column('role_id', Integer, ForeignKey('roles.id'))
)
# Role model
class Role(Base):
__tablename__ = "roles"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String, unique=True, index=True)
description: Mapped[str] = mapped_column(String)
permissions: Mapped[List[str]] = mapped_column(ARRAY(String), default=list)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationships
users = relationship("User", secondary=user_roles, back_populates="roles")
# Branch model
class Branch(Base):
__tablename__ = "branches"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String, unique=True, index=True)
address: Mapped[str] = mapped_column(String)
phone: Mapped[str] = mapped_column(String)
email: Mapped[str] = mapped_column(String)
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationships
users = relationship("User", back_populates="branch")
products = relationship("Product", back_populates="branch")
orders = relationship("Order", back_populates="branch")
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True)
email: Mapped[str] = mapped_column(String, unique=True, index=True)
username: Mapped[str] = mapped_column(String, unique=True, index=True)
full_name: Mapped[str] = mapped_column(String)
hashed_password: Mapped[str] = mapped_column(String)
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
is_superuser: Mapped[bool] = mapped_column(Boolean, default=False)
branch_id: Mapped[Optional[int]] = mapped_column(ForeignKey("branches.id"))
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
# Update roles relationship to use many-to-many
roles = relationship("Role", secondary=user_roles, back_populates="users")
# Other relationships
branch = relationship("Branch", back_populates="users")
products = relationship("Product", back_populates="seller")
orders = relationship("Order", back_populates="customer")
notifications = relationship("Notification", back_populates="user")
sessions = relationship("Session", back_populates="user", cascade="all, delete-orphan")
class Product(Base):
__tablename__ = "products"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String, index=True)
description: Mapped[str] = mapped_column(String)
price: Mapped[float] = mapped_column(Float)
category: Mapped[str] = mapped_column(String, index=True)
inventory_count: Mapped[int] = mapped_column(Integer)
seller_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
branch_id: Mapped[int] = mapped_column(ForeignKey("branches.id"))
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
updated_at: Mapped[datetime] = mapped_column(
DateTime,
default=datetime.utcnow,
onupdate=datetime.utcnow
)
# Relationships
seller = relationship("User", back_populates="products")
branch = relationship("Branch", back_populates="products")
order_items = relationship("OrderItem", back_populates="product")
class Order(Base):
__tablename__ = "orders"
id: Mapped[int] = mapped_column(primary_key=True)
customer_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
branch_id: Mapped[int] = mapped_column(ForeignKey("branches.id"))
total_amount: Mapped[float] = mapped_column(Float)
status: Mapped[str] = mapped_column(String)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
updated_at: Mapped[datetime] = mapped_column(
DateTime,
default=datetime.utcnow,
onupdate=datetime.utcnow
)
# Relationships
customer = relationship("User", back_populates="orders")
branch = relationship("Branch", back_populates="orders")
items = relationship("OrderItem", back_populates="order", cascade="all, delete-orphan")
class OrderItem(Base):
__tablename__ = "order_items"
id: Mapped[int] = mapped_column(primary_key=True)
order_id: Mapped[int] = mapped_column(ForeignKey("orders.id"))
product_id: Mapped[int] = mapped_column(ForeignKey("products.id"))
quantity: Mapped[int] = mapped_column(Integer)
price: Mapped[float] = mapped_column(Float)
# Relationships
order = relationship("Order", back_populates="items")
product = relationship("Product", back_populates="order_items")
class Notification(Base):
__tablename__ = "notifications"
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
title: Mapped[str] = mapped_column(String)
message: Mapped[str] = mapped_column(String)
type: Mapped[str] = mapped_column(String)
data: Mapped[Optional[dict]] = mapped_column(JSONB)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
read: Mapped[bool] = mapped_column(Boolean, default=False)
# Relationship
user = relationship("User", back_populates="notifications")
class Event(Base):
__tablename__ = "events"
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
title: Mapped[str] = mapped_column(String)
description: Mapped[str] = mapped_column(String)
start_time: Mapped[datetime] = mapped_column(DateTime)
end_time: Mapped[datetime] = mapped_column(DateTime)
attendees: Mapped[List[str]] = mapped_column(ARRAY(String), default=list)
is_all_day: Mapped[bool] = mapped_column(Boolean, default=False)
reminder_minutes: Mapped[int] = mapped_column(Integer)
status: Mapped[str] = mapped_column(String)
attendee_responses: Mapped[dict] = mapped_column(JSONB, default=dict)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
updated_at: Mapped[datetime] = mapped_column(
DateTime,
default=datetime.utcnow,
onupdate=datetime.utcnow
)
# Fields for recurring events
is_recurring: Mapped[bool] = mapped_column(Boolean, default=False)
recurrence_pattern: Mapped[Optional[str]] = mapped_column(String)
recurrence_group: Mapped[Optional[str]] = mapped_column(String)
recurrence_end_date: Mapped[Optional[datetime]] = mapped_column(DateTime)
parent_event_id: Mapped[Optional[int]] = mapped_column(Integer)
sequence_number: Mapped[Optional[int]] = mapped_column(Integer)
reminder_sent: Mapped[bool] = mapped_column(Boolean, default=False)
# Relationship
user = relationship("User")
class Session(Base):
__tablename__ = "sessions"
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
session_token: Mapped[str] = mapped_column(String, unique=True, index=True)
last_activity: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
expires_at: Mapped[datetime] = mapped_column(DateTime)
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
# Relationship
user = relationship("User", back_populates="sessions")