from flask_sqlalchemy import SQLAlchemy from datetime import datetime from sqlalchemy import Index, CheckConstraint from decimal import Decimal db = SQLAlchemy() class ClassGroup(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False, unique=True) description = db.Column(db.Text) year = db.Column(db.String(20), nullable=False) students = db.relationship('Student', backref='class_group', lazy=True) assessments = db.relationship('Assessment', backref='class_group', lazy=True) def __repr__(self): return f'' class Student(db.Model): id = db.Column(db.Integer, primary_key=True) last_name = db.Column(db.String(100), nullable=False) first_name = db.Column(db.String(100), nullable=False) email = db.Column(db.String(120), unique=True) class_group_id = db.Column(db.Integer, db.ForeignKey('class_group.id'), nullable=False) grades = db.relationship('Grade', backref='student', lazy=True) def __repr__(self): return f'' @property def full_name(self): return f"{self.first_name} {self.last_name}" class Assessment(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(200), nullable=False) description = db.Column(db.Text) date = db.Column(db.Date, nullable=False, default=datetime.utcnow) class_group_id = db.Column(db.Integer, db.ForeignKey('class_group.id'), nullable=False) coefficient = db.Column(db.Float, default=1.0) # Garder Float pour compatibilité exercises = db.relationship('Exercise', backref='assessment', lazy=True, cascade='all, delete-orphan') def __repr__(self): return f'' class Exercise(db.Model): id = db.Column(db.Integer, primary_key=True) assessment_id = db.Column(db.Integer, db.ForeignKey('assessment.id'), nullable=False) title = db.Column(db.String(200), nullable=False) description = db.Column(db.Text) order = db.Column(db.Integer, default=1) grading_elements = db.relationship('GradingElement', backref='exercise', lazy=True, cascade='all, delete-orphan') def __repr__(self): return f'' class GradingElement(db.Model): id = db.Column(db.Integer, primary_key=True) exercise_id = db.Column(db.Integer, db.ForeignKey('exercise.id'), nullable=False) label = db.Column(db.String(200), nullable=False) description = db.Column(db.Text) skill = db.Column(db.String(200)) max_points = db.Column(db.Float, nullable=False) # Garder Float pour compatibilité grading_type = db.Column(db.String(10), nullable=False, default='points') grades = db.relationship('Grade', backref='grading_element', lazy=True, cascade='all, delete-orphan') def __repr__(self): return f'' class Grade(db.Model): id = db.Column(db.Integer, primary_key=True) student_id = db.Column(db.Integer, db.ForeignKey('student.id'), nullable=False) grading_element_id = db.Column(db.Integer, db.ForeignKey('grading_element.id'), nullable=False) value = db.Column(db.String(10)) # Garder l'ancien format pour compatibilité comment = db.Column(db.Text) def __repr__(self): return f''