Small fixes

This commit is contained in:
Jonas Linter
2025-11-12 18:40:37 +01:00
parent f9139d82d7
commit 12072dcbc8
7 changed files with 1277 additions and 953 deletions

View File

@@ -560,6 +560,18 @@ async def process_wix_form_submission(request: Request, data: dict[str, Any], db
name_prefix = data.get("field:anrede") name_prefix = data.get("field:anrede")
email_newsletter = data.get("field:form_field_5a7b", False) email_newsletter = data.get("field:form_field_5a7b", False)
# if email_newsletter is a string, attempt to convert to boolean, else false
if isinstance(email_newsletter, str):
email_newsletter = email_newsletter.lower() in [
"yes",
"true",
"1",
"on",
"selezionato",
"angekreuzt",
]
address_line = None address_line = None
city_name = None city_name = None
postal_code = None postal_code = None
@@ -585,14 +597,20 @@ async def process_wix_form_submission(request: Request, data: dict[str, Any], db
num_children = int(data.get("field:anzahl_kinder") or 0) num_children = int(data.get("field:anzahl_kinder") or 0)
children_ages = [] children_ages = []
if num_children > 0: if num_children > 0:
# Collect all child age fields, then take only the first num_children
# This handles form updates that may send extra padded/zero fields
temp_ages = []
for k in data: for k in data:
if k.startswith("field:alter_kind_"): if k.startswith("field:alter_kind_"):
try: try:
age = int(data[k]) age = int(data[k])
children_ages.append(age) temp_ages.append(age)
except ValueError: except ValueError:
_LOGGER.warning("Invalid age value for %s: %s", k, data[k]) _LOGGER.warning("Invalid age value for %s: %s", k, data[k])
# Only keep the first num_children ages, regardless of their values
children_ages = temp_ages[:num_children]
offer = data.get("field:angebot_auswaehlen") offer = data.get("field:angebot_auswaehlen")
# get submissionId and ensure max length 35. Generate one if not present # get submissionId and ensure max length 35. Generate one if not present

View File

@@ -11,6 +11,7 @@ This module tests all FastAPI endpoints including:
import base64 import base64
import gzip import gzip
import json
import uuid import uuid
from pathlib import Path from pathlib import Path
from unittest.mock import patch from unittest.mock import patch
@@ -263,6 +264,29 @@ class TestWixWebhookEndpoint:
data = response.json() data = response.json()
assert data["status"] == "success" assert data["status"] == "success"
@pytest.mark.parametrize(
"test_form_file",
[
Path(__file__).parent / "test_data" / f"test_form{i}.json"
for i in range(1, 6)
],
ids=lambda p: p.name,
)
def test_wix_webhook_test_endpoint_with_test_forms(self, client, test_form_file):
"""Test the test endpoint works with all test form data files."""
# Skip if file doesn't exist
if not test_form_file.exists():
pytest.skip(f"{test_form_file.name} not found")
# Load test form data
with test_form_file.open() as f:
form_data = json.load(f)
response = client.post("/api/webhook/wix-form/test", json=form_data)
assert response.status_code == HttpStatusCode.OK
data = response.json()
assert data["status"] == "success"
def test_wix_webhook_updates_existing_customer(self, client): def test_wix_webhook_updates_existing_customer(self, client):
"""Test that same contact_id updates customer instead of duplicate.""" """Test that same contact_id updates customer instead of duplicate."""
# First submission # First submission

View File

@@ -1,4 +1,5 @@
{"data": { {
"data": {
"formName": "Contact us", "formName": "Contact us",
"submissions": [ "submissions": [
{ {
@@ -111,7 +112,7 @@
"field:utm_source": "", "field:utm_source": "",
"submissionTime": "2025-10-06T07:05:34.001Z", "submissionTime": "2025-10-06T07:05:34.001Z",
"field:gad_source": "5", "field:gad_source": "5",
"field:form_field_5a7b": "Angekreuzt", "field:form_field_5a7b": true,
"field:gad_campaignid": "23065043477", "field:gad_campaignid": "23065043477",
"field:utm_medium": "", "field:utm_medium": "",
"field:utm_term_id": "", "field:utm_term_id": "",
@@ -238,4 +239,5 @@
"field:anrede": "Herr", "field:anrede": "Herr",
"field:long_answer_3524": "Kommentarsektion vermutlich", "field:long_answer_3524": "Kommentarsektion vermutlich",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1" "formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}} }
}

View File

@@ -1,4 +1,5 @@
{"data": { {
"data": {
"formName": "Reservation Request", "formName": "Reservation Request",
"submissions": [ "submissions": [
{ {
@@ -111,7 +112,6 @@
"field:utm_source": "google", "field:utm_source": "google",
"submissionTime": "2025-10-06T14:22:15.001Z", "submissionTime": "2025-10-06T14:22:15.001Z",
"field:gad_source": "1", "field:gad_source": "1",
"field:form_field_5a7b": "Selezionato",
"field:gad_campaignid": "98765432", "field:gad_campaignid": "98765432",
"field:utm_medium": "cpc", "field:utm_medium": "cpc",
"field:utm_term_id": "12345", "field:utm_term_id": "12345",
@@ -239,4 +239,5 @@
"field:anrede": "Frau", "field:anrede": "Frau",
"field:long_answer_3524": "Benötige ein ruhiges Zimmer, bitte.", "field:long_answer_3524": "Benötige ein ruhiges Zimmer, bitte.",
"formId": "f195117c-bf94-5f5e-c6g6-185229dde4c2" "formId": "f195117c-bf94-5f5e-c6g6-185229dde4c2"
}} }
}

View File

@@ -1,4 +1,5 @@
{"data": { {
"data": {
"formName": "Family Vacation Inquiry", "formName": "Family Vacation Inquiry",
"submissions": [ "submissions": [
{ {
@@ -111,7 +112,7 @@
"field:utm_source": "facebook", "field:utm_source": "facebook",
"submissionTime": "2025-10-06T16:45:22.001Z", "submissionTime": "2025-10-06T16:45:22.001Z",
"field:gad_source": "", "field:gad_source": "",
"field:form_field_5a7b": "Angekreuzt", "field:form_field_5a7b": false,
"field:gad_campaignid": "", "field:gad_campaignid": "",
"field:utm_medium": "social", "field:utm_medium": "social",
"field:utm_term_id": "54321", "field:utm_term_id": "54321",
@@ -241,4 +242,5 @@
"field:anrede": "Herr", "field:anrede": "Herr",
"field:long_answer_3524": "Wir planen unseren Weihnachtsurlaub mit drei Kindern. Brauchen Kinderbetten und Nähe zum Spielplatz.", "field:long_answer_3524": "Wir planen unseren Weihnachtsurlaub mit drei Kindern. Brauchen Kinderbetten und Nähe zum Spielplatz.",
"formId": "g206228d-ch05-6g6f-d7h7-296330eef5d3" "formId": "g206228d-ch05-6g6f-d7h7-296330eef5d3"
}} }
}

View File

@@ -1,4 +1,5 @@
{"data": { {
"data": {
"formName": "Business Travel Request", "formName": "Business Travel Request",
"submissions": [ "submissions": [
{ {
@@ -111,7 +112,7 @@
"field:utm_source": "direct", "field:utm_source": "direct",
"submissionTime": "2025-10-06T09:15:45.001Z", "submissionTime": "2025-10-06T09:15:45.001Z",
"field:gad_source": "", "field:gad_source": "",
"field:form_field_5a7b": "", "field:form_field_5a7b": true,
"field:gad_campaignid": "", "field:gad_campaignid": "",
"field:utm_medium": "none", "field:utm_medium": "none",
"field:utm_term_id": "", "field:utm_term_id": "",
@@ -238,4 +239,5 @@
"field:anrede": "Frau", "field:anrede": "Frau",
"field:long_answer_3524": "Business trip for conference. Need WiFi and workspace. Will arrive late on Monday.", "field:long_answer_3524": "Business trip for conference. Need WiFi and workspace. Will arrive late on Monday.",
"formId": "h317339e-di16-7h7g-e8i8-3a7441ffg6e4" "formId": "h317339e-di16-7h7g-e8i8-3a7441ffg6e4"
}} }
}

View File

@@ -0,0 +1,275 @@
{
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Angebot auswählen",
"value": "Zimmer: Doppelzimmer"
},
{
"label": "Anreisedatum",
"value": "2026-06-25"
},
{
"label": "Abreisedatum",
"value": "2026-06-28"
},
{
"label": "Anzahl Erwachsene",
"value": "7"
},
{
"label": "Anzahl Kinder",
"value": "3"
},
{
"label": "Alter Kind 1",
"value": "4"
},
{
"label": "Alter Kind 2",
"value": "3"
},
{
"label": "Alter Kind 3",
"value": "1"
},
{
"label": "Alter Kind 4",
"value": "0"
},
{
"label": "Alter Kind 5",
"value": "0"
},
{
"label": "Alter Kind 6",
"value": "0"
},
{
"label": "Alter Kind 7",
"value": "0"
},
{
"label": "Anrede",
"value": "Frau"
},
{
"label": "Vorname",
"value": "Petra"
},
{
"label": "Nachname",
"value": "Pohl"
},
{
"label": "Email",
"value": "petrapohl79@yahoo.com"
},
{
"label": "Phone",
"value": "+49 176 72219046"
},
{
"label": "Message",
"value": "Wir hatten als Familie vor einigen Jahren ein Wochenende bei Ihnen verbracht "
},
{
"label": "utm_Source",
"value": ""
},
{
"label": "utm_Medium",
"value": ""
},
{
"label": "utm_Campaign",
"value": ""
},
{
"label": "utm_Term",
"value": ""
},
{
"label": "utm_Content",
"value": ""
},
{
"label": "utm_term_id",
"value": ""
},
{
"label": "utm_content_id",
"value": ""
},
{
"label": "gad_source",
"value": "1"
},
{
"label": "gad_campaignid",
"value": "183901432"
},
{
"label": "gbraid",
"value": "0AAAAADxR52Ad0oCzeogeTrupgGeMwD7Yp"
},
{
"label": "gclid",
"value": "EAIaIQobChMIpNik0vXskAMVOoCDBx0cSQ1GEAAYASAAEgLog_D_BwE"
},
{
"label": "fbclid",
"value": ""
},
{
"label": "hotelid",
"value": "39054_001"
},
{
"label": "hotelname",
"value": "Bemelmans Post"
}
],
"field:date_picker_7e65": "2026-06-28",
"field:alter_kind_7": 0,
"field:number_7cf5": 7,
"field:utm_source": "",
"submissionTime": "2025-11-12T15:32:23.208Z",
"field:alter_kind_3": 4,
"field:gad_source": "1",
"field:gad_campaignid": "183901432",
"field:utm_medium": "",
"field:utm_term_id": "",
"context": {
"metaSiteId": "1dea821c-8168-4736-96e4-4b92e8b364cf",
"activationId": "84dc33f6-ff90-4a2a-b77b-5f32fe9e3fc2"
},
"field:email_5139": "petrapohl79@yahoo.com",
"field:phone_4c77": "+4917672219046",
"_context": {
"activation": {
"id": "84dc33f6-ff90-4a2a-b77b-5f32fe9e3fc2"
},
"configuration": {
"id": "a976f18c-fa86-495d-be1e-676df188eeae"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "152db4d7-5263-40c4-be2b-1c81476318b7"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"field:gclid": "EAIaIQobChMIpNik0vXskAMVOoCDBx0cSQ1GEAAYASAAEgLog_D_BwE",
"field:alter_kind_8": 0,
"formFieldMask": [
"field:",
"field:",
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"field:hotelid",
"field:hotelname",
"field:roomtypecode",
"field:roomclassificationcode",
"field:",
"metaSiteId"
],
"field:alter_kind_4": 1,
"contact": {
"name": {
"first": "Petra",
"last": "Pohl"
},
"email": "petrapohl79@yahoo.com",
"locale": "de-de",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+49 176 72219046",
"id": "332e1d29-9ece-4e87-85bd-f39654be00b8",
"countryCode": "DE",
"e164Phone": "+4917672219046",
"primary": true,
"phone": "176 72219046"
}
],
"contactId": "5cd8d5a4-8705-49f5-b1be-c61dab5355d1",
"emails": [
{
"id": "4dbbbe7c-2892-47e8-b7e2-982c9f44407d",
"tag": "UNTAGGED",
"email": "petrapohl79@yahoo.com",
"primary": true
}
],
"updatedDate": "2025-11-12T15:32:24.771Z",
"phone": "+4917672219046",
"createdDate": "2025-11-12T15:32:24.771Z"
},
"submissionId": "ae8837ee-bb2d-4bad-a065-7e366dde7e6b",
"field:anzahl_kinder": 3,
"field:alter_kind_25": 3,
"field:alter_kind_5": 0,
"field:first_name_abae": "Petra",
"field:utm_content_id": "",
"field:utm_campaign": "",
"field:utm_term": "",
"contactId": "5cd8d5a4-8705-49f5-b1be-c61dab5355d1",
"field:alter_kind_6": 0,
"field:date_picker_a7c8": "2026-06-25",
"field:hotelname": "Bemelmans Post",
"field:angebot_auswaehlen": "Zimmer: Doppelzimmer",
"field:utm_content": "",
"field:last_name_d97c": "Pohl",
"field:hotelid": "39054_001",
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:gbraid": "0AAAAADxR52Ad0oCzeogeTrupgGeMwD7Yp",
"field:fbclid": "",
"submissionPdf": {
"fileName": "ae8837ee-bb2d-4bad-a065-7e366dde7e6b.pdf",
"downloadUrl": "https://manage.wix.com/_api/form-submission-service/v4/submissions/ae8837ee-bb2d-4bad-a065-7e366dde7e6b/download?accessToken=JWS.eyJraWQiOiJWLVNuLWhwZSIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wibWV0YVNpdGVJZFwiOlwiMWRlYTgyMWMtODE2OC00NzM2LTk2ZTQtNGI5MmU4YjM2NGNmXCJ9IiwiaWF0IjoxNzYyOTYxNTQ1LCJleHAiOjE3NjI5NjIxNDV9.ThbV0VtGcaDfYzuQKsN24uWyUeCtwZq3Z3Z4flTqEBg"
},
"field:anrede": "Frau",
"field:long_answer_3524": "Wir hatten als Familie vor einigen Jahren ein Wochenende bei Ihnen verbracht ",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
}