Small fixes
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
}}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
}}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
}}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
}}
|
}
|
||||||
|
}
|
||||||
|
|||||||
275
tests/test_data/test_form5.json
Normal file
275
tests/test_data/test_form5.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user