from app import db from datetime import datetime class Classroom(db.Model): __tablename__ = 'classrooms' id = db.Column(db.Integer, primary_key=True) campus_id = db.Column(db.Integer, db.ForeignKey('campuses.id'), nullable=False) building = db.Column(db.String(100), nullable=False) room_number = db.Column(db.String(50), nullable=False) floor = db.Column(db.Integer, nullable=False) capacity = db.Column(db.Integer, nullable=False) description = db.Column(db.Text) is_active = db.Column(db.Boolean, default=True, nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Virtual field for code (combination of building and room_number) @property def code(self): return f"{self.building}-{self.room_number}" # Relationships reservations = db.relationship('Reservation', backref='classroom', lazy=True, cascade='all, delete-orphan') # Resources relationship (教室资源) resources = db.relationship('ClassroomResource', backref='classroom', lazy=True, cascade='all, delete-orphan') def to_dict(self): """Convert classroom to dictionary""" return { 'id': self.id, 'code': self.code, 'building': self.building, 'floor': self.floor, 'capacity': self.capacity, 'description': self.description, 'is_active': self.is_active, 'created_at': self.created_at.isoformat() if self.created_at else None, 'updated_at': self.updated_at.isoformat() if self.updated_at else None, 'resources': [resource.to_dict() for resource in self.resources] } def get_full_location(self): """Get full classroom location""" return f"{self.building} - Floor {self.floor}" def __repr__(self): return f'' class ClassroomResource(db.Model): __tablename__ = 'classroom_resources' id = db.Column(db.Integer, primary_key=True) classroom_id = db.Column(db.Integer, db.ForeignKey('classrooms.id'), nullable=False) resource_type = db.Column(db.String(50), nullable=False) # PROJECTOR, WHITEBOARD, COMPUTER, etc. brand = db.Column(db.String(100)) model = db.Column(db.String(100)) specifications = db.Column(db.Text) functional = db.Column(db.Boolean, default=True) last_maintenance_date = db.Column(db.DateTime) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) def to_dict(self): """Convert resource to dictionary""" return { 'id': self.id, 'classroom_id': self.classroom_id, 'resource_type': self.resource_type, 'brand': self.brand, 'model': self.model, 'specifications': self.specifications, 'functional': self.functional, 'last_maintenance_date': self.last_maintenance_date.isoformat() if self.last_maintenance_date else None, 'created_at': self.created_at.isoformat() if self.created_at else None } def __repr__(self): return f''