"""Printer plugin models - new Asset-based architecture.""" from shopdb.extensions import db from shopdb.core.models.base import BaseModel class PrinterType(BaseModel): """ Printer type classification. Examples: Laser, Inkjet, Label, MFP, Plotter, etc. """ __tablename__ = 'printertypes' printertypeid = db.Column(db.Integer, primary_key=True) printertype = db.Column(db.String(100), unique=True, nullable=False) description = db.Column(db.Text) icon = db.Column(db.String(50), comment='Icon name for UI') def __repr__(self): return f"" class Printer(BaseModel): """ Printer-specific extension data (new Asset architecture). Links to core Asset table via assetid. Stores printer-specific fields like type, Windows name, share name, etc. """ __tablename__ = 'printers' printerid = db.Column(db.Integer, primary_key=True) # Link to core asset assetid = db.Column( db.Integer, db.ForeignKey('assets.assetid', ondelete='CASCADE'), unique=True, nullable=False, index=True ) # Printer classification printertypeid = db.Column( db.Integer, db.ForeignKey('printertypes.printertypeid'), nullable=True ) # Vendor vendorid = db.Column( db.Integer, db.ForeignKey('vendors.vendorid'), nullable=True ) modelnumberid = db.Column( db.Integer, db.ForeignKey('models.modelnumberid'), nullable=True ) # Network identity hostname = db.Column( db.String(100), index=True, comment='Network hostname' ) # Windows/Network naming windowsname = db.Column( db.String(255), comment='Windows printer name (e.g., \\\\server\\printer)' ) sharename = db.Column( db.String(100), comment='CSF/share name' ) # Installation iscsf = db.Column(db.Boolean, default=False, comment='Is CSF printer') installpath = db.Column(db.String(255), comment='Driver install path') # Printer PIN (for secure print) pin = db.Column(db.String(20)) # Features iscolor = db.Column(db.Boolean, default=False, comment='Color capable') isduplex = db.Column(db.Boolean, default=False, comment='Duplex capable') isnetwork = db.Column(db.Boolean, default=True, comment='Network connected') # Relationships asset = db.relationship( 'Asset', backref=db.backref('printer', uselist=False, lazy='joined') ) printertype = db.relationship('PrinterType', backref='printers') vendor = db.relationship('Vendor', backref='printer_items') model = db.relationship('Model', backref='printer_items') __table_args__ = ( db.Index('idx_printer_type', 'printertypeid'), db.Index('idx_printer_hostname', 'hostname'), db.Index('idx_printer_windowsname', 'windowsname'), ) def __repr__(self): return f"" def to_dict(self): """Convert to dictionary with related names.""" result = super().to_dict() # Add related object names if self.printertype: result['printertype_name'] = self.printertype.printertype if self.vendor: result['vendor_name'] = self.vendor.vendor if self.model: result['model_name'] = self.model.modelnumber return result