From 5384fa494d5f71bc0210a1d8c4afbbe85d29474e Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Tue, 21 Oct 2025 12:33:17 +0300 Subject: [PATCH] Features: 1) Add `get_integration_class_object` method to `Transaction` for dynamic gateway class instantiation; Fixes: 1) Validate gateway presence in `process_transaction_changes` signal; 2) Add missing imports for `Type`, `create_object`, and `AbstractGateway`; Extra: 1) Cleanup unused diff lines in migrations files; 2) Improve JSONField, FloatField, and PositiveIntegerField declarations by consolidating into single lines; 3) Remove redundant match-case logic in `signals.py`. --- blog/migrations/0007_post_is_static_page.py | 1 - ...egration_path_alter_productimage_priority.py | 1 - .../0005_gateway_transaction_gateway.py | 17 ++++------------- payments/models.py | 15 +++++++++++++++ payments/signals.py | 11 +++-------- 5 files changed, 22 insertions(+), 23 deletions(-) diff --git a/blog/migrations/0007_post_is_static_page.py b/blog/migrations/0007_post_is_static_page.py index 2f3a971e..051728de 100644 --- a/blog/migrations/0007_post_is_static_page.py +++ b/blog/migrations/0007_post_is_static_page.py @@ -4,7 +4,6 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ ("blog", "0006_post_meta_description_post_meta_description_ar_ar_and_more"), ] diff --git a/core/migrations/0048_vendor_integration_path_alter_productimage_priority.py b/core/migrations/0048_vendor_integration_path_alter_productimage_priority.py index 4b7d4719..220042f4 100644 --- a/core/migrations/0048_vendor_integration_path_alter_productimage_priority.py +++ b/core/migrations/0048_vendor_integration_path_alter_productimage_priority.py @@ -4,7 +4,6 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ ("core", "0047_alter_attribute_unique_together"), ] diff --git a/payments/migrations/0005_gateway_transaction_gateway.py b/payments/migrations/0005_gateway_transaction_gateway.py index 59d38dac..506c5f6b 100644 --- a/payments/migrations/0005_gateway_transaction_gateway.py +++ b/payments/migrations/0005_gateway_transaction_gateway.py @@ -7,7 +7,6 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ ("payments", "0004_alter_transaction_payment_method"), ] @@ -98,15 +97,11 @@ class Migration(migrations.Migration): ), ( "minimum_transaction_amount", - models.FloatField( - default=0, verbose_name="minimum transaction amount" - ), + models.FloatField(default=0, verbose_name="minimum transaction amount"), ), ( "maximum_transaction_amount", - models.FloatField( - default=0, verbose_name="maximum transaction amount" - ), + models.FloatField(default=0, verbose_name="maximum transaction amount"), ), ( "daily_limit", @@ -126,15 +121,11 @@ class Migration(migrations.Migration): ), ( "priority", - models.PositiveIntegerField( - default=10, unique=True, verbose_name="priority" - ), + models.PositiveIntegerField(default=10, unique=True, verbose_name="priority"), ), ( "integration_variables", - models.JSONField( - default=dict, verbose_name="integration variables" - ), + models.JSONField(default=dict, verbose_name="integration variables"), ), ], options={ diff --git a/payments/models.py b/payments/models.py index a779ea0a..78fc9c68 100644 --- a/payments/models.py +++ b/payments/models.py @@ -1,3 +1,5 @@ +from typing import Type + from constance import config from django.conf import settings from django.contrib.postgres.indexes import GinIndex @@ -16,6 +18,8 @@ from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from core.abstract import NiceModel +from evibes.utils.misc import create_object +from payments.gateways import AbstractGateway class Transaction(NiceModel): @@ -147,3 +151,14 @@ class Gateway(NiceModel): monthly_ok = self.monthly_limit == 0 or monthly_sum < self.monthly_limit return daily_ok and monthly_ok + + def get_integration_class_object(self, raise_exc: bool = True) -> Type[AbstractGateway] | None: + if not self.integration_path: + if raise_exc: + raise ValueError(_("gateway integration path is not set")) + return None + try: + module_name, class_name = self.integration_path.rsplit(".", 1) + except ValueError as exc: + raise ValueError(_("invalid integration path: %(path)s") % {"path": self.integration_path}) from exc + return create_object(module_name, class_name) diff --git a/payments/signals.py b/payments/signals.py index dfaae48a..43fc689d 100644 --- a/payments/signals.py +++ b/payments/signals.py @@ -24,15 +24,10 @@ def create_balance_on_user_creation_signal(instance: User, created: bool, **kwar @receiver(post_save, sender=Transaction) def process_transaction_changes(instance: Transaction, created: bool, **kwargs: dict[Any, Any]) -> None: if created: + if not instance.gateway: + raise ValueError("gateway is required to process a transaction") try: - gateway = None - match instance.process.get("gateway", "default"): - case "gateway": - gateway = AbstractGateway() - case "default": - gateway = AbstractGateway() - case _: - gateway = AbstractGateway() + gateway = instance.gateway.get_integration_class_object() gateway.process_transaction(instance) except Exception as e: instance.process = {"status": "ERRORED", "error": str(e)}