Skip to content

Commit 8f6e3bd

Browse files
committed
[#3793] Improve factory and fix submissions without references
1 parent dcb2fff commit 8f6e3bd

File tree

3 files changed

+52
-11
lines changed

3 files changed

+52
-11
lines changed

src/openforms/payments/models.py

+14-5
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ def create_for(
4343
return payment
4444

4545
@staticmethod
46-
def create_public_order_id_for(payment: SubmissionPayment) -> str:
46+
def create_public_order_id_for(
47+
payment: SubmissionPayment, pk: int | None = None
48+
) -> str:
4749
"""Create a public order ID to be sent to the payment provider."""
4850

4951
# TODO it isn't really clear what the required format/max length is
@@ -54,10 +56,17 @@ def create_public_order_id_for(payment: SubmissionPayment) -> str:
5456
if prefix:
5557
prefix = f"{prefix}/"
5658

57-
assert payment.submission.public_registration_reference
58-
return (
59-
f"{prefix}{payment.submission.public_registration_reference}/{payment.pk}"
60-
)
59+
reference = payment.submission.public_registration_reference
60+
if not reference and config.wait_for_payment_to_register:
61+
from openforms.submissions.public_references import ( # circ. ref
62+
set_submission_reference,
63+
)
64+
65+
reference = set_submission_reference(payment.submission)
66+
67+
pk = pk if pk is not None else payment.pk
68+
69+
return f"{prefix}{payment.submission.public_registration_reference}/{pk}"
6170

6271

6372
class SubmissionPaymentQuerySet(models.QuerySet["SubmissionPayment"]):

src/openforms/payments/tests/factories.py

+24-4
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,42 @@
1+
from datetime import datetime
12
from decimal import Decimal
3+
from typing import Any
4+
from unittest.mock import patch
25

36
import factory
47

8+
from openforms.config.models import GlobalConfiguration
59
from openforms.submissions.tests.factories import SubmissionFactory
610

7-
from ..models import SubmissionPayment
11+
from ..models import SubmissionPayment, SubmissionPaymentManager
12+
13+
14+
def mocked_create_public_order_id_for(
15+
payment: SubmissionPayment, create: bool, extracted: str | None, **kwargs: Any
16+
) -> None:
17+
if extracted is not None:
18+
payment.public_order_id = extracted
19+
return
20+
21+
with patch(
22+
"openforms.payments.models.GlobalConfiguration.get_solo",
23+
return_value=GlobalConfiguration(),
24+
):
25+
pk = factory.Faker("random_int").generate() if not create else None
26+
payment.public_order_id = SubmissionPaymentManager.create_public_order_id_for(
27+
payment, pk=pk
28+
)
829

930

1031
class SubmissionPaymentFactory(factory.django.DjangoModelFactory):
32+
created = datetime.now()
1133
submission = factory.SubFactory(
1234
SubmissionFactory, with_public_registration_reference=True
1335
)
1436
plugin_id = "demo"
1537
plugin_options = {"foo": 123}
1638
amount = Decimal("10.00")
17-
public_order_id = factory.LazyAttributeSequence(
18-
lambda obj, n: f"{obj.submission.public_registration_reference}_{n}"
19-
)
39+
public_order_id = factory.PostGeneration(mocked_create_public_order_id_for)
2040

2141
class Meta:
2242
model = SubmissionPayment

src/openforms/submissions/tests/factories.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import copy
22
from datetime import timedelta
3+
from decimal import Decimal
4+
from typing import Any
35

46
from django.conf import settings
57
from django.utils import timezone
@@ -34,6 +36,16 @@
3436
from ..public_references import get_random_reference
3537

3638

39+
def _calculate_price(
40+
submission: Submission, create: bool, extracted: Decimal | None, **kwargs: Any
41+
):
42+
if extracted is not None:
43+
submission.price = extracted
44+
return
45+
46+
submission.calculate_price(save=create)
47+
48+
3749
class SubmissionFactory(factory.django.DjangoModelFactory):
3850

3951
# this repeats the default of the Charfield LazyAttribute evaluation needs;
@@ -57,7 +69,7 @@ class Params:
5769
lambda s: s.completed_on - timedelta(hours=4)
5870
),
5971
pre_registration_completed=True,
60-
price=factory.PostGenerationMethodCall("calculate_price"),
72+
price=factory.PostGeneration(_calculate_price),
6173
metadata=factory.RelatedFactory(
6274
"openforms.submissions.tests.factories.PostCompletionMetadataFactory",
6375
factory_related_name="submission",
@@ -70,7 +82,7 @@ class Params:
7082
created_on=factory.LazyAttribute(
7183
lambda s: s.completed_on - timedelta(hours=4)
7284
),
73-
price=factory.PostGenerationMethodCall("calculate_price"),
85+
price=factory.PostGeneration(_calculate_price),
7486
)
7587
suspended = factory.Trait(
7688
suspended_on=factory.Faker("date_time_this_month", tzinfo=timezone.utc),

0 commit comments

Comments
 (0)