"""Network device plugin models.""" from shopdb.extensions import db from shopdb.core.models.base import BaseModel class NetworkDeviceType(BaseModel): """ Network device type classification. Examples: Switch, Router, Access Point, Camera, IDF, Firewall, etc. """ __tablename__ = 'networkdevicetypes' networkdevicetypeid = db.Column(db.Integer, primary_key=True) networkdevicetype = 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 NetworkDevice(BaseModel): """ Network device-specific extension data. Links to core Asset table via assetid. Stores network device-specific fields like hostname, firmware, ports, etc. """ __tablename__ = 'networkdevices' networkdeviceid = 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 ) # Network device classification networkdevicetypeid = db.Column( db.Integer, db.ForeignKey('networkdevicetypes.networkdevicetypeid'), nullable=True ) # Vendor vendorid = db.Column( db.Integer, db.ForeignKey('vendors.vendorid'), nullable=True ) # Network identity hostname = db.Column( db.String(100), index=True, comment='Network hostname' ) # Firmware/software version firmwareversion = db.Column(db.String(100), nullable=True) # Physical characteristics portcount = db.Column( db.Integer, nullable=True, comment='Number of ports (for switches)' ) # Features ispoe = db.Column( db.Boolean, default=False, comment='Power over Ethernet capable' ) ismanaged = db.Column( db.Boolean, default=False, comment='Managed device (SNMP, web interface, etc.)' ) # For IDF/closet locations rackunit = db.Column( db.String(20), nullable=True, comment='Rack unit position (e.g., U1, U5)' ) # Relationships asset = db.relationship( 'Asset', backref=db.backref('network_device', uselist=False, lazy='joined') ) networkdevicetype = db.relationship('NetworkDeviceType', backref='networkdevices') vendor = db.relationship('Vendor', backref='network_devices') __table_args__ = ( db.Index('idx_netdev_type', 'networkdevicetypeid'), db.Index('idx_netdev_hostname', 'hostname'), db.Index('idx_netdev_vendor', 'vendorid'), ) 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.networkdevicetype: result['networkdevicetypename'] = self.networkdevicetype.networkdevicetype if self.vendor: result['vendorname'] = self.vendor.vendor return result