Commit 160f3914 by Nimisha Asthagiri

Merge pull request #10959 from edx/course_overview/manual_seeding

Course Overview - require manual seeding of the table
parents e45ac60c d6364312
...@@ -140,6 +140,7 @@ class PreRequisiteCourseCatalog(ModuleStoreTestCase, LoginEnrollmentTestCase): ...@@ -140,6 +140,7 @@ class PreRequisiteCourseCatalog(ModuleStoreTestCase, LoginEnrollmentTestCase):
org='edX', org='edX',
course='900', course='900',
display_name='pre requisite course', display_name='pre requisite course',
emit_signals=True,
) )
pre_requisite_courses = [unicode(pre_requisite_course.id)] pre_requisite_courses = [unicode(pre_requisite_course.id)]
...@@ -155,6 +156,7 @@ class PreRequisiteCourseCatalog(ModuleStoreTestCase, LoginEnrollmentTestCase): ...@@ -155,6 +156,7 @@ class PreRequisiteCourseCatalog(ModuleStoreTestCase, LoginEnrollmentTestCase):
start=datetime.datetime(2013, 1, 1), start=datetime.datetime(2013, 1, 1),
end=datetime.datetime(2030, 1, 1), end=datetime.datetime(2030, 1, 1),
pre_requisite_courses=pre_requisite_courses, pre_requisite_courses=pre_requisite_courses,
emit_signals=True,
) )
set_prerequisite_courses(course.id, pre_requisite_courses) set_prerequisite_courses(course.id, pre_requisite_courses)
...@@ -180,7 +182,8 @@ class IndexPageCourseCardsSortingTests(ModuleStoreTestCase): ...@@ -180,7 +182,8 @@ class IndexPageCourseCardsSortingTests(ModuleStoreTestCase):
metadata={ metadata={
'start': datetime.datetime.now(UTC) + datetime.timedelta(days=4), 'start': datetime.datetime.now(UTC) + datetime.timedelta(days=4),
'announcement': datetime.datetime.now(UTC) + datetime.timedelta(days=3), 'announcement': datetime.datetime.now(UTC) + datetime.timedelta(days=3),
} },
emit_signals=True,
) )
self.starting_earlier = CourseFactory.create( self.starting_earlier = CourseFactory.create(
org='MITx', org='MITx',
...@@ -189,12 +192,14 @@ class IndexPageCourseCardsSortingTests(ModuleStoreTestCase): ...@@ -189,12 +192,14 @@ class IndexPageCourseCardsSortingTests(ModuleStoreTestCase):
metadata={ metadata={
'start': datetime.datetime.now(UTC) + datetime.timedelta(days=2), 'start': datetime.datetime.now(UTC) + datetime.timedelta(days=2),
'announcement': datetime.datetime.now(UTC) + datetime.timedelta(days=1), 'announcement': datetime.datetime.now(UTC) + datetime.timedelta(days=1),
} },
emit_signals=True,
) )
self.course_with_default_start_date = CourseFactory.create( self.course_with_default_start_date = CourseFactory.create(
org='MITx', org='MITx',
number='1002', number='1002',
display_name='Tech Beta Course', display_name='Tech Beta Course',
emit_signals=True,
) )
self.factory = RequestFactory() self.factory = RequestFactory()
......
...@@ -34,7 +34,11 @@ class TestMicrosites(ModuleStoreTestCase, LoginEnrollmentTestCase): ...@@ -34,7 +34,11 @@ class TestMicrosites(ModuleStoreTestCase, LoginEnrollmentTestCase):
# IMPORTANT: For these tests to work, this domain must be defined via # IMPORTANT: For these tests to work, this domain must be defined via
# DNS configuration (either local or published) # DNS configuration (either local or published)
self.course = CourseFactory.create(display_name='Robot_Super_Course', org='TestMicrositeX') self.course = CourseFactory.create(
display_name='Robot_Super_Course',
org='TestMicrositeX',
emit_signals=True,
)
self.chapter0 = ItemFactory.create(parent_location=self.course.location, self.chapter0 = ItemFactory.create(parent_location=self.course.location,
display_name='Overview') display_name='Overview')
self.chapter9 = ItemFactory.create(parent_location=self.course.location, self.chapter9 = ItemFactory.create(parent_location=self.course.location,
...@@ -44,13 +48,18 @@ class TestMicrosites(ModuleStoreTestCase, LoginEnrollmentTestCase): ...@@ -44,13 +48,18 @@ class TestMicrosites(ModuleStoreTestCase, LoginEnrollmentTestCase):
self.section9 = ItemFactory.create(parent_location=self.chapter9.location, self.section9 = ItemFactory.create(parent_location=self.chapter9.location,
display_name='factory_section') display_name='factory_section')
self.course_outside_microsite = CourseFactory.create(display_name='Robot_Course_Outside_Microsite', org='FooX') self.course_outside_microsite = CourseFactory.create(
display_name='Robot_Course_Outside_Microsite',
org='FooX',
emit_signals=True,
)
# have a course which explicitly sets visibility in catalog to False # have a course which explicitly sets visibility in catalog to False
self.course_hidden_visibility = CourseFactory.create( self.course_hidden_visibility = CourseFactory.create(
display_name='Hidden_course', display_name='Hidden_course',
org='TestMicrositeX', org='TestMicrositeX',
catalog_visibility=CATALOG_VISIBILITY_NONE, catalog_visibility=CATALOG_VISIBILITY_NONE,
emit_signals=True,
) )
# have a course which explicitly sets visibility in catalog and about to true # have a course which explicitly sets visibility in catalog and about to true
...@@ -59,6 +68,7 @@ class TestMicrosites(ModuleStoreTestCase, LoginEnrollmentTestCase): ...@@ -59,6 +68,7 @@ class TestMicrosites(ModuleStoreTestCase, LoginEnrollmentTestCase):
org='TestMicrositeX', org='TestMicrositeX',
course="foo", course="foo",
catalog_visibility=CATALOG_VISIBILITY_CATALOG_AND_ABOUT, catalog_visibility=CATALOG_VISIBILITY_CATALOG_AND_ABOUT,
emit_signals=True,
) )
def setup_users(self): def setup_users(self):
......
...@@ -33,12 +33,10 @@ class Command(BaseCommand): ...@@ -33,12 +33,10 @@ class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
course_keys = []
if options['all']: if options['all']:
# Have CourseOverview generate course overviews for all course_keys = [course.id for course in modulestore().get_courses()]
# the courses in the system.
CourseOverview.get_all_courses(force_reseeding=True)
else: else:
course_keys = []
if len(args) < 1: if len(args) < 1:
raise CommandError('At least one course or --all must be specified.') raise CommandError('At least one course or --all must be specified.')
try: try:
...@@ -49,4 +47,4 @@ class Command(BaseCommand): ...@@ -49,4 +47,4 @@ class Command(BaseCommand):
if not course_keys: if not course_keys:
log.fatal('No courses specified.') log.fatal('No courses specified.')
CourseOverview.get_select_courses(course_keys) CourseOverview.get_select_courses(course_keys)
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('course_overviews', '0004_courseoverview_org'),
]
operations = [
migrations.DeleteModel(
name='CourseOverviewGeneratedHistory',
),
]
...@@ -447,45 +447,20 @@ class CourseOverview(TimeStampedModel): ...@@ -447,45 +447,20 @@ class CourseOverview(TimeStampedModel):
return course_overviews return course_overviews
@classmethod @classmethod
def get_all_courses(cls, force_reseeding=False, org=None): def get_all_courses(cls, org=None):
""" """
Returns all CourseOverview objects in the database. Returns all CourseOverview objects in the database.
Arguments: Arguments:
force_reseeding (bool): Optional parameter.
If True, the modulestore is used as the source of truth for
the list of courses, even if the CourseOverview table was
previously seeded. However, only non-existing CourseOverview
entries or those with older data model versions or will get
populated.
If False, the list of courses is retrieved from the
CourseOverview table if it was previously seeded, falling
back to the modulestore if it wasn't seeded.
org (string): Optional parameter that allows filtering org (string): Optional parameter that allows filtering
by organization. by organization.
""" """
if force_reseeding or not CourseOverviewGeneratedHistory.objects.first(): # Note: If a newly created course is not returned in this QueryList,
# Seed the CourseOverview table with data for all # make sure the "publish" signal was emitted when the course was
# courses in the system. # created. For tests using CourseFactory, use emit_signals=True.
course_keys = [course.id for course in modulestore().get_courses()] course_overviews = CourseOverview.objects.all()
course_overviews = cls.get_select_courses(course_keys) if org:
num_courses = len(course_overviews) course_overviews = course_overviews.filter(org=org)
CourseOverviewGeneratedHistory.objects.create(num_courses=num_courses)
if org:
course_overviews = [c for c in course_overviews if c.org == org]
else:
# Note: If a newly created course is not returned in this QueryList,
# make sure the "publish" signal was emitted when the course was
# created. For tests using CourseFactory, use emit_signals=True.
# Or pass True for force_reseeding.
course_overviews = CourseOverview.objects.all()
if org:
course_overviews = course_overviews.filter(org=org)
return course_overviews return course_overviews
@classmethod @classmethod
...@@ -516,14 +491,3 @@ class CourseOverviewTab(models.Model): ...@@ -516,14 +491,3 @@ class CourseOverviewTab(models.Model):
""" """
tab_id = models.CharField(max_length=50) tab_id = models.CharField(max_length=50)
course_overview = models.ForeignKey(CourseOverview, db_index=True, related_name="tabs") course_overview = models.ForeignKey(CourseOverview, db_index=True, related_name="tabs")
class CourseOverviewGeneratedHistory(TimeStampedModel):
"""
Model for keeping track of when CourseOverview Models are
generated/seeded.
"""
num_courses = IntegerField(null=True)
def __unicode__(self):
return self.num_courses
...@@ -450,7 +450,7 @@ class CourseOverviewTestCase(ModuleStoreTestCase): ...@@ -450,7 +450,7 @@ class CourseOverviewTestCase(ModuleStoreTestCase):
) )
def test_get_all_courses(self): def test_get_all_courses(self):
course_ids = [CourseFactory.create().id for __ in range(3)] course_ids = [CourseFactory.create(emit_signals=True).id for __ in range(3)]
self.assertSetEqual( self.assertSetEqual(
{course_overview.id for course_overview in CourseOverview.get_all_courses()}, {course_overview.id for course_overview in CourseOverview.get_all_courses()},
set(course_ids), set(course_ids),
...@@ -462,23 +462,15 @@ class CourseOverviewTestCase(ModuleStoreTestCase): ...@@ -462,23 +462,15 @@ class CourseOverviewTestCase(ModuleStoreTestCase):
CourseOverview.get_all_courses() CourseOverview.get_all_courses()
self.assertFalse(mock_get_from_id.called) self.assertFalse(mock_get_from_id.called)
CourseOverview.get_all_courses(force_reseeding=True)
self.assertTrue(mock_get_from_id.called)
def test_get_all_courses_by_org(self): def test_get_all_courses_by_org(self):
org_courses = [] # list of lists of courses org_courses = [] # list of lists of courses
for index in range(2): for index in range(2):
org_courses.append([ org_courses.append([
CourseFactory.create(org='test_org_' + unicode(index)) CourseFactory.create(org='test_org_' + unicode(index), emit_signals=True)
for __ in range(3) for __ in range(3)
]) ])
self.assertSetEqual( self.assertSetEqual(
{c.id for c in CourseOverview.get_all_courses(org='test_org_0', force_reseeding=True)},
{c.id for c in org_courses[0]},
)
self.assertSetEqual(
{c.id for c in CourseOverview.get_all_courses(org='test_org_1')}, {c.id for c in CourseOverview.get_all_courses(org='test_org_1')},
{c.id for c in org_courses[1]}, {c.id for c in org_courses[1]},
) )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment