This reverts merge request !421remotes/origin/revert-6d879fe8
parent
6d879fe871
commit
f5ceb3d130
7 changed files with 128 additions and 177 deletions
@ -1,16 +0,0 @@ |
|||||||
from django.core.management.base import BaseCommand |
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand): |
|
||||||
help = 'Команда для тестов' |
|
||||||
|
|
||||||
def handle(self, *args, **options): |
|
||||||
from finance.loggers import FinanceLogger |
|
||||||
logger = FinanceLogger() |
|
||||||
try: |
|
||||||
10 / 0 |
|
||||||
except Exception as exc: |
|
||||||
logger.exception('FinanceLogger test log record', extra={'asdf': 3246523}, |
|
||||||
invoice_id=42, exc={'a': 1, 'b': 3, 'привет': 'медвед'} |
|
||||||
) |
|
||||||
|
|
||||||
@ -1,56 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
|
|
||||||
import logging |
|
||||||
|
|
||||||
_logger = logging.getLogger('finance_data') |
|
||||||
|
|
||||||
|
|
||||||
class FinanceLogger: |
|
||||||
""" |
|
||||||
Все kwargs попадют в %(finance_data)s и логируются |
|
||||||
'format': '%(asctime)s - %(levelname)s - %(message)s - %(finance_data)s' |
|
||||||
""" |
|
||||||
|
|
||||||
def __init__(self, prefix=None): |
|
||||||
self.prefix = prefix |
|
||||||
|
|
||||||
def log(self, level, msg, *args, **kwargs): |
|
||||||
_logger.log(level=level, msg=self._get_msg(msg), *args, **self._make_kwargs(kwargs)) |
|
||||||
|
|
||||||
def _get_msg(self, msg): |
|
||||||
if self.prefix: |
|
||||||
msg = '{}: {}'.format(self.prefix, msg) |
|
||||||
return msg |
|
||||||
|
|
||||||
def _make_kwargs(self, kwargs): |
|
||||||
new_kwargs = {} |
|
||||||
for inspected_kwarg in ('exc_info', 'stack_info', 'extra'): |
|
||||||
try: |
|
||||||
new_kwargs[inspected_kwarg] = kwargs.pop(inspected_kwarg) |
|
||||||
except KeyError: |
|
||||||
pass |
|
||||||
if 'extra' in new_kwargs: |
|
||||||
new_kwargs['extra']['finance_data'] = kwargs |
|
||||||
else: |
|
||||||
new_kwargs['extra'] = dict(finance_data=kwargs) |
|
||||||
return new_kwargs |
|
||||||
|
|
||||||
def debug(self, msg, *args, **kwargs): |
|
||||||
self.log(level=logging.DEBUG, msg=msg, *args, **kwargs) |
|
||||||
|
|
||||||
def info(self, msg, *args, **kwargs): |
|
||||||
self.log(level=logging.INFO, msg=msg, *args, **kwargs) |
|
||||||
|
|
||||||
def warning(self, msg, *args, **kwargs): |
|
||||||
self.log(level=logging.WARNING, msg=msg, *args, **kwargs) |
|
||||||
|
|
||||||
# TODO отделить логирование ошибок в другой лог |
|
||||||
def error(self, msg, *args, **kwargs): |
|
||||||
self.log(level=logging.ERROR, msg=msg, *args, **kwargs) |
|
||||||
|
|
||||||
def critical(self, msg, *args, **kwargs): |
|
||||||
self.log(level=logging.CRITICAL, msg=msg, *args, **kwargs) |
|
||||||
|
|
||||||
def exception(self, msg, *args, **kwargs): |
|
||||||
kwargs['stack_info'] = True |
|
||||||
_logger.exception(self._get_msg(msg), *args, **self._make_kwargs(kwargs)) |
|
||||||
@ -1,14 +1,15 @@ |
|||||||
|
import logging |
||||||
|
|
||||||
from django.core.management.base import BaseCommand |
from django.core.management.base import BaseCommand |
||||||
|
|
||||||
from finance.loggers import FinanceLogger |
|
||||||
from finance.tasks import periodic_billing |
from finance.tasks import periodic_billing |
||||||
|
|
||||||
finance_logger = FinanceLogger() # prefix='YandexMoney' |
logger_yandex = logging.getLogger('yandex_money') |
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand): |
class Command(BaseCommand): |
||||||
|
|
||||||
def handle(self, *args, **options): |
def handle(self, *args, **options): |
||||||
finance_logger.info("start console repeat payment command") |
logger_yandex.info("start console repeat payment command") |
||||||
print('Started') |
print('Started') |
||||||
periodic_billing() |
periodic_billing() |
||||||
|
|||||||
@ -1,60 +1,61 @@ |
|||||||
import logging |
import logging |
||||||
import os |
|
||||||
|
|
||||||
|
import os |
||||||
import requests |
import requests |
||||||
from django.conf import settings |
from dateutil.relativedelta import relativedelta |
||||||
from django.db import transaction |
|
||||||
from django.utils import timezone |
|
||||||
from yandex_money.models import Payment |
from yandex_money.models import Payment |
||||||
|
|
||||||
from finance.loggers import FinanceLogger |
|
||||||
from finance.models import InvoiceRebilling |
from finance.models import InvoiceRebilling |
||||||
from lms import celery_app |
from lms import celery_app |
||||||
|
from django.conf import settings |
||||||
|
from django.utils import timezone |
||||||
|
|
||||||
|
logger_yandex = logging.getLogger('yandex_money') |
||||||
|
|
||||||
finance_logger = FinanceLogger() |
|
||||||
|
|
||||||
@celery_app.task |
@celery_app.task |
||||||
def periodic_billing(): |
def periodic_billing(): |
||||||
finance_logger.info("start periodic billing task") |
try: |
||||||
|
logger_yandex.info("start periodic billing task") |
||||||
invoices = InvoiceRebilling.objects.filter(method='Y').exclude(status='F') |
invoices = InvoiceRebilling.objects.filter(method='Y').exclude(status='F') |
||||||
for invoice in invoices.filter(expected_date__lt=timezone.now()): |
|
||||||
# выбираем все необработанные из прошлого |
for invoice in invoices.filter( |
||||||
with transaction.atomic(): |
expected_date__gt=timezone.now(), expected_date__lt=timezone.now() + relativedelta(days=1)): |
||||||
try: |
# TODO выбирать все, даже прошлые неотработанные - что бы не потерять |
||||||
_yandex_repeat_card_payment(invoice) |
|
||||||
except Exception as exc: |
user = invoice.bill.user |
||||||
finance_logger.exception('YandexMoney repeatCardPayment Exception', invoice_id=invoice.id) |
yandex_pay = Payment.objects.create( |
||||||
invoice.comment = 'Ошибка при попытке повторного платежа, свяжитесь с клиентской службой' |
order_amount=invoice.price, |
||||||
invoice.save() |
customer_number=user.id, |
||||||
|
user=user, |
||||||
|
cps_email=user.email, |
||||||
def _yandex_repeat_card_payment(invoice): |
shop_id=settings.YANDEX_MONEY_REBILLING_SHOP_ID, |
||||||
user = invoice.bill.user |
scid=settings.YANDEX_MONEY_REBILLING_SCID |
||||||
yandex_pay = Payment.objects.create( |
) |
||||||
order_amount=invoice.price, |
invoice.yandex_pay = yandex_pay |
||||||
customer_number=user.id, |
invoice.save() |
||||||
user=user, |
|
||||||
cps_email=user.email, |
repeat_card_payment(invoice) |
||||||
shop_id=settings.YANDEX_MONEY_REBILLING_SHOP_ID, |
except Exception as exc: |
||||||
scid=settings.YANDEX_MONEY_REBILLING_SCID |
logger_yandex.error('periodic billing Exception', exc_info=True, extra={ |
||||||
) |
'exc': exc |
||||||
invoice.yandex_pay = yandex_pay |
}) |
||||||
|
# TODO записывать в invoice.comments ошибку яндекса |
||||||
finance_logger.info('YandexMoney repeatCardPayment start', invoice_id=invoice.id) |
|
||||||
resp = requests.post( |
|
||||||
url=settings.YANDEX_MONEY_MWS_URL + 'repeatCardPayment', |
def repeat_card_payment(invoice): |
||||||
data={ |
resp = requests.post(settings.YANDEX_MONEY_MWS_URL + 'repeatCardPayment', |
||||||
'clientOrderId': invoice.id, # уникальное возрастающее целое число |
data={ |
||||||
'invoiceId': invoice.key, |
'clientOrderId': invoice.id, # уникальное возрастающее целое число |
||||||
'amount': invoice.price, |
'invoiceId': invoice.key, |
||||||
'orderNumber': invoice.yandex_pay.order_number |
'amount': invoice.price, |
||||||
}, |
'orderNumber': invoice.yandex_pay.order_number |
||||||
cert=( |
}, |
||||||
os.path.join(settings.SSL_ROOT, 'skillbox.cer'), |
cert=( |
||||||
os.path.join(settings.SSL_ROOT, 'skillbox.key') |
os.path.join(settings.SSL_ROOT, 'skillbox.cer'), |
||||||
), |
os.path.join(settings.SSL_ROOT, 'skillbox.key') |
||||||
verify=os.path.join(settings.SSL_ROOT, 'yamoney_chain.cer') |
), |
||||||
) |
verify=os.path.join(settings.SSL_ROOT, 'yamoney_chain.cer')) |
||||||
# TODO тут проверять нет ли ошибки яндекса (даже при 200 ответе) |
logger_yandex.info('periodic billing finish', exc_info=True, extra={ |
||||||
finance_logger.info('YandexMoney repeatCardPayment ended', |
'response': resp.text, 'code': resp.status_code, |
||||||
invoice_id=invoice.id, response=resp.text, code=resp.status_code, ) |
}) |
||||||
|
|||||||
Loading…
Reference in new issue