diff --git a/common/djangoapps/course_modes/models.py b/common/djangoapps/course_modes/models.py index ce15059643..8e475d1ec1 100644 --- a/common/djangoapps/course_modes/models.py +++ b/common/djangoapps/course_modes/models.py @@ -9,7 +9,7 @@ from collections import namedtuple from django.utils.translation import ugettext as _ from django.db.models import Q -Mode = namedtuple('Mode', ['slug', 'name', 'min_price', 'suggested_prices', 'currency']) +Mode = namedtuple('Mode', ['slug', 'name', 'min_price', 'suggested_prices', 'currency', 'expiration_date']) class CourseMode(models.Model): @@ -39,7 +39,7 @@ class CourseMode(models.Model): # turn this mode off after the given expiration date expiration_date = models.DateField(default=None, null=True, blank=True) - DEFAULT_MODE = Mode('honor', _('Honor Code Certificate'), 0, '', 'usd') + DEFAULT_MODE = Mode('honor', _('Honor Code Certificate'), 0, '', 'usd', None) DEFAULT_MODE_SLUG = 'honor' class Meta: @@ -57,8 +57,14 @@ class CourseMode(models.Model): found_course_modes = cls.objects.filter(Q(course_id=course_id) & (Q(expiration_date__isnull=True) | Q(expiration_date__gte=now))) - modes = ([Mode(mode.mode_slug, mode.mode_display_name, mode.min_price, mode.suggested_prices, mode.currency) - for mode in found_course_modes]) + modes = ([Mode( + mode.mode_slug, + mode.mode_display_name, + mode.min_price, + mode.suggested_prices, + mode.currency, + mode.expiration_date + ) for mode in found_course_modes]) if not modes: modes = [cls.DEFAULT_MODE] return modes diff --git a/common/djangoapps/course_modes/tests/test_models.py b/common/djangoapps/course_modes/tests/test_models.py index 651c7c51a5..7a01c30dc4 100644 --- a/common/djangoapps/course_modes/tests/test_models.py +++ b/common/djangoapps/course_modes/tests/test_models.py @@ -49,7 +49,7 @@ class CourseModeModelTest(TestCase): self.create_mode('verified', 'Verified Certificate') modes = CourseMode.modes_for_course(self.course_id) - mode = Mode(u'verified', u'Verified Certificate', 0, '', 'usd') + mode = Mode(u'verified', u'Verified Certificate', 0, '', 'usd', None) self.assertEqual([mode], modes) modes_dict = CourseMode.modes_for_course_dict(self.course_id) @@ -61,8 +61,8 @@ class CourseModeModelTest(TestCase): """ Finding the modes when there's multiple modes """ - mode1 = Mode(u'honor', u'Honor Code Certificate', 0, '', 'usd') - mode2 = Mode(u'verified', u'Verified Certificate', 0, '', 'usd') + mode1 = Mode(u'honor', u'Honor Code Certificate', 0, '', 'usd', None) + mode2 = Mode(u'verified', u'Verified Certificate', 0, '', 'usd', None) set_modes = [mode1, mode2] for mode in set_modes: self.create_mode(mode.slug, mode.name, mode.min_price, mode.suggested_prices) @@ -81,9 +81,9 @@ class CourseModeModelTest(TestCase): self.assertEqual(0, CourseMode.min_course_price_for_currency(self.course_id, 'usd')) # create some modes - mode1 = Mode(u'honor', u'Honor Code Certificate', 10, '', 'usd') - mode2 = Mode(u'verified', u'Verified Certificate', 20, '', 'usd') - mode3 = Mode(u'honor', u'Honor Code Certificate', 80, '', 'cny') + mode1 = Mode(u'honor', u'Honor Code Certificate', 10, '', 'usd', None) + mode2 = Mode(u'verified', u'Verified Certificate', 20, '', 'usd', None) + mode3 = Mode(u'honor', u'Honor Code Certificate', 80, '', 'cny', None) set_modes = [mode1, mode2, mode3] for mode in set_modes: self.create_mode(mode.slug, mode.name, mode.min_price, mode.suggested_prices, mode.currency) @@ -98,14 +98,15 @@ class CourseModeModelTest(TestCase): modes = CourseMode.modes_for_course(self.course_id) self.assertEqual([CourseMode.DEFAULT_MODE], modes) - mode1 = Mode(u'honor', u'Honor Code Certificate', 0, '', 'usd') + mode1 = Mode(u'honor', u'Honor Code Certificate', 0, '', 'usd', None) self.create_mode(mode1.slug, mode1.name, mode1.min_price, mode1.suggested_prices) modes = CourseMode.modes_for_course(self.course_id) self.assertEqual([mode1], modes) - expired_mode.expiration_date = datetime.now(pytz.UTC) + timedelta(days=1) + expiration_date = datetime.now(pytz.UTC) + timedelta(days=1) + expired_mode.expiration_date = expiration_date expired_mode.save() - expired_mode_value = Mode(u'verified', u'Verified Certificate', 0, '', 'usd') + expired_mode_value = Mode(u'verified', u'Verified Certificate', 0, '', 'usd', expiration_date.date()) modes = CourseMode.modes_for_course(self.course_id) self.assertEqual([expired_mode_value, mode1], modes) diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 9d3d0bc63b..3172026209 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -300,6 +300,7 @@ def dashboard(request): show_courseware_links_for = frozenset(course.id for course, _enrollment in courses if has_access(request.user, course, 'load')) + course_modes = {course.id: CourseMode.modes_for_course_dict(course.id) for course, _enrollment in courses} cert_statuses = {course.id: cert_info(request.user, course) for course, _enrollment in courses} # only show email settings for Mongo course and when bulk email is turned on @@ -324,6 +325,7 @@ def dashboard(request): 'staff_access': staff_access, 'errored_courses': errored_courses, 'show_courseware_links_for': show_courseware_links_for, + 'all_course_modes': course_modes, 'cert_statuses': cert_statuses, 'show_email_settings_for': show_email_settings_for, } diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html index 683422133f..1bcdd4582f 100644 --- a/lms/templates/dashboard.html +++ b/lms/templates/dashboard.html @@ -179,7 +179,8 @@ <% show_courseware_link = (course.id in show_courseware_links_for) %> <% cert_status = cert_statuses.get(course.id) %> <% show_email_settings = (course.id in show_email_settings_for) %> - <%include file='dashboard/dashboard_course_listing.html' args="course=course, enrollment=enrollment, show_courseware_link=show_courseware_link, cert_status=cert_status, show_email_settings=show_email_settings" /> + <% course_modes = all_course_modes.get(course.id) %> + <%include file='dashboard/dashboard_course_listing.html' args="course=course, enrollment=enrollment, show_courseware_link=show_courseware_link, cert_status=cert_status, show_email_settings=show_email_settings, course_modes=course_modes" /> % endfor diff --git a/lms/templates/dashboard/dashboard_course_listing.html b/lms/templates/dashboard/dashboard_course_listing.html index 3442cb93aa..2f9069034a 100644 --- a/lms/templates/dashboard/dashboard_course_listing.html +++ b/lms/templates/dashboard/dashboard_course_listing.html @@ -1,8 +1,9 @@ -<%page args="course, enrollment, show_courseware_link, cert_status, show_email_settings" /> +<%page args="course, enrollment, show_courseware_link, cert_status, show_email_settings, course_modes" /> <%! from django.utils.translation import ugettext as _ %> <%! from django.core.urlresolvers import reverse + from datetime import date from courseware.courses import course_image_url, get_course_about_section import waffle %> @@ -116,8 +117,6 @@ % endif % endif - - ${_('Unregister')} % if show_email_settings: @@ -125,5 +124,18 @@ % endif + %if enrollment.mode != 'verified' and 'verified' in course_modes: +
+ ${_('Only {days} days left!').format(days=days_left)} +
+ %endif + +