From b02e8c134374e6ba4a11aa01195115fcd19c0a96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Ho=CC=88rler?= Date: Thu, 11 Jan 2018 19:21:13 +0100 Subject: [PATCH] corrected offline error to be catched. --- .../didgeridoo/currencies/exchange_rates.py | 212 +++++++++--------- .../templates/currencies/index.html | 22 +- django/didgeridoo/currencies/views.py | 116 +++++----- 3 files changed, 180 insertions(+), 170 deletions(-) diff --git a/django/didgeridoo/currencies/exchange_rates.py b/django/didgeridoo/currencies/exchange_rates.py index 24f7c46..05c279f 100644 --- a/django/didgeridoo/currencies/exchange_rates.py +++ b/django/didgeridoo/currencies/exchange_rates.py @@ -24,117 +24,121 @@ def get_exchange_rate(): # ~~~~~~~~~~~~~~~~~~~~~ today = datetime.now().strftime("%Y-%m-%d") SNB_URL = 'https://www.snb.ch/selector/de/mmr/exfeed/rss' - urlsocket = urllib.request.urlopen(SNB_URL) - root = ET.parse(urlsocket) - root = ET.ElementTree(root) + urlsocket = '' + try: + urlsocket = urllib.request.urlopen(SNB_URL) + except urllib.error.URLError as e: + print('err: urllib.request.urlopen: ', e.reason) + if urlsocket: + root = ET.parse(urlsocket) + root = ET.ElementTree(root) + # ~~~~~~~~~~~~~~~~~~~~~ + # development block: + # ~~~~~~~~~~~~~~~~~~~~~ + # today = "2018-01-08" + # try: + # root = ET.ElementTree(file='rss') + # except Exception as e: + # print('exchange_rates.py_urlsocket failed %s ( + # %s) on date: %s for %s' + # % (e, type(e), root)) + # ~~~~~~~~~~~~~~~~~~~~~ - # ~~~~~~~~~~~~~~~~~~~~~ - # development block: - # ~~~~~~~~~~~~~~~~~~~~~ - # today = "2018-01-03" - # try: - # root = ET.ElementTree(file='rss') - # except Exception as e: - # print('exchange_rates.py_urlsocket failed %s ( - # %s) on date: %s for %s' - # % (e, type(e), root)) - # ~~~~~~~~~~~~~~~~~~~~~ + # Namespaces + ns = {'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + 'none': 'http://purl.org/rss/1.0/', + 'dc': 'http://purl.org/dc/elements/1.1/', + 'dcterms': 'http://purl.org/dc/terms/', + 'cb': 'http://www.cbwiki.net/wiki/index.php/Specification_1.2/' + } + # Pathvariables to XML Namespaces + rate_path = 'cb:statistics/cb:exchangeRate/' + observation_path = 'cb:statistics/cb:exchangeRate/cb:observation/' + exchange_rates = {} + for item in root.findall('none:item', ns): + # for eatch item n the list we grab the release date + # to evaluate if its fresh data or old: - # Namespaces - ns = {'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', - 'none': 'http://purl.org/rss/1.0/', - 'dc': 'http://purl.org/dc/elements/1.1/', - 'dcterms': 'http://purl.org/dc/terms/', - 'cb': 'http://www.cbwiki.net/wiki/index.php/Specification_1.2/' - } - # Pathvariables to XML Namespaces - rate_path = 'cb:statistics/cb:exchangeRate/' - observation_path = 'cb:statistics/cb:exchangeRate/cb:observation/' - exchange_rates = {} - for item in root.findall('none:item', ns): - # for eatch item n the list we grab the release date - # to evaluate if its fresh data or old: - - # THE CURRENCY DATE: - datetime_str = item.find('dc:date', ns).text - # convert string to date object: - # https://stackoverflow.com/a/12282040/4061870 - # seams like snb striked the microsecond somewhere - # between Nov. and Dez. 2017 so maybe first check - # time type is with milliseconds: - try: - date = datetime.strptime(''.join( - datetime_str.rsplit(':', 1)), - "%Y-%m-%dT%H:%M:%S%z").strftime( - "%Y-%m-%d") - except Exception as e: - print('%s (%s)' % (e, type(e))) + # THE CURRENCY DATE: + datetime_str = item.find('dc:date', ns).text + # convert string to date object: + # https://stackoverflow.com/a/12282040/4061870 + # seams like snb striked the microsecond somewhere + # between Nov. and Dez. 2017 so maybe first check + # time type is with milliseconds: try: date = datetime.strptime(''.join( datetime_str.rsplit(':', 1)), - "%Y-%m-%dT%H:%M:%S.%f%z").strftime( + "%Y-%m-%dT%H:%M:%S%z").strftime( "%Y-%m-%d") - continue except Exception as e: print('%s (%s)' % (e, type(e))) - continue - # Print dates for development: - # print("date:", date, "today:", today) - # only the values of today are used so check for date in XML: - if date == today: - # now search for the currency exchange rate: - target_currency = item.find(rate_path + - 'cb:targetCurrency', ns).text - value = float(item.find(observation_path + - 'cb:value', ns).text) - value = float(value) # convert to float - foreign_value = value # copy to new value to have both. + try: + date = datetime.strptime(''.join( + datetime_str.rsplit(':', 1)), + "%Y-%m-%dT%H:%M:%S.%f%z").strftime( + "%Y-%m-%d") + continue + except Exception as e: + print('%s (%s)' % (e, type(e))) + continue + # Print dates for development: + # print("date:", date, "today:", today) + # only the values of today are used so check for date in XML: + if date == today: + # now search for the currency exchange rate: + target_currency = item.find(rate_path + + 'cb:targetCurrency', ns).text + value = float(item.find(observation_path + + 'cb:value', ns).text) + value = float(value) # convert to float + foreign_value = value # copy to new value to have both. - if item.find(observation_path + 'cb:unit_mult', ns) is None: - # because it's dangerous to check for present, - # i check for none here and have to set the target - # to 1. as im multiplying it later. - unit_mult = float("1.0") + if item.find(observation_path + 'cb:unit_mult', ns) is None: + # because it's dangerous to check for present, + # i check for none here and have to set the target + # to 1. as im multiplying it later. + unit_mult = float("1.0") + else: + # shift left by 2 digits with "/" + # https://stackoverflow.com/questions/8362792/ + # because some currencys differ widly from CHF + unit_mult = item.find(observation_path + + 'cb:unit_mult', ns).text + # unit_mult defaults to '0' so we check for 8 decimal + # values (2..-6) they represent the fracton value to + # calculate the correct decimalpoint. + if unit_mult == '2': # thinking of Bitcoins + unit_mult = '0.01' + if unit_mult == '1': + unit_mult = '0.10' + if unit_mult == '-1': + unit_mult = '10' + if unit_mult == '-2': # Japan Yen + unit_mult = '100' + if unit_mult == '-3': + unit_mult = '1000' + if unit_mult == '-4': + unit_mult = '10000' + if unit_mult == '-5': + unit_mult = '100000' + if unit_mult == '-6': # indian rupies + unit_mult = '1000000' + unit_mult = float(unit_mult) # convert to float + # calculate the Currency to CHF: + foreign_value = 1 / value + foreign_value *= unit_mult + value = value / unit_mult + # truncate it to decimal values provided by the xml: + foreign_value_round = round(foreign_value, 5) + # Print nice setup of all calculated currencys for development: + # print("date:", date, " 1 ", target_currency, " costs: ", + # CHFvalue, "CHF and 1 ", base_currency, " costs: ", + # FOREIGNvalue_round, target_currency) + exchange_rates.update( + {target_currency: foreign_value_round}) + # Print the Dictionary: + # print(exchange_rates) else: - # shift left by 2 digits with "/" - # https://stackoverflow.com/questions/8362792/ - # because some currencys differ widly from CHF - unit_mult = item.find(observation_path + - 'cb:unit_mult', ns).text - # unit_mult defaults to '0' so we check for 8 decimal - # values (2..-6) they represent the fracton value to - # calculate the correct decimalpoint. - if unit_mult == '2': # thinking of Bitcoins - unit_mult = '0.01' - if unit_mult == '1': - unit_mult = '0.10' - if unit_mult == '-1': - unit_mult = '10' - if unit_mult == '-2': # Japan Yen - unit_mult = '100' - if unit_mult == '-3': - unit_mult = '1000' - if unit_mult == '-4': - unit_mult = '10000' - if unit_mult == '-5': - unit_mult = '100000' - if unit_mult == '-6': # indian rupies - unit_mult = '1000000' - unit_mult = float(unit_mult) # convert to float - # calculate the Currency to CHF: - foreign_value = 1 / value - foreign_value *= unit_mult - value = value / unit_mult - # truncate it to decimal values provided by the xml: - foreign_value_round = round(foreign_value, 5) - # Print nice setup of all calculated currencys for development: - # print("date:", date, " 1 ", target_currency, " costs: ", - # CHFvalue, "CHF and 1 ", base_currency, " costs: ", - # FOREIGNvalue_round, target_currency) - exchange_rates.update( - {target_currency: foreign_value_round}) - # Print the Dictionary: - # print(exchange_rates) - else: - break - return(exchange_rates, today) + continue + return(exchange_rates, today) diff --git a/django/didgeridoo/currencies/templates/currencies/index.html b/django/didgeridoo/currencies/templates/currencies/index.html index de264d1..d29a52d 100644 --- a/django/didgeridoo/currencies/templates/currencies/index.html +++ b/django/didgeridoo/currencies/templates/currencies/index.html @@ -14,13 +14,13 @@ DATE RATE - + {% for currency in currency_USD_list %} + {{ currency.date.date }} {{ currency.exchange_rate_to_chf }} - + {% endfor %} - {% else %}

