Improve campaign personalization and contact duplicate handling.
Deploy Beta / unit-tests (push) Successful in 13s
Deploy Beta / docker (push) Successful in 17s
Deploy Beta / deploy-beta (push) Successful in 1m44s

Add merge tags for email/SMS, paginated removable recipients, PCM event panels for postcard campaigns, and a portal modal when phone/address matches an existing contact.
This commit is contained in:
2026-08-10 09:47:04 -05:00
parent 58258f2875
commit 8680c082fe
13 changed files with 747 additions and 101 deletions
+67
View File
@@ -1,3 +1,4 @@
from django.contrib.auth import get_user_model
from django.test import Client, TestCase
from django.urls import reverse
@@ -152,3 +153,69 @@ class ContactFormMergeTests(TestCase):
self.assertEqual(lead.contact_id, self.existing.pk)
self.assertIn("alt@example.com", lead.message)
self.assertIn("merged by phone", lead.message)
class PortalCreateMatchPromptTests(TestCase):
def setUp(self):
User = get_user_model()
self.user = User.objects.create_user(
username="adder", password="test-pass-123"
)
self.client = Client()
self.client.login(username="adder", password="test-pass-123")
self.existing = Contact.objects.create(
email="primary@example.com",
phone="6301112222",
first_name="Alex",
)
def test_phone_match_shows_prompt(self):
url = reverse("contacts:create")
response = self.client.post(
url,
{
"first_name": "Alex",
"email": "alt@example.com",
"phone": "(630) 111-2222",
"consent_email": "1",
},
)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Possible duplicate")
self.assertContains(response, "Update existing")
self.assertEqual(Contact.objects.count(), 1)
def test_choose_create_new_keeps_both(self):
url = reverse("contacts:create")
response = self.client.post(
url,
{
"first_name": "Alex",
"email": "alt@example.com",
"phone": "(630) 111-2222",
"consent_email": "1",
"resolve_match": "create",
"match_id": str(self.existing.pk),
},
)
self.assertEqual(response.status_code, 302)
self.assertEqual(Contact.objects.count(), 2)
def test_choose_update_merges(self):
url = reverse("contacts:create")
response = self.client.post(
url,
{
"first_name": "Alexander",
"email": "alt@example.com",
"phone": "(630) 111-2222",
"consent_email": "1",
"resolve_match": "update",
"match_id": str(self.existing.pk),
},
)
self.assertEqual(response.status_code, 302)
self.assertEqual(Contact.objects.count(), 1)
self.existing.refresh_from_db()
self.assertEqual(self.existing.first_name, "Alexander")
self.assertIn("alt@example.com", self.existing.notes)