Skip to content
Snippets Groups Projects
Verified Commit 77874724 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Move provider configuration to payment variant models

parent b5b25464
No related branches found
No related tags found
1 merge request!25Payment variants
Pipeline #105451 failed
# Generated by Django 4.1.4 on 2022-12-29 17:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("tezor", "0012_paymentvariant_no_blank_fields"),
]
operations = [
migrations.AddField(
model_name="paypalpaymentvariant",
name="endpoint",
field=models.URLField(default="https://api.paypal.com", verbose_name="Endpoint"),
),
]
...@@ -17,6 +17,9 @@ class PaymentVariant(ExtensiblePolymorphicModel): ...@@ -17,6 +17,9 @@ class PaymentVariant(ExtensiblePolymorphicModel):
def __str__(self) -> str: def __str__(self) -> str:
return self.description return self.description
def get_provider(self):
raise NotImplementedError()
@classmethod @classmethod
def get_payment_variants(cls): def get_payment_variants(cls):
all_variants = [c for c in cls.__subclasses__() if c.label] all_variants = [c for c in cls.__subclasses__() if c.label]
...@@ -44,6 +47,14 @@ class SofortPaymentVariant(PaymentVariant): ...@@ -44,6 +47,14 @@ class SofortPaymentVariant(PaymentVariant):
sofort_api_key = models.CharField(verbose_name=_("API key"), max_length=255) sofort_api_key = models.CharField(verbose_name=_("API key"), max_length=255)
sofort_project_id = models.CharField(verbose_name=_("Project ID"), max_length=255) sofort_project_id = models.CharField(verbose_name=_("Project ID"), max_length=255)
def get_provider(self):
from payments.sofort import SofortProvider # noqa
provider = SofortProvider(
key=self.sofort_api_key, id=self.sofort_api_id, project_id=self.sofort_project_id
)
return provider
class Meta: class Meta:
verbose_name = _("Sofort/Klarna payment variant") verbose_name = _("Sofort/Klarna payment variant")
verbose_name_plural = _("Sofort/Klarna payment variants") verbose_name_plural = _("Sofort/Klarna payment variants")
...@@ -59,6 +70,18 @@ class PaypalPaymentVariant(PaymentVariant): ...@@ -59,6 +70,18 @@ class PaypalPaymentVariant(PaymentVariant):
paypal_capture = models.BooleanField( paypal_capture = models.BooleanField(
verbose_name=_("Use PayPal Authorize & Capture"), default=False verbose_name=_("Use PayPal Authorize & Capture"), default=False
) )
endpoint = models.URLField(verbose_name=_("Endpoint"), default="https://api.paypal.com")
def get_provider(self):
from payments.paypal import PaypalProvider # noqa
provider = PaypalProvider(
client_id=self.paypal_client_id,
secret=self.paypal_secret,
capture=self.paypal_capture,
endpoint=self.endpoint,
)
return provider
class Meta: class Meta:
verbose_name = _("PayPal payment variant") verbose_name = _("PayPal payment variant")
...@@ -79,6 +102,17 @@ class SEPADirectDebitPaymentVariant(PaymentVariant): ...@@ -79,6 +102,17 @@ class SEPADirectDebitPaymentVariant(PaymentVariant):
sdd_iban = IBANField(verbose_name=_("IBAN of bank account")) sdd_iban = IBANField(verbose_name=_("IBAN of bank account"))
sdd_bic = BICField(verbose_name=_("BIC/SWIFT code of bank")) sdd_bic = BICField(verbose_name=_("BIC/SWIFT code of bank"))
def get_provider(self):
from djp_sepa.providers import DirectDebitProvider # noqa
provider = DirectDebitProvider(
creditor=self.sdd_creditor,
creditor_identifier=self.sdd_creditor_identifier,
iban=self.sdd_iban,
bic=self.sdd_bic,
)
return provider
class Meta: class Meta:
verbose_name = _("SEPA Direct Debit payment variant") verbose_name = _("SEPA Direct Debit payment variant")
verbose_name_plural = _("SEPA Direct Debit payment variants") verbose_name_plural = _("SEPA Direct Debit payment variants")
...@@ -89,6 +123,12 @@ class PledgePaymentVariant(PaymentVariant): ...@@ -89,6 +123,12 @@ class PledgePaymentVariant(PaymentVariant):
name = _("Payment pledge/Manual payment") name = _("Payment pledge/Manual payment")
label = "pledge" label = "pledge"
def get_provider(self):
from djp_sepa.providers import PaymentPledgeProvider # noqa
provider = PaymentPledgeProvider()
return provider
class Meta: class Meta:
verbose_name = _("Pledge payment variant") verbose_name = _("Pledge payment variant")
verbose_name_plural = _("Pledge payment variants") verbose_name_plural = _("Pledge payment variants")
......
...@@ -96,6 +96,10 @@ class Invoice(BasePayment, PureDjangoModel): ...@@ -96,6 +96,10 @@ class Invoice(BasePayment, PureDjangoModel):
super().save(*args, **kwargs) super().save(*args, **kwargs)
def get_variant(self):
variants = [v for v in self.group.client.payment_variants.all() if v.label == self.variant]
return variants[0] if variants else None
def get_variant_name(self): def get_variant_name(self):
return PaymentVariant.get_payment_variants_as_dict()[self.variant].name return PaymentVariant.get_payment_variants_as_dict()[self.variant].name
......
...@@ -2,52 +2,16 @@ _provider_cache = {} ...@@ -2,52 +2,16 @@ _provider_cache = {}
def provider_factory(variant, payment=None): def provider_factory(variant, payment=None):
from djp_sepa.providers import DirectDebitProvider, PaymentPledgeProvider # noqa
from payments.paypal import PaypalProvider # noqa
from payments.sofort import SofortProvider # noqa
if not payment: if not payment:
raise KeyError("Could not configure payment provider without a payment.") raise KeyError("Could not configure payment provider without a payment.")
if not payment.group:
raise KeyError(
"Could not configure payment provider for a payment without an invoice group."
)
if not payment.group.client:
raise KeyError(
"Could not configure payment provider for an invoice group without a client."
)
cache_key = (variant, payment.group.client.pk) cache_key = (variant, payment.group.client.pk)
if cache_key in _provider_cache: if cache_key in _provider_cache:
return _provider_cache[cache_key] return _provider_cache[cache_key]
client = payment.group.client variant = payment.get_variant()
provider = None provider = variant.get_provider() if variant else None
if variant == "sofort" and client.sofort_enabled:
provider = SofortProvider(
key=client.sofort_api_key, id=client.sofort_api_id, project_id=client.sofort_project_id
)
if variant == "paypal" and client.paypal_enabled:
provider = PaypalProvider(
client_id=client.paypal_client_id,
secret=client.paypal_secret,
capture=client.paypal_capture,
endpoint="https://api.paypal.com",
)
if variant == "pledge" and client.pledge_enabled:
provider = PaymentPledgeProvider()
if variant == "sdd" and client.sdd_enabled:
provider = DirectDebitProvider(
creditor=client.sdd_creditor,
creditor_identifier=client.sdd_creditor_identifier,
iban=client.sdd_iban,
bic=client.sdd_bic,
)
if provider is None: if provider is None:
raise KeyError("Provider not found or not configured for client.") raise KeyError("Provider not found or not configured for client.")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment