Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 78 additions & 31 deletions employer_recommendation_system/emp/helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -315,57 +315,104 @@ def get_role(user):
elif list(set(['STUDENT','STUDENT_ILW']).intersection([x.name for x in user.groups.all()])):
return 'STUDENT'


def fetch_moodle_score(student):
"""
Fetch Moodle quiz scores for a logged-in student
using EMAIL as the bridge between ERS and Moodle.
Output format matches emp/student_form.html
"""
scores = []
# 1. Spoken user email (login email)

email = student.user.email
if not email:
return scores
# 2. Find Moodle user using same email
mdl_user = (MdlUser.objects.using('moodle').filter(email__iexact=email.strip()).first())

mdl_user = (MdlUser.objects.using('moodle').filter(email__iexact=email.strip()).values('id').first())
if not mdl_user:
return scores
# 3. Fetch quiz grades for this Moodle user
quiz_grades = (MdlQuizGrades.objects.using('moodle').filter(userid=mdl_user).order_by('-timemodified'))

# 4. Fetch quizzes once (performance-safe)
quiz_ids = [q.quiz for q in quiz_grades]
quizzes = {
q.id: q
for q in MdlQuiz.objects.using('moodle').filter(id__in=quiz_ids)
}
mdl_user_id = mdl_user['id']

# 5. Map quiz name → FOSS
foss_list = FossCategory.objects.all()
quiz_grades = (MdlQuizGrades.objects.using('moodle').filter(userid=mdl_user_id).values('quiz', 'grade', 'timemodified').order_by('-timemodified'))
if not quiz_grades:
return scores
quiz_ids = [q['quiz'] for q in quiz_grades]

for qg in quiz_grades:
quiz = quizzes.get(qg.quiz)
if not quiz:
continue
quiz_foss_map = (FossMdlCourses.objects.filter(mdlquiz_id__in=quiz_ids).select_related('foss').values('mdlquiz_id', 'foss__foss'))

# Match quiz name with FOSS name
foss_obj = None
quiz_name = quiz.name.lower()
quiz_to_foss = {
q['mdlquiz_id']: q['foss__foss']
for q in quiz_foss_map
}

for foss in foss_list:
if foss.foss.lower() in quiz_name:
foss_obj = foss
break

if not foss_obj:
seen_foss = set()
for q in quiz_grades:
foss_name = quiz_to_foss.get(q['quiz'])
if not foss_name:
continue

scores.append({
'name': foss_obj.foss,
'grade': float(qg.grade),
'updated': datetime.datetime.fromtimestamp(qg.timemodified),
if foss_name in seen_foss:
continue

seen_foss.add(foss_name)

scores.append({'name': foss_name,'grade': float(q['grade']),'updated': datetime.datetime.fromtimestamp(q['timemodified']),
})

return scores


# def fetch_moodle_score(student):
# """
# Fetch Moodle quiz scores for a logged-in student
# using EMAIL as the bridge between ERS and Moodle.
# """
# scores = []
# # 1. Spoken user email (login email)
# email = student.user.email
# if not email:
# return scores
# # 2. Find Moodle user using same email
# mdl_user = (MdlUser.objects.using('moodle').filter(email__iexact=email.strip()).first())

# if not mdl_user:
# return scores
# # 3. Fetch quiz grades for this Moodle user
# quiz_grades = (MdlQuizGrades.objects.using('moodle').filter(userid=mdl_user).order_by('-timemodified'))

# # 4. Fetch quizzes once (performance-safe)
# quiz_ids = [q.quiz for q in quiz_grades]
# quizzes = {
# q.id: q
# for q in MdlQuiz.objects.using('moodle').filter(id__in=quiz_ids)
# }

# # 5. Map quiz name → FOSS
# foss_list = FossCategory.objects.all()

# for qg in quiz_grades:
# quiz = quizzes.get(qg.quiz)
# if not quiz:
# continue

# # Match quiz name with FOSS name
# foss_obj = None
# quiz_name = quiz.name.lower()

# for foss in foss_list:
# if foss.foss.lower() in quiz_name:
# foss_obj = foss
# break

# if not foss_obj:
# continue

# scores.append({
# 'name': foss_obj.foss,
# 'grade': float(qg.grade),
# 'updated': datetime.datetime.fromtimestamp(qg.timemodified),
# })

# return scores