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