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`.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-10-21 12:33:17 +03:00
parent a87cb31d7e
commit 5384fa494d
5 changed files with 22 additions and 23 deletions

View file

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

View file

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("core", "0047_alter_attribute_unique_together"),
]

View file

@ -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={

View file

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

View file

@ -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)}