85 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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'<ClassGroup {self.name}>'
 | |
| 
 | |
| 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'<Student {self.first_name} {self.last_name}>'
 | |
|     
 | |
|     @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)
 | |
|     trimester = db.Column(db.Integer, nullable=False)  # 1, 2, ou 3
 | |
|     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')
 | |
| 
 | |
|     __table_args__ = (
 | |
|         CheckConstraint('trimester IN (1, 2, 3)', name='check_trimester_valid'),
 | |
|     )
 | |
| 
 | |
|     def __repr__(self):
 | |
|         return f'<Assessment {self.title}>'
 | |
| 
 | |
| 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'<Exercise {self.title}>'
 | |
| 
 | |
| 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'<GradingElement {self.label}>'
 | |
| 
 | |
| 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'<Grade {self.value} for {self.student.first_name if self.student else "Unknown"}>' |