Merge pull request #15248 from edx/ibrahimahmed443/LEARNER-1127

Exclude hidden programs from white label course page and home page
This commit is contained in:
Ibrahim Ahmed
2017-06-10 03:41:09 +05:00
committed by GitHub
5 changed files with 66 additions and 8 deletions

View File

@@ -216,7 +216,7 @@ def index(request, extra_context=None, user=AnonymousUser()):
# Do not add programs to the context if there are no program types enabled for the site.
if program_types:
programs_list = get_programs_with_type(program_types)
programs_list = get_programs_with_type(program_types, include_hidden=False)
context["programs_list"] = programs_list

View File

@@ -167,7 +167,7 @@ def courses(request):
# Do not add programs to the context if there are no program types enabled for the site.
if program_types:
programs_list = get_programs_with_type(program_types)
programs_list = get_programs_with_type(program_types, include_hidden=False)
return render_to_response(
"courseware/courses.html",

View File

@@ -125,6 +125,7 @@ class ProgramFactory(DictFactoryBase):
title = factory.Faker('catch_phrase')
type = factory.Faker('word')
uuid = factory.Faker('uuid4')
hidden = False
class ProgramTypeFactory(DictFactoryBase):

View File

@@ -3,6 +3,7 @@
import copy
import uuid
import ddt
import mock
from django.contrib.auth import get_user_model
from django.core.cache import cache
@@ -13,15 +14,14 @@ from openedx.core.djangoapps.catalog.models import CatalogIntegration
from openedx.core.djangoapps.catalog.tests.factories import CourseRunFactory, ProgramFactory, ProgramTypeFactory
from openedx.core.djangoapps.catalog.tests.mixins import CatalogIntegrationMixin
from openedx.core.djangoapps.catalog.utils import (
get_programs,
get_program_types,
get_programs_with_type,
get_course_runs,
get_program_types,
get_programs,
get_programs_with_type
)
from openedx.core.djangolib.testing.utils import CacheIsolationTestCase, skip_unless_lms
from student.tests.factories import UserFactory
UTILS_MODULE = 'openedx.core.djangoapps.catalog.utils'
User = get_user_model() # pylint: disable=invalid-name
@@ -154,6 +154,58 @@ class TestGetPrograms(CacheIsolationTestCase):
@skip_unless_lms
@ddt.ddt
class TestGetProgramsWithType(TestCase):
@mock.patch(UTILS_MODULE + '.get_programs')
@mock.patch(UTILS_MODULE + '.get_program_types')
def test_get_programs_with_type(self, mock_get_program_types, mock_get_programs):
"""Verify get_programs_with_type returns the expected list of programs."""
programs_with_program_type = []
programs = ProgramFactory.create_batch(2)
program_types = []
for program in programs:
program_type = ProgramTypeFactory(name=program['type'])
program_types.append(program_type)
program_with_type = copy.deepcopy(program)
program_with_type['type'] = program_type
programs_with_program_type.append(program_with_type)
mock_get_programs.return_value = programs
mock_get_program_types.return_value = program_types
actual = get_programs_with_type()
self.assertEqual(actual, programs_with_program_type)
@ddt.data(False, True)
@mock.patch(UTILS_MODULE + '.get_programs')
@mock.patch(UTILS_MODULE + '.get_program_types')
def test_get_programs_with_type_include_hidden(self, include_hidden, mock_get_program_types, mock_get_programs):
"""Verify get_programs_with_type returns the expected list of programs with include_hidden parameter."""
programs_with_program_type = []
programs = [ProgramFactory(hidden=False), ProgramFactory(hidden=True)]
program_types = []
for program in programs:
if program['hidden'] and not include_hidden:
continue
program_type = ProgramTypeFactory(name=program['type'])
program_types.append(program_type)
program_with_type = copy.deepcopy(program)
program_with_type['type'] = program_type
programs_with_program_type.append(program_with_type)
mock_get_programs.return_value = programs
mock_get_program_types.return_value = program_types
actual = get_programs_with_type(include_hidden=include_hidden)
self.assertEqual(actual, programs_with_program_type)
@mock.patch(UTILS_MODULE + '.get_edx_api_data')
class TestGetProgramTypes(CatalogIntegrationMixin, TestCase):
"""Tests covering retrieval of program types from the catalog service."""

View File

@@ -109,15 +109,17 @@ def get_program_types(name=None):
return []
def get_programs_with_type(types=None):
def get_programs_with_type(types=None, include_hidden=True):
"""
Return the list of programs. You can filter the types of programs returned using the optional
types parameter. If no filter is provided, all programs of all types will be returned.
types parameter. If no filter is provided, all programs of all types will be returned. In addition,
you can specify whether to include hidden programs using the optional include_hidden parameter.
The program dict is updated with the fully serialized program type.
Keyword Arguments:
types (list): List of program type slugs to filter by.
include_hidden (bool): whether to include hidden programs
Return:
list of dict, representing the active programs.
@@ -136,6 +138,9 @@ def get_programs_with_type(types=None):
if types and program['type'] not in types:
continue
if program['hidden'] and not include_hidden:
continue
# deepcopy the program dict here so we are not adding
# the type to the cached object
program_with_type = copy.deepcopy(program)