"""Model-to-supply mapping - data-driven toner/drum/waste part numbers. Replaces the old hardcoded part-number table. Each row maps one printer model to one supply part (a toner of a given color and capacity tier, or a drum/waste/maintenance item). Lets new models and their toners be added through the API/UI without a code change. """ from shopdb.api import db, BaseModel # allowed values, surfaced to the UI via the /supplies/meta endpoint SUPPLY_TYPES = ('toner', 'drum', 'waste', 'maintenance') SUPPLY_COLORS = ('black', 'cyan', 'magenta', 'yellow', 'none') CAPACITY_TIERS = ('standard', 'high', 'extrahigh', 'metered', 'dmo') class ModelSupply(BaseModel): """One supply part belonging to one printer model.""" __tablename__ = 'modelsupplies' modelsupplyid = db.Column(db.Integer, primary_key=True) modelnumberid = db.Column( db.Integer, db.ForeignKey('models.modelnumberid'), nullable=False, ) # toner, drum, waste, maintenance supplytype = db.Column(db.String(20), nullable=False, default='toner') # black, cyan, magenta, yellow, or none (drum/waste have no color) color = db.Column(db.String(20), nullable=False, default='none') # standard, high, extrahigh, metered, dmo capacitytier = db.Column(db.String(20), nullable=False, default='standard') partnumber = db.Column(db.String(50), nullable=False) marketingname = db.Column(db.String(120)) pageyield = db.Column(db.Integer, comment='Rated page yield at 5 percent coverage') notes = db.Column(db.Text) model = db.relationship('Model', backref='supplies') # one part number per model, no duplicates __table_args__ = ( db.UniqueConstraint('modelnumberid', 'partnumber', name='uq_modelsupply_part'), ) def __repr__(self): return f"" def to_dict(self): data = super().to_dict() if self.model: data['modelnumber'] = self.model.modelnumber return data