Currently, https://github.com/openedx/frontend-app-course-authoring/issues/517 faces an issue when the progress graph toggle is enabled/disabled but the settings are not respected, the disable_progress_graph attribute will allow the frontend-app-learning repo to use this attribute to respect the settings authored from frontend-app-course-authoring and ultimately fix https://github.com/openedx/frontend-app-course-authoring/issues/517.
149 lines
5.2 KiB
Python
149 lines
5.2 KiB
Python
"""
|
|
Progress Tab Serializers
|
|
"""
|
|
from datetime import datetime
|
|
|
|
from rest_framework import serializers
|
|
from rest_framework.reverse import reverse
|
|
from pytz import UTC
|
|
|
|
from lms.djangoapps.course_home_api.serializers import ReadOnlySerializer, VerifiedModeSerializer
|
|
|
|
|
|
class CourseGradeSerializer(ReadOnlySerializer):
|
|
"""
|
|
Serializer for course grade
|
|
"""
|
|
letter_grade = serializers.CharField()
|
|
percent = serializers.FloatField()
|
|
is_passing = serializers.BooleanField(source='passed')
|
|
|
|
|
|
class SubsectionScoresSerializer(ReadOnlySerializer):
|
|
"""
|
|
Serializer for subsections in section_scores
|
|
"""
|
|
assignment_type = serializers.CharField(source='format')
|
|
block_key = serializers.SerializerMethodField()
|
|
display_name = serializers.CharField()
|
|
has_graded_assignment = serializers.BooleanField(source='graded')
|
|
override = serializers.SerializerMethodField()
|
|
learner_has_access = serializers.SerializerMethodField()
|
|
num_points_earned = serializers.FloatField(source='graded_total.earned')
|
|
num_points_possible = serializers.FloatField(source='graded_total.possible')
|
|
percent_graded = serializers.FloatField()
|
|
problem_scores = serializers.SerializerMethodField()
|
|
show_correctness = serializers.CharField()
|
|
show_grades = serializers.SerializerMethodField()
|
|
url = serializers.SerializerMethodField()
|
|
|
|
def get_override(self, subsection):
|
|
"""Proctoring or grading score override"""
|
|
if subsection.override is None:
|
|
return None
|
|
else:
|
|
return {
|
|
"system": subsection.override.system,
|
|
"reason": subsection.override.override_reason,
|
|
}
|
|
|
|
def get_block_key(self, subsection):
|
|
return str(subsection.location)
|
|
|
|
def get_problem_scores(self, subsection):
|
|
"""Problem scores for this subsection"""
|
|
problem_scores = [
|
|
{
|
|
'earned': score.earned,
|
|
'possible': score.possible,
|
|
}
|
|
for score in subsection.problem_scores.values()
|
|
]
|
|
return problem_scores
|
|
|
|
def get_url(self, subsection):
|
|
"""
|
|
Returns the URL for the subsection while taking into account if the course team has
|
|
marked the subsection's visibility as hide after due.
|
|
"""
|
|
hide_url_date = subsection.end if subsection.self_paced else subsection.due
|
|
if (not self.context['staff_access'] and subsection.hide_after_due and hide_url_date
|
|
and datetime.now(UTC) > hide_url_date):
|
|
return None
|
|
|
|
relative_path = reverse('jump_to', args=[self.context['course_key'], subsection.location])
|
|
request = self.context['request']
|
|
return request.build_absolute_uri(relative_path)
|
|
|
|
def get_show_grades(self, subsection):
|
|
return subsection.show_grades(self.context['staff_access'])
|
|
|
|
def get_learner_has_access(self, subsection):
|
|
course_blocks = self.context['course_blocks']
|
|
return not course_blocks.get_xblock_field(subsection.location, 'contains_gated_content', False)
|
|
|
|
|
|
class SectionScoresSerializer(ReadOnlySerializer):
|
|
"""
|
|
Serializer for sections in section_scores
|
|
"""
|
|
display_name = serializers.CharField()
|
|
subsections = SubsectionScoresSerializer(source='sections', many=True)
|
|
|
|
|
|
class GradingPolicySerializer(ReadOnlySerializer):
|
|
"""
|
|
Serializer for grading policy
|
|
"""
|
|
assignment_policies = serializers.SerializerMethodField()
|
|
grade_range = serializers.DictField(source='GRADE_CUTOFFS')
|
|
|
|
def get_assignment_policies(self, grading_policy):
|
|
return [{
|
|
'num_droppable': assignment_policy['drop_count'],
|
|
'num_total': float(assignment_policy['min_count']),
|
|
'short_label': assignment_policy.get('short_label', ''),
|
|
'type': assignment_policy['type'],
|
|
'weight': assignment_policy['weight'],
|
|
} for assignment_policy in grading_policy['GRADER']]
|
|
|
|
|
|
class CertificateDataSerializer(ReadOnlySerializer):
|
|
"""
|
|
Serializer for certificate data
|
|
"""
|
|
cert_status = serializers.CharField()
|
|
cert_web_view_url = serializers.CharField()
|
|
download_url = serializers.CharField()
|
|
certificate_available_date = serializers.DateTimeField()
|
|
|
|
|
|
class VerificationDataSerializer(ReadOnlySerializer):
|
|
"""
|
|
Serializer for verification data object
|
|
"""
|
|
link = serializers.URLField()
|
|
status = serializers.CharField()
|
|
status_date = serializers.DateTimeField()
|
|
|
|
|
|
class ProgressTabSerializer(VerifiedModeSerializer):
|
|
"""
|
|
Serializer for progress tab
|
|
"""
|
|
access_expiration = serializers.DictField()
|
|
certificate_data = CertificateDataSerializer()
|
|
completion_summary = serializers.DictField()
|
|
course_grade = CourseGradeSerializer()
|
|
credit_course_requirements = serializers.DictField()
|
|
end = serializers.DateTimeField()
|
|
enrollment_mode = serializers.CharField()
|
|
grading_policy = GradingPolicySerializer()
|
|
has_scheduled_content = serializers.BooleanField()
|
|
section_scores = SectionScoresSerializer(many=True)
|
|
studio_url = serializers.CharField()
|
|
username = serializers.CharField()
|
|
user_has_passing_grade = serializers.BooleanField()
|
|
verification_data = VerificationDataSerializer()
|
|
disable_progress_graph = serializers.BooleanField()
|