"""Location + LocationType models.""" from shopdb.extensions import db from .base import BaseModel class LocationType(BaseModel): """Location classification (ADR-001 shared reference data). Seeded values: section, cell, subcell, operation, meetingroom, lab, office, storage, hallway, networkcloset, building. Sites can extend. """ __tablename__ = 'locationtypes' locationtypeid = db.Column(db.Integer, primary_key=True) locationtype = db.Column(db.String(50), unique=True, nullable=False) description = db.Column(db.Text) color = db.Column(db.String(20), comment='CSS color for UI') def __repr__(self): return f"" class Location(BaseModel): """Physical location model.""" __tablename__ = 'locations' locationid = db.Column(db.Integer, primary_key=True) locationname = db.Column(db.String(100), unique=True, nullable=False) building = db.Column(db.String(100)) floor = db.Column(db.String(50)) room = db.Column(db.String(50)) description = db.Column(db.Text) # Classification + tree (ADR-001) locationtypeid = db.Column( db.Integer, db.ForeignKey('locationtypes.locationtypeid'), nullable=True ) parentlocationid = db.Column( db.Integer, db.ForeignKey('locations.locationid'), nullable=True, comment='Parent location for the site location tree' ) # Map configuration mapimage = db.Column(db.String(500), comment='Path to floor map image') mapwidth = db.Column(db.Integer) mapheight = db.Column(db.Integer) # Location-level position used as fallback when an asset has no own coords # and no inheritsposition relationship resolves. ADR-001 position resolution # chain priority 3. mapx = db.Column(db.Integer, comment='Default X coordinate for assets at this location') mapy = db.Column(db.Integer, comment='Default Y coordinate for assets at this location') # Relationships locationtype = db.relationship('LocationType') parent = db.relationship('Location', remote_side=[locationid]) def to_dict(self): data = super().to_dict() data['locationtypename'] = self.locationtype.locationtype if self.locationtype else None data['parentlocationname'] = self.parent.locationname if self.parent else None return data def __repr__(self): return f""