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:
Zainab Amir
2020-02-03 13:21:44 +05:00
committed by GitHub
parent 29b9b7b0b2
commit 4b458099cf
3 changed files with 86 additions and 1 deletions

View File

@@ -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,

View File

@@ -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')]),
),
]

View File

@@ -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):
"""