from sqlalchemy import func from scores.model.score_model import Score from students.model.students_model import Students from class_management.model.class_management_model import ClassInfo def get_top_students_dao(db): top_sids = (db.query(Score.sid) .filter(Score.is_deleted == 0) .group_by(Score.sid, Score.num) .having(func.min(Score.score) >= 80) .subquery() ) results = (db.query(Students.id, Students.name, Score.num, Score.t_subject, Score.score,) .join(Score, Students.id == Score.sid) .filter( Score.sid.in_(top_sids), Score.is_deleted == 0,) .order_by(Students.id, Score.num) .all()) return [{"sid": r.sid, "name": r.name, "score": r.score,} for r in results] def get_failing_students_dao(db): failing_sids = (db.query(Score.sid) .filter(Score.score < 60, Score.is_deleted == 0,) .group_by(Score.sid) .having(func.count() >= 2) .subquery()) results = (db.query( Students.id, Students.name, ClassInfo.name.label("class_name"), Score.num, Score.t_subject, Score.score,) .join(Score, Students.id == Score.sid) .join(ClassInfo, Score.cid == ClassInfo.id) .filter(Score.sid.in_(failing_sids), Score.score < 60, Score.is_deleted == 0,) .order_by(ClassInfo.id, Score.num) .all()) return [{"sid": r.sid, "name": r.name, "class_name": r.class_name, "num": r.num, "t_subject": r.tsub, "score": r.score,} for r in results] def get_class_avg_dao(db): results = (db.query(Score.num, Score.cid, ClassInfo.name.label("class_name"), func.avg(Score.score).label("avg_score")) .join(ClassInfo, Score.cid == ClassInfo.id) .filter(Score.is_deleted == 0) .group_by(Score.num, Score.cid, ClassInfo.name) .order_by(func.avg(Score.score).desc()) .all()) return [ {"num": r.num, "cid": r.cid, "class_name": r.class_name, "avg_score": round(float(r.avg_score), 2),} for r in results]