Esempio n. 1
0
def parse_vkurse():
    from rate.models import Rate
    url = 'http://vkurse.dp.ua/course.json'
    response = requests.get(url)
    # print(response.json())
    currency_mapper = {
        'Dollar': mch.CURRENCY_USD,
        'Euro': mch.CURRENCY_EUR,
    }
    for r in response.json():
        if r not in currency_mapper:
            # print('r[xxxxxxx]', r)
            continue
        sale = to_decimal(response.json()[r]['sale'])
        buy = to_decimal(response.json()[r]['buy'])
        currency = currency_mapper[r]
        latest_rate = Rate.objects.filter(
            source=mch.SOURCE_VKURSE,
            currency=currency,
        ).last()  # Rate() or None
        print('!!VKURSE!!!!', latest_rate.source, latest_rate.currency,
              latest_rate.sale, latest_rate.buy)
        # Rate.objects.create(
        #     source=mch.SOURCE_VKURSE,
        #     currency=currency,
        #     buy=buy,
        #     sale=sale,
        # )
        if latest_rate is None or latest_rate.sale != sale or latest_rate.buy != buy:
            Rate.objects.create(
                source=mch.SOURCE_VKURSE,
                currency=currency,
                buy=buy,
                sale=sale,
            )
Esempio n. 2
0
def parse_nbu():
    url = "https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?json"
    response = requests.get(url)
    currency_type_mapper = {
        # DICT KEY = currency code according to ISO 4217
        840: mch.CURRENCY_USD,
        978: mch.CURRENCY_EUR,
        643: mch.CURRENCY_RUR,
    }
    for item in response.json():

        if item['r030'] not in currency_type_mapper:
            continue
        currency = currency_type_mapper[item['r030']]
        buy = to_decimal(item['rate'])
        sale = to_decimal('0.0')  # NBU HAS NO SALE RATE

        last = Rate.objects.filter(
            source=mch.SOURCE_NBU,
            currency=currency,
        ).last()

        if last is None or last.buy != buy:
            Rate.objects.create(
                buy=buy,
                sale=sale,
                source=mch.SOURCE_NBU,
                currency=currency,
            )
Esempio n. 3
0
def parse_monobank():
    from monobank_api import BaseAPI
    from rate.models import Rate
    mono = BaseAPI()
    response = mono.get_currency()
    # print('response!!!!!!!!!!!!!!!!!!!', response[0])
    currency_mapper = {
        '840': mch.CURRENCY_USD,
        '978': mch.CURRENCY_EUR,
    }
    for r in response:
        # print(r['currencyCodeA'])
        if (str(r['currencyCodeA'])
                not in currency_mapper) or str(r['currencyCodeB']) != '980':
            # print(r['currencyCodeA'] * 10)
            continue
        sale = to_decimal(r['rateSell'])
        buy = to_decimal(r['rateBuy'])
        currency = currency_mapper[str(r['currencyCodeA'])]
        latest_rate = Rate.objects.filter(
            source=mch.SOURCE_MONOBANK,
            currency=currency,
        ).last()  # Rate() or None
        print('!!!MONOBANK!!!!', latest_rate.source, latest_rate.currency,
              latest_rate.sale, latest_rate.buy)
        if latest_rate is None or latest_rate.sale != sale or latest_rate.buy != buy:
            Rate.objects.create(
                source=mch.SOURCE_MONOBANK,
                currency=currency,
                buy=buy,
                sale=sale,
            )
Esempio n. 4
0
def parse_pumb():
    from rate.models import Rate
    url = 'https://retail.pumb.ua/'
    response = requests.get(url)
    response.raise_for_status()
    source = choices.SOURCE_PUMB
    soup = BeautifulSoup(response.content, 'lxml')
    table = soup.find('table')
    buy_usd = table.find_all('tr')[1].find_all('td')[1].text
    sale_usd = table.find_all('tr')[1].find_all('td')[2].text
    buy_euro = table.find_all('tr')[2].find_all('td')[1].text
    sale_euro = table.find_all('tr')[2].find_all('td')[2].text
    usd = dict(ccy='USD', buy=buy_usd, sale=sale_usd)
    euro = dict(ccy='EUR', buy=buy_euro, sale=sale_euro)
    data = [usd, euro]
    currency_map = {
        'USD': choices.CURRENCY_USD,
        'EUR': choices.CURRENCY_EUR,
    }
    for row in data:
        if row['ccy'] in currency_map:
            buy = to_decimal(row['buy'])
            sale = to_decimal(row['sale'])
            currency = currency_map[row['ccy']]
            last_rate = Rate.objects.filter(source=source,
                                            currency=currency).last()
            if last_rate is None or buy != last_rate.buy or sale != last_rate.sale:
                Rate.objects.create(currency=currency,
                                    source=source,
                                    sale=sale,
                                    buy=buy)
