| 
									
										
										
										
											2013-11-10 22:03:16 +01:00
										 |  |  | from datetime import datetime | 
					
						
							| 
									
										
										
										
											2013-12-01 16:41:24 +01:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  | import os | 
					
						
							|  |  |  | import json | 
					
						
							|  |  |  | import unicodedata | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | categories = [] | 
					
						
							| 
									
										
										
										
											2015-04-26 18:13:09 +02:00
										 |  |  | url = 'https://download.finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s={query}=X' | 
					
						
							| 
									
										
										
										
											2013-11-10 21:20:22 +01:00
										 |  |  | weight = 100 | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 15:29:47 +02:00
										 |  |  | parser_re = re.compile(u'.*?(\\d+(?:\\.\\d+)?) ([^.0-9]+) (?:in|to) ([^.0-9]+)', re.I)  # noqa | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | db = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def normalize_name(name): | 
					
						
							| 
									
										
										
										
											2016-05-03 02:06:17 +02:00
										 |  |  |     name = name.lower().replace('-', ' ').rstrip('s') | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  |     name = re.sub(' +', ' ', name) | 
					
						
							| 
									
										
										
										
											2015-06-07 15:38:38 +02:00
										 |  |  |     return unicodedata.normalize('NFKD', name).lower() | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def name_to_iso4217(name): | 
					
						
							|  |  |  |     global db | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     name = normalize_name(name) | 
					
						
							|  |  |  |     currencies = db['names'].get(name, [name]) | 
					
						
							|  |  |  |     return currencies[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def iso4217_to_name(iso4217, language): | 
					
						
							|  |  |  |     global db | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return db['iso4217'].get(iso4217, {}).get(language, iso4217) | 
					
						
							| 
									
										
										
										
											2013-12-01 16:41:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-19 22:59:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  | def request(query, params): | 
					
						
							| 
									
										
										
										
											2015-06-07 15:38:38 +02:00
										 |  |  |     m = parser_re.match(unicode(query, 'utf8')) | 
					
						
							| 
									
										
										
										
											2013-12-01 16:41:24 +01:00
										 |  |  |     if not m: | 
					
						
							|  |  |  |         # wrong query | 
					
						
							|  |  |  |         return params | 
					
						
							| 
									
										
										
										
											2015-02-03 19:56:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-03 02:06:17 +02:00
										 |  |  |     ammount, from_currency, to_currency = m.groups() | 
					
						
							| 
									
										
										
										
											2015-02-03 19:56:26 +01:00
										 |  |  |     ammount = float(ammount) | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  |     from_currency = name_to_iso4217(from_currency.strip()) | 
					
						
							|  |  |  |     to_currency = name_to_iso4217(to_currency.strip()) | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-19 22:59:01 +01:00
										 |  |  |     q = (from_currency + to_currency).upper() | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     params['url'] = url.format(query=q) | 
					
						
							|  |  |  |     params['ammount'] = ammount | 
					
						
							|  |  |  |     params['from'] = from_currency | 
					
						
							|  |  |  |     params['to'] = to_currency | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  |     params['from_name'] = iso4217_to_name(from_currency, 'en') | 
					
						
							|  |  |  |     params['to_name'] = iso4217_to_name(to_currency, 'en') | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return params | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def response(resp): | 
					
						
							|  |  |  |     results = [] | 
					
						
							|  |  |  |     try: | 
					
						
							| 
									
										
										
										
											2014-01-19 22:59:01 +01:00
										 |  |  |         _, conversion_rate, _ = resp.text.split(',', 2) | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  |         conversion_rate = float(conversion_rate) | 
					
						
							|  |  |  |     except: | 
					
						
							|  |  |  |         return results | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  |     answer = '{0} {1} = {2} {3}, 1 {1} ({5}) = {4} {3} ({6})'.format( | 
					
						
							| 
									
										
										
										
											2014-01-19 22:59:01 +01:00
										 |  |  |         resp.search_params['ammount'], | 
					
						
							|  |  |  |         resp.search_params['from'], | 
					
						
							| 
									
										
										
										
											2014-09-28 16:51:41 +02:00
										 |  |  |         resp.search_params['ammount'] * conversion_rate, | 
					
						
							| 
									
										
										
										
											2014-01-19 22:59:01 +01:00
										 |  |  |         resp.search_params['to'], | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  |         conversion_rate, | 
					
						
							|  |  |  |         resp.search_params['from_name'], | 
					
						
							|  |  |  |         resp.search_params['to_name'], | 
					
						
							| 
									
										
										
										
											2014-01-19 22:59:01 +01:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-10 22:03:16 +01:00
										 |  |  |     now_date = datetime.now().strftime('%Y%m%d') | 
					
						
							| 
									
										
										
										
											2015-04-26 18:13:09 +02:00
										 |  |  |     url = 'https://finance.yahoo.com/currency/converter-results/{0}/{1}-{2}-to-{3}.html'  # noqa | 
					
						
							| 
									
										
										
										
											2014-01-19 22:59:01 +01:00
										 |  |  |     url = url.format( | 
					
						
							|  |  |  |         now_date, | 
					
						
							|  |  |  |         resp.search_params['ammount'], | 
					
						
							|  |  |  |         resp.search_params['from'].lower(), | 
					
						
							|  |  |  |         resp.search_params['to'].lower() | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-28 16:51:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-07 16:37:56 +01:00
										 |  |  |     results.append({'answer': answer, 'url': url}) | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return results | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def load(): | 
					
						
							|  |  |  |     global db | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     current_dir = os.path.dirname(os.path.realpath(__file__)) | 
					
						
							|  |  |  |     json_data = open(current_dir + "/../data/currencies.json").read() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     db = json.loads(json_data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | load() |