From ae040e7cbea71335d1701cbe4e5fabf9747eb849 Mon Sep 17 00:00:00 2001 From: rehan99000 Date: Tue, 8 Sep 2020 17:13:50 +0500 Subject: [PATCH] refactored number_of_courses to subscription_number_of_courses --- .../static/js/models/subscription_model.js | 4 +-- .../js/views/subscription_detail_view.js | 4 +-- .../static/js/views/subscription_form_view.js | 6 ++--- .../static/templates/subscription_detail.html | 4 +-- .../static/templates/subscription_form.html | 2 +- ecommerce/subscriptions/api/v2/serializers.py | 14 +++++------ .../subscriptions/api/v2/tests/constants.py | 11 ++++++++ .../subscriptions/api/v2/tests/factories.py | 4 +-- .../subscriptions/api/v2/tests/mixins.py | 2 +- .../api/v2/tests/test_serializers.py | 8 +++--- .../subscriptions/api/v2/tests/test_views.py | 4 +-- ecommerce/subscriptions/api/v2/tests/utils.py | 25 +++++++++++++++++++ ecommerce/subscriptions/modules.py | 9 ++++--- ecommerce/subscriptions/tests/test_modules.py | 6 +++-- 14 files changed, 72 insertions(+), 31 deletions(-) create mode 100644 ecommerce/subscriptions/api/v2/tests/constants.py create mode 100644 ecommerce/subscriptions/api/v2/tests/utils.py diff --git a/ecommerce/static/js/models/subscription_model.js b/ecommerce/static/js/models/subscription_model.js index 5434cc49a36..1a54669d77c 100644 --- a/ecommerce/static/js/models/subscription_model.js +++ b/ecommerce/static/js/models/subscription_model.js @@ -52,7 +52,7 @@ define([ subscription_type: SUBSCRIPTION_TYPES.limited_access, subscription_duration_value: 0, subscription_duration_unit: SUBSCRIPTION_DURATION_UNITS.days, - number_of_courses: 0, + subscription_number_of_courses: 0, subscription_actual_price: 0, subscription_price: 0, subscription_display_order: 1, @@ -79,7 +79,7 @@ define([ return subscription_type === SUBSCRIPTION_TYPES.limited_access || subscription_type === SUBSCRIPTION_TYPES.full_access_courses; } }, - number_of_courses: { + subscription_number_of_courses: { pattern: 'number', required: function() { var subscription_type = this.get('subscription_type'); diff --git a/ecommerce/static/js/views/subscription_detail_view.js b/ecommerce/static/js/views/subscription_detail_view.js index 55221cfa55b..3762f74cf02 100644 --- a/ecommerce/static/js/views/subscription_detail_view.js +++ b/ecommerce/static/js/views/subscription_detail_view.js @@ -45,7 +45,7 @@ define([ subscriptionStatus = this.model.get('subscription_status'), dateCreated = this.model.get('date_created'), dateEdited = this.model.get('date_updated'), - numberOfCourses = this.model.get('number_of_courses'), + subscriptionNumberOfCourses = this.model.get('subscription_number_of_courses'), subscriptionActualPrice = this.model.get('subscription_actual_price'), subscriptionPrice = this.model.get('subscription_price'), subscriptionDurationValue = this.model.get('subscription_duration_value'), @@ -58,7 +58,7 @@ define([ subscription_status: subscriptionStatus, subscription_actual_price: subscriptionActualPrice, subscription_price: subscriptionPrice, - number_of_courses: numberOfCourses, + subscription_number_of_courses: subscriptionNumberOfCourses, subscription_duration_value: subscriptionDurationValue, subscription_duration_unit: subscriptionDurationUnit, dateEdited: dateEdited ? this.formatDateTime(dateEdited) : '', diff --git a/ecommerce/static/js/views/subscription_form_view.js b/ecommerce/static/js/views/subscription_form_view.js index 3a7a71a88e0..aca5c581292 100644 --- a/ecommerce/static/js/views/subscription_form_view.js +++ b/ecommerce/static/js/views/subscription_form_view.js @@ -77,8 +77,8 @@ define([ 'input[name=actual_price]': { observe: 'subscription_actual_price' }, - 'input[name=number_of_courses]': { - observe: 'number_of_courses' + 'input[name=subscription_number_of_courses]': { + observe: 'subscription_number_of_courses' }, 'input[name=price]': { observe: 'subscription_price' @@ -140,7 +140,7 @@ define([ toggleSubscriptionTypeFields: function() { var subscriptionType = this.$('[name=subscription_type]:checked').val(), limitedAccessFields = [ - '[name=number_of_courses]', + '[name=subscription_number_of_courses]', ], fullAccessFields = [ '[name=duration_value]', diff --git a/ecommerce/static/templates/subscription_detail.html b/ecommerce/static/templates/subscription_detail.html index f0c3c2a2f6e..f91e61e1e21 100644 --- a/ecommerce/static/templates/subscription_detail.html +++ b/ecommerce/static/templates/subscription_detail.html @@ -43,10 +43,10 @@

<%= subscription_duration_value %> <%= subscription_duration_unit %>
<%}%> - <% if(number_of_courses) {%> + <% if(subscription_number_of_courses) {%>
<%= gettext('Number of Courses:') %>
-
<%= number_of_courses %>
+
<%= subscription_number_of_courses %>
<%}%> <% if(dateCreated) {%> diff --git a/ecommerce/static/templates/subscription_form.html b/ecommerce/static/templates/subscription_form.html index d5a19db4e30..3844396cb3c 100644 --- a/ecommerce/static/templates/subscription_form.html +++ b/ecommerce/static/templates/subscription_form.html @@ -63,7 +63,7 @@
- +

<%= gettext('Provide the number of courses which students can access using this subscription.') %>

diff --git a/ecommerce/subscriptions/api/v2/serializers.py b/ecommerce/subscriptions/api/v2/serializers.py index a4e0b7761bb..6334b075ce2 100644 --- a/ecommerce/subscriptions/api/v2/serializers.py +++ b/ecommerce/subscriptions/api/v2/serializers.py @@ -29,9 +29,9 @@ StockRecord = get_model('partner', 'StockRecord') SUBSCRIPTION_TYPE_ATTRIBUTES = { - 'limited-access': ['number_of_courses', 'subscription_duration_value', 'subscription_duration_unit', ], + 'limited-access': ['subscription_number_of_courses', 'subscription_duration_value', 'subscription_duration_unit', ], 'full-access-courses': ['subscription_duration_value', 'subscription_duration_unit', ], - 'full-access-time-period': ['number_of_courses', ], + 'full-access-time-period': ['subscription_number_of_courses', ], 'lifetime-access': [], } SUBSCRIPTION_GENERAL_ATTRIBUTES = ['subscription_type', 'subscription_actual_price', 'subscription_price', 'subscription_status', 'subscription_display_order'] @@ -102,7 +102,7 @@ class SubscriptionSerializer(serializers.ModelSerializer): subscription_actual_price = serializers.SerializerMethodField() subscription_price = serializers.SerializerMethodField() subscription_status = serializers.SerializerMethodField() - number_of_courses = serializers.SerializerMethodField() + subscription_number_of_courses = serializers.SerializerMethodField() subscription_duration_value = serializers.SerializerMethodField() subscription_duration_unit = serializers.SerializerMethodField() @@ -130,13 +130,13 @@ def get_subscription_status(self, product): """ return product.attr.subscription_status - def get_number_of_courses(self, product): + def get_subscription_number_of_courses(self, product): """ Get number of courses depending on the subscription type. """ subscription_type = product.attribute_values.get(attribute__code='subscription_type').value.option if subscription_type == 'limited-access' or subscription_type == 'full-access-time-period': - return product.attr.number_of_courses + return product.attr.subscription_number_of_courses return None def get_subscription_duration_value(self, product): @@ -171,7 +171,7 @@ def to_internal_value(self, obj): 'subscription_actual_price': obj.get('subscription_actual_price', 0.0), 'subscription_price': obj.get('subscription_price', 0.0), 'subscription_status': subscription_status, - 'number_of_courses': obj.get('number_of_courses', 0), + 'subscription_number_of_courses': obj.get('subscription_number_of_courses', 0), 'subscription_duration_value': obj.get('subscription_duration_value', 0), 'subscription_duration_unit': obj.get('subscription_duration_unit', 'days'), 'subscription_display_order': obj.get('subscription_display_order', 1), @@ -326,5 +326,5 @@ class Meta: model = Product fields = ( 'title', 'subscription_type', 'subscription_actual_price', 'subscription_price', 'subscription_status', - 'number_of_courses', 'subscription_duration_value', 'subscription_duration_unit' + 'subscription_number_of_courses', 'subscription_duration_value', 'subscription_duration_unit' ) diff --git a/ecommerce/subscriptions/api/v2/tests/constants.py b/ecommerce/subscriptions/api/v2/tests/constants.py new file mode 100644 index 00000000000..0408b37595a --- /dev/null +++ b/ecommerce/subscriptions/api/v2/tests/constants.py @@ -0,0 +1,11 @@ +""" +Subscription constants. +""" + +LIMITED_ACCESS = 'limited-access' +FULL_ACCESS_COURSES = 'full-access-courses' +FULL_ACCESS_TIME_PERIOD = 'full-access-time-period' +LIFETIME_ACCESS = 'lifetime-access' + +SUBSCRIPTION_TYPES = [LIMITED_ACCESS, FULL_ACCESS_COURSES, FULL_ACCESS_TIME_PERIOD, LIFETIME_ACCESS] +SUBSCRIPTION_DURATION_UNIT_OPTIONS = ['days', 'months', 'years'] diff --git a/ecommerce/subscriptions/api/v2/tests/factories.py b/ecommerce/subscriptions/api/v2/tests/factories.py index 2dac92897aa..e5212eb229b 100644 --- a/ecommerce/subscriptions/api/v2/tests/factories.py +++ b/ecommerce/subscriptions/api/v2/tests/factories.py @@ -33,7 +33,7 @@ SUBSCRIPTION_ATTRIBUTES_VALUES = lambda subscription: { 'limited-access': { - 'number_of_courses': FuzzyInteger(1, 10).fuzz(), + 'subscription_number_of_courses': FuzzyInteger(1, 10).fuzz(), 'subscription_duration_value': FuzzyInteger(1, 10).fuzz(), 'subscription_duration_unit': choice(subscription.attr.get_attribute_by_code('subscription_duration_unit').option_group.options.all()), 'subscription_actual_price': FuzzyFloat(100.0, 500.0).fuzz(), @@ -50,7 +50,7 @@ 'subscription_status': FuzzyChoice((True, False)).fuzz() }, 'full-access-time-period': { - 'number_of_courses': FuzzyInteger(1, 10).fuzz(), + 'subscription_number_of_courses': FuzzyInteger(1, 10).fuzz(), 'subscription_actual_price': FuzzyFloat(100.0, 500.0).fuzz(), 'subscription_price': FuzzyFloat(10.0, 99.0).fuzz(), 'subscription_display_order': FuzzyInteger(1, 5).fuzz(), diff --git a/ecommerce/subscriptions/api/v2/tests/mixins.py b/ecommerce/subscriptions/api/v2/tests/mixins.py index 15645418103..42c520b3694 100644 --- a/ecommerce/subscriptions/api/v2/tests/mixins.py +++ b/ecommerce/subscriptions/api/v2/tests/mixins.py @@ -31,7 +31,7 @@ class SubscriptionProductMixin(object): SUBSRIPTION_ATTRIBUTES = [ { 'name': 'Number of Courses', - 'code': 'number_of_courses', + 'code': 'subscription_number_of_courses', 'type': ProductAttribute.INTEGER, }, { diff --git a/ecommerce/subscriptions/api/v2/tests/test_serializers.py b/ecommerce/subscriptions/api/v2/tests/test_serializers.py index d93de6e4e55..b8270cb3f8b 100644 --- a/ecommerce/subscriptions/api/v2/tests/test_serializers.py +++ b/ecommerce/subscriptions/api/v2/tests/test_serializers.py @@ -68,22 +68,22 @@ def test_subscription_serializer(self, subscription_type): subscription = self.create_subscription(subscription_type=subscription_type) conditional_attribute_values = { LIMITED_ACCESS: lambda subscription: { - 'number_of_courses': subscription.attr.number_of_courses, + 'subscription_number_of_courses': subscription.attr.subscription_number_of_courses, 'subscription_duration_unit': subscription.attr.subscription_duration_unit.option, 'subscription_duration_value': subscription.attr.subscription_duration_value }, FULL_ACCESS_COURSES: lambda subscription: { - 'number_of_courses': None, + 'subscription_number_of_courses': None, 'subscription_duration_unit': subscription.attr.subscription_duration_unit.option, 'subscription_duration_value': subscription.attr.subscription_duration_value }, FULL_ACCESS_TIME_PERIOD: lambda subscription: { - 'number_of_courses': subscription.attr.number_of_courses, + 'subscription_number_of_courses': subscription.attr.subscription_number_of_courses, 'subscription_duration_unit': None, 'subscription_duration_value': None }, LIFETIME_ACCESS: lambda subscription: { - 'number_of_courses': None, + 'subscription_number_of_courses': None, 'subscription_duration_unit': None, 'subscription_duration_value': None }, diff --git a/ecommerce/subscriptions/api/v2/tests/test_views.py b/ecommerce/subscriptions/api/v2/tests/test_views.py index a46df2cc929..f9445ab6cb3 100644 --- a/ecommerce/subscriptions/api/v2/tests/test_views.py +++ b/ecommerce/subscriptions/api/v2/tests/test_views.py @@ -65,7 +65,7 @@ def test_create(self): 'subscription_actual_price': 100.00, 'subscription_price': 50.00, 'subscription_active_status': 'true', - 'number_of_courses': 4, + 'subscription_number_of_courses': 4, 'subscription_duration_value': 4, 'subscription_duration_unit': 'months', 'subscription_display_order': 1 @@ -89,7 +89,7 @@ def test_update(self): 'subscription_actual_price': 100.00, 'subscription_price': 50.00, 'subscription_active_status': 'inactive', - 'number_of_courses': 4, + 'subscription_number_of_courses': 4, 'subscription_duration_value': 4, 'subscription_duration_unit': 'months', 'subscription_display_order': 1 diff --git a/ecommerce/subscriptions/api/v2/tests/utils.py b/ecommerce/subscriptions/api/v2/tests/utils.py new file mode 100644 index 00000000000..9000ff932ff --- /dev/null +++ b/ecommerce/subscriptions/api/v2/tests/utils.py @@ -0,0 +1,25 @@ +""" +Subscription utility methods. +""" +from datetime import date +from factory.fuzzy import ( + FuzzyChoice, + FuzzyDate, + FuzzyInteger, +) + +from ecommerce.subscriptions.api.v2.tests.constants import SUBSCRIPTION_TYPES + + +def mock_user_subscription(): + """ + Mock LMS response for user subscription. + """ + return { + 'subscription_id': FuzzyInteger(1, 100).fuzz(), + 'subscription_type': FuzzyChoice(SUBSCRIPTION_TYPES).fuzz(), + 'expiration_date': FuzzyDate(start_date=date.today()).fuzz().strftime('%Y-%m-%d'), + 'course_enrollments': [], + 'max_allowed_courses': FuzzyInteger(1, 10).fuzz(), + 'user': FuzzyInteger(1, 10).fuzz() + } diff --git a/ecommerce/subscriptions/modules.py b/ecommerce/subscriptions/modules.py index efd01118275..bc965bbf303 100644 --- a/ecommerce/subscriptions/modules.py +++ b/ecommerce/subscriptions/modules.py @@ -94,13 +94,16 @@ def fulfill_product(self, order, lines, email_opt_in=False): subscription = line.product subscription_type = subscription.attr.subscription_type.option subscription_expiration = get_subscription_expiration_date(subscription) - number_of_courses = subscription.attribute_values.filter(attribute__code='number_of_courses').first() + subscription_expiration = str(subscription_expiration) if subscription_expiration else None + subscription_number_of_courses = subscription.attribute_values.filter( + attribute__code='subscription_number_of_courses' + ).first() data = { 'user': order.user.username, 'subscription_id': subscription.id, - 'expiration_date': str(subscription_expiration) if subscription_expiration else subscription_expiration, + 'expiration_date': subscription_expiration, 'subscription_type': subscription_type, - 'max_allowed_courses': number_of_courses.value if number_of_courses else None, + 'max_allowed_courses': subscription_number_of_courses.value if subscription_number_of_courses else None } try: response = self._post_to_user_subscription_api(data, user=order.user) diff --git a/ecommerce/subscriptions/tests/test_modules.py b/ecommerce/subscriptions/tests/test_modules.py index b7380ec8c3f..785c0fb2a88 100644 --- a/ecommerce/subscriptions/tests/test_modules.py +++ b/ecommerce/subscriptions/tests/test_modules.py @@ -53,13 +53,15 @@ def setUp(self): subscription_type = self.subscription.attr.subscription_type.option subscription_expiration = get_subscription_expiration_date(self.subscription) - number_of_courses = self.subscription.attribute_values.filter(attribute__code='number_of_courses').first() + subscription_number_of_courses = self.subscription.attribute_values.filter( + attribute__code='subscription_number_of_courses' + ).first() self.user_subscription_api_payload = { 'user': self.order.user.username, 'subscription_id': self.subscription.id, 'expiration_date': str(subscription_expiration) if subscription_expiration else subscription_expiration, 'subscription_type': subscription_type, - 'max_allowed_courses': number_of_courses.value if number_of_courses else None, + 'max_allowed_courses': subscription_number_of_courses.value if subscription_number_of_courses else None, } def test_get_supported_lines(self):