Add unique_together to CourseEntitlement (#22948)
Add unique_together on course_uuid and order_number to avoid duplicate records PROD-1064
This commit is contained in:
@@ -141,6 +141,59 @@ class EntitlementViewSetTest(ModuleStoreTestCase):
|
||||
)
|
||||
assert results == CourseEntitlementSerializer(course_entitlement).data
|
||||
|
||||
def test_add_duplicate_entitlement(self):
|
||||
"""
|
||||
Request with identical course_uuid and order_number should not create duplicate
|
||||
entitlement
|
||||
"""
|
||||
course_uuid = uuid.uuid4()
|
||||
entitlement_data = self._get_data_set(self.user, str(course_uuid))
|
||||
|
||||
response = self.client.post(
|
||||
self.entitlements_list_url,
|
||||
data=json.dumps(entitlement_data),
|
||||
content_type='application/json',
|
||||
)
|
||||
assert response.status_code == 201
|
||||
response = self.client.post(
|
||||
self.entitlements_list_url,
|
||||
data=json.dumps(entitlement_data),
|
||||
content_type='application/json',
|
||||
)
|
||||
assert response.status_code == 400
|
||||
course_entitlement = CourseEntitlement.objects.filter(
|
||||
course_uuid=course_uuid,
|
||||
order_number=entitlement_data['order_number']
|
||||
)
|
||||
assert course_entitlement.count() == 1
|
||||
|
||||
def test_order_number_null(self):
|
||||
"""
|
||||
Test that for same course_uuid order_number set to null is treated as unique
|
||||
entitlement
|
||||
"""
|
||||
course_uuid = uuid.uuid4()
|
||||
entitlement_data = self._get_data_set(self.user, str(course_uuid))
|
||||
entitlement_data['order_number'] = None
|
||||
|
||||
response = self.client.post(
|
||||
self.entitlements_list_url,
|
||||
data=json.dumps(entitlement_data),
|
||||
content_type='application/json',
|
||||
)
|
||||
assert response.status_code == 201
|
||||
response = self.client.post(
|
||||
self.entitlements_list_url,
|
||||
data=json.dumps(entitlement_data),
|
||||
content_type='application/json',
|
||||
)
|
||||
assert response.status_code == 201
|
||||
course_entitlement = CourseEntitlement.objects.filter(
|
||||
course_uuid=course_uuid,
|
||||
order_number=entitlement_data['order_number']
|
||||
)
|
||||
assert course_entitlement.count() == 2
|
||||
|
||||
def test_default_no_policy_entry(self):
|
||||
"""
|
||||
Verify that, when there are no entries in the course entitlement policy table,
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.27 on 2020-01-29 10:33
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('entitlements', '0014_auto_20200115_2022'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='courseentitlement',
|
||||
name='order_number',
|
||||
field=models.CharField(default=None, max_length=128, null=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='historicalcourseentitlement',
|
||||
name='order_number',
|
||||
field=models.CharField(default=None, max_length=128, null=True),
|
||||
),
|
||||
migrations.AlterUniqueTogether(
|
||||
name='courseentitlement',
|
||||
unique_together=set([('course_uuid', 'order_number')]),
|
||||
),
|
||||
]
|
||||
@@ -171,12 +171,15 @@ class CourseEntitlement(TimeStampedModel):
|
||||
blank=True,
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
order_number = models.CharField(max_length=128, null=True, blank=True)
|
||||
order_number = models.CharField(max_length=128, default=None, null=True)
|
||||
refund_locked = models.BooleanField(default=False)
|
||||
_policy = models.ForeignKey(CourseEntitlementPolicy, null=True, blank=True, on_delete=models.CASCADE)
|
||||
|
||||
history = HistoricalRecords()
|
||||
|
||||
class Meta:
|
||||
unique_together = ('course_uuid', 'order_number')
|
||||
|
||||
@property
|
||||
def expired_at_datetime(self):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user