Skip to content

Commit

Permalink
💩 [#4764] Prevent log record spam when viewing a submission in the admin
Browse files Browse the repository at this point in the history
  • Loading branch information
sergei-maertens committed Oct 18, 2024
1 parent 9bd2738 commit 10404b2
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/openforms/submissions/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
SubmissionValueVariable,
TemporaryFileUpload,
)
from .pricing import InvalidPrice
from .tasks import on_post_submission_event


Expand Down Expand Up @@ -381,7 +382,14 @@ def get_price(self, obj):

@admin.display(description=_("Payment required"), boolean=True)
def get_payment_required(self, obj):
return obj.payment_required
obj._in_admin_display = True
try:
return obj.payment_required
# InvalidPrice means that pricing/payment was set up and configured, but a
# semi-expected crash happened when trying to calculate the price because of
# mis-configuration.
except InvalidPrice:
return True

def change_view(self, request, object_id, form_url="", extra_context=None):
submission = self.get_object(request, object_id)
Expand Down
4 changes: 4 additions & 0 deletions src/openforms/submissions/pricing.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ def get_submission_price(submission: Submission) -> Decimal:
try:
price = _price_from_variable(submission)
except InvalidPrice as exc:
# Dirty, dirty hack - don't create new log records when viewing this in the
# admin.
if getattr(submission, "_in_admin_display", False): # pragma: no cover
raise
logevent.price_calculation_variable_error(
submission=submission,
variable=exc.variable,
Expand Down
28 changes: 28 additions & 0 deletions src/openforms/submissions/tests/test_admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from decimal import Decimal
from unittest.mock import patch

from django.contrib.admin import AdminSite
Expand All @@ -11,9 +12,11 @@
from maykin_2fa.test import disable_admin_mfa

from openforms.accounts.tests.factories import UserFactory
from openforms.forms.tests.factories import FormVariableFactory
from openforms.logging.logevent import submission_start
from openforms.logging.models import TimelineLogProxy
from openforms.submissions.models.submission import Submission
from openforms.variables.constants import FormVariableDataTypes

from ...config.models import GlobalConfiguration
from ..admin import SubmissionAdmin, SubmissionTimeListFilter
Expand Down Expand Up @@ -220,6 +223,31 @@ def test_change_view(self):
)
self.app.get(change_url, user=self.user, status=404)

def test_change_view_with_broken_price_variable_config(self):
submission = SubmissionFactory.create(
completed=True,
form__generate_minimal_setup=False,
form__product__price=Decimal("123.45"),
form__payment_backend="demo",
form__price_variable_key="",
)
FormVariableFactory.create(
user_defined=True,
key="calculatedPrice",
form=submission.form,
data_type=FormVariableDataTypes.string,
initial_value="bwoken",
)
submission.form.price_variable_key = "calculatedPrice"
submission.form.save()
change_url = reverse(
"admin:submissions_submission_change", kwargs={"object_id": submission.pk}
)

change_page = self.app.get(change_url, user=self.user)

self.assertEqual(change_page.status_code, 200)


class TestSubmissionTimeListFilterAdmin(TestCase):
def test_time_filtering(self):
Expand Down

0 comments on commit 10404b2

Please sign in to comment.