Skip to content

Commit

Permalink
change extra_data with atomic operations to reduce concurrent problems
Browse files Browse the repository at this point in the history
  • Loading branch information
PetrDlouhy committed Nov 22, 2024
1 parent aa3c365 commit 10ee32d
Showing 1 changed file with 20 additions and 7 deletions.
27 changes: 20 additions & 7 deletions payments_payu/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,20 @@


def add_extra_data(payment, new_extra_data):
payment.refresh_from_db()
if payment.extra_data:
old_extra_data = json.loads(payment.extra_data)
else:
old_extra_data = {}
extra_data = {**old_extra_data, **new_extra_data}
payment.extra_data = json.dumps(extra_data, indent=2)
payment.save()
payment._change_reason = 'PayU Payments: add_extra_data' # For django-simple-history
payment.save(update_fields=["extra_data"])
payment._change_reason = None


def add_new_status(payment, new_status):
payment.refresh_from_db()
if payment.extra_data:
old_extra_data = json.loads(payment.extra_data)
else:
Expand All @@ -61,7 +65,9 @@ def add_new_status(payment, new_status):
old_extra_data["statuses"] = []
old_extra_data["statuses"].append(new_status)
payment.extra_data = json.dumps(old_extra_data, indent=2)
payment.save()
payment._change_reason = 'PayU Payments: add_new_status' # For django-simple-history
payment.save(update_fields=["extra_data"])
payment._change_reason = None


def quantize_price(price, currency):
Expand Down Expand Up @@ -424,6 +430,7 @@ def create_order(self, payment, payment_processor, auto_renew=False):

try:
payment.transaction_id = response_dict["orderId"]
payment.save(update_fields=["transaction_id"])

if "payMethods" in response_dict:
payment.set_renew_token(
Expand All @@ -444,7 +451,9 @@ def create_order(self, payment, payment_processor, auto_renew=False):
if response_dict["status"]["statusCode"] == "SUCCESS":
if "redirectUri" in response_dict:
payment.pay_link = response_dict["redirectUri"]
payment.save()
payment._change_reason = 'PayU Payments: create_order -> pay_link' # For django-simple-history
payment.save(update_fields=["pay_link"])
payment._change_reason = None
return response_dict["redirectUri"]
else:
if auto_renew:
Expand Down Expand Up @@ -573,7 +582,9 @@ def process_notification(self, payment, request):
payment.change_status(PaymentStatus.REFUNDED)
else:
payment.captured_amount -= refunded_price
payment.save()
payment._change_reason = 'PayU Payments: process_notification -> refund' # For django-simple-history
payment.save(update_fields=["captured_amount, message"])
payment._change_reason = None
return HttpResponse("ok", status=200)
else:
raise Exception("Refund was not finelized", data)
Expand All @@ -594,9 +605,9 @@ def process_notification(self, payment, request):
data["order"]["totalAmount"],
data["order"]["currencyCode"],
)
type(payment).objects.filter(pk=payment.pk).update(
captured_amount=payment.captured_amount
)
payment._change_reason = 'PayU Payments: process_notification -> confirmed' # For django-simple-history
payment.save(update_fields=["captured_amount"])
payment._change_reason = None
if payment.status == PaymentStatus.CONFIRMED and payment.status != status:
logger.error(
"Suspicious status change of payment %s: %s -> %s",
Expand Down Expand Up @@ -660,7 +671,9 @@ def refund(self, payment, amount=None):
)
payment_extra_data_refund_responses.append(response)
payment.extra_data = json.dumps(payment_extra_data, indent=2)
payment._change_reason = 'PayU Payments: refund' # For django-simple-history
payment.save()
payment._change_reason = None

try:
refund = response["refund"]
Expand Down

0 comments on commit 10ee32d

Please sign in to comment.