Skip to content

Commit

Permalink
add some new features
Browse files Browse the repository at this point in the history
  • Loading branch information
GLEF1X committed Apr 2, 2021
1 parent 8c54f46 commit 82ac848
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 27 deletions.
36 changes: 29 additions & 7 deletions glQiwiApi/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from enum import Enum
from http.cookies import SimpleCookie
from typing import Literal, Optional, Union, Dict, List, Any

from aiohttp.typedefs import RawHeaders
from aiosocksy import Socks5Auth, Socks4Auth

Expand Down Expand Up @@ -70,26 +71,47 @@ class WrapperData:
cookies: Optional[Dict[str, Union[str, int]]] = None


class InvalidCardNumber(Exception):
pass


@dataclass
class Sum:
amount: Union[int, float]
amount: Union[int, float, str]
currency: str


@dataclass(frozen=True)
class Transaction:
transaction_id: int
""" ID транзакции в сервисе QIWI Кошелек"""

person_id: int
"""Номер кошелька"""

date: str
"""
Для запросов истории платежей - Дата/время платежа, во временной зоне запроса (см. параметр startDate).
Для запросов данных о транзакции - Дата/время платежа, время московское
"""

type: Literal['IN', 'OUT', 'QIWI_CARD']
"""
Тип платежа. Возможные значения:
IN - пополнение,
OUT - платеж,
QIWI_CARD - платеж с карт QIWI (QVC, QVP).
"""
sum: Sum
"""Данные о сумме платежа или пополнения."""

commission: Sum
"""Данные о комиссии"""

total: Sum
"""Общие данные о платеже в формате объекта Sum"""

to_account: str
"""
Для платежей - номер счета получателя.
Для пополнений - номер отправителя, терминала или название агента пополнения кошелька
"""
comment: Optional[str] = None


Expand Down Expand Up @@ -126,7 +148,7 @@ class Limit:

@dataclass
class BillStatus:
status: Literal['WAITING', 'PAID', 'REJECTED', 'EXPIRED']
value: Literal['WAITING', 'PAID', 'REJECTED', 'EXPIRED']
changedDateTime: str


Expand Down Expand Up @@ -512,7 +534,7 @@ class IncomingTransaction:


