Commit 3e3ca2da by Awais Qureshi

Merge pull request #303 from edx/awais786/XCOM-554-expired-course-price

Adding new strategy for admin users.
parents 91de6da5 5478e680
...@@ -70,8 +70,9 @@ class ProductSerializer(serializers.HyperlinkedModelSerializer): ...@@ -70,8 +70,9 @@ class ProductSerializer(serializers.HyperlinkedModelSerializer):
return None return None
def _get_info(self, product): def _get_info(self, product):
info = Selector().strategy().fetch_for_product(product) return Selector().strategy(
return info request=self.context.get('request')
).fetch_for_product(product)
def get_is_available_to_buy(self, product): def get_is_available_to_buy(self, product):
info = self._get_info(product) info = self._get_info(product)
......
...@@ -18,12 +18,17 @@ class CourseSeatAvailabilityPolicyMixin(strategy.StockRequired): ...@@ -18,12 +18,17 @@ class CourseSeatAvailabilityPolicyMixin(strategy.StockRequired):
return ProductClass.objects.get(slug='seat') return ProductClass.objects.get(slug='seat')
def availability_policy(self, product, stockrecord): def availability_policy(self, product, stockrecord):
""" A seat is unavailable if the current date is beyond the seat's expiration date. """ """ A product is unavailable for non-admin users if the current date is
if product.expires and timezone.now() > product.expires: beyond the product's expiration date. Products are always available for admin users.
"""
is_staff = getattr(self.user, 'is_staff', False)
is_available = product.expires is None or (product.expires >= timezone.now())
if is_staff or is_available:
return super(CourseSeatAvailabilityPolicyMixin, self).availability_policy(product, stockrecord)
else:
return availability.Unavailable() return availability.Unavailable()
return super(CourseSeatAvailabilityPolicyMixin, self).availability_policy(product, stockrecord)
class DefaultStrategy(strategy.UseFirstStockRecord, CourseSeatAvailabilityPolicyMixin, class DefaultStrategy(strategy.UseFirstStockRecord, CourseSeatAvailabilityPolicyMixin,
strategy.NoTax, strategy.Structured): strategy.NoTax, strategy.Structured):
...@@ -32,4 +37,4 @@ class DefaultStrategy(strategy.UseFirstStockRecord, CourseSeatAvailabilityPolicy ...@@ -32,4 +37,4 @@ class DefaultStrategy(strategy.UseFirstStockRecord, CourseSeatAvailabilityPolicy
class Selector(object): class Selector(object):
def strategy(self, request=None, user=None, **kwargs): # pylint: disable=unused-argument def strategy(self, request=None, user=None, **kwargs): # pylint: disable=unused-argument
return DefaultStrategy() return DefaultStrategy(request if hasattr(request, 'user') else None)
import datetime import datetime
import ddt
from django.test import TestCase from django.test import TestCase, RequestFactory
from oscar.apps.partner import availability from oscar.apps.partner import availability
import pytz import pytz
from ecommerce.courses.models import Course from ecommerce.courses.models import Course
from ecommerce.extensions.catalogue.tests.mixins import CourseCatalogTestMixin from ecommerce.extensions.catalogue.tests.mixins import CourseCatalogTestMixin
from ecommerce.extensions.partner.strategy import DefaultStrategy, Selector from ecommerce.extensions.partner.strategy import DefaultStrategy, Selector
from ecommerce.tests.mixins import UserMixin
class DefaultStrategyTests(CourseCatalogTestMixin, TestCase): @ddt.ddt
class DefaultStrategyTests(CourseCatalogTestMixin, UserMixin, TestCase):
def setUp(self): def setUp(self):
super(DefaultStrategyTests, self).setUp() super(DefaultStrategyTests, self).setUp()
self.strategy = DefaultStrategy() self.strategy = DefaultStrategy()
...@@ -40,6 +43,28 @@ class DefaultStrategyTests(CourseCatalogTestMixin, TestCase): ...@@ -40,6 +43,28 @@ class DefaultStrategyTests(CourseCatalogTestMixin, TestCase):
actual = self.strategy.availability_policy(product, stock_record) actual = self.strategy.availability_policy(product, stock_record)
self.assertIsInstance(actual, availability.Unavailable) self.assertIsInstance(actual, availability.Unavailable)
@ddt.unpack
@ddt.data(
(True, availability.Available),
(False, availability.Unavailable),
)
def test_expired_seats_availability_for_users(self, is_staff, available):
""" A product is unavailable for students if the current date
is beyond the product's expiration date. But for Admin products
are always available.
"""
self.assert_expired_product_availability(is_staff, available)
def assert_expired_product_availability(self, is_staff, available):
request = RequestFactory()
request.user = self.create_user(is_staff=is_staff)
strategy = DefaultStrategy(request)
product = self.honor_seat
product.expires = pytz.utc.localize(datetime.datetime.min)
stock_record = product.stockrecords.first()
actual = strategy.availability_policy(product, stock_record)
self.assertIsInstance(actual, available)
class SelectorTests(TestCase): class SelectorTests(TestCase):
def test_strategy(self): def test_strategy(self):
......
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