11"""normalize.py"""
2+
23import json
34import re
45
56from typings import Donation , Form , Payload , Pressure , Plip
67from utils import only_digits , get_field , find_by_ddd
78
9+
810def 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+
2023def clean_response (item ):
2124 return {key : value for key , value in item .items () if value }
2225
26+
2327def 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+
2934def 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+
3440def 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+
6081def 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+
91117def 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+
105132def 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+
122155def 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
0 commit comments