diff --git a/common/djangoapps/student/models.py b/common/djangoapps/student/models.py index 3ef7a59880..036ba2d79f 100644 --- a/common/djangoapps/student/models.py +++ b/common/djangoapps/student/models.py @@ -1760,7 +1760,7 @@ class CourseEnrollment(models.Model): return None try: - if not self.schedule or not self.schedule.active: + if not self.schedule or not self.schedule.active: # pylint: disable=no-member return None log.debug( diff --git a/common/lib/xmodule/xmodule/modulestore/tests/factories.py b/common/lib/xmodule/xmodule/modulestore/tests/factories.py index fa91d765fb..da8af6cecf 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/factories.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/factories.py @@ -12,7 +12,7 @@ from collections import defaultdict from contextlib import contextmanager from uuid import uuid4 -from factory import Factory, Sequence, lazy_attribute_sequence, lazy_attribute, Faker +from factory import Factory, Sequence, lazy_attribute_sequence, lazy_attribute from factory.errors import CyclicDefinitionError from mock import patch from nose.tools import assert_less_equal, assert_greater_equal diff --git a/openedx/core/djangoapps/schedules/admin.py b/openedx/core/djangoapps/schedules/admin.py index 2cfbf64903..9685c5f3f9 100644 --- a/openedx/core/djangoapps/schedules/admin.py +++ b/openedx/core/djangoapps/schedules/admin.py @@ -5,6 +5,7 @@ from django import forms from django.db.models import F from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ +from openedx.core.djangolib.markup import HTML from . import models @@ -84,7 +85,7 @@ class ScheduleAdmin(admin.ModelAdmin): experience_display.short_descriptions = _('Experience') def username(self, obj): - return '{}'.format( + return HTML('{}').format( reverse("admin:auth_user_change", args=(obj.enrollment.user.id,)), obj.enrollment.user.username ) @@ -93,7 +94,7 @@ class ScheduleAdmin(admin.ModelAdmin): username.short_description = _('Username') def course_id(self, obj): - return '{}'.format( + return HTML('{}').format( reverse("admin:course_overviews_courseoverview_change", args=( obj.enrollment.course_id, )), diff --git a/openedx/core/djangoapps/schedules/management/commands/setup_models_to_send_test_emails.py b/openedx/core/djangoapps/schedules/management/commands/setup_models_to_send_test_emails.py index bc7c1813cb..3fad828d71 100644 --- a/openedx/core/djangoapps/schedules/management/commands/setup_models_to_send_test_emails.py +++ b/openedx/core/djangoapps/schedules/management/commands/setup_models_to_send_test_emails.py @@ -1,32 +1,48 @@ +""" +A managment command that can be used to set up Schedules with various configurations for testing. +""" + import datetime import pytz import factory from django.core.management.base import BaseCommand -from student.models import CourseEnrollment from django.contrib.sites.models import Site -from openedx.core.djangoapps.schedules.models import Schedule, ScheduleConfig, ScheduleExperience -from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory, ScheduleConfigFactory, ScheduleExperienceFactory -from student.tests.factories import CourseEnrollmentFactory +from openedx.core.djangoapps.schedules.models import ScheduleExperience +from openedx.core.djangoapps.schedules.tests.factories import ( + ScheduleFactory, ScheduleConfigFactory, ScheduleExperienceFactory +) from xmodule.modulestore.tests.factories import CourseFactory, XMODULE_FACTORY_LOCK from openedx.core.djangoapps.content.course_overviews.models import CourseOverview from xmodule.modulestore.django import modulestore class ThreeDayNudgeSchedule(ScheduleFactory): + """ + A ScheduleFactory that creates a Schedule set up for a 3-day nudge email. + """ start = factory.Faker('date_time_between', start_date='-3d', end_date='-3d', tzinfo=pytz.UTC) class TenDayNudgeSchedule(ScheduleFactory): + """ + A ScheduleFactory that creates a Schedule set up for a 10-day nudge email. + """ start = factory.Faker('date_time_between', start_date='-10d', end_date='-10d', tzinfo=pytz.UTC) class UpgradeReminderSchedule(ScheduleFactory): + """ + A ScheduleFactory that creates a Schedule set up for a 2-days-remaining upgrade reminder. + """ start = factory.Faker('past_datetime', tzinfo=pytz.UTC) upgrade_deadline = factory.Faker('date_time_between', start_date='+2d', end_date='+2d', tzinfo=pytz.UTC) class ContentHighlightSchedule(ScheduleFactory): + """ + A ScheduleFactory that creates a Schedule set up for a course highlights email. + """ start = factory.Faker('date_time_between', start_date='-7d', end_date='-7d', tzinfo=pytz.UTC) experience = factory.RelatedFactory(ScheduleExperienceFactory, 'schedule', experience_type=ScheduleExperience.EXPERIENCES.course_updates) @@ -45,8 +61,8 @@ class Command(BaseCommand): max_org_sequence_id = max(int(course.org[4:]) for course in courses if course.org.startswith('org.')) XMODULE_FACTORY_LOCK.enable() - CourseFactory.reset_sequence(max_org_sequence_id + 1, force=True) - course = CourseFactory( + CourseFactory.reset_sequence(max_org_sequence_id + 1, force=True) # pylint: disable=no-member + course = CourseFactory.create( start=datetime.datetime.today() - datetime.timedelta(days=30), end=datetime.datetime.today() + datetime.timedelta(days=30), number=factory.Sequence('schedules_test_course_{}'.format),