NDOJ/judge/views/course.py
2023-02-23 23:11:52 +07:00

93 lines
3.4 KiB
Python

from django.db import models
from judge.models.course import Course , CourseAssignment , CourseRole
from judge.models.contest import ContestParticipation, Contest
from django.views.generic import ListView, DetailView
from django.utils import timezone
__all__ = [
"CourseList",
"CourseDetail",
"CourseResource",
"CourseResourceDetail",
"CourseStudentResults",
"CourseEdit",
"CourseResourceDetailEdit",
"CourseResourceEdit",
]
course_directory_file = ""
class CourseList(ListView):
model = Course
template_name = "course/list.html"
queryset = Course.objects.filter(is_public=True).filter(is_open=True)
def get_context_data(self, **kwargs):
context = super(CourseList, self).get_context_data(**kwargs)
available, enrolling = [], []
for course in Course.objects.filter(is_public=True).filter(is_open=True):
if Course.is_accessible_by(course, self.request.profile):
enrolling.append(course)
else:
available.append(course)
context["available"] = available
context["enrolling"] = enrolling
return context
class CourseDetail(ListView):
model = CourseAssignment
template_name = "course/course.html"
def get_queryset(self):
cur_course = Course.objects.get(slug=self.kwargs['slug'])
return CourseAssignment.objects.filter(course=cur_course)
def get_context_data(self, **kwargs):
context = super(CourseDetail, self).get_context_data(**kwargs)
context['slug'] = self.kwargs['slug']
return context
def best_score_user_contest(user , contest):
participated_contests = ContestParticipation.objects.filter(user=user, contest=contest)
progress_point = 0
for cur_contest in participated_contests:
progress_point = max( progress_point , cur_contest.score_final )
return progress_point
def progress_contest(user , contest):
return best_score_user_contest(user, contest) / contest.total_points
def progress_course(user , course):
assignments = CourseAssignment.objects.filter(course=course)
assignments_total_point = 0
for assignment in assignments:
assignments_total_point += assignment.points
progress = 0
for assignment in assignments:
progress += progress_contest(user,assignment.contest) * assignment.points / assignments_total_point
return progress
class CourseStudentResults(ListView):
model = ContestParticipation
template_name = "course/grades.html"
def get_queryset(self):
cur_course = Course.objects.get(slug=self.kwargs['slug'])
contests = CourseAssignment.objects.filter(course=cur_course)
students = Course.get_students(cur_course)
grades_table = []
for student in students:
grades_student = [student.user.user.username]
for contest in contests:
grades_student.append( round(progress_contest(student.user, contest.contest) * 100 ) )
grades_student.append( round(progress_course(student.user, cur_course) * 100) )
grades_table.append( grades_student )
return grades_table
def get_context_data(self, **kwargs):
context = super(CourseStudentResults, self).get_context_data(**kwargs)
cur_course = Course.objects.get(slug=self.kwargs['slug'])
contests = CourseAssignment.objects.filter(course=cur_course)
context['contests'] = contests
return context