Mercurial > hg > horiscopes
comparison V4/dParse.py @ 13:b253748dbb11
developing V4 - Class based structure, with self calcuation of all aspects
author | DaveM |
---|---|
date | Sun, 04 Mar 2018 14:51:43 +0000 |
parents | |
children | 50a95089414d |
comparison
equal
deleted
inserted
replaced
12:18e337b2550d | 13:b253748dbb11 |
---|---|
1 #!/usr/bin/env python | |
2 | |
3 import csv | |
4 import time | |
5 import unicodedata | |
6 from geopy.geocoders import Nominatim | |
7 from geopy.exc import GeocoderTimedOut | |
8 import random | |
9 import pdb | |
10 | |
11 DEFAULT_TIME_H = 12 | |
12 DEFAULT_TIME_M = 00 | |
13 DEAULT_LOCATION = 'USA' | |
14 | |
15 # def parseCSV(filename): | |
16 # stream = csv.DictReader(open(filename,'rb')) | |
17 # dictList = [] | |
18 # people = [] | |
19 # for line in stream: | |
20 # people.append(syn.person(line)) | |
21 # return people | |
22 # # dictList.append(regulateData(line)) | |
23 # # return dictList | |
24 | |
25 def regulateData(dataDict): | |
26 print("Parse %s"%(str(dataDict['ID']))) | |
27 p_DOBQ = "What is your partner's date of birth? Please use the format DD/MM/YYYY (for example, 29/03/1981)." | |
28 p_TOBQ = "At what exact time were your partner born? Please use the format HHMM (for example, 2204)." | |
29 DOB_DQ = "Which day (numeric) have you been born?" | |
30 DOB_MQ = "Which month have you been born?" | |
31 DOB_YQ = "Year Of Birth" | |
32 TOB_Q = "At what exact time were you born? Please use the format HHMM (for example, 2204)." | |
33 COB = "What is your place of birth? Please specify city and country (for example, San Francisco, USA)." | |
34 p_COB = "What is your partner's place of birth? Please specify city and country (for example, San Francisco, USA)." | |
35 dataDict['DOB'] = parseDOB(dataDict[DOB_DQ],dataDict[DOB_MQ],dataDict[DOB_YQ]) | |
36 # print (dataDict[DOB_DQ],dataDict[DOB_MQ],dataDict[DOB_YQ]) | |
37 # print dataDict['DOB'] | |
38 dataDict['TOB'] = parseTOB(dataDict[TOB_Q]) | |
39 dataDict['pDOB'] = parsePartnerDOB(dataDict[p_DOBQ]) | |
40 dataDict['pTOB'] = parseTOB(dataDict[p_TOBQ]) | |
41 # MAKE RANDOM PLACE | |
42 # dataDict['COB'] = (random.uniform(-90, 90),random.uniform(-90, 90)) | |
43 # dataDict['pCOB'] = (random.uniform(-90, 90),random.uniform(-90, 90)) | |
44 dataDict['COB'] = parseBirthTown(dataDict[COB]) | |
45 dataDict['pCOB'] = parseBirthTown(dataDict[p_COB]) | |
46 return dataDict | |
47 | |
48 | |
49 def parseBirthTown(s): | |
50 try: | |
51 s = s.encode('ascii') | |
52 except UnicodeDecodeError: | |
53 # pdb.set_trace() | |
54 s = s.decode('latin-1') | |
55 # s = unicodedata.normalize('NFKD',s.decode('utf-8')).encode('ascii','ignore') | |
56 timeoutTime = 2 | |
57 geolocator = Nominatim(timeout=timeoutTime) | |
58 while s is not [] and timeoutTime < 60: | |
59 try: | |
60 location = geolocator.geocode(s) | |
61 if location is not None: | |
62 # print(location.raw) | |
63 # print (location.latitude, location.longitude) | |
64 return (location.latitude, location.longitude, location.raw) | |
65 else: | |
66 s = s.split(' ',1) | |
67 if len(s) == 2: | |
68 s = s[1] | |
69 # print s | |
70 else: | |
71 s = DEAULT_LOCATION | |
72 except: | |
73 timeoutTime += 1 | |
74 print("Error: geocode failed on input %s, incrementing timeout time to %d"%(s,timeoutTime)) | |
75 time.sleep(5) | |
76 geolocator = Nominatim(timeout=timeoutTime) | |
77 # places = geograpy.get_place_context(text=s) | |
78 | |
79 def parsePartnerDOB(dob): | |
80 # print dob | |
81 # pdb.set_trace() | |
82 dob = dob.strip() | |
83 if(dob.count('-') == 2): | |
84 dob = dob.replace('-','/') | |
85 if(dob.count(' ') == 2): | |
86 dob = dob.replace(' ','/') | |
87 dob_ = dob.split('/') | |
88 if(len(dob_) != 3): | |
89 dob = dob.replace('/','').strip() | |
90 dob_ = [] | |
91 # print dob | |
92 if len(dob) == 8: # ddmmyyyy | |
93 dob_.append(dob[:2]) | |
94 dob_.append(dob[2:4]) | |
95 dob_.append(dob[4:]) | |
96 elif len(dob) == 7 and dob[1] == '1' and (dob[2] == '0' or dob[2] == '1' or dob[2] == '2'): # dmmyyyy | |
97 dob_.append(dob[0]) | |
98 dob_.append(dob[1:3]) | |
99 dob_.append(dob[3:]) | |
100 elif(len(dob) == 7): | |
101 if int(dob[:2]) > 31:# dmmyyyy | |
102 dob_.append(dob[0]) | |
103 dob_.append(dob[1:3]) | |
104 dob_.append(dob[3:]) | |
105 elif len(dob) == 7: # ddmyyyy | |
106 dob_.append(dob[0:2]) | |
107 dob_.append(dob[2]) | |
108 dob_.append(dob[3:]) | |
109 elif len(dob) == 6 and dob[3:4] != '19': # ddmmyy | |
110 dob_.append(dob[:2]) | |
111 dob_.append(dob[2:4]) | |
112 dob_.append(dob[4:]) | |
113 elif len(dob) == 5 and dob[1] == '1' and (dob[2] == '0' or dob[2] == '1' or dob[2] == '2'): # dmmyy | |
114 dob_.append(dob[0]) | |
115 dob_.append(dob[1:3]) | |
116 dob_.append(dob[3:]) | |
117 elif len(dob) == 5: # ddmyy | |
118 dob_.append(dob[:2]) | |
119 dob_.append(dob[2]) | |
120 dob_.append(dob[3:]) | |
121 elif len(dob) == 4: # dmyy | |
122 dob_.append(dob[0]) | |
123 dob_.append(dob[1]) | |
124 dob_.append(dob[2:]) | |
125 else: | |
126 if(len(dob) < 4): | |
127 return None | |
128 # print dob | |
129 # print filter(lambda x: x.isdigit(),dob) | |
130 print 'no / partnerDOB issue' | |
131 # deal with no /'s | |
132 try: | |
133 d = int(filter(lambda x: x.isdigit(),dob_[0])) | |
134 m = int(filter(lambda x: x.isdigit(),dob_[1])) | |
135 y = int(filter(lambda x: x.isdigit(),dob_[2])) | |
136 if y < 100: | |
137 y = y + 1900 | |
138 if (m > 12 and d <= 12): | |
139 temp = d | |
140 d = m | |
141 m = temp | |
142 if(d > 31 or d < 1 or m > 12 or m < 1 or y > 2017 or y < 1900): | |
143 print 'error with DOB '+d+'/'+m+'/'+y | |
144 pdb.set_trace() | |
145 except TypeError: | |
146 return None | |
147 # print (d,m,y) | |
148 return (d,m,y) | |
149 | |
150 def monthStringToNum(s): | |
151 # print 'inMonthStringToNum' | |
152 m = {'jan':1,'feb':2,'mar':3, | |
153 'apr':4,'may':5,'jun':6,'jul':7,'aug':8, | |
154 'sep':9,'oct':10,'nov':11,'dec':12} | |
155 s_ = s.strip()[:3].lower() | |
156 try: | |
157 out = m[s_] | |
158 return out | |
159 except: | |
160 raise ValueError('Not a month') | |
161 | |
162 def checkMonthDay(d,m): | |
163 if d > 31: # take first two digits of day | |
164 d = int(str(d)[:2]) | |
165 if d > 31: | |
166 d = int(str(d)[1]) | |
167 if m > 12 and d < 12: # Day and month wrong way round - American | |
168 temp = m | |
169 m = d | |
170 d = temp | |
171 if(m == 2): | |
172 if d <= 29: | |
173 return (True,d,m) | |
174 else: | |
175 return (False,d,m) | |
176 elif m in [4,6,9,11]: | |
177 if d <= 30: | |
178 return (True,d,m) | |
179 else: | |
180 return (False,d,m) | |
181 elif m <= 12 and d <= 31: | |
182 return (True,d,m) | |
183 else: | |
184 return (False,d,m) | |
185 | |
186 def parseDOB(d,m,y): | |
187 d = int(filter(lambda x: x.isdigit(),d)) | |
188 y = int(filter(lambda x: x.isdigit(),y)) | |
189 try: | |
190 # print m | |
191 m = monthStringToNum(m.strip()) | |
192 except ValueError: | |
193 m = int(m.strip()) | |
194 if(y < 100): | |
195 y = y + 1900 | |
196 (r,d,m) = checkMonthDay(d,m) | |
197 if not r: | |
198 print 'error with day month' | |
199 print (r,d,m) | |
200 return (d,m,y) | |
201 | |
202 def parseTOB(T): | |
203 # pdb.set_trace() | |
204 timeFlag = None | |
205 T_ = T.replace('.','').lower().strip() | |
206 if 'am' in T_: | |
207 timeFlag = 0 | |
208 T = T_.replace('am','') | |
209 if 'pm' in T_: | |
210 timeFlag = 1 | |
211 T = T_.replace('pm','') | |
212 T = T.strip() | |
213 if T.count('.') == 1: | |
214 T = T.replace('.',':') | |
215 try: | |
216 if ':' in T: | |
217 T_ = T.split(':') | |
218 | |
219 H = int(T_[0]) | |
220 M = int(T_[1]) | |
221 else: | |
222 if len(T) == 4: | |
223 H = int(T[:2]) | |
224 M = int(T[2:]) | |
225 elif int(T) <= 24 : | |
226 H = int(T) | |
227 M = 0 | |
228 elif int(T) > 100: | |
229 H = int(T)/100 | |
230 M = int(T)%100 | |
231 if timeFlag is not None: | |
232 if timeFlag == 0: | |
233 H = H%12 | |
234 else: | |
235 H = H%12 + 12 | |
236 except ValueError: | |
237 H = DEFAULT_TIME_H | |
238 M = DEFAULT_TIME_M | |
239 return (H,M) | |
240 | |
241 def makePayload(dataDict): | |
242 if type(dataDict['COB']) is str: | |
243 cob_0 = float(dataDict['COB'].split(',')[0][1:]) | |
244 cob_1 = float(dataDict['COB'].split(',')[1]) | |
245 dataDict['COB'] = (cob_0,cob_1) | |
246 if type(dataDict['pCOB']) is str: | |
247 pcob_0 = float(dataDict['pCOB'].split(',')[0][1:]) | |
248 pcob_1 = float(dataDict['pCOB'].split(',')[1]) | |
249 dataDict['pCOB'] = (pcob_0,pcob_1) | |
250 if type(dataDict['DOB']) is str: | |
251 dataDict['DOB'] = dataDict['DOB'][1:-1].split(',') | |
252 if type(dataDict['pDOB']) is str: | |
253 dataDict['pDOB'] = dataDict['pDOB'][1:-1].split(',') | |
254 if type(dataDict['TOB']) is str: | |
255 dataDict['TOB'] = dataDict['TOB'][1:-1].split(',') | |
256 if type(dataDict['pTOB']) is str: | |
257 dataDict['pTOB'] = dataDict['pTOB'][1:-1].split(',') | |
258 # pdb.set_trace() | |
259 | |
260 print dataDict['pDOB'] | |
261 | |
262 R = {'send_calculation':'1', #Req | |
263 'muz_narozeni_den':dataDict['DOB'][0], | |
264 'muz_narozeni_mesic':dataDict['DOB'][1], | |
265 'muz_narozeni_rok':dataDict['DOB'][2], | |
266 'muz_narozeni_hodina':dataDict['TOB'][0], | |
267 'muz_narozeni_minuta':dataDict['TOB'][1], | |
268 'muz_narozeni_city':'', | |
269 'muz_narozeni_mesto_hidden':'Manually+place%3A+%C2%B0%27N%2C+%C2%B0%27E',#auto | |
270 'muz_narozeni_stat_hidden':'XX', | |
271 'muz_narozeni_podstat_kratky_hidden':'', | |
272 'muz_narozeni_podstat_hidden':'', | |
273 'muz_narozeni_podstat2_kratky_hidden':'', | |
274 'muz_narozeni_podstat3_kratky_hidden':'', | |
275 'muz_narozeni_input_hidden':'', | |
276 'muz_narozeni_sirka_stupne':str(abs(dataDict['COB'][0])).split('.')[0], | |
277 'muz_narozeni_sirka_minuty':str(float('0.'+str(dataDict['COB'][0]).split('.')[1])*60).split('.')[0], | |
278 'muz_narozeni_sirka_smer': '1' if dataDict['COB'][0]<0 else '0', #address N Dir (0':'N',1':'S) | |
279 'muz_narozeni_delka_stupne':str(abs(dataDict['COB'][1])).split('.')[0], #address E - Main | |
280 'muz_narozeni_delka_minuty':str(float('0.'+str(dataDict['COB'][1]).split('.')[1])*60).split('.')[0], | |
281 'muz_narozeni_delka_smer': '1' if dataDict['COB'][1]<0 else '0', #address E Dir (0':'E',1':'W) | |
282 'muz_narozeni_timezone_form':'auto', | |
283 'muz_narozeni_timezone_dst_form':'auto', | |
284 'send_calculation':'1', | |
285 'zena_narozeni_den':dataDict['pDOB'][0], | |
286 'zena_narozeni_mesic':dataDict['pDOB'][1], | |
287 'zena_narozeni_rok':dataDict['pDOB'][2], | |
288 'zena_narozeni_hodina':dataDict['pTOB'][0], | |
289 'zena_narozeni_minuta':dataDict['pTOB'][1], | |
290 'zena_narozeni_city':'', | |
291 'zena_narozeni_mesto_hidden':'Manually+place%3A+%C2%B0%27N%2C+%C2%B0%27E', | |
292 'zena_narozeni_stat_hidden':'XX', | |
293 'zena_narozeni_podstat_kratky_hidden':'', | |
294 'zena_narozeni_podstat_hidden':'', | |
295 'zena_narozeni_podstat2_kratky_hidden':'', | |
296 'zena_narozeni_podstat3_kratky_hidden':'', | |
297 'zena_narozeni_input_hidden':'', | |
298 'zena_narozeni_sirka_stupne':str(abs(dataDict['pCOB'][0])).split('.')[0], | |
299 'zena_narozeni_sirka_minuty':str(float('0.'+str(dataDict['pCOB'][0]).split('.')[1])*60).split('.')[0], | |
300 'zena_narozeni_sirka_smer': '1' if dataDict['pCOB'][0]<0 else '0', | |
301 'zena_narozeni_delka_stupne':str(abs(dataDict['pCOB'][1])).split('.')[0], | |
302 'zena_narozeni_delka_minuty':str(float('0.'+str(dataDict['pCOB'][1]).split('.')[1])*60).split('.')[0], | |
303 'zena_narozeni_delka_smer': '1' if dataDict['pCOB'][1]<0 else '0', | |
304 'zena_narozeni_timezone_form':'auto', | |
305 'zena_narozeni_timezone_dst_form':'auto', | |
306 'switch_interpretations':'0', | |
307 'house_system':'placidus', | |
308 'uhel_orbis':'#tabs_redraw'} | |
309 return R | |
310 | |
311 | |
312 | |
313 |