Commit 6b6cbfa4 by chrisndodge

Merge pull request #10843 from edx/cdodge/address-honor-mode-breakage

White Labels need to still use the 'honor' course mode even through t…
parents 2470072a 1592a32d
...@@ -39,7 +39,9 @@ class CourseModeForm(forms.ModelForm): ...@@ -39,7 +39,9 @@ class CourseModeForm(forms.ModelForm):
[(CourseMode.DEFAULT_MODE_SLUG, CourseMode.DEFAULT_MODE_SLUG)] + [(CourseMode.DEFAULT_MODE_SLUG, CourseMode.DEFAULT_MODE_SLUG)] +
[(mode_slug, mode_slug) for mode_slug in CourseMode.VERIFIED_MODES] + [(mode_slug, mode_slug) for mode_slug in CourseMode.VERIFIED_MODES] +
[(CourseMode.NO_ID_PROFESSIONAL_MODE, CourseMode.NO_ID_PROFESSIONAL_MODE)] + [(CourseMode.NO_ID_PROFESSIONAL_MODE, CourseMode.NO_ID_PROFESSIONAL_MODE)] +
[(mode_slug, mode_slug) for mode_slug in CourseMode.CREDIT_MODES] [(mode_slug, mode_slug) for mode_slug in CourseMode.CREDIT_MODES] +
# need to keep legacy modes around for awhile
[(CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG, CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG)]
) )
mode_slug = forms.ChoiceField(choices=COURSE_MODE_SLUG_CHOICES, label=_("Mode")) mode_slug = forms.ChoiceField(choices=COURSE_MODE_SLUG_CHOICES, label=_("Mode"))
......
...@@ -114,6 +114,13 @@ class CourseMode(models.Model): ...@@ -114,6 +114,13 @@ class CourseMode(models.Model):
# Modes that are allowed to upsell # Modes that are allowed to upsell
UPSELL_TO_VERIFIED_MODES = [HONOR, AUDIT] UPSELL_TO_VERIFIED_MODES = [HONOR, AUDIT]
# Courses purchased through the shoppingcart
# should be "honor". Since we've changed the DEFAULT_MODE_SLUG from
# "honor" to "audit", we still need to have the shoppingcart
# use "honor"
DEFAULT_SHOPPINGCART_MODE_SLUG = HONOR
DEFAULT_SHOPPINGCART_MODE = Mode(HONOR, _('Honor'), 0, '', 'usd', None, None, None)
class Meta(object): class Meta(object):
unique_together = ('course_id', 'mode_slug', 'currency') unique_together = ('course_id', 'mode_slug', 'currency')
......
...@@ -111,7 +111,16 @@ def enroll_email(course_id, student_email, auto_enroll=False, email_students=Fal ...@@ -111,7 +111,16 @@ def enroll_email(course_id, student_email, auto_enroll=False, email_students=Fal
if previous_state.user: if previous_state.user:
# if the student is currently unenrolled, don't enroll them in their # if the student is currently unenrolled, don't enroll them in their
# previous mode # previous mode
course_mode = CourseMode.DEFAULT_MODE_SLUG
# for now, White Labels use 'shoppingcart' which is based on the
# "honor" course_mode. Given the change to use "audit" as the default
# course_mode in Open edX, we need to be backwards compatible with
# how White Labels approach enrollment modes.
if CourseMode.is_white_label(course_id):
course_mode = CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG
else:
course_mode = CourseMode.DEFAULT_MODE_SLUG
if previous_state.enrollment: if previous_state.enrollment:
course_mode = previous_state.mode course_mode = previous_state.mode
......
...@@ -362,6 +362,11 @@ class TestInstructorDetailedEnrollmentReport(TestReportMixin, InstructorTaskCour ...@@ -362,6 +362,11 @@ class TestInstructorDetailedEnrollmentReport(TestReportMixin, InstructorTaskCour
def setUp(self): def setUp(self):
super(TestInstructorDetailedEnrollmentReport, self).setUp() super(TestInstructorDetailedEnrollmentReport, self).setUp()
self.course = CourseFactory.create() self.course = CourseFactory.create()
CourseModeFactory.create(
course_id=self.course.id,
min_price=50,
mode_slug=CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG
)
# create testing invoice 1 # create testing invoice 1
self.instructor = InstructorFactory(course_key=self.course.id) self.instructor = InstructorFactory(course_key=self.course.id)
...@@ -476,7 +481,7 @@ class TestInstructorDetailedEnrollmentReport(TestReportMixin, InstructorTaskCour ...@@ -476,7 +481,7 @@ class TestInstructorDetailedEnrollmentReport(TestReportMixin, InstructorTaskCour
created_by=self.instructor, created_by=self.instructor,
invoice=self.sale_invoice_1, invoice=self.sale_invoice_1,
invoice_item=self.invoice_item, invoice_item=self.invoice_item,
mode_slug=CourseMode.DEFAULT_MODE_SLUG mode_slug=CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG
) )
course_registration_code.save() course_registration_code.save()
...@@ -517,7 +522,7 @@ class TestInstructorDetailedEnrollmentReport(TestReportMixin, InstructorTaskCour ...@@ -517,7 +522,7 @@ class TestInstructorDetailedEnrollmentReport(TestReportMixin, InstructorTaskCour
created_by=self.instructor, created_by=self.instructor,
invoice=self.sale_invoice_1, invoice=self.sale_invoice_1,
invoice_item=self.invoice_item, invoice_item=self.invoice_item,
mode_slug=CourseMode.DEFAULT_MODE_SLUG mode_slug=CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG
) )
course_registration_code.save() course_registration_code.save()
...@@ -845,7 +850,11 @@ class TestExecutiveSummaryReport(TestReportMixin, InstructorTaskCourseTestCase): ...@@ -845,7 +850,11 @@ class TestExecutiveSummaryReport(TestReportMixin, InstructorTaskCourseTestCase):
def setUp(self): def setUp(self):
super(TestExecutiveSummaryReport, self).setUp() super(TestExecutiveSummaryReport, self).setUp()
self.course = CourseFactory.create() self.course = CourseFactory.create()
CourseModeFactory.create(course_id=self.course.id, min_price=50) CourseModeFactory.create(
course_id=self.course.id,
min_price=50,
mode_slug=CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG
)
self.instructor = InstructorFactory(course_key=self.course.id) self.instructor = InstructorFactory(course_key=self.course.id)
self.student1 = UserFactory() self.student1 = UserFactory()
......
# pylint: disable=arguments-differ
""" Models for the shopping cart and assorted purchase types """ """ Models for the shopping cart and assorted purchase types """
from collections import namedtuple from collections import namedtuple
...@@ -1473,7 +1474,7 @@ class PaidCourseRegistration(OrderItem): ...@@ -1473,7 +1474,7 @@ class PaidCourseRegistration(OrderItem):
app_label = "shoppingcart" app_label = "shoppingcart"
course_id = CourseKeyField(max_length=128, db_index=True) course_id = CourseKeyField(max_length=128, db_index=True)
mode = models.SlugField(default=CourseMode.DEFAULT_MODE_SLUG) mode = models.SlugField(default=CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG)
course_enrollment = models.ForeignKey(CourseEnrollment, null=True) course_enrollment = models.ForeignKey(CourseEnrollment, null=True)
@classmethod @classmethod
...@@ -1526,7 +1527,8 @@ class PaidCourseRegistration(OrderItem): ...@@ -1526,7 +1527,8 @@ class PaidCourseRegistration(OrderItem):
@classmethod @classmethod
@transaction.atomic @transaction.atomic
def add_to_order(cls, order, course_id, mode_slug=CourseMode.DEFAULT_MODE_SLUG, cost=None, currency=None): def add_to_order(cls, order, course_id, mode_slug=CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG,
cost=None, currency=None): # pylint: disable=arguments-differ
""" """
A standardized way to create these objects, with sensible defaults filled in. A standardized way to create these objects, with sensible defaults filled in.
Will update the cost if called on an order that already carries the course. Will update the cost if called on an order that already carries the course.
...@@ -1561,7 +1563,7 @@ class PaidCourseRegistration(OrderItem): ...@@ -1561,7 +1563,7 @@ class PaidCourseRegistration(OrderItem):
course_mode = CourseMode.mode_for_course(course_id, mode_slug) course_mode = CourseMode.mode_for_course(course_id, mode_slug)
if not course_mode: if not course_mode:
# user could have specified a mode that's not set, in that case return the DEFAULT_MODE # user could have specified a mode that's not set, in that case return the DEFAULT_MODE
course_mode = CourseMode.DEFAULT_MODE course_mode = CourseMode.DEFAULT_SHOPPINGCART_MODE
if not cost: if not cost:
cost = course_mode.min_price cost = course_mode.min_price
if not currency: if not currency:
...@@ -1660,7 +1662,7 @@ class CourseRegCodeItem(OrderItem): ...@@ -1660,7 +1662,7 @@ class CourseRegCodeItem(OrderItem):
app_label = "shoppingcart" app_label = "shoppingcart"
course_id = CourseKeyField(max_length=128, db_index=True) course_id = CourseKeyField(max_length=128, db_index=True)
mode = models.SlugField(default=CourseMode.DEFAULT_MODE_SLUG) mode = models.SlugField(default=CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG)
@classmethod @classmethod
def get_bulk_purchased_seat_count(cls, course_key, status='purchased'): def get_bulk_purchased_seat_count(cls, course_key, status='purchased'):
...@@ -1706,7 +1708,8 @@ class CourseRegCodeItem(OrderItem): ...@@ -1706,7 +1708,8 @@ class CourseRegCodeItem(OrderItem):
@classmethod @classmethod
@transaction.atomic @transaction.atomic
def add_to_order(cls, order, course_id, qty, mode_slug=CourseMode.DEFAULT_MODE_SLUG, cost=None, currency=None): # pylint: disable=arguments-differ def add_to_order(cls, order, course_id, qty, mode_slug=CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG,
cost=None, currency=None): # pylint: disable=arguments-differ
""" """
A standardized way to create these objects, with sensible defaults filled in. A standardized way to create these objects, with sensible defaults filled in.
Will update the cost if called on an order that already carries the course. Will update the cost if called on an order that already carries the course.
...@@ -1736,8 +1739,8 @@ class CourseRegCodeItem(OrderItem): ...@@ -1736,8 +1739,8 @@ class CourseRegCodeItem(OrderItem):
### handle default arguments for mode_slug, cost, currency ### handle default arguments for mode_slug, cost, currency
course_mode = CourseMode.mode_for_course(course_id, mode_slug) course_mode = CourseMode.mode_for_course(course_id, mode_slug)
if not course_mode: if not course_mode:
# user could have specified a mode that's not set, in that case return the DEFAULT_MODE # user could have specified a mode that's not set, in that case return the DEFAULT_SHOPPINGCART_MODE
course_mode = CourseMode.DEFAULT_MODE course_mode = CourseMode.DEFAULT_SHOPPINGCART_MODE
if not cost: if not cost:
cost = course_mode.min_price cost = course_mode.min_price
if not currency: if not currency:
......
...@@ -732,7 +732,7 @@ class PaidCourseRegistrationTest(ModuleStoreTestCase): ...@@ -732,7 +732,7 @@ class PaidCourseRegistrationTest(ModuleStoreTestCase):
self.assertEqual(reg1.unit_cost, 0) self.assertEqual(reg1.unit_cost, 0)
self.assertEqual(reg1.line_cost, 0) self.assertEqual(reg1.line_cost, 0)
self.assertEqual(reg1.mode, CourseMode.DEFAULT_MODE_SLUG) self.assertEqual(reg1.mode, CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG)
self.assertEqual(reg1.user, self.user) self.assertEqual(reg1.user, self.user)
self.assertEqual(reg1.status, "cart") self.assertEqual(reg1.status, "cart")
self.assertEqual(self.cart.total_cost, 0) self.assertEqual(self.cart.total_cost, 0)
...@@ -742,7 +742,7 @@ class PaidCourseRegistrationTest(ModuleStoreTestCase): ...@@ -742,7 +742,7 @@ class PaidCourseRegistrationTest(ModuleStoreTestCase):
self.assertEqual(course_reg_code_item.unit_cost, 0) self.assertEqual(course_reg_code_item.unit_cost, 0)
self.assertEqual(course_reg_code_item.line_cost, 0) self.assertEqual(course_reg_code_item.line_cost, 0)
self.assertEqual(course_reg_code_item.mode, CourseMode.DEFAULT_MODE_SLUG) self.assertEqual(course_reg_code_item.mode, CourseMode.DEFAULT_SHOPPINGCART_MODE_SLUG)
self.assertEqual(course_reg_code_item.user, self.user) self.assertEqual(course_reg_code_item.user, self.user)
self.assertEqual(course_reg_code_item.status, "cart") self.assertEqual(course_reg_code_item.status, "cart")
self.assertEqual(self.cart.total_cost, 0) self.assertEqual(self.cart.total_cost, 0)
......
...@@ -247,13 +247,7 @@ class ShoppingCartViewsTests(SharedModuleStoreTestCase, XssTestMixin): ...@@ -247,13 +247,7 @@ class ShoppingCartViewsTests(SharedModuleStoreTestCase, XssTestMixin):
test to check that that the same coupon code applied on multiple test to check that that the same coupon code applied on multiple
items in the cart. items in the cart.
""" """
for course_key, cost in ((self.course_key, 40), (self.testing_course.id, 20)):
CourseMode(
course_id=course_key,
mode_slug=CourseMode.DEFAULT_MODE_SLUG,
mode_display_name=CourseMode.DEFAULT_MODE_SLUG,
min_price=cost
).save()
self.login_user() self.login_user()
# add first course to user cart # add first course to user cart
resp = self.client.post( resp = self.client.post(
......
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