feat: implement missing audit access expired check (#31249)

This commit is contained in:
Nathan Sprenkle
2022-11-03 13:24:59 -04:00
committed by GitHub
parent 3adf5eb929
commit 5e7432129f
2 changed files with 26 additions and 14 deletions

View File

@@ -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", [])

View File

@@ -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),