Issue: Some fields should have unique constraint in openedx/ecommerce

transaction_id should be unique in class PaymentProcessorResponse.

transaction_id is used to find the payment response for one transaction, this id should be unique in all the payments. For example,

In ecommerce/extensions/payment/processors/cybersource.py

                if PaymentProcessorResponse.objects.filter(transaction_id=transaction_id).exists():
                    raise RedundantPaymentNotificationError

We can add unique = True to ensure the data’s integrity in the first place.

class PaymentProcessorResponse(models.Model):
    """
    Auditing model used to save all responses received
    from payment processors, which includes payments and refunds.
    """
    processor_name = models.CharField(max_length=255, verbose_name=_('Payment Processor'))
    transaction_id = models.CharField(max_length=255, verbose_name=_('Transaction ID'), null=True, blank=True)

Similarly, the coupon field should be unique in the CouponVouchers. Each coupon_product should have one CouponVouchers object, otherwise, it may cause exceptions in usage like get_or_create. We can add a unique=True for this field to ensure data integrity.

class CouponVouchers(models.Model):
    ...
    coupon = models.ForeignKey('catalogue.Product', related_name='coupon_vouchers', on_delete=models.CASCADE)
1 Like