Skip to content
This repository has been archived by the owner on Nov 4, 2024. It is now read-only.

Django Oscar Upgrade to version 3.1 #4050

Merged
merged 15 commits into from
Jan 16, 2024
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,6 @@ def django_db_setup(django_db_setup, django_db_blocker, django_db_use_migrations
Option.objects.get_or_create(
name='Course Entitlement',
code='course_entitlement',
type=Option.OPTIONAL,
)

coupon, _ = ProductClass.objects.get_or_create(
Expand Down
4 changes: 2 additions & 2 deletions ecommerce/core/management/commands/tests/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
from oscar.core.loading import get_model


class PaymentEventFactory(factory.DjangoModelFactory):
class PaymentEventFactory(factory.django.DjangoModelFactory):
id = FuzzyInteger(1000, 999999)

class Meta:
model = get_model('order', 'PaymentEvent')


class SuperUserFactory(factory.DjangoModelFactory):
class SuperUserFactory(factory.django.DjangoModelFactory):
id = FuzzyInteger(1000, 999999)
is_superuser = True
lms_user_id = 56765
Expand Down
4 changes: 2 additions & 2 deletions ecommerce/core/tests/test_create_demo_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ def assert_seats_created(self, course_id, course_title, price):
audit_seat = seats[1]
self.assertFalse(hasattr(audit_seat.attr, 'certificate_type'))
self.assertFalse(audit_seat.attr.id_verification_required)
self.assertEqual(audit_seat.stockrecords.get(partner=self.partner).price_excl_tax, 0)
self.assertEqual(audit_seat.stockrecords.get(partner=self.partner).price, 0)

verified_seat = seats[0]
self.assertEqual(verified_seat.attr.certificate_type, 'verified')
self.assertTrue(verified_seat.attr.id_verification_required)
self.assertEqual(verified_seat.stockrecords.get(partner=self.partner).price_excl_tax, price)
self.assertEqual(verified_seat.stockrecords.get(partner=self.partner).price, price)

@responses.activate
def test_handle(self):
Expand Down
2 changes: 1 addition & 1 deletion ecommerce/core/tests/test_generate_courses.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,5 +192,5 @@ def test_create_seat(self, seat_type, mock_logger):
course = Course.objects.get(id='course-v1:test-course-generator+1+1')
seats = course.seat_products
seat = seats[0]
self.assertEqual(seat.stockrecords.get(partner=self.partner).price_excl_tax, price)
self.assertEqual(seat.stockrecords.get(partner=self.partner).price, price)
mock_logger.info.assert_any_call("%s has been set to %s", seat_type, True)
2 changes: 1 addition & 1 deletion ecommerce/coupons/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def test_is_voucher_applied(self):
"""
Verify is_voucher_applied return correct value.
"""
product = ProductFactory(stockrecords__price_excl_tax=100)
product = ProductFactory(stockrecords__price=100)
voucher, product = prepare_voucher(
_range=RangeFactory(products=[product]),
benefit_value=10
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ def get_course_info(course):
if len(seats) == 1:
seat = seats[0]
seat_type = getattr(seat.attr, 'certificate_type', '').lower()
price = seat.stockrecords.all()[0].price_excl_tax
price = seat.stockrecords.all()[0].price
id_verification_required = getattr(seat.attr, 'id_verification_required', False)

return seat_type, price, id_verification_required
Expand Down
4 changes: 2 additions & 2 deletions ecommerce/courses/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ def create_or_update_seat(
course_id
)

stock_record.price_excl_tax = price
stock_record.price = price
stock_record.price_currency = settings.OSCAR_DEFAULT_CURRENCY
stock_record.save()

Expand Down Expand Up @@ -325,7 +325,7 @@ def _create_or_update_enrollment_code(self, seat_type, id_verification_required,
partner_sku=enrollment_code_sku
)

stock_record.price_excl_tax = price
stock_record.price = price
stock_record.price_currency = settings.OSCAR_DEFAULT_CURRENCY
stock_record.save()

Expand Down
2 changes: 1 addition & 1 deletion ecommerce/courses/publishers.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def serialize_seat_for_commerce_api(self, seat):
return {
'name': mode_for_product(seat),
'currency': stock_record.price_currency,
'price': int(stock_record.price_excl_tax),
'price': int(stock_record.price),
'sku': stock_record.partner_sku,
'bulk_sku': bulk_sku,
'expires': self.get_seat_expiration(seat),
Expand Down
2 changes: 1 addition & 1 deletion ecommerce/courses/tests/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from ecommerce.courses.models import Course


class CourseFactory(factory.DjangoModelFactory):
class CourseFactory(factory.django.DjangoModelFactory):
class Meta:
model = Course

Expand Down
4 changes: 2 additions & 2 deletions ecommerce/courses/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ def assert_course_seat_valid(self, seat, course, certificate_type, id_verificati
self.assertEqual(getattr(seat.attr, 'certificate_type', ''), certificate_type)
self.assertEqual(seat.attr.course_key, course.id)
self.assertEqual(seat.attr.id_verification_required, id_verification_required)
self.assertEqual(seat.stockrecords.first().price_excl_tax, price)
self.assertEqual(seat.stockrecords.first().price, price)

if credit_provider:
self.assertEqual(seat.attr.credit_provider, credit_provider)
Expand Down Expand Up @@ -157,7 +157,7 @@ def test_create_seat_with_enrollment_code(self):
self.assertIsNone(enrollment_code.expires)

stock_record = StockRecord.objects.get(product=enrollment_code)
self.assertEqual(stock_record.price_excl_tax, price)
self.assertEqual(stock_record.price, price)
self.assertEqual(stock_record.price_currency, settings.OSCAR_DEFAULT_CURRENCY)
self.assertEqual(stock_record.partner, self.partner)

Expand Down
10 changes: 5 additions & 5 deletions ecommerce/courses/tests/test_publishers.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ def _create_mobile_seat_for_course(self, course, sku_prefix):
product=mobile_seat,
partner_sku="mobile.{}.{}".format(sku_prefix.lower(), web_stock_record.partner_sku.lower()),
price_currency=web_stock_record.price_currency,
price_excl_tax=web_stock_record.price_excl_tax,
price=web_stock_record.price,
)
return mobile_seat

Expand Down Expand Up @@ -164,7 +164,7 @@ def test_serialize_seat_for_commerce_api(self):
expected = {
'name': 'verified',
'currency': 'USD',
'price': int(stock_record.price_excl_tax),
'price': int(stock_record.price),
'sku': stock_record.partner_sku,
'bulk_sku': None,
'expires': None,
Expand Down Expand Up @@ -195,7 +195,7 @@ def test_serialize_seat_for_commerce_api_with_mobile_skus(self):
expected = {
'name': 'verified',
'currency': 'USD',
'price': int(stock_record.price_excl_tax),
'price': int(stock_record.price),
'sku': stock_record.partner_sku,
'bulk_sku': None,
'expires': None,
Expand Down Expand Up @@ -229,7 +229,7 @@ def test_serialize_seat_for_commerce_api_with_professional(self, is_verified, ex
expected = {
'name': expected_mode,
'currency': 'USD',
'price': int(stock_record.price_excl_tax),
'price': int(stock_record.price),
'sku': stock_record.partner_sku,
'bulk_sku': None,
'expires': None,
Expand All @@ -247,7 +247,7 @@ def test_serialize_seat_with_enrollment_code(self):
expected = {
'name': 'verified',
'currency': 'USD',
'price': int(stock_record.price_excl_tax),
'price': int(stock_record.price),
'sku': stock_record.partner_sku,
'bulk_sku': ec_stock_record.partner_sku,
'expires': None,
Expand Down
6 changes: 3 additions & 3 deletions ecommerce/credit/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,12 +154,12 @@ def _get_providers_detail(self, credit_seats):
if code:
discount = format_benefit_value(voucher.benefit)
if discount_type == 'Percentage':
new_price = stockrecord.price_excl_tax - (stockrecord.price_excl_tax * (discount_value / 100))
new_price = stockrecord.price - (stockrecord.price * (discount_value / 100))
else:
new_price = stockrecord.price_excl_tax - discount_value
new_price = stockrecord.price - discount_value
new_price = '{0:.2f}'.format(new_price)
providers_dict[seat.attr.credit_provider].update({
'price': stockrecord.price_excl_tax,
'price': stockrecord.price,
'sku': stockrecord.partner_sku,
'credit_hours': seat.attr.credit_hours,
'discount': discount,
Expand Down
2 changes: 1 addition & 1 deletion ecommerce/enterprise/conditions.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def is_offer_max_discount_available(basket, offer):

def _get_basket_discount_value(basket, offer):
"""Calculate the discount value based on benefit type and value"""
sum_basket_lines = basket.all_lines().aggregate(total=Sum('stockrecord__price_excl_tax'))['total'] or Decimal(0.0)
sum_basket_lines = basket.all_lines().aggregate(total=Sum('stockrecord__price'))['total'] or Decimal(0.0)
# calculate discount value that will be covered by the offer
benefit_type = get_benefit_type(offer.benefit)
benefit_value = offer.benefit.value
Expand Down
4 changes: 2 additions & 2 deletions ecommerce/enterprise/tests/test_conditions.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def setUp(self):
self.user = UserFactory()
self.condition = factories.EnterpriseCustomerConditionFactory()

self.test_product = ProductFactory(stockrecords__price_excl_tax=10, categories=[])
self.test_product = ProductFactory(stockrecords__price=10, categories=[])
self.course_run_1 = CourseFactory(partner=self.partner)
self.course_run_1.create_or_update_seat('verified', True, Decimal(100))

Expand Down Expand Up @@ -227,7 +227,7 @@ def test_is_satisfied_free_basket(self):
offer = factories.EnterpriseOfferFactory(partner=self.partner, condition=self.condition)
basket = BasketFactory(site=self.site, owner=self.user)
test_product = factories.ProductFactory(
stockrecords__price_excl_tax=0,
stockrecords__price=0,
stockrecords__partner__short_code='test'
)
basket.add_product(test_product)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ def setUp(self):

for i in range(2):
code = '{}EntUserPercentBenefit'.format(i)
voucher = VoucherFactory(code=code)
name = 'Test_1 voucher{}'.format(i)
voucher = VoucherFactory(code=code, name=name)
offer_name = "Coupon [{}]-{}-{}".format(
voucher.pk,
benefit_percent.type,
Expand All @@ -69,7 +70,8 @@ def setUp(self):

for i in range(2):
code = '{}EntUserAbsoluteBenefit'.format(i)
voucher = VoucherFactory(code=code)
name = 'Test_2 voucher{}'.format(i)
voucher = VoucherFactory(code=code, name=name)
offer_name = "Coupon [{}]-{}-{}".format(
voucher.pk,
benefit_absolute.type,
Expand All @@ -93,7 +95,8 @@ def setUp(self):

for i in range(3):
code = '{}NoEntUserPercentBenefit'.format(i)
voucher = VoucherFactory(code=code)
name = 'Test_3 voucher{}'.format(i)
voucher = VoucherFactory(code=code, name=name)
offer_name = "Coupon [{}]-{}-{}".format(
voucher.pk,
benefit.type,
Expand Down
8 changes: 4 additions & 4 deletions ecommerce/entitlements/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def test_course_entitlement_creation(self):
self.assertEqual(product.attr.UUID, 'foo-bar')

stock_record = StockRecord.objects.get(product=product, partner=self.partner)
self.assertEqual(stock_record.price_excl_tax, 100)
self.assertEqual(stock_record.price, 100)

def test_course_entitlement_update(self):
""" Test course entitlement product update """
Expand All @@ -29,16 +29,16 @@ def test_course_entitlement_update(self):
assert product.attr.variant_id == original_variant_id
stock_record = StockRecord.objects.get(product=product, partner=self.partner)

self.assertEqual(stock_record.price_excl_tax, 100)
self.assertEqual(stock_record.price, 100)
self.assertEqual(product.title, 'Course Foo Bar Entitlement')

new_variant_id = '11111111-1111-1111-1111-11111111'
product = create_or_update_course_entitlement(
'verified', 200, self.partner, 'foo-bar', 'Foo Bar Entitlement', variant_id=new_variant_id)

stock_record = StockRecord.objects.get(product=product, partner=self.partner)
self.assertEqual(stock_record.price_excl_tax, 200)
self.assertEqual(stock_record.price_excl_tax, 200)
self.assertEqual(stock_record.price, 200)
self.assertEqual(stock_record.price, 200)

product.refresh_from_db()
assert product.attr.variant_id == new_variant_id
5 changes: 3 additions & 2 deletions ecommerce/entitlements/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,12 @@ def create_or_update_course_entitlement(
course_entitlement.structure = Product.CHILD
course_entitlement.is_discountable = True
course_entitlement.title = 'Course {}'.format(title)
course_entitlement.parent = parent_entitlement
course_entitlement.attr.certificate_type = certificate_type
course_entitlement.attr.UUID = UUID
course_entitlement.attr.id_verification_required = id_verification_required
course_entitlement.attr.credit_provider = credit_provider
course_entitlement.parent = parent_entitlement

if variant_id:
course_entitlement.attr.variant_id = variant_id
if has_existing_course_entitlement:
Expand All @@ -94,7 +95,7 @@ def create_or_update_course_entitlement(
'product': course_entitlement,
'partner': partner,
'partner_sku': generate_sku(course_entitlement, partner),
'price_excl_tax': price,
'price': price,
'price_currency': settings.OSCAR_DEFAULT_CURRENCY,
}
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 3.2.20 on 2023-11-08 13:55

from django.db import migrations

Check warning on line 3 in ecommerce/extensions/analytics/migrations/0003_auto_20231108_1355.py

View check run for this annotation

Codecov / codecov/patch

ecommerce/extensions/analytics/migrations/0003_auto_20231108_1355.py#L3

Added line #L3 was not covered by tests


class Migration(migrations.Migration):

Check warning on line 6 in ecommerce/extensions/analytics/migrations/0003_auto_20231108_1355.py

View check run for this annotation

Codecov / codecov/patch

ecommerce/extensions/analytics/migrations/0003_auto_20231108_1355.py#L6

Added line #L6 was not covered by tests

dependencies = [

Check warning on line 8 in ecommerce/extensions/analytics/migrations/0003_auto_20231108_1355.py

View check run for this annotation

Codecov / codecov/patch

ecommerce/extensions/analytics/migrations/0003_auto_20231108_1355.py#L8

Added line #L8 was not covered by tests
('analytics', '0002_auto_20140827_1705'),
]

operations = [

Check warning on line 12 in ecommerce/extensions/analytics/migrations/0003_auto_20231108_1355.py

View check run for this annotation

Codecov / codecov/patch

ecommerce/extensions/analytics/migrations/0003_auto_20231108_1355.py#L12

Added line #L12 was not covered by tests
migrations.AlterModelOptions(
name='userproductview',
options={'ordering': ['-pk'], 'verbose_name': 'User product view', 'verbose_name_plural': 'User product views'},
),
migrations.AlterModelOptions(
name='usersearch',
options={'ordering': ['-pk'], 'verbose_name': 'User search query', 'verbose_name_plural': 'User search queries'},
),
]
6 changes: 3 additions & 3 deletions ecommerce/extensions/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,18 +327,18 @@ class StockRecordSerializer(serializers.ModelSerializer):

class Meta:
model = StockRecord
fields = ('id', 'product', 'partner', 'partner_sku', 'price_currency', 'price_excl_tax',)
fields = ('id', 'product', 'partner', 'partner_sku', 'price_currency', 'price',)


class PartialStockRecordSerializerForUpdate(StockRecordSerializer):
""" Stock record objects serializer for PUT requests.
Allowed fields to update are 'price_currency' and 'price_excl_tax'.
Allowed fields to update are 'price_currency' and 'price'.
"""

class Meta:
model = StockRecord
fields = ('price_currency', 'price_excl_tax',)
fields = ('price_currency', 'price',)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It will break mobile apps

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes discussed with mobile team

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will also break financial reporting; where is it being tested and when is this scheduled to be moved to production?



class ProductSerializer(ProductPaymentInfoMixin, serializers.HyperlinkedModelSerializer):
Expand Down
2 changes: 1 addition & 1 deletion ecommerce/extensions/api/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def format_seat(seat):
result = seat_template.format(
course.name,
stock_record.partner_sku,
stock_record.price_excl_tax,
stock_record.price,
)
return result

Expand Down
2 changes: 1 addition & 1 deletion ecommerce/extensions/api/v2/tests/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,5 +87,5 @@ def serialize_stockrecord(self, stockrecord):
'product': stockrecord.product.id,
'partner_sku': stockrecord.partner_sku,
'price_currency': stockrecord.price_currency,
'price_excl_tax': str(stockrecord.price_excl_tax),
'price': str(stockrecord.price),
}
Loading
Loading