@@ -34,13 +34,13 @@ DATE RATE - + {% for currency in currency_EUR_list %} + {{ currency.date.date }} {{ currency.exchange_rate_to_chf }} - + {% endfor %} - {% else %}

@@ -54,11 +54,12 @@ DATE RATE - + {% for currency in currency_JPY_list %} + {{ currency.date.date }} {{ currency.exchange_rate_to_chf }} - + {% endfor %} @@ -74,11 +75,12 @@ DATE RATE - + {% for currency in currency_GBP_list %} + {{ currency.date.date }} {{ currency.exchange_rate_to_chf }} - + {% endfor %} diff --git a/django/didgeridoo/currencies/views.py b/django/didgeridoo/currencies/views.py index b4a6fe9..d19f3e8 100644 --- a/django/didgeridoo/currencies/views.py +++ b/django/didgeridoo/currencies/views.py @@ -12,67 +12,71 @@ def currencies(request): # prepares the view all dynamicaly. # It can grow in terms of more Currencies over time automaticaly. today = '' - raw_data = '' - raw_data, today = exchange_rates.get_exchange_rate() - print('views raw_data: ', raw_data) # assert False + raw_data = [] + try: + raw_data, today = exchange_rates.get_exchange_rate() + except Exception as e: + print('views raw_data: ', raw_data, 'error:', e) # assert False message_no = "Already querried today: " message_yes = " Updated successfully: " - for currency, rate in raw_data.items(): - if ExchangeRate.objects.filter( - date__date=today, - name__name=currency): - message_no += currency + ", " - # A: https://stackoverflow.com/a/27802801/4061870 - else: - if ExchangeRate_date.objects.filter(date=today)[:1]: - try: - # lustigerweise gibt .values() den value und die id - # zurück. Ohne .values() gibts nur den "value" - date_dict = ExchangeRate_date.objects.filter( - date=today).values() - except Exception as e: - print('exdate_exists %s (%s) on %s' - % (e, type(e), today)) + if raw_data: + print(raw_data) + for currency, rate in raw_data.items(): + if ExchangeRate.objects.filter( + date__date=today, + name__name=currency): + message_no += currency + ", " + # A: https://stackoverflow.com/a/27802801/4061870 else: + if ExchangeRate_date.objects.filter(date=today)[:1]: + try: + # lustigerweise gibt .values() den value und die id + # zurück. Ohne .values() gibts nur den "value" + date_dict = ExchangeRate_date.objects.filter( + date=today).values() + except Exception as e: + print('exdate_exists %s (%s) on %s' + % (e, type(e), today)) + else: + try: + exdate = ExchangeRate_date.objects.create( + date=today) + exdate.save() + except Exception as e: + print('exdate_not_exists %s (%s) for %s' + % (e, type(e), today)) + if ExchangeRate_name.objects.filter( + name=currency)[:1]: + try: + name_dict = ExchangeRate_name.objects.filter( + name=currency).values() + except Exception as e: + print('exname_exists %s (%s) on %s' + % (e, type(e), currency)) + else: + try: + exname = ExchangeRate_name.objects.create( + name=currency) + exname.save() + except Exception as e: + print('exname_not_exists %s (%s) on %s' + % (e, type(e), currency)) try: - exdate = ExchangeRate_date.objects.create( - date=today) - exdate.save() - except Exception as e: - print('exdate_not_exists %s (%s) for %s' - % (e, type(e), today)) - if ExchangeRate_name.objects.filter( - name=currency)[:1]: - try: - name_dict = ExchangeRate_name.objects.filter( - name=currency).values() - except Exception as e: - print('exname_exists %s (%s) on %s' - % (e, type(e), currency)) - else: - try: - exname = ExchangeRate_name.objects.create( - name=currency) - exname.save() - except Exception as e: - print('exname_not_exists %s (%s) on %s' - % (e, type(e), currency)) - try: - exrate = ExchangeRate.objects.create( - # name_id=name_id, - name_id=ExchangeRate_name.objects.get( - name=currency).id, - # date_id=date_id, - date_id=ExchangeRate_date.objects.get( - date=today).id, - exchange_rate_to_chf=rate, - ) - exrate.save() - message_yes += currency + ", " + exrate = ExchangeRate.objects.create( + # name_id=name_id, + name_id=ExchangeRate_name.objects.get( + name=currency).id, + # date_id=date_id, + date_id=ExchangeRate_date.objects.get( + date=today).id, + exchange_rate_to_chf=rate, + ) + exrate.save() + message_yes += currency + ", " - except Exception as e: - print('exrate_create %s (%s) on %s for %s' - % (e, type(e), currency, today)) + except Exception as e: + print('exrate_create %s (%s) on %s for %s' + % (e, type(e), currency, today)) # prepare messages: # python can not swap a char insinde a sting so i have