feat: implement missing audit access expired check (#31249)
This commit is contained in:
@@ -6,6 +6,7 @@ from urllib.parse import urljoin
|
||||
|
||||
from django.conf import settings
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
from rest_framework import serializers
|
||||
|
||||
@@ -175,9 +176,9 @@ class EnrollmentSerializer(serializers.Serializer):
|
||||
"""
|
||||
Info about this particular enrollment.
|
||||
Derived from a CourseEnrollment with added context:
|
||||
- "audit_access_deadlines" (dict): when audit access expires for user.
|
||||
- "ecommerce_payment_page" (url): ecommerce page, used to determine if we can upgrade.
|
||||
- "course_mode_info" (dict): keyed by course ID with the following values:
|
||||
- "expiration_datetime" (int): when the verified mode will expire.
|
||||
- "show_upsell" (bool): whether or not we offer an upsell for this course.
|
||||
- "verified_sku" (uuid): ID for the verified mode for upgrade.
|
||||
- "show_courseware_link": keyed by course ID with added metadata.
|
||||
@@ -228,10 +229,12 @@ class EnrollmentSerializer(serializers.Serializer):
|
||||
)
|
||||
|
||||
def get_isAuditAccessExpired(self, enrollment):
|
||||
show_courseware_link = self.context.get("show_courseware_link", {}).get(
|
||||
enrollment.course.id, {}
|
||||
"""Mirrors logic in "check_course_expired" but using pre-fetched expiration date"""
|
||||
expiration_date = self.context.get("audit_access_deadlines", {}).get(
|
||||
enrollment.course_id
|
||||
)
|
||||
return show_courseware_link.get("error_code") == "audit_expired"
|
||||
|
||||
return bool(expiration_date) and timezone.now() > expiration_date
|
||||
|
||||
def get_isEmailEnabled(self, enrollment):
|
||||
return enrollment.course_id in self.context.get("show_email_settings_for", [])
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"""Tests for serializers for the Learner Dashboard"""
|
||||
|
||||
from datetime import date, datetime, timedelta
|
||||
from datetime import date, datetime, timedelta, timezone
|
||||
from itertools import product
|
||||
from random import randint
|
||||
from unittest import mock
|
||||
@@ -325,7 +325,6 @@ class TestEnrollmentSerializer(LearnerDashboardBaseTest):
|
||||
},
|
||||
"course_optouts": [],
|
||||
"show_email_settings_for": [course.id],
|
||||
"show_courseware_link": {course.id: {"has_access": True}},
|
||||
"resume_course_urls": {course.id: "some_url"},
|
||||
"ecommerce_payment_page": random_url(),
|
||||
}
|
||||
@@ -346,23 +345,33 @@ class TestEnrollmentSerializer(LearnerDashboardBaseTest):
|
||||
for key in output:
|
||||
assert output[key] is not None
|
||||
|
||||
def test_audit_access_expired(self):
|
||||
@ddt.data(
|
||||
(None, False), # No expiration date, allowed for non-audit, non-expired.
|
||||
(datetime.max, False), # Expiration in the far future. Shouldn't be expired.
|
||||
(datetime.min, True), # Expiration in the far past. Should be expired.
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_audit_access_expired(self, expiration_datetime, should_be_expired):
|
||||
# Given an enrollment
|
||||
input_data = self.create_test_enrollment()
|
||||
input_context = self.create_test_context(input_data.course)
|
||||
|
||||
# Example audit expired context
|
||||
# With/out an expiration date (made timezone aware, if it exists)
|
||||
expiration_datetime = (
|
||||
expiration_datetime.replace(tzinfo=timezone.utc)
|
||||
if expiration_datetime
|
||||
else None
|
||||
)
|
||||
input_context.update(
|
||||
{
|
||||
"show_courseware_link": {
|
||||
input_data.course.id: {"error_code": "audit_expired"}
|
||||
},
|
||||
"audit_access_deadlines": {input_data.course.id: expiration_datetime},
|
||||
}
|
||||
)
|
||||
|
||||
serializer = EnrollmentSerializer(input_data, context=input_context)
|
||||
output = serializer.data
|
||||
# When I serialize
|
||||
output = EnrollmentSerializer(input_data, context=input_context).data
|
||||
|
||||
assert output["isAuditAccessExpired"] is True
|
||||
self.assertEqual(output["isAuditAccessExpired"], should_be_expired)
|
||||
|
||||
@ddt.data(
|
||||
(random_url(), True, uuid4(), True),
|
||||
|
||||
Reference in New Issue
Block a user