From 16eccea851b03898e4d951a34006c9042df457ed Mon Sep 17 00:00:00 2001 From: Klaas van Schelven Date: Tue, 23 Sep 2025 10:14:28 +0200 Subject: [PATCH] Fix null constraint failure when remote_addr is None and user is '{{auto}}' Fix #229 --- tags/models.py | 7 ++++++- tags/tests.py | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/tags/models.py b/tags/models.py index e850885..863661d 100644 --- a/tags/models.py +++ b/tags/models.py @@ -167,7 +167,12 @@ def digest_tags(event_data, event, issue): for key in "user.ip_address", "user": if tags.get(key) == "{{auto}}": - tags[key] = event.remote_addr + if event.remote_addr is None: + # removing the tag if we don't have the info seems the most faithful to the semantics, i.e. if we don't + # have the information it shouldn't appear in tags. + del tags[key] + else: + tags[key] = event.remote_addr store_tags(event, issue, tags) diff --git a/tags/tests.py b/tags/tests.py index 6c04d92..ef9d926 100644 --- a/tags/tests.py +++ b/tags/tests.py @@ -157,8 +157,27 @@ class DigestTagsTestCase(DjangoTestCase): event.save() digest_tags(event_data, event, issue) + # twice because "user" and "user.ip_address" self.assertEqual(["123.123.123.123", "123.123.123.123"], [e.value.value for e in event.get_tags]) + def test_auto_ip_address_when_not_available(self): + # could be non-available because of proxy misconfig or other reasons, in any case it should not break anything: + # Event.remote_addr is nullable so downstream code should be able to handle None + project = Project.objects.create(name="Test Project") + issue, _ = get_or_create_issue(project) + event = create_event(project, issue=issue) + + event_data = { + "user": { + "ip_address": "{{auto}}", + }, + } + event.remote_addr = None + event.save() + digest_tags(event_data, event, issue) + + self.assertEqual([], [e.value.value for e in event.get_tags]) + class SearchParserTestCase(RegularTestCase):