__all__ = (
'Response', 'Bill', 'Commission', 'Limit', 'Identification', 'InvalidCardNumber', 'WrapperData',
'Response', 'Bill', 'Commission', 'Limit', 'Identification', 'WrapperData',
'Transaction', 'ProxyService',
'proxy_list', 'AccountInfo', 'OperationType', 'ALL_OPERATION_TYPES', 'Operation', 'OperationDetails',
'PreProcessPaymentResponse', 'Payment', 'IncomingTransaction'
Expand Down
6 changes: 5 additions & 1 deletion glQiwiApi/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ class RequestProxyError(Exception):
ProxyError = Exception()


class InvalidCardNumber(Exception):
"""Ошибка, при передаче номера карты в неправильном формате"""


class RequestAuthError(Exception):
"""
Ошибка при неправильной аунтефикации POST or GET data
Expand All @@ -20,4 +24,4 @@ class InvalidData(Exception):
"""Ошибка возникает, если были переданы или получены невалид данные при запросе"""


__all__ = ('InvalidData', 'NoUrlFound', 'RequestAuthError', 'RequestProxyError', 'ProxyError')
__all__ = ('InvalidData', 'NoUrlFound', 'RequestAuthError', 'RequestProxyError', 'ProxyError', 'InvalidCardNumber')
3 changes: 2 additions & 1 deletion glQiwiApi/qiwi/basic_qiwi_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,8 @@
'creationDateTime': 'creation_date_time',
'expirationDateTime': 'expiration_date_time',
'payUrl': 'pay_url',
'customFields': 'custom_fields'
'customFields': 'custom_fields',
'value': 'amount'
}

LIMIT_TYPES = ['TURNOVER', 'REFILL', 'PAYMENTS_P2P', 'PAYMENTS_PROVIDER_INTERNATIONALS', 'PAYMENTS_PROVIDER_PAYOUT',
Expand Down
24 changes: 12 additions & 12 deletions glQiwiApi/qiwi/qiwi_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@

from glQiwiApi.abstracts import AbstractPaymentWrapper
from glQiwiApi.api import HttpXParser
from glQiwiApi.qiwi.basic_qiwi_config import *
from glQiwiApi.data import Response, InvalidCardNumber, Transaction, Identification, Limit, \
from glQiwiApi.data import Response, Transaction, Identification, Limit, \
Bill, Commission
from glQiwiApi.exceptions import InvalidData
from glQiwiApi.exceptions import InvalidData, InvalidCardNumber
from glQiwiApi.qiwi.basic_qiwi_config import *
from glQiwiApi.utils import datetime_to_str_in_iso, DataFormatter


Expand Down Expand Up @@ -140,17 +140,17 @@ async def transactions(
self,
rows_num: int = 50,
operation: Literal['ALL', 'IN', 'OUT', 'QIWI_CARD', 'ALL'] = 'ALL',
start_date: Optional[Union[str, datetime]] = None,
end_date: Optional[Union[str, datetime]] = None
start_date: Optional[datetime] = None,
end_date: Optional[datetime] = None
) -> Union[Optional[List[Transaction]], dict]:
"""
Метод для получения транзакций на счёту
Более подробная документация https://developer.qiwi.com/ru/qiwi-wallet-personal/?http#payments_list
:param rows_num: кол-во транзакций, которые вы хотите получить
:param operation: Тип операций в отчете, для отбора.
:param start_date:Начальная дата поиска платежей. Используется только вместе с endDate.
:param end_date: онечная дата поиска платежей. Используется только вместе со startDate.
:param start_date:Начальная дата поиска платежей. Используется только вместе с end_date.
:param end_date: онечная дата поиска платежей. Используется только вместе со start_date.
"""
if rows_num > 50:
Expand All @@ -160,11 +160,11 @@ async def transactions(
'rows': rows_num,
'operation': operation
}
if isinstance(start_date, (datetime, str)) and isinstance(end_date, (datetime, str)):
if isinstance(start_date, datetime) and isinstance(end_date, datetime):
payload_data.update(
{
'startDate': start_date,
'endDate': end_date
'startDate': datetime_to_str_in_iso(start_date),
'endDate': datetime_to_str_in_iso(end_date)
}
)
async for response in self._parser.fast().fetch(
Expand Down Expand Up @@ -307,7 +307,7 @@ async def check_transaction(
raise InvalidData('Можно проверять не более 50 транзакций')
transactions = await self.transactions(rows_num=rows_num)
for transaction in transactions:
if float(transaction.sum.get('amount')) >= amount and transaction.type == transaction_type:
if float(transaction.sum.amount) >= amount and transaction.type == transaction_type:
if transaction.comment == comment and transaction.to_account == sender_number:
return True
elif comment and sender_number:
Expand Down Expand Up @@ -508,7 +508,7 @@ async def check_p2p_bill_status(self, bill_id: str) -> Literal['WAITING', 'PAID'
iterable_obj=(response.response_data,),
transfers=P2P_BILL_TRANSFER,
obj=Bill
)[0].status['value']
)[0].status.value
except (IndexError, KeyError):
raise ConnectionError('Не удалось создать p2p bill. Проверьте ваши токены.') from None

Expand Down
3 changes: 2 additions & 1 deletion glQiwiApi/types.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from typing import Union, Any, Callable, TypeVar
from glQiwiApi.data import Transaction, Commission, Bill, Limit, Identification, WrapperData, AccountInfo, Operation, \

from glQiwiApi.data import Transaction, Commission, Bill, Limit, Identification, AccountInfo, Operation, \
OperationDetails, PreProcessPaymentResponse, Payment, IncomingTransaction

BasicTypes = Union[Transaction, Identification, Limit, Bill, Commission, AccountInfo, Operation, OperationDetails,
Expand Down
21 changes: 16 additions & 5 deletions glQiwiApi/utils.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import functools as ft
import re
import time
from copy import deepcopy
from dataclasses import is_dataclass
from datetime import datetime
import functools as ft
from typing import Optional, Union, Type

import pytz
Expand All @@ -22,7 +21,7 @@ async def wrapper(*args, **kwargs):
return wrapper


def datetime_to_str_in_iso(obj, yoo_money_format):
def datetime_to_str_in_iso(obj, yoo_money_format=False):
if not isinstance(obj, datetime):
return ''
if yoo_money_format:
Expand Down Expand Up @@ -55,6 +54,15 @@ def parse_headers(content_json=False, auth=False):
return headers


def format_objects_for_fill(data, transfers):
for key, value in data.copy().items():
if hasattr(transfers, 'get'):
if key in transfers.keys():
data.update({transfers.get(key): value})
data.pop(key)
return data


class DataFormatter:

@staticmethod
Expand All @@ -67,7 +75,7 @@ def set_data_to_wallet(data, to_number, trans_sum, comment, currency):
return data

def format_objects(self, iterable_obj, obj, transfers=None):
"""Метод для форматирования объектов, которые приходят от апи"""
"""Метод для форматирования объектов, которые приходят от апи, pydantic usage soon..."""
kwargs = {}
objects = []
for transaction in iterable_obj:
Expand All @@ -79,7 +87,10 @@ def format_objects(self, iterable_obj, obj, transfers=None):
fill_key = key
sp_obj: Optional[Union[str, Type]] = obj.__dict__.get('__annotations__').get(fill_key)
if is_dataclass(sp_obj):
kwargs.update({fill_key: sp_obj(**value)})
try:
kwargs.update({fill_key: sp_obj(**value)})
except TypeError:
kwargs.update({fill_key: sp_obj(**format_objects_for_fill(value, transfers))})
continue
kwargs.update({fill_key: value})
objects.append(obj(**kwargs))
Expand Down
3 changes: 3 additions & 0 deletions glQiwiApi/utils.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ def measure_time(func: types.F) -> None: ...
def datetime_to_str_in_iso(obj: datetime, yoo_money_format: bool = False) -> str: ...


def format_objects_for_fill(data: dict, transfers: Dict[str, str]) -> dict: ...


def parse_auth_link(response_data: Union[str, bytes]) -> Optional[str]: ...


Expand Down

0 comments on commit 82ac848

Please sign in to comment.