Esempio n. 5
0
def parse_kredobank():
    from rate.models import Rate
    url = 'https://kredobank.com.ua/info/kursy-valyut/commercial'
    response = requests.get(url)
    response.raise_for_status()
    source = choices.SOURCE_KREDOBANK
    soup = BeautifulSoup(response.content, 'lxml')
    table = soup.find('table')
    buy_usd = int(table.find_all('tr')[1].find_all('td')[3].text) / 100
    sale_usd = int(table.find_all('tr')[1].find_all('td')[2].text) / 100
    buy_euro = int(table.find_all('tr')[2].find_all('td')[3].text) / 100
    sale_euro = int(table.find_all('tr')[2].find_all('td')[2].text) / 100
    usd = dict(ccy='USD', buy=buy_usd, sale=sale_usd)
    euro = dict(ccy='EUR', buy=buy_euro, sale=sale_euro)
    data = [usd, euro]
    currency_map = {
        'USD': choices.CURRENCY_USD,
        'EUR': choices.CURRENCY_EUR,
    }
    for row in data:
        if row['ccy'] in currency_map:
            buy = to_decimal(row['buy'])
            sale = to_decimal(row['sale'])
            currency = currency_map[row['ccy']]
            last_rate = Rate.objects.filter(source=source,
                                            currency=currency).last()
            if last_rate is None or buy != last_rate.buy or sale != last_rate.sale:
                Rate.objects.create(currency=currency,
                                    source=source,
                                    sale=sale,
                                    buy=buy)
Esempio n. 6
0
def parse_nbu():
    from rate.models import Rate
    url = 'https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?json'
    response = requests.get(url)
    # print(response.json())
    currency_mapper = {
        'USD': mch.CURRENCY_USD,
        'EUR': mch.CURRENCY_EUR,
    }
    for r in response.json():
        if r['cc'] not in currency_mapper:
            continue
        sale = to_decimal(r['rate'])
        buy = to_decimal(r['rate'])
        currency = currency_mapper[r['cc']]
        latest_rate = Rate.objects.filter(
            source=mch.SOURCE_NBU,
            currency=currency,
        ).last()  # Rate() or None
        # Rate.objects.create(
        #     source=mch.SOURCE_NBU,
        #     currency=currency,
        #     buy=buy,
        #     sale=sale,
        # )
        if latest_rate is None or latest_rate.sale != sale or latest_rate.buy != buy:
            Rate.objects.create(
                source=mch.SOURCE_NBU,
                currency=currency,
                buy=buy,
                sale=sale,
            )
        print('!!!NBU!!!!', latest_rate.source, latest_rate.currency,
              latest_rate.sale, latest_rate.buy)
Esempio n. 7
0
def parse_privatbank():
    url = "https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5"
    response = requests.get(url)
    currency_type_mapper = {
        'USD': mch.CURRENCY_USD,
        'EUR': mch.CURRENCY_EUR,
        'RUR': mch.CURRENCY_RUR,
        'BTC': mch.CURRENCY_BTC,
    }
    for item in response.json():

        if item['ccy'] not in currency_type_mapper:
            continue

        buy = to_decimal(item['buy'])
        sale = to_decimal(item['sale'])

        last = Rate.objects.filter(
            source=mch.SOURCE_PRIVATBANK,
            currency=currency_type_mapper[item['ccy']],
        ).last()

        if last is None or last.buy != buy or last.sale != sale:
            Rate.objects.create(
                buy=buy,
                sale=sale,
                source=mch.SOURCE_PRIVATBANK,
                currency=currency_type_mapper[item['ccy']],
            )
Esempio n. 8
0
def parse_pumb():
    url = 'https://www.pumb.ua/'
    response = requests.get(url)
    currency_type_mapper = {
        'USD': mch.CURRENCY_USD,
        'EUR': mch.CURRENCY_EUR,
        'RUB': mch.CURRENCY_RUR,
    }

    soup = bs4.BeautifulSoup(response.text, 'lxml')
    data = soup.find('div', {'class': 'exchange-rate'})
    chunk_data = data.find('table').find_all('tr')

    for item in chunk_data:
        if item.find_all('td'):
            currency = item.find_all('td')[0].text.strip()
            if currency not in currency_type_mapper:
                continue

            buy = to_decimal(item.find_all('td')[1].text.strip())
            sale = to_decimal(item.find_all('td')[2].text.strip())

            last = Rate.objects.filter(
                source=mch.SOURCE_PUMB,
                currency=currency_type_mapper[currency],
            ).last()

            if last is None or last.buy != buy or last.sale != sale:
                Rate.objects.create(
                    buy=buy,
                    sale=sale,
                    source=mch.SOURCE_PUMB,
                    currency=currency_type_mapper[currency],
                )
Esempio n. 9
0
def parse_monobank():
    url = "https://api.monobank.ua/bank/currency"
    response = requests.get(url)
    currency_type_mapper = {
        # DICT KEY = currency code according to ISO 4217
        840: mch.CURRENCY_USD,
        978: mch.CURRENCY_EUR,
        643: mch.CURRENCY_RUR
    }
    for item in response.json():

        if item['currencyCodeA'] not in currency_type_mapper:
            continue
        if item['currencyCodeB'] != 980:  # 980 = UAH
            continue

        buy = to_decimal(item['rateBuy'])
        sale = to_decimal(item['rateSell'])

        last = Rate.objects.filter(
            source=mch.SOURCE_MONOBANK,
            currency=currency_type_mapper[item['currencyCodeA']],
        ).last()

        if last is None or last.buy != buy or last.sale != sale:
            Rate.objects.create(
                buy=buy,
                sale=sale,
                source=mch.SOURCE_MONOBANK,
                currency=currency_type_mapper[item['currencyCodeA']],
            )
Esempio n. 10
0
def parse_vkurse():
    url = "http://vkurse.dp.ua/course.json"
    response = requests.get(url)
    currency_type_mapper = {
        'Dollar': mch.CURRENCY_USD,
        'Euro': mch.CURRENCY_EUR,
        'Rub': mch.CURRENCY_RUR,
    }
    for key, value in response.json().items():
        if key not in currency_type_mapper:
            continue

        buy = to_decimal(value['buy'])
        sale = to_decimal(value['sale'])

        last = Rate.objects.filter(
            source=mch.SOURCE_VKURSE,
            currency=currency_type_mapper[key],
        ).last()

        if last is None or last.buy != buy or last.sale != sale:
            Rate.objects.create(
                buy=buy,
                sale=sale,
                source=mch.SOURCE_VKURSE,
                currency=currency_type_mapper[key],
            )
Esempio n. 11
0
def parse_privatbank():
    from rate.models import Rate
    url = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5'
    response = requests.get(url)
    # print(response.json())
    currency_mapper = {
        'USD': mch.CURRENCY_USD,
        'EUR': mch.CURRENCY_EUR,
    }
    for r in response.json():
        if r['ccy'] not in currency_mapper:
            continue
        sale = to_decimal(r['sale'])
        buy = to_decimal(r['buy'])
        currency = currency_mapper[r['ccy']]
        latest_rate = Rate.objects.filter(
            source=mch.SOURCE_PRIVATBANK,
            currency=currency,
        ).last()  # Rate() or None
        if latest_rate is None or latest_rate.sale != sale or latest_rate.buy != buy:
            Rate.objects.create(
                source=mch.SOURCE_PRIVATBANK,
                currency=currency,
                buy=buy,
                sale=sale,
            )
        print('!!!PRIVAT!!!!', latest_rate.source, latest_rate.currency,
              latest_rate.sale, latest_rate.buy)
Esempio n. 12
0
def parse_aval():
    rate = []
    page = requests.get(
        'https://ex.aval.ua/ru/personal/everyday/exchange/exchange/',
        timeout=5)
    currency_type_mapper = {
        'Доллары США': mch.CURRENCY_TYPE_USD,
        'Евро': mch.CURRENCY_TYPE_EUR,
        'Рубли': mch.CURRENCY_TYPE_RUR,
    }

    soup = BeautifulSoup(page.text, "html.parser")
    body_currency = soup.findAll('div', class_='body-currency')

    temp = body_currency[0].findAll('td')

    for i in temp:
        rate.append(i.text)

    for item in rate:
        if item not in currency_type_mapper:
            continue
        currency_type = currency_type_mapper[item]
        item = rate.index(item)

        # buy
        amount = to_decimal(rate[item + 1].replace(',', '.'))

        last = Rate.objects.filter(
            source=mch.SOURCE_AVAL,
            currency_type=currency_type,
            type_rate=mch.RATE_TYPE_BUY,
        ).last()

        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_AVAL,
                currency_type=currency_type,
                type_rate=mch.RATE_TYPE_BUY,
            )

        # sale
        amount = to_decimal(rate[item + 2].replace(',', '.'))

        last = Rate.objects.filter(
            source=mch.SOURCE_AVAL,
            currency_type=currency_type,
            type_rate=mch.RATE_TYPE_SALE,
        ).last()

        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_AVAL,
                currency_type=currency_type,
                type_rate=mch.RATE_TYPE_SALE,
            )
Esempio n. 13
0
def parse_nbu():
    response = requests.get('https://bank.gov.ua/NBU_Exchange/exchange?json',
                            timeout=5)

    currency_type_mapper = {
        '840': mch.CURRENCY_TYPE_USD,
        '978': mch.CURRENCY_TYPE_EUR,
        '643': mch.CURRENCY_TYPE_RUR,
    }

    for item in response.json():
        if item['CurrencyCode'] not in currency_type_mapper:
            continue
        currency_type = currency_type_mapper[item['CurrencyCode']]

        if currency_type == mch.CURRENCY_TYPE_RUR:
            amount = to_decimal(item['Amount'] / 10)
        else:
            amount = to_decimal(item['Amount'])

        # buy
        last = Rate.objects.filter(
            source=mch.SOURCE_NBU,
            currency_type=currency_type,
            type_rate=mch.RATE_TYPE_BUY,
        ).last()

        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_NBU,
                currency_type=currency_type,
                type_rate=mch.RATE_TYPE_BUY,
            )

        if currency_type == mch.CURRENCY_TYPE_RUR:
            amount = to_decimal(item['Amount'] / 10)
        else:
            amount = to_decimal(item['Amount'])

        # sale
        last = Rate.objects.filter(
            source=mch.SOURCE_NBU,
            currency_type=currency_type,
            type_rate=mch.RATE_TYPE_SALE,
        ).last()

        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_NBU,
                currency_type=currency_type,
                type_rate=mch.RATE_TYPE_SALE,
            )
Esempio n. 14
0
    def handle(self, *args, **options):
        def date_generator():
            end_date = datetime.now().date()
            start_date = end_date - relativedelta(years=4)
            while start_date <= end_date:
                yield start_date.strftime("%d.%m.%Y")
                start_date += timedelta(days=1)

        for archive_date in date_generator():
            time.sleep(10)
            url = f'https://api.privatbank.ua/p24api/exchange_rates?json&date={archive_date}'
            response = requests.get(url)
            currency_type_mapper = {
                'USD': mch.CURRENCY_USD,
                'EUR': mch.CURRENCY_EUR,
                'RUB': mch.CURRENCY_RUR,
                'BTC': mch.CURRENCY_BTC,
            }

            for item in response.json()['exchangeRate']:
                if 'currency' in item:
                    if item['currency'] not in currency_type_mapper:
                        continue
                    currency = currency_type_mapper[item['currency']]
                    buy = to_decimal(item['purchaseRate'])
                    sale = to_decimal(item['saleRate'])

                    format_date = datetime.strptime(
                        archive_date,
                        '%d.%m.%Y').strftime('%Y-%m-%d %H:%M:%S.%f')
                    lookup_date = datetime.strptime(
                        format_date, '%Y-%m-%d %H:%M:%S.%f')  # datetime object

                    latest_rate = Rate.objects.filter(
                        source=mch.SOURCE_PRIVATBANK,
                        currency=currency,
                        created=lookup_date,
                    ).last()
                    """
                    following compare condition helps to exclude duplicates and fill the voids in data
                    """
                    if latest_rate is None or latest_rate.buy != buy or latest_rate.sale != sale:
                        rate = Rate.objects.create(
                            created=lookup_date,
                            buy=buy,
                            sale=sale,
                            source=mch.SOURCE_PRIVATBANK,
                            currency=currency,
                        )
                        rate.created = format_date
                        rate.save(
                            update_fields=['created']
                        )  # avoids 'auto_now_add' restriction to pass own date
Esempio n. 15
0
def parse_monobank():
    url = 'https://api.monobank.ua/bank/currency'
    response = requests.get(url, timeout=5)
    currency_type_mapper = {
        840: mch.CURRENCY_TYPE_USD,
        978: mch.CURRENCY_TYPE_EUR,
        643: mch.CURRENCY_TYPE_RUR,
    }

    for item in response.json():

        if item['currencyCodeA'] not in currency_type_mapper or item[
                'currencyCodeB'] != 980:
            continue

        currency_type = currency_type_mapper[item['currencyCodeA']]

        # buy
        amount = to_decimal(item['rateBuy'])

        last = Rate.objects.filter(
            source=mch.SOURCE_MONOBANK,
            currency_type=currency_type,
            type_rate=mch.RATE_TYPE_BUY,
        ).last()

        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_MONOBANK,
                currency_type=currency_type,
                type_rate=mch.RATE_TYPE_BUY,
            )

        # sale
        amount = to_decimal(item['rateSell'])

        last = Rate.objects.filter(
            source=mch.SOURCE_MONOBANK,
            currency_type=currency_type,
            type_rate=mch.RATE_TYPE_SALE,
        ).last()

        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_MONOBANK,
                currency_type=currency_type,
                type_rate=mch.RATE_TYPE_SALE,
            )
Esempio n. 16
0
def parse_monobank():
    url = 'https://api.monobank.ua/bank/currency'
    response = requests.get(url)
    currency_type_mapper = {
        840: mch.CURRENCY_TYPE_USD,
        978: mch.CURRENCY_TYPE_EUR,
    }

    for item in response.json():
        if item['currencyCodeA'] not in currency_type_mapper:
            continue

        if item['currencyCodeB'] == 980:

            currency_type = currency_type_mapper[item['currencyCodeA']]

            # buy
            rate = to_decimal(item['rateBuy'])

            last = Rate.objects.filter(
                source=mch.SOURCE_MONOBANK,
                currency_type=currency_type,
                rate_type=mch.RATE_TYPE_BUY,
            ).last()

            if last is None or last.rate != rate:
                Rate.objects.create(
                    rate=rate,
                    source=mch.SOURCE_MONOBANK,
                    currency_type=currency_type,
                    rate_type=mch.RATE_TYPE_BUY,
                )

            # sale

            rate = to_decimal(item['rateSell'])

            last = Rate.objects.filter(
                source=mch.SOURCE_MONOBANK,
                currency_type=currency_type,
                rate_type=mch.RATE_TYPE_SALE,
            ).last()

            if last is None or last.rate != rate:
                Rate.objects.create(
                    rate=rate,
                    source=mch.SOURCE_MONOBANK,
                    currency_type=currency_type,
                    rate_type=mch.RATE_TYPE_SALE,
                )
Esempio n. 17
0
def parse_privatbank():
    url = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5'
    response = requests.get(url, timeout=5)
    currency_type_mapper = {
        'USD': mch.CURRENCY_TYPE_USD,
        'EUR': mch.CURRENCY_TYPE_EUR,
        'RUR': mch.CURRENCY_TYPE_RUR,
    }

    for item in response.json():

        if item['ccy'] not in currency_type_mapper:
            continue

        currency_type = currency_type_mapper[item['ccy']]

        # buy
        amount = to_decimal(item['buy'])

        last = Rate.objects.filter(
            source=mch.SOURCE_PRIVATBANK,
            currency_type=currency_type,
            type_rate=mch.RATE_TYPE_BUY,
        ).last()

        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_PRIVATBANK,
                currency_type=currency_type,
                type_rate=mch.RATE_TYPE_BUY,
            )

        # sale
        amount = to_decimal(item['sale'])

        last = Rate.objects.filter(
            source=mch.SOURCE_PRIVATBANK,
            currency_type=currency_type,
            type_rate=mch.RATE_TYPE_SALE,
        ).last()

        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_PRIVATBANK,
                currency_type=currency_type,
                type_rate=mch.RATE_TYPE_SALE,
            )
    def handle(self, *args, **options):
        start_date = date(2015, 1, 1)
        end_date = date.today()

        currency_type_mapper = {
            'USD': mch.CURRENCY_TYPE_USD,
            'EUR': mch.CURRENCY_TYPE_EUR,
        }

        for single_date in date_range(start_date, end_date):
            url = f'https://api.privatbank.ua/p24api/exchange_rates?json&date={single_date.strftime("%d.%m.%Y")}'
            response = requests.get(url).json()
            for item in response['exchangeRate']:
                if 'currency' not in item or item[
                        'currency'] not in currency_type_mapper:
                    continue

                currency_type = currency_type_mapper[item['currency']]

                # buy
                rate = to_decimal(item['purchaseRate']
                                  ) if 'purchaseRate' in item else to_decimal(
                                      item['purchaseRateNB'])

                rate = Rate.objects.create(
                    rate=rate,
                    source=mch.SOURCE_PRIVATBANK,
                    currency_type=currency_type,
                    rate_type=mch.RATE_TYPE_BUY,
                )

                rate.created = single_date
                rate.save()

                # sale
                rate = to_decimal(
                    item['saleRate']) if 'saleRate' in item else to_decimal(
                        item['saleRateNB'])

                rate = Rate.objects.create(
                    rate=rate,
                    source=mch.SOURCE_PRIVATBANK,
                    currency_type=currency_type,
                    rate_type=mch.RATE_TYPE_SALE,
                )

                rate.created = single_date
                rate.save()
Esempio n. 19
0
def parse_vkurse():
    response = requests.get('http://vkurse.dp.ua/course.json', timeout=5)
    currency_type_mapper = {
        'Dollar': mch.CURRENCY_TYPE_USD,
        'Euro': mch.CURRENCY_TYPE_EUR,
        'Rub': mch.CURRENCY_TYPE_RUR,
    }

    for key, value in response.json().items():
        if key not in currency_type_mapper:
            continue

        currency_type = currency_type_mapper[key]

        # buy
        amount = to_decimal(value['buy'])

        last = Rate.objects.filter(
            source=mch.SOURCE_BUD_VSEGDA_V_KURSE,
            currency_type=currency_type,
            type_rate=mch.RATE_TYPE_BUY,
        ).last()

        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_BUD_VSEGDA_V_KURSE,
                currency_type=currency_type,
                type_rate=mch.RATE_TYPE_BUY,
            )

        # sale
        amount = to_decimal(value['sale'])
        # amount = to_decimal(value['sale'][0:-1])

        last = Rate.objects.filter(
            source=mch.SOURCE_BUD_VSEGDA_V_KURSE,
            currency_type=currency_type,
            type_rate=mch.RATE_TYPE_SALE,
        ).last()

        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_BUD_VSEGDA_V_KURSE,
                currency_type=currency_type,
                type_rate=mch.RATE_TYPE_SALE,
            )
Esempio n. 20
0
def parse_aval():
    from rate.models import Rate

    url = 'https://ex.aval.ua/ru/personal/everyday/exchange/exchange/'

    response = requests.get(url)
    assert response.status_code == 200

    soup = BeautifulSoup(response.text, 'html.parser')
    mydivs = soup.findAll("div", {"class": "body-currency"})
    rates = mydivs[0].findAll('td', {'class': 'right'})

    rates = [to_decimal(rate.text.replace(',', '.')) for rate in rates]
    rates_to_save = [
        {'amount': rates[0], 'currency_type': mch.CURRENCY_TYPE_USD, 'type': mch.RATE_TYPE_SALE},
        {'amount': rates[1], 'currency_type': mch.CURRENCY_TYPE_USD, 'type': mch.RATE_TYPE_BUY},
        {'amount': rates[2], 'currency_type': mch.CURRENCY_TYPE_EUR, 'type': mch.RATE_TYPE_SALE},
        {'amount': rates[3], 'currency_type': mch.CURRENCY_TYPE_EUR, 'type': mch.RATE_TYPE_BUY},
    ]

    for rate in rates_to_save:
        amount = rate['amount']
        last = Rate.objects.filter(
            source=mch.SOURCE_AVAL,
            currency_type=rate['currency_type'],
            type=rate['type'],
        ).last()

        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_AVAL,
                currency_type=rate['currency_type'],
                type=rate['type'],
            )
Esempio n. 21
0
def parse_vkurse():
    url = 'http://vkurse.dp.ua/course.json'
    response = requests.get(url).json()

    currency_type_mapper = {
        'Dollar': mch.CURRENCY_TYPE_USD,
        'Euro': mch.CURRENCY_TYPE_EUR,
    }

    for item in response:
        if item not in currency_type_mapper:
            continue

        currency_type = currency_type_mapper[item]

        # buy
        rate = to_decimal(response[item]['buy'])
        last = Rate.objects.filter(
            source=mch.SOURCE_VKURSE,
            currency_type=currency_type,
            rate_type=mch.RATE_TYPE_BUY,
        ).last()

        if last is None or last.rate != rate:
            Rate.objects.create(
                rate=rate,
                source=mch.SOURCE_VKURSE,
                currency_type=currency_type,
                rate_type=mch.RATE_TYPE_BUY,
            )

        # sale
        rate = to_decimal(response[item]['sale'])
        last = Rate.objects.filter(
            source=mch.SOURCE_VKURSE,
            currency_type=currency_type,
            rate_type=mch.RATE_TYPE_SALE,
        ).last()

        if last is None or last.rate != rate:
            Rate.objects.create(
                rate=rate,
                source=mch.SOURCE_VKURSE,
                currency_type=currency_type,
                rate_type=mch.RATE_TYPE_SALE,
            )
Esempio n. 22
0
def parse_otpbank():
    current_date = date.today().strftime("%d.%m.%Y")
    url = f'https://ru.otpbank.com.ua/local/components/otp/utils.exchange_rate_arc/exchange_rate_by_date.php' \
          f'?curr_date={current_date}&ib_code=otp_bank_currency_rates'
    response = requests.get(url)
    response = response.json()
    currency_type_mapper = {
        'USD': mch.CURRENCY_TYPE_USD,
        'EUR': mch.CURRENCY_TYPE_EUR,
    }
    for item in response['items']:
        if item['NAME'] not in currency_type_mapper:
            continue
        currency_type = currency_type_mapper[item['NAME']]

        # BUY
        amount = to_decimal(item['BUY'])
        last = Rate.objects.filter(
            source=mch.SOURCE_OTPBANK,
            currency_type=currency_type,
            type=mch.RATE_TYPE_BUY,
        ).last()
        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_OTPBANK,
                currency_type=currency_type,
                type=mch.RATE_TYPE_BUY,
            )

        # SALE
        amount = to_decimal(item['SELL'])
        last = Rate.objects.filter(
            source=mch.SOURCE_OTPBANK,
            currency_type=currency_type,
            type=mch.RATE_TYPE_SALE,
        ).last()
        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_OTPBANK,
                currency_type=currency_type,
                type=mch.RATE_TYPE_SALE,
            )
Esempio n. 23
0
def parse_tascombank():
    url = 'https://tascombank.ua/api/currencies'
    response = requests.get(url)
    response = response.json()
    currency_type_mapper = {
        'USD': mch.CURRENCY_TYPE_USD,
        'EUR': mch.CURRENCY_TYPE_EUR,
    }
    for item in response[0]:
        if item['short_name'] not in currency_type_mapper or item['kurs_type_description'] != 'Обменный':
            continue
        currency_type = currency_type_mapper[item['short_name']]

        # BUY
        amount = to_decimal(item['kurs_buy'])
        last = Rate.objects.filter(
            source=mch.SOURCE_TASCOMBANK,
            currency_type=currency_type,
            type=mch.RATE_TYPE_BUY,
        ).last()
        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_TASCOMBANK,
                currency_type=currency_type,
                type=mch.RATE_TYPE_BUY,
            )

        # SALE
        amount = to_decimal(item['kurs_sale'])
        last = Rate.objects.filter(
            source=mch.SOURCE_TASCOMBANK,
            currency_type=currency_type,
            type=mch.RATE_TYPE_SALE,
        ).last()
        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_TASCOMBANK,
                currency_type=currency_type,
                type=mch.RATE_TYPE_SALE,
            )
Esempio n. 24
0
 def parse(day_to_parse):
     url = f'https://api.privatbank.ua/p24api/exchange_rates?json&date={day_to_parse.strftime("%d.%m.%Y")}'
     response = requests.get(url)
     response = response.json()
     currency_type_mapper = {
         'USD': mch.CURRENCY_TYPE_USD,
         'EUR': mch.CURRENCY_TYPE_EUR,
     }
     for item in response['exchangeRate']:
         if item['currency'] not in currency_type_mapper:
             continue
         currency_type = currency_type_mapper[item['currency']]
         # BUY
         amount = to_decimal(item['purchaseRate'])
         last = Rate.objects.filter(
             source=mch.SOURCE_PRIVATBANK,
             currency_type=currency_type,
             type=mch.RATE_TYPE_BUY,
         ).last()
         if last is None or last.amount != amount:
             Rate.objects.create(
                 created=day_to_parse,
                 amount=amount,
                 source=mch.SOURCE_PRIVATBANK,
                 currency_type=currency_type,
                 type=mch.RATE_TYPE_BUY,
             )
         # SALE
         amount = to_decimal(item['saleRate'])
         last = Rate.objects.filter(
             source=mch.SOURCE_PRIVATBANK,
             currency_type=currency_type,
             type=mch.RATE_TYPE_SALE,
         ).last()
         if last is None or last.amount != amount:
             Rate.objects.create(
                 created=day_to_parse,
                 amount=amount,
                 source=mch.SOURCE_PRIVATBANK,
                 currency_type=currency_type,
                 type=mch.RATE_TYPE_SALE,
             )
Esempio n. 25
0
def parse_nbu():
    current_date = date.today().strftime("%Y%m%d")
    url = f'https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?date={current_date}&json'
    response = requests.get(url)
    response = response.json()
    currency_type_mapper = {
        'USD': mch.CURRENCY_TYPE_USD,
        'EUR': mch.CURRENCY_TYPE_EUR,
    }
    for item in response:
        if item['cc'] not in currency_type_mapper:
            continue
        currency_type = currency_type_mapper[item['cc']]
        # BUY
        amount = to_decimal(item['rate'])
        last = Rate.objects.filter(
            source=mch.SOURCE_NBU,
            currency_type=currency_type,
            type=mch.RATE_TYPE_BUY,
        ).last()
        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_NBU,
                currency_type=currency_type,
                type=mch.RATE_TYPE_BUY,
            )
        # SALE
        amount = to_decimal(item['rate'])
        last = Rate.objects.filter(
            source=mch.SOURCE_NBU,
            currency_type=currency_type,
            type=mch.RATE_TYPE_SALE,
        ).last()
        if last is None or last.amount != amount:
            Rate.objects.create(
                amount=amount,
                source=mch.SOURCE_NBU,
                currency_type=currency_type,
                type=mch.RATE_TYPE_SALE,
            )
Esempio n. 26
0
 def handle(self, *args, **options):
     date_format = '%d.%m.%Y'
     created = datetime(2018, 1, 1)
     end = datetime.now()
     date_generated = [
         created + timedelta(days=x)
         for x in range(8, (end-created).days)
     ]
     for created in date_generated:
         created_str = created.strftime(date_format)
         url = 'https://api.privatbank.ua/p24api/exchange_rates'
         params = {'json': '', 'date': created_str}
         response = requests.get(url, params=params)
         response.raise_for_status()
         data = response.json()
         exchangeRate = data['exchangeRate']
         source = choices.SOURCE_PRIVATBANK
         currency_map = {
             'USD': choices.CURRENCY_USD,
             'EUR': choices.CURRENCY_EUR,
         }
         for row in exchangeRate:
             if row['currency'] in currency_map:
                 buy = to_decimal(row['purchaseRate'])
                 sale = to_decimal(row['saleRate'])
                 currency = currency_map[row['currency']]
                 last_rate = Rate.objects.filter(
                     source=source,
                     currency=currency,
                     created=created,
                 ).last()
                 if last_rate is None:
                     rate = Rate.objects.create(
                         currency=currency,
                         source=source,
                         sale=sale,
                         buy=buy,
                     )
                     rate.created = created
                     rate.save(update_fields=('created',))
Esempio n. 27
0
def parse_alfabank():
    url = 'https://alfabank.ua/'
    response = requests.get(url)
    currency_type_mapper = {
        'USD': mch.CURRENCY_USD,
        'EUR': mch.CURRENCY_EUR,
        'RUB': mch.CURRENCY_RUR,
    }
    soup = bs4.BeautifulSoup(response.text, 'lxml')
    data = soup.find_all('div', {'class': 'currency-block'})

    for item in data:
        if item.find(lambda span: len(span.attrs) == 2):
            currency = item.find('div', {'class': 'title'}).text.strip()
            if currency not in currency_type_mapper:
                continue

            buy = to_decimal(
                item.find('span', {
                    'data-currency': f'{currency}_BUY'
                }).text.strip())
            sale = to_decimal(
                item.find('span', {
                    'data-currency': f'{currency}_SALE'
                }).text.strip())

            last = Rate.objects.filter(
                source=mch.SOURCE_ALFABANK,
                currency=currency_type_mapper[currency],
            ).last()

            if last is None or last.buy != buy or last.sale != sale:
                Rate.objects.create(
                    buy=buy,
                    sale=sale,
                    source=mch.SOURCE_ALFABANK,
                    currency=currency_type_mapper[currency],
                )
Esempio n. 28
0
def test_edit_rate_admin_correct_payload(admin_client):
    rate = Rate.objects.last()
    url = reverse('rate:edit', kwargs={'pk': rate.id})

    payload = {
        'source': 1,
        'currency': 1,
        'buy': to_decimal(23.65),
        'sale': to_decimal(25.50),
        format: 'json'
    }  # test auxiliary funcs, just in case.
    response = admin_client.post(url, payload)
    assert response.status_code == 302
    edited_rate = Rate.objects.filter(id=rate.id).last()
    assert edited_rate.source == payload['source']
    assert edited_rate.currency == payload['currency']
    assert edited_rate.buy == payload['buy']
    assert edited_rate.sale == payload['sale']

    # check success redirect
    assert response['Location'] == reverse('rate:list')
    response = admin_client.post(url, payload, follow=True)
    assert response.status_code == 200
Esempio n. 29
0
def parse_monobank():
    from rate.models import Rate
    url = 'https://api.monobank.ua/bank/currency'
    response = requests.get(url)
    response.raise_for_status()
    data = response.json()[0:2]
    source = choices.SOURCE_MONOBANK
    currency_map = {
        840: choices.CURRENCY_USD,
        978: choices.CURRENCY_EUR,
    }
    for row in data:
        if row['currencyCodeA'] in currency_map:
            buy = to_decimal(row['rateBuy'])
            sale = to_decimal(row['rateSell'])
            currency = currency_map[row['currencyCodeA']]
            last_rate = Rate.objects.filter(source=source,
                                            currency=currency).last()
            if last_rate is None or buy != last_rate.buy or sale != last_rate.sale:
                Rate.objects.create(currency=currency,
                                    source=source,
                                    sale=sale,
                                    buy=buy)
Esempio n. 30
0
def parse_minora():
    from rate.models import Rate
    url = 'http://vkurse.dp.ua/course.json'
    response = requests.get(url)
    response.raise_for_status()
    data = response.json()
    source = choices.SOURCE_MINORA
    currency_map = {
        'Dollar': choices.CURRENCY_USD,
        'Euro': choices.CURRENCY_EUR,
    }
    for key in data:
        if key in currency_map:
            currency = currency_map[key]
            buy = to_decimal(data[key]['buy'])
            sale = to_decimal(data[key]['sale'])
            last_rate = Rate.objects.filter(source=source,
                                            currency=currency).last()
            if last_rate is None or buy != last_rate.buy or sale != last_rate.sale:
                Rate.objects.create(currency=currency,
                                    source=source,
                                    buy=buy,
                                    sale=sale)