Files

77 lines
2.3 KiB
Python

"""EquipmentGroup (Bundle) model for grouping equipment items."""
import uuid
from datetime import datetime
from sqlalchemy import String, DateTime, ForeignKey, func, Float, Text, Table, Column
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.db.base import Base
# Many-to-many association table: equipment_groups ↔ equipment
equipment_group_items = Table(
"equipment_group_items",
Base.metadata,
Column(
"group_id",
String(36),
ForeignKey("equipment_groups.id", ondelete="CASCADE"),
primary_key=True,
),
Column(
"equipment_id",
String(36),
ForeignKey("equipment.id", ondelete="CASCADE"),
primary_key=True,
),
Column(
"quantity",
Float,
nullable=False,
default=1.0,
),
)
class EquipmentGroup(Base):
"""Represents a bundle/group of equipment items."""
__tablename__ = "equipment_groups"
id: Mapped[str] = mapped_column(
String(36), primary_key=True, default=lambda: str(uuid.uuid4())
)
account_id: Mapped[str] = mapped_column(
String(36), ForeignKey("accounts.id", ondelete="CASCADE"), nullable=False
)
name: Mapped[str] = mapped_column(String(255), nullable=False)
description: Mapped[str | None] = mapped_column(Text, nullable=True)
daily_rate: Mapped[float | None] = mapped_column(Float, nullable=True)
default_location_id: Mapped[str | None] = mapped_column(
String(36), ForeignKey("stock_locations.id", ondelete="SET NULL"), nullable=True
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), nullable=False
)
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
server_default=func.now(),
onupdate=func.now(),
nullable=False,
)
# Relationships
account: Mapped["Account"] = relationship(
"Account", back_populates="equipment_groups"
)
default_location: Mapped["StockLocation"] = relationship(
"StockLocation", back_populates="equipment_groups"
)
items: Mapped[list["Equipment"]] = relationship(
"Equipment", secondary=equipment_group_items, backref="groups"
)
def __repr__(self) -> str:
return f"<EquipmentGroup {self.name}>"