diff --git a/django/didgeridoo/currencies/exchange_rates.py b/django/didgeridoo/currencies/exchange_rates.py index bb12c47..173de19 100644 --- a/django/didgeridoo/currencies/exchange_rates.py +++ b/django/didgeridoo/currencies/exchange_rates.py @@ -1,14 +1,15 @@ from datetime import datetime import urllib.request import xml.etree.ElementTree as ET +import datetime as dt -today = datetime.now().strftime("%Y-%m-%d") -""" this method calls a rss/XML Resource - of Currency's and parses it to our - needed exchange rate values. - The return is a dictionary carring - Key:Value pairs of new currencys. +""" +this method calls a rss/XML Resource +of Currency's and parses it to our +needed exchange rate values. +The return is a dictionary carring +Key:Value pairs of new currencys. """ @@ -20,16 +21,17 @@ def get_exchange_rate(): # ~~~~~~~~~~~~~~~~~~~~~ # Online Resource block: # ~~~~~~~~~~~~~~~~~~~~~ - 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) + # 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) # ~~~~~~~~~~~~~~~~~~~~~ # development block: # ~~~~~~~~~~~~~~~~~~~~~ - # root = ET.ElementTree(file='rss') + root = ET.ElementTree(file='rss') # ~~~~~~~~~~~~~~~~~~~~~ + # Namespaces ns = {'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'none': 'http://purl.org/rss/1.0/', @@ -38,43 +40,45 @@ def get_exchange_rate(): 'cb': 'http://www.cbwiki.net/wiki/index.php/Specification_1.2/' } # Pathvariables to XML Namespaces - none_path = 'none:item/' rate_path = 'cb:statistics/cb:exchangeRate/' observation_path = 'cb:statistics/cb:exchangeRate/cb:observation/' - # THE FILE DATE: - xml_datetime_string = root.find('none:channel/dcterms:created', ns).text - # because of few knowlede just trim end of string to avoid error - xml_datestring = xml_datetime_string.split('T')[0] - # parse string to date object: - xml_date = datetime.date(datetime.strptime(xml_datestring, "%Y-%m-%d")) + # today = datetime.now().strftime("%Y-%m-%d") + today = "2018-01-02" exchange_rates = {} + for item in root.findall('none:item', ns): # 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. "%Y-%m-%dT%H:%M:%S.%f%z" - date = datetime.strptime(''.join( - datetime_str.rsplit(':', 1)), - "%Y-%m-%dT%H:%M:%S%z").strftime( - "%Y-%m-%d") + # 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-%d") + except Exception as e: + print('%s (%s)' % (e, type(e))) + 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))) + # 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: - title = item.find('none:title', ns).text - base_currency = item.find(rate_path + - 'cb:baseCurrency', ns).text target_currency = item.find(rate_path + 'cb:targetCurrency', ns).text - CHFvalue = float(item.find(observation_path + - 'cb:value', ns).text) - CHFvalue = float(CHFvalue) # convert to float - FOREIGNvalue = CHFvalue # copy to new value to have both. - unit = item.find(observation_path + 'cb:unit', ns).text - decimals = int(item.find(observation_path + - 'cb:decimals', 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. # because it's dangerous to check for present, i check for none - # here and have to do something in there so i set the target to 0. + # here and have to do something in there so i set the target to 1. if item.find(observation_path + 'cb:unit_mult', ns) is None: unit_mult = float("1.0") else: @@ -104,21 +108,21 @@ def get_exchange_rate(): unit_mult = '1000000' unit_mult = float(unit_mult) # convert to float # calculate the Currency to CHF: - FOREIGNvalue = 1 / CHFvalue - FOREIGNvalue *= unit_mult - CHFvalue = CHFvalue / unit_mult + foreign_value = 1 / value + foreign_value *= unit_mult + value = value / unit_mult # truncate it to decimal values provided by the xml: - FOREIGNvalue_round = round(FOREIGNvalue, 5) + foreign_value_round = round(foreign_value, 5) # Print nice setup of all calculated currencys for Dev: # print("date:", date, " 1 ", target_currency, " costs: ", # CHFvalue, "CHF and 1 ", base_currency, " costs: ", # FOREIGNvalue_round, target_currency) exchange_rates.update( - {target_currency: FOREIGNvalue_round}) + {target_currency: foreign_value_round}) # Print the Dictionary: # print(exchange_rates) else: break - return(exchange_rates, date) + return(exchange_rates, today) # for development its preferable to see that the for loop is done: # print('no more fresh data!') diff --git a/django/didgeridoo/currencies/templates/currencies/index.html b/django/didgeridoo/currencies/templates/currencies/index.html index bddcee2..d61c474 100644 --- a/django/didgeridoo/currencies/templates/currencies/index.html +++ b/django/didgeridoo/currencies/templates/currencies/index.html @@ -6,20 +6,24 @@