from sqlalchemy import Column, Integer, String, Text, ForeignKey from sqlalchemy.orm import declarative_base, relationship Base = declarative_base() class Device(Base): __tablename__ = "device" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(100), nullable=False, unique=True) battery_slots = Column(Integer, nullable=False, default=1) device_type = Column(String(50), nullable=True) notes = Column(Text, nullable=True) batteries = relationship("Battery", back_populates="device") def installed_count(self): return sum(1 for b in self.batteries if b.status == "installed") def installed_brands(self): return set(b.brand for b in self.batteries if b.status == "installed") def has_mixed_brands(self): return len(self.installed_brands()) > 1 def __repr__(self): return f"" class Battery(Base): __tablename__ = "battery" id = Column(Integer, primary_key=True, autoincrement=True) label = Column(String(50), nullable=False) brand = Column(String(100), nullable=False) status = Column(String(20), nullable=False, default="available") device_id = Column(Integer, ForeignKey("device.id", ondelete="SET NULL"), nullable=True) notes = Column(Text, nullable=True) # Optional metadata size = Column(String(20), nullable=True) # AA, AAA, 18650, CR2032 … chemistry = Column(String(20), nullable=True) # NiMH, Alkaline, Li-ion … capacity_mah = Column(Integer, nullable=True) # nominal capacity in mAh tested_capacity_mah = Column(Integer, nullable=True) # last measured capacity in mAh tested_date = Column(String(10), nullable=True) # YYYY-MM-DD of last test charge_cycles = Column(Integer, nullable=True) # number of charge cycles purchase_date = Column(String(10), nullable=True) # YYYY-MM-DD when purchased storage_location = Column(String(100), nullable=True) # where stored when not installed device = relationship("Device", back_populates="batteries") def is_available(self): return self.status == "available" def is_retired(self): return self.status == "retired" def is_installed(self): return self.status == "installed" def __repr__(self): return f""