| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2013-12-01 16:41:24 +01:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  | import unicodedata | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  | from datetime import datetime | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if sys.version_info[0] == 3: | 
					
						
							|  |  |  |     unicode = str | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | categories = [] | 
					
						
							| 
									
										
										
										
											2017-11-07 14:29:17 +01:00
										 |  |  | url = 'https://finance.google.com/finance/converter?a=1&from={0}&to={1}' | 
					
						
							| 
									
										
										
										
											2013-11-10 21:20:22 +01:00
										 |  |  | weight = 100 | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  | parser_re = re.compile(b'.*?(\\d+(?:\\.\\d+)?) ([^.0-9]+) (?:in|to) ([^.0-9]+)', re.I) | 
					
						
							| 
									
										
										
										
											2015-05-12 20:52:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | db = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def normalize_name(name): | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  |     name = name.decode('utf-8').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): | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  |     m = parser_re.match(query) | 
					
						
							| 
									
										
										
										
											2013-12-01 16:41:24 +01:00
										 |  |  |     if not m: | 
					
						
							|  |  |  |         # wrong query | 
					
						
							|  |  |  |         return params | 
					
						
							| 
									
										
										
										
											2015-02-03 19:56:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-07 15:14:20 +01:00
										 |  |  |     amount, from_currency, to_currency = m.groups() | 
					
						
							|  |  |  |     amount = float(amount) | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-07 14:29:17 +01:00
										 |  |  |     params['url'] = url.format(from_currency, to_currency) | 
					
						
							| 
									
										
										
										
											2017-11-07 15:14:20 +01:00
										 |  |  |     params['amount'] = amount | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  |     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 = [] | 
					
						
							| 
									
										
										
										
											2017-11-07 14:29:17 +01:00
										 |  |  |     pat = '<span class=bld>(.+) {0}</span>'.format( | 
					
						
							|  |  |  |         resp.search_params['to'].upper()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-04 21:47:16 +01:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2017-11-07 14:29:17 +01:00
										 |  |  |         conversion_rate = re.findall(pat, resp.text)[0] | 
					
						
							| 
									
										
										
										
											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( | 
					
						
							| 
									
										
										
										
											2017-11-07 15:14:20 +01:00
										 |  |  |         resp.search_params['amount'], | 
					
						
							| 
									
										
										
										
											2014-01-19 22:59:01 +01:00
										 |  |  |         resp.search_params['from'], | 
					
						
							| 
									
										
										
										
											2017-11-07 15:14:20 +01:00
										 |  |  |         resp.search_params['amount'] * 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-07 14:29:17 +01:00
										 |  |  |     url = 'https://finance.google.com/finance?q={0}{1}'.format( | 
					
						
							|  |  |  |         resp.search_params['from'].upper(), resp.search_params['to']) | 
					
						
							| 
									
										
										
										
											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() |