Skip to content
Snippets Groups Projects
Commit c8b4f7e7 authored by Michael Roytman's avatar Michael Roytman
Browse files

allow configurability of the minimum price for a course mode

parent 89c36ad6
No related merge requests found
......@@ -202,8 +202,18 @@ class CourseMode(models.Model):
raise ValidationError(
_(u"Professional education modes are not allowed to have expiration_datetime set.")
)
if self.is_verified_slug(self.mode_slug) and self.min_price <= 0:
raise ValidationError(_(u"Verified modes cannot be free."))
mode_config = settings.COURSE_ENROLLMENT_MODES.get(self.mode_slug, {})
min_price_for_mode = mode_config.get('min_price', 0)
if self.min_price < min_price_for_mode:
mode_display_name = mode_config.get('display_name', self.mode_slug)
raise ValidationError(
_(
u"The {course_mode} course mode has a minimum price of {min_price}. You must set a price greater than or equal to {min_price}.".format(
course_mode=mode_display_name, min_price=min_price_for_mode
)
)
)
def save(self, force_insert=False, force_update=False, using=None):
# Ensure currency is always lowercase.
......
......@@ -474,6 +474,7 @@ class CourseModeModelTest(TestCase):
(CourseMode.CREDIT_MODE, False),
(CourseMode.PROFESSIONAL, True),
(CourseMode.NO_ID_PROFESSIONAL_MODE, False),
(CourseMode.MASTERS, False),
)
@ddt.unpack
def test_verified_min_price(self, mode_slug, is_error_expected):
......
......@@ -3347,48 +3347,52 @@ ENTERPRISE_CUSTOMER_COOKIE_NAME = 'enterprise_customer_uuid'
BASE_COOKIE_DOMAIN = 'localhost'
############## Settings for Course Enrollment Modes ######################
# The min_price key refers to the minimum price allowed for an instance
# of a particular type of course enrollment mode. This is not to be confused
# with the min_price field of the CourseMode model, which refers to the actual
# price of the CourseMode.
COURSE_ENROLLMENT_MODES = {
"audit": {
"id": 1,
"slug": "audit",
"display_name": _("Audit"),
"min_price": 0
"min_price": 0,
},
"verified": {
"id": 2,
"slug": "verified",
"display_name": _("Verified"),
"min_price": 0
"min_price": 1,
},
"professional": {
"id": 3,
"slug": "professional",
"display_name": _("Professional"),
"min_price": 0
"min_price": 1,
},
"no-id-professional": {
"id": 4,
"slug": "no-id-professional",
"display_name": _("No-Id-Professional"),
"min_price": 0
"min_price": 0,
},
"credit": {
"id": 5,
"slug": "credit",
"display_name": _("Credit"),
"min_price": 0
"min_price": 0,
},
"honor": {
"id": 6,
"slug": "honor",
"display_name": _("Honor"),
"min_price": 0
"min_price": 0,
},
"masters": {
"id": 7,
"slug": "masters",
"display_name": _("Master's"),
"min_price": 0
"min_price": 0,
},
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment