예제 #1
0
class ExchangeRatesPoller(object):

    API_key = '7cf21b8b9b8f4b7a887a5cde5ae85949'
    API_fetch_interval = timedelta(hours=1)

    def __init__(self):
        self.client = OpenExchangeRatesClient(ExchangeRatesPoller.API_key)
        self.currencies = self.client.currencies()
        logging.info(
            "ExchangeRatesPoller initialized.\nSupported currencies:\n" +
            "\n".join([c + ": " + self.currencies[c] for c in self.currencies
                       ]))
        self.last_api_fetch_time = None

    def poll_data(self):
        if self.client is None or self.last_api_fetch_time is None \
                or (datetime.utcnow() - self.last_api_fetch_time >
                    ExchangeRatesPoller.API_fetch_interval):
            self.lastest = self.client.latest()
            self.rates = self.lastest['rates']
            self.last_api_fetch_time = datetime.utcnow()
            logging.info(' '.join(
                [self.__class__.__name__, ": poll_data() fetched new data at:",
                 self.last_api_fetch_time.isoformat()]))
        else:
            logging.info(' '.join([self.__class__.__name__, (
                ": poll_data() called within fetch "
                "interval threshold, use previous "
                "fetched data at:"), self.last_api_fetch_time.isoformat()]))

    def trigger_notification(self, message):
        print message

    def check_exchange_rates(self, currencies):
        rates = {}
        for c in currencies:
            if c.upper() not in self.rates:
                logging.error(' '.join([self.__class__.__name__, ": currency:",
                                        c, "not found in self.rates dict."]))
                raise Exception("Currency: %s Not recognized!" % c)
            rates[c] = float(self.rates[c.upper()])
            rates_str_lst = [
                "USD exchange rate to " + rc.upper() + ": " + str(rates[rc])
                for rc in rates
            ]
        rates_str = '\n'.join(rates_str_lst)

        logging.debug(' '.join([self.__class__.__name__,
                                ": check_exchange_rates()\n", rates_str]))

        return rates_str_lst
예제 #2
0
class OpenExchangeRatesAdapter(BaseAdapter):
    """This adapter uses openexchangerates.org service to populate currency and
    exchange rate models.
    """

    API_KEY_SETTINGS_KEY = 'OPENEXCHANGERATES_API_KEY'

    def __init__(self):
        self.client = OpenExchangeRatesClient(
            getattr(settings, self.API_KEY_SETTINGS_KEY))

    def get_currencies(self):
        return self.client.currencies().items()

    def get_exchangerates(self, base):
        return self.client.latest(base)['rates'].items()
예제 #3
0
class OpenExchangeRatesAdapter(BaseAdapter):
    """This adapter uses openexchangerates.org service to populate currency and
    exchange rate models.

    """

    API_KEY_SETTINGS_KEY = 'OPENEXCHANGERATES_API_KEY'

    def __init__(self):
        self.client = OpenExchangeRatesClient(
            getattr(settings, self.API_KEY_SETTINGS_KEY))

    def get_currencies(self):
        return self.client.currencies().items()

    def get_exchangerates(self, code):
        return self.client.latest(code)['rates'].items()
예제 #4
0
class OpenExchangeRateConnector:
    def __init__(self, api_key):
        self.client = OpenExchangeRatesClient(api_key)

    def get_all_rates(self):
        currencies = self.client.currencies()
        latest = self.client.latest()['rates']

        rates = []

        for currency in currencies:
            short_name = currency

            if short_name not in settings.CURRENCY_FILTER:
                continue

            full_name = currencies[currency]
            exchange_rate = latest[currency]

            rates.append(ExchangeRateData(short_name=short_name, full_name=full_name, exchange_rate=exchange_rate))
        return rates
예제 #5
0
    def handle(self, *args, **options):
        self.verbose = int(options.get('verbosity', 0))
        self.options = options

        self.force = self.options['force']

        self.imports = [e for e in self.options['import'] if e]

        client = OpenExchangeRatesClient(APP_ID)
        if self.verbose >= 1:
            self.stdout.write("Querying database at %s" % (client.ENDPOINT_CURRENCIES))

        symbols = {}
        with open(self.file_path) as df:
            symbols = json.load(df)

        currencies = client.currencies()
        for code in sorted(currencies.keys()):
            if (not self.imports) or code in self.imports:
                if not C._default_manager.filter(code=code) or self.force is True:
                    if self.verbose >= 1:
                        self.stdout.write("Creating %r (%s)" % (currencies[code], code))

                    c, created = C._default_manager.get_or_create(code=code)
                    if created is True:
                        C._default_manager.filter(pk=c.pk).update(name=currencies[code], is_active=False)

                    if bool(c.symbol) and self.force is False:
                        continue

                    symbol = symbols.get(c.code)
                    if symbol is not None:
                        C._default_manager.filter(pk=c.pk).update(symbol=symbol)
                else:
                    if self.verbose >= 1:
                        self.stdout.write("Skipping %r (%s)" % (currencies[code], code))