gmao/app_new/core/models/college.py
2026-08-14 16:02:25 +00:00

146 lines
5.2 KiB
Python

"""
Modèle College et Building - GMAO Collège
Gestion des collèges et bâtiments
Compatible avec la base de données existante
"""
from datetime import datetime, timezone
from ...extensions import db
class College(db.Model):
"""Collège."""
__tablename__ = "colleges"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), nullable=False)
address = db.Column(db.Text, nullable=True)
city = db.Column(db.String(100), nullable=True)
zip_code = db.Column(db.String(10), nullable=True)
phone = db.Column(db.String(20), nullable=True)
email = db.Column(db.String(100), nullable=True)
website = db.Column(db.String(255), nullable=True)
logo = db.Column(db.String(255), nullable=True)
is_active = db.Column(db.Boolean, default=True)
created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
updated_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc))
# Relations - buildings n'a pas de college_id, pas de relation directe
def __repr__(self):
return f"<College {self.name}>"
class Building(db.Model):
"""Bâtiment du collège."""
__tablename__ = "buildings"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text, nullable=True)
# Relations - utiliser overlaps pour éviter warning SQLAlchemy
rooms = db.relationship("Room", overlaps="building", lazy="dynamic")
zones = db.relationship("Zone", back_populates="building", lazy="dynamic")
@property
def room_count(self):
"""Nombre de salles dans le bâtiment."""
return self.rooms.count()
def __repr__(self):
return f"<Building {self.name}>"
class Zone(db.Model):
"""Zone dans un bâtiment."""
__tablename__ = "zones"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
building_id = db.Column(db.Integer, db.ForeignKey("buildings.id"), nullable=False)
# Relations
building = db.relationship("Building", back_populates="zones")
rooms = db.relationship("Room", back_populates="zone")
@property
def full_name(self):
"""Nom complet avec bâtiment."""
if self.building:
return f"{self.building.name} - {self.name}"
return self.name
def __repr__(self):
return f"<Zone {self.name}>"
class Room(db.Model):
"""Salle du collège."""
__tablename__ = "rooms"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
code = db.Column(db.String(20), nullable=True)
zone_id = db.Column(db.Integer, db.ForeignKey("zones.id"), nullable=True)
floor = db.Column(db.Integer, default=0)
building_id = db.Column(db.Integer, db.ForeignKey("buildings.id"), nullable=False)
room_type_id = db.Column(db.Integer, db.ForeignKey("room_types.id"), nullable=True)
# Libelle historique conserve pour les imports anterieurs a zone_id.
legacy_zone_name = db.Column("zone", db.String(100), nullable=True)
# Relations - utiliser overlaps pour éviter warning SQLAlchemy
building = db.relationship("Building", overlaps="rooms")
zone = db.relationship("Zone", back_populates="rooms")
room_type = db.relationship("RoomType", back_populates="rooms")
equipments = db.relationship("Equipment", back_populates="room")
@property
def full_name(self):
"""Nom complet avec bâtiment."""
if self.building:
return f"{self.building.name} - {self.name}"
return self.name
def __repr__(self):
return f"<Room {self.name}>"
class RoomType(db.Model):
"""Type de salle."""
__tablename__ = "room_types"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text, nullable=True)
is_teaching = db.Column(db.Boolean, default=False)
color = db.Column(db.String(20), nullable=True)
icon = db.Column(db.String(50), nullable=True)
# Relation vers les salles
rooms = db.relationship("Room", back_populates="room_type")
def __repr__(self):
return f"<RoomType {self.name}>"
class RoomSchedule(db.Model):
"""Emploi du temps d'une salle."""
__tablename__ = "room_schedules"
id = db.Column(db.Integer, primary_key=True)
room_id = db.Column(db.Integer, db.ForeignKey("rooms.id"), nullable=False)
week_start = db.Column(db.Date, nullable=False)
day_of_week = db.Column(db.Integer, nullable=False)
start_time = db.Column(db.Time, nullable=False)
end_time = db.Column(db.Time, nullable=False)
subject = db.Column(db.String(100), nullable=True)
teacher = db.Column(db.String(100), nullable=True)
class_name = db.Column(db.String(50), nullable=True)
course_name = db.Column(db.String(255), nullable=True)
created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
# Relations
room = db.relationship("Room", backref="schedules")
def __repr__(self):
return f"<RoomSchedule {self.room.name} - {self.day_of_week}>"