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):
return None
def _get_info(self, product):
info = Selector().strategy().fetch_for_product(product)
return info
return Selector().strategy(
request=self.context.get('request')
).fetch_for_product(product)
def get_is_available_to_buy(self, product):
info = self._get_info(product)
......
......@@ -18,12 +18,17 @@ class CourseSeatAvailabilityPolicyMixin(strategy.StockRequired):
return ProductClass.objects.get(slug='seat')
def availability_policy(self, product, stockrecord):
""" A seat is unavailable if the current date is beyond the seat's expiration date. """
if product.expires and timezone.now() > product.expires:
""" A product is unavailable for non-admin users if the current date is
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 super(CourseSeatAvailabilityPolicyMixin, self).availability_policy(product, stockrecord)
class DefaultStrategy(strategy.UseFirstStockRecord, CourseSeatAvailabilityPolicyMixin,
strategy.NoTax, strategy.Structured):
......@@ -32,4 +37,4 @@ class DefaultStrategy(strategy.UseFirstStockRecord, CourseSeatAvailabilityPolicy
class Selector(object):
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 ddt
from django.test import TestCase
from django.test import TestCase, RequestFactory
from oscar.apps.partner import availability
import pytz
from ecommerce.courses.models import Course
from ecommerce.extensions.catalogue.tests.mixins import CourseCatalogTestMixin
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):
super(DefaultStrategyTests, self).setUp()
self.strategy = DefaultStrategy()
......@@ -40,6 +43,28 @@ class DefaultStrategyTests(CourseCatalogTestMixin, TestCase):
actual = self.strategy.availability_policy(product, stock_record)
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):
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