Merge pull request #28496 from edx/ciduarte/AA-877

feat: add access_expiration to progress tab view (AA-877)
This commit is contained in:
Carla Duarte
2021-09-02 09:41:45 -04:00
committed by GitHub
4 changed files with 45 additions and 25 deletions

View File

@@ -47,3 +47,4 @@ class CourseHomeMetadataSerializer(VerifiedModeSerializer):
tabs = CourseTabSerializer(many=True)
title = serializers.CharField()
username = serializers.CharField()
user_timezone = serializers.CharField()

View File

@@ -15,6 +15,7 @@ from common.djangoapps.student.models import CourseEnrollment
from lms.djangoapps.course_api.api import course_detail
from lms.djangoapps.course_home_api.course_metadata.serializers import CourseHomeMetadataSerializer
from lms.djangoapps.courseware.access import has_access
from lms.djangoapps.courseware.context_processor import user_timezone_locale_prefs
from lms.djangoapps.courseware.courses import check_course_access
from lms.djangoapps.courseware.masquerade import setup_masquerade
from lms.djangoapps.courseware.tabs import get_course_tab_list
@@ -52,6 +53,7 @@ class CourseHomeMetadataView(RetrieveAPIView):
url: (str) The url to view the tab
title: (str) The Course's display title
celebrations: (dict) a dict of celebration data
user_timezone: (str) The timezone of the given user
**Returns**
@@ -103,8 +105,14 @@ class CourseHomeMetadataView(RetrieveAPIView):
is_course_staff=original_user_is_staff
)
# User locale settings
user_timezone_locale = user_timezone_locale_prefs(request)
user_timezone = user_timezone_locale['user_timezone']
browser_timezone = self.request.query_params.get('browser_timezone', None)
celebrations = get_celebrations_dict(request.user, enrollment, course, browser_timezone)
celebrations = get_celebrations_dict(
request.user, enrollment, course, user_timezone if not None else browser_timezone
)
data = {
'course_id': course.id,
@@ -121,6 +129,7 @@ class CourseHomeMetadataView(RetrieveAPIView):
'course_access': load_access.to_json(),
'can_load_courseware': can_load_courseware,
'celebrations': celebrations,
'user_timezone': user_timezone,
}
context = self.get_serializer_context()
context['course'] = course

View File

@@ -120,15 +120,16 @@ class ProgressTabSerializer(VerifiedModeSerializer):
"""
Serializer for progress tab
"""
username = serializers.CharField()
access_expiration = serializers.DictField()
certificate_data = CertificateDataSerializer()
completion_summary = serializers.DictField()
course_grade = CourseGradeSerializer()
end = serializers.DateTimeField()
user_has_passing_grade = serializers.BooleanField()
has_scheduled_content = serializers.BooleanField()
section_scores = SectionScoresSerializer(many=True)
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()

View File

@@ -34,6 +34,7 @@ from openedx.core.djangoapps.content.block_structure.api import get_block_struct
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from openedx.core.lib.api.authentication import BearerAuthenticationAllowInactiveUser
from openedx.features.content_type_gating.block_transformers import ContentTypeGateTransformer
from openedx.features.course_duration_limits.access import get_access_expiration_data
from openedx.features.enterprise_support.utils import get_enterprise_learner_generic_name
User = get_user_model()
@@ -54,10 +55,11 @@ class ProgressTabView(RetrieveAPIView):
Body consists of the following fields:
end: (date) end date of the course
user_has_passing_grade: (bool) boolean on if the user has a passing grade in the course
username: (str) username of the student whose progress information is being displayed.
has_scheduled_content: (bool) boolean on if the course has content scheduled with a release date in the future
access_expiration: An object detailing when access to this course will expire
expiration_date: (str) When the access expires, in ISO 8601 notation
masquerading_expired_course: (bool) Whether this course is expired for the masqueraded user
upgrade_deadline: (str) Last chance to upgrade, in ISO 8601 notation (or None if can't upgrade anymore)
upgrade_url: (str) Upgrade link (or None if can't upgrade anymore)
certificate_data: Object containing information about the user's certificate status
cert_status: (str) the status of a user's certificate (full list of statuses are defined in
lms/djangoapps/certificates/models.py)
@@ -72,6 +74,19 @@ class ProgressTabView(RetrieveAPIView):
letter_grade: (str) the user's letter grade based on the set grade range.
If user is passing, value may be 'A', 'B', 'C', 'D', 'Pass', otherwise none
percent: (float) the user's total graded percent in the course
end: (date) end date of the course
enrollment_mode: (str) a str representing the enrollment the user has ('audit', 'verified', ...)
grading_policy:
assignment_policies: List of serialized assignment grading policy objects, each has the following fields:
num_droppable: (int) the number of lowest scored assignments that will not be counted towards the final
grade
short_label: (str) the abbreviated name given to the assignment type
type: (str) the assignment type
weight: (float) the percent weight the given assigment type has on the overall grade
grade_range: an object containing the grade range cutoffs. The exact keys in the object can vary, but they
range from just 'Pass', to a combination of 'A', 'B', 'C', and 'D'. If a letter grade is
present, 'Pass' is not included.
has_scheduled_content: (bool) boolean on if the course has content scheduled with a release date in the future
section_scores: List of serialized Chapters. Each Chapter has the following fields:
display_name: (str) a str of what the name of the Chapter is for displaying on the site
subsections: List of serialized Subsections, each has the following fields:
@@ -93,18 +108,9 @@ class ProgressTabView(RetrieveAPIView):
show_grades: (bool) a bool for whether to show grades based on the access the user has
url: (str or None) the absolute path url to the Subsection or None if the Subsection is no longer
accessible to the learner due to a hide_after_due course team setting
enrollment_mode: (str) a str representing the enrollment the user has ('audit', 'verified', ...)
grading_policy:
assignment_policies: List of serialized assignment grading policy objects, each has the following fields:
num_droppable: (int) the number of lowest scored assignments that will not be counted towards the final
grade
short_label: (str) the abbreviated name given to the assignment type
type: (str) the assignment type
weight: (float) the percent weight the given assigment type has on the overall grade
grade_range: an object containing the grade range cutoffs. The exact keys in the object can vary, but they
range from just 'Pass', to a combination of 'A', 'B', 'C', and 'D'. If a letter grade is
present, 'Pass' is not included.
studio_url: (str) a str of the link to the grading in studio for the course
user_has_passing_grade: (bool) boolean on if the user has a passing grade in the course
username: (str) username of the student whose progress information is being displayed.
verification_data: an object containing
link: (str) the link to either start or retry ID verification
status: (str) the status of the ID verification
@@ -223,18 +229,21 @@ class ProgressTabView(RetrieveAPIView):
'status_date': verification_status['status_date'],
}
access_expiration = get_access_expiration_data(request.user, course_overview)
data = {
'username': username,
'end': course.end,
'user_has_passing_grade': user_has_passing_grade,
'access_expiration': access_expiration,
'certificate_data': get_cert_data(student, course, enrollment_mode, course_grade),
'completion_summary': get_course_blocks_completion_summary(course_key, student),
'course_grade': course_grade,
'has_scheduled_content': has_scheduled_content,
'section_scores': list(course_grade.chapter_grades.values()),
'end': course.end,
'enrollment_mode': enrollment_mode,
'grading_policy': grading_policy,
'has_scheduled_content': has_scheduled_content,
'section_scores': list(course_grade.chapter_grades.values()),
'studio_url': get_studio_url(course, 'settings/grading'),
'username': username,
'user_has_passing_grade': user_has_passing_grade,
'verification_data': verification_data,
}
context = self.get_serializer_context()