78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
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] |