Skip to content

Commit 2ee7db8

Browse files
committed
fix(an-web): add team field to plip normalize
1 parent 80812a8 commit 2ee7db8

File tree

2 files changed

+101
-67
lines changed

2 files changed

+101
-67
lines changed

action-network/web/normalize.py

Lines changed: 100 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,83 @@
11
"""normalize.py"""
2+
23
import json
34
import re
45

56
from typings import Donation, Form, Payload, Pressure, Plip
67
from utils import only_digits, get_field, find_by_ddd
78

9+
810
def normalize_phone(phone):
911
phone = only_digits(phone)
1012
patterns = [
11-
(r'^(\d{2})(\d{1})(\d{4})(\d{4})$', r'+55 (\1) \2 \3 \4'),
12-
(r'^(\d{1})(\d{4})(\d{4})$', r'+55 (xx) \1 \2 \3'),
13-
(r'^(\d{2})(\d{4})(\d{4})$', r'+55 (\1) 9 \2 \3'),
14-
(r'^(\d{4})(\d{4})$', r'+55 (xx) 9 \1 \2')
13+
(r"^(\d{2})(\d{1})(\d{4})(\d{4})$", r"+55 (\1) \2 \3 \4"),
14+
(r"^(\d{1})(\d{4})(\d{4})$", r"+55 (xx) \1 \2 \3"),
15+
(r"^(\d{2})(\d{4})(\d{4})$", r"+55 (\1) 9 \2 \3"),
16+
(r"^(\d{4})(\d{4})$", r"+55 (xx) 9 \1 \2"),
1517
]
1618
for pattern, replacement in patterns:
1719
phone = re.sub(pattern, replacement, phone)
1820
return phone
1921

22+
2023
def clean_response(item):
2124
return {key: value for key, value in item.items() if value}
2225

26+
2327
def normalize_name(name, given_name, family_name):
2428
name = name.title() if name else ""
2529
given_name = given_name or name.split(" ")[0]
2630
family_name = family_name or " ".join(name.split(" ")[1:])
2731
return name, given_name.title(), family_name.title()
2832

33+
2934
def normalize_region(region):
30-
if region and '(' in region:
31-
region = re.sub(r'[\w Á-ù]+\((\w{2})\)', r'\1', region)
35+
if region and "(" in region:
36+
region = re.sub(r"[\w Á-ù]+\((\w{2})\)", r"\1", region)
3237
return region
3338

39+
3440
def form(payload: Form):
3541
fields = json.loads(payload.fields)
3642
item = {
37-
'given_name': get_field(r'(nombre|first[\s\-\_]?name|seu nome|nome|name|primeiro[\s\-\_]?nome)', fields),
38-
'family_name': get_field(r'(sobre[\s\-\_]?nome|seu sobre[\s\-\_]?nome|surname|last[\s\-\_]?name|apellido)', fields),
39-
'email': get_field(r'(e-?mail|correo electr(o|ó)nico|email|seu.*email)', fields),
40-
'locality': get_field(r'(cidade|city|ciudad)', fields),
41-
'phone': get_field(r'(celular|mobile|portable|whatsapp)', fields),
42-
'region': get_field(r'(estado|state)', fields),
43-
'gender': get_field(r'(gen[e|ê]ro|orienta[ç|c][a|ã]o sexual|identifica)', fields),
44-
'color': get_field(r'(cor|ra[ç|c]a|etnia)', fields),
45-
'birthday': get_field(r'(data[de ]*nascimento|idade|[ano]*[de ]*nascimento)', fields)
43+
"given_name": get_field(
44+
r"(nombre|first[\s\-\_]?name|seu nome|nome|name|primeiro[\s\-\_]?nome)",
45+
fields,
46+
),
47+
"family_name": get_field(
48+
r"(sobre[\s\-\_]?nome|seu sobre[\s\-\_]?nome|surname|last[\s\-\_]?name|apellido)",
49+
fields,
50+
),
51+
"email": get_field(
52+
r"(e-?mail|correo electr(o|ó)nico|email|seu.*email)", fields
53+
),
54+
"locality": get_field(r"(cidade|city|ciudad)", fields),
55+
"phone": get_field(r"(celular|mobile|portable|whatsapp)", fields),
56+
"region": get_field(r"(estado|state)", fields),
57+
"gender": get_field(
58+
r"(gen[e|ê]ro|orienta[ç|c][a|ã]o sexual|identifica)", fields
59+
),
60+
"color": get_field(r"(cor|ra[ç|c]a|etnia)", fields),
61+
"birthday": get_field(
62+
r"(data[de ]*nascimento|idade|[ano]*[de ]*nascimento)", fields
63+
),
4664
}
4765

48-
item['region'] = normalize_region(item['region'])
49-
item['name'], item['given_name'], item['family_name'] = normalize_name(
50-
f"{item['given_name']} {item['family_name']}".strip(), item['given_name'], item['family_name']
66+
item["region"] = normalize_region(item["region"])
67+
item["name"], item["given_name"], item["family_name"] = normalize_name(
68+
f"{item['given_name']} {item['family_name']}".strip(),
69+
item["given_name"],
70+
item["family_name"],
5171
)
52-
if item['phone']:
53-
item['phone'] = normalize_phone(item['phone'])
72+
if item["phone"]:
73+
item["phone"] = normalize_phone(item["phone"])
5474

55-
if not item['name'] or not item['email']:
75+
if not item["name"] or not item["email"]:
5676
return None
5777

5878
return clean_response(item)
5979

80+
6081
def donation(payload: Donation):
6182
if not payload.transaction_status or not payload.payment_method:
6283
raise ValueError("Missing required fields in donation payload.")
@@ -69,82 +90,94 @@ def donation(payload: Donation):
6990
phone = checkout_data.phone
7091

7192
item = {
72-
'name': checkout_data.name.title(),
73-
'email': checkout_data.email,
74-
'metadata': {
75-
'amount': f"{str(payload.amount)[:-2]}.00",
76-
'transaction_status': payload.transaction_status,
77-
'payment_method': payload.payment_method,
78-
'recurring': payload.subscription,
79-
'recurring_period': "Monthly" if payload.subscription else None
93+
"name": checkout_data.name.title(),
94+
"email": checkout_data.email,
95+
"metadata": {
96+
"amount": f"{str(payload.amount)[:-2]}.00",
97+
"transaction_status": payload.transaction_status,
98+
"payment_method": payload.payment_method,
99+
"recurring": payload.subscription,
100+
"recurring_period": "Monthly" if payload.subscription else None,
80101
},
81-
'address_line': f"{address.street_number} {address.street}, {address.complementary}".strip(', '),
82-
'locality': address.city,
83-
'region': address.state,
84-
'postal_code': address.zipcode,
85-
'phone': f"+55{phone.ddd}{phone.number}" if phone else None
102+
"address_line": f"{address.street_number} {address.street}, {address.complementary}".strip(
103+
", "
104+
),
105+
"locality": address.city,
106+
"region": address.state,
107+
"postal_code": address.zipcode,
108+
"phone": f"+55{phone.ddd}{phone.number}" if phone else None,
86109
}
87110

88-
item['name'], item['given_name'], item['family_name'] = normalize_name(item['name'], None, None)
111+
item["name"], item["given_name"], item["family_name"] = normalize_name(
112+
item["name"], None, None
113+
)
89114
return clean_response(item)
90115

116+
91117
def pressure(payload: Pressure):
92118
form_data = payload.form_data
93119
item = {
94-
'name': form_data.name.title(),
95-
'email': form_data.email,
96-
'given_name': form_data.name.split(" ")[0].title(),
97-
'family_name': " ".join(form_data.name.split(" ")[1:]).title(),
98-
'region': form_data.state,
99-
'phone': normalize_phone(form_data.phone) if form_data.phone else None
120+
"name": form_data.name.title(),
121+
"email": form_data.email,
122+
"given_name": form_data.name.split(" ")[0].title(),
123+
"family_name": " ".join(form_data.name.split(" ")[1:]).title(),
124+
"region": form_data.state,
125+
"phone": normalize_phone(form_data.phone) if form_data.phone else None,
100126
}
101-
if item['phone']:
102-
item['region'] = find_by_ddd(item['phone'])
127+
if item["phone"]:
128+
item["region"] = find_by_ddd(item["phone"])
103129
return clean_response(item)
104130

131+
105132
def plip(payload: Plip):
106133
form_data = payload.form_data
107134
item = {
108-
'name': form_data.name.title(),
109-
'email': form_data.email,
110-
'region': form_data.state,
111-
'color': form_data.color,
112-
'phone': normalize_phone(form_data.whatsapp) if form_data.whatsapp else None,
113-
'metadata': {
114-
'expected_signatures': form_data.expected_signatures,
115-
'unique_identifier': payload.unique_identifier,
116-
'type_form': "Ativista"
117-
}
135+
"name": form_data.name.title(),
136+
"email": form_data.email,
137+
"region": form_data.state,
138+
"color": form_data.color,
139+
"phone": normalize_phone(form_data.whatsapp) if form_data.whatsapp else None,
140+
"metadata": {
141+
"expected_signatures": form_data.expected_signatures,
142+
"unique_identifier": payload.unique_identifier,
143+
"type_form": "Ativista",
144+
},
118145
}
119-
item['name'], item['given_name'], item['family_name'] = normalize_name(item['name'], None, None)
146+
if form_data.team:
147+
item["metadata"]["team"] = form_data.team
148+
149+
item["name"], item["given_name"], item["family_name"] = normalize_name(
150+
item["name"], None, None
151+
)
120152
return clean_response(item)
121153

154+
122155
def to_payload(data: Payload):
123156
"""to_payload"""
124157
payload = data.event.data.new
125158
table = data.table.name
126159
response = dict()
127160

128-
if table == 'form_entries':
161+
if table == "form_entries":
129162
response = form(payload=payload)
130-
response['action'] = 'form'
163+
response["action"] = "form"
131164

132-
elif table == 'donations':
165+
elif table == "donations":
133166
response = donation(payload=payload)
134-
response['action'] = 'donation'
167+
response["action"] = "donation"
135168

136-
elif table == 'activist_pressures':
169+
elif table == "activist_pressures":
137170
response = pressure(payload=payload)
138-
response['action'] = 'pressure'
171+
response["action"] = "pressure"
139172

140-
elif table == 'plips':
173+
elif table == "plips":
141174
response = plip(payload=payload)
142-
response['action'] = 'plip'
175+
response["action"] = "plip"
143176

144-
response['widget_id'] = payload.widget_id
145-
response['mobilization_id'] = payload.mobilization_id
146-
response['community_id'] = payload.cached_community_id
147-
response['action_id'] = payload.id
148-
response['action_date'] = payload.created_at
177+
response["widget_id"] = payload.widget_id
178+
response["mobilization_id"] = payload.mobilization_id
179+
response["community_id"] = payload.cached_community_id
180+
response["action_id"] = payload.id
181+
response["action_date"] = payload.created_at
149182

150183
return response

action-network/web/typings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class PlipFormData(BaseModel):
3737
color: Optional[str] = None
3838
whatsapp: Optional[str] = None
3939
gender: Optional[str] = None
40+
team: Optional[str] = None
4041
name: str
4142
expected_signatures: int
4243

0 commit comments

Comments
 (0)