Merge pull request #19882 from edx/emma-green/REVEM-176/D/Fix-course-program-cache

fix course program cache
This commit is contained in:
emma-green
2019-02-27 10:04:21 -05:00
committed by GitHub
3 changed files with 31 additions and 8 deletions

View File

@@ -1,3 +1,5 @@
""""Management command to add program information to the cache."""
from collections import defaultdict
import logging
import sys
@@ -211,15 +213,12 @@ class Command(BaseCommand):
in the cache not just the course runs in a program. Therefore, a cache miss would be different from a
course not in a program.
"""
course_runs = {}
course_runs = defaultdict(list)
failure = False
for program_uuid, program in programs.items():
for program in programs.values():
for course in program['courses']:
for course_run in course['course_runs']:
course_run_key = course_run['key']
if course_run_key in course_runs:
course_runs[course_run_key] += program_uuid
else:
course_runs[course_run_key] = [program_uuid]
course_run_cache_key = COURSE_PROGRAMS_CACHE_KEY_TPL.format(course_run_id=course_run['key'])
course_runs[course_run_cache_key].append(program['uuid'])
return course_runs, failure

View File

@@ -16,6 +16,7 @@ from course_modes.tests.factories import CourseModeFactory
from entitlements.tests.factories import CourseEntitlementFactory
from openedx.core.constants import COURSE_UNPUBLISHED
from openedx.core.djangoapps.catalog.cache import (
COURSE_PROGRAMS_CACHE_KEY_TPL,
PATHWAY_CACHE_KEY_TPL,
PROGRAM_CACHE_KEY_TPL,
SITE_PATHWAY_IDS_CACHE_KEY_TPL,
@@ -183,6 +184,27 @@ class TestGetPrograms(CacheIsolationTestCase):
self.assertEqual(actual_program, expected_program)
self.assertFalse(mock_warning.called)
def test_get_from_course(self, mock_warning, _mock_info):
expected_program = ProgramFactory()
expected_course = expected_program['courses'][0]['course_runs'][0]['key']
self.assertEqual(get_programs(course=expected_course), [])
cache.set(
COURSE_PROGRAMS_CACHE_KEY_TPL.format(course_run_id=expected_course),
[expected_program['uuid']],
None
)
cache.set(
PROGRAM_CACHE_KEY_TPL.format(uuid=expected_program['uuid']),
expected_program,
None
)
actual_program = get_programs(course=expected_course)
self.assertEqual(actual_program, [expected_program])
self.assertFalse(mock_warning.called)
@skip_unless_lms
@mock.patch(UTILS_MODULE + '.logger.info')

View File

@@ -107,7 +107,9 @@ def get_programs(site=None, uuid=None, course=None): # pylint: disable=redefine
elif course:
uuids = cache.get(COURSE_PROGRAMS_CACHE_KEY_TPL.format(course_run_id=course))
if not uuids:
logger.warning(missing_details_msg_tpl.format(course=course))
# Currently, the cache does not differentiate between a cache miss and a course
# without programs. After this is changed, log any cache misses here.
return []
else:
uuids = cache.get(SITE_PROGRAM_UUIDS_CACHE_KEY_TPL.format(domain=site.domain), [])
if not uuids: