parent
347455ced7
commit
cfe1238b67
13 changed files with 123 additions and 398 deletions
@ -1,40 +0,0 @@ |
|||||||
# coding=utf-8 |
|
||||||
from celery.task import periodic_task |
|
||||||
from datetime import timedelta, datetime |
|
||||||
from access.models import User, TrafSource, TrafTokenHistory |
|
||||||
|
|
||||||
|
|
||||||
# @periodic_task(run_every=timedelta(minutes=20)) |
|
||||||
# def check_prepo_delay(): |
|
||||||
# # Проверка просроченых задач преподавателя |
|
||||||
# for res in User.objects.filter(delay_date__lte=datetime.now(), in_role='T'): |
|
||||||
# res.delay = False |
|
||||||
# res.delay_description = '' |
|
||||||
# res.delay_date = None |
|
||||||
# res.save() |
|
||||||
# |
|
||||||
# |
|
||||||
# @periodic_task(run_every=timedelta(minutes=1)) |
|
||||||
# def check_online(): |
|
||||||
# for user in User.objects.filter(status='ON', last_time__lte=datetime.now()-timedelta(minutes=10)): |
|
||||||
# user.status = 'OFF' |
|
||||||
# user.save() |
|
||||||
# |
|
||||||
# |
|
||||||
# @periodic_task(run_every=timedelta(hours=1)) |
|
||||||
# def check_traf_source(): |
|
||||||
# for source in TrafSource.objects.filter(on=True).exclude(live_time=None): |
|
||||||
# if source.token and source.token_start + timedelta(hours=source.live_time) < datetime.now(): |
|
||||||
# source.on = False |
|
||||||
# TrafTokenHistory.objects.create(token=source.token, source=source, live_time=source.live_time, date_start=source.token_start, date_end=datetime.now()) |
|
||||||
# source.token = None |
|
||||||
# source.token_start = None |
|
||||||
# source.save() |
|
||||||
|
|
||||||
|
|
||||||
#@periodic_task(run_every=timedelta(minutes=1)) |
|
||||||
#def sync_users(): |
|
||||||
# for user in User.objects.filter(sync=False): |
|
||||||
# result = sent_sync_user(user) |
|
||||||
# if result: |
|
||||||
# user._set_synced() |
|
||||||
@ -0,0 +1,20 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
# Generated by Django 1.11.6 on 2017-11-08 19:30 |
||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
from django.db import migrations, models |
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration): |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
('finance', '0008_auto_20171108_1435'), |
||||||
|
] |
||||||
|
|
||||||
|
operations = [ |
||||||
|
migrations.AlterField( |
||||||
|
model_name='invoice', |
||||||
|
name='key', |
||||||
|
field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Ключ платежа'), |
||||||
|
), |
||||||
|
] |
||||||
@ -0,0 +1,22 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
# Generated by Django 1.11.6 on 2017-11-09 11:40 |
||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
from django.conf import settings |
||||||
|
from django.db import migrations |
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration): |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
('courses', '0007_auto_20171103_1627'), |
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||||
|
('finance', '0009_auto_20171108_1930'), |
||||||
|
] |
||||||
|
|
||||||
|
operations = [ |
||||||
|
migrations.AlterUniqueTogether( |
||||||
|
name='bill', |
||||||
|
unique_together=set([('course', 'opener', 'user')]), |
||||||
|
), |
||||||
|
] |
||||||
@ -1,91 +0,0 @@ |
|||||||
# coding=utf-8 |
|
||||||
## Реализация платежных сервисов |
|
||||||
from django.shortcuts import render |
|
||||||
from lms.decors import response_decor |
|
||||||
from finance.models import Bill |
|
||||||
from django.http import Http404 |
|
||||||
from lms.tools import gen_pay_sig |
|
||||||
|
|
||||||
|
|
||||||
@response_decor(template='good_pay.html', without_auth=True) |
|
||||||
def success(request): |
|
||||||
# Страница успешного платежа |
|
||||||
if request.GET.get('sp_sig') and gen_pay_sig(request.GET) == request.GET.get('sp_sig'): |
|
||||||
try: |
|
||||||
bill = Bill.objects.get(id=request.GET['sp_order_id']) |
|
||||||
|
|
||||||
except Bill.DoesNotExist: |
|
||||||
raise Http404 |
|
||||||
|
|
||||||
else: |
|
||||||
bill.status = 'F' if request.GET['sp_result'] == '1' else 'C' |
|
||||||
bill.out_id = request.GET['sp_payment_id'] |
|
||||||
bill._method = 'S' |
|
||||||
bill.save() |
|
||||||
|
|
||||||
url = '/?success_pay=True' if bill.service.freepay else '/?success_pay=True&course_id={0}'.format(bill.service.course.id) |
|
||||||
if bill.admitad_uid: |
|
||||||
url += '&admitad_uid={0}&order_id={1}&email={2}'.format(bill.admitad_uid, bill.id, bill.user.email) |
|
||||||
|
|
||||||
return {'redirect': url} |
|
||||||
else: |
|
||||||
raise Http404 |
|
||||||
|
|
||||||
|
|
||||||
@response_decor(template='fail_pay.html', without_auth=True) |
|
||||||
def fail(request): |
|
||||||
# Страница ошибки платежа |
|
||||||
if request.GET.get('sp_sig') and gen_pay_sig(request.GET) == request.GET.get('sp_sig'): |
|
||||||
try: |
|
||||||
bill = Bill.objects.get(id=request.GET['sp_order_id']) |
|
||||||
|
|
||||||
except Bill.DoesNotExist: |
|
||||||
raise Http404 |
|
||||||
|
|
||||||
else: |
|
||||||
bill.status = 'F' if request.GET['sp_result'] else 'C' |
|
||||||
bill.out_id = request.GET['sp_payment_id'] |
|
||||||
bill._method = 'S' |
|
||||||
bill.save() |
|
||||||
|
|
||||||
url = '/?fail_pay=True&fail_url={0}'.format(bill.service.url) if bill.service.freepay else '/?fail_pay=True&fail_pay_id={0}'.format(bill.id) |
|
||||||
return {'redirect': url} |
|
||||||
else: |
|
||||||
raise Http404 |
|
||||||
|
|
||||||
|
|
||||||
def result(request): |
|
||||||
# Страница получения результата о платежах |
|
||||||
if request.GET.get('sp_sig') and gen_pay_sig(request.GET) == request.GET.get('sp_sig'): |
|
||||||
try: |
|
||||||
bill = Bill.objects.get(id=request.GET['sp_order_id']) |
|
||||||
except Bill.DoesNotExist: |
|
||||||
keys = {'sp_salt': request.GET['sp_salt'], |
|
||||||
'sp_status': 'error', |
|
||||||
'sp_description': 'Order not found'} |
|
||||||
|
|
||||||
return render(request, 'simplepayresult.xml', |
|
||||||
{"salt": request.GET['sp_salt'], |
|
||||||
'status': 'error', |
|
||||||
'description': 'Order not found', |
|
||||||
'sig': gen_pay_sig(keys)}, |
|
||||||
content_type="application/xhtml+xml") |
|
||||||
|
|
||||||
else: |
|
||||||
bill.status = 'F' if request.GET['sp_result'] == '1' else 'C' |
|
||||||
bill.out_id = request.GET['sp_payment_id'] |
|
||||||
bill._method = 'S' |
|
||||||
bill.save() |
|
||||||
|
|
||||||
keys = {'sp_salt': request.GET['sp_salt'], |
|
||||||
'sp_status': 'ok', |
|
||||||
'sp_description': 'Good pay'} |
|
||||||
|
|
||||||
return render(request, 'simplepayresult.xml', |
|
||||||
{'salt': request.GET['sp_salt'], |
|
||||||
'status': 'ok', |
|
||||||
'sig': gen_pay_sig(keys), |
|
||||||
'description': 'Good pay'}, |
|
||||||
content_type="application/xhtml+xml") |
|
||||||
else: |
|
||||||
raise Http404 |
|
||||||
@ -1,40 +1,27 @@ |
|||||||
# coding=utf-8 |
from __future__ import absolute_import, unicode_literals |
||||||
from celery.task import periodic_task |
from celery import shared_task |
||||||
from datetime import timedelta, datetime |
import requests |
||||||
|
from django.core.mail import send_mail |
||||||
from django.db.models import Q |
|
||||||
|
|
||||||
from finance.models import Price, Bill, ServiceRequest |
@shared_task |
||||||
from courses.models import CourseMap |
def send_to_yandex(pay): |
||||||
|
r = requests.post('https://money.yandex.ru/eshop.xml', data={ |
||||||
|
'shopId': pay.shop_id, |
||||||
# @periodic_task(run_every=timedelta(minutes=1)) |
'scid': pay.scid, |
||||||
# def price_map_migrator(): |
'sum': pay.order_amount, |
||||||
# for price in Price.objects.filter(included=None).exclude(course=None): |
'customerNumber': pay.customer_number, |
||||||
# if not price.included.exists(): |
'orderNumber': pay.order_number, |
||||||
# inc_type = [] |
'cps_email': pay.cps_email, |
||||||
# |
}) |
||||||
# if price.m_type == 'B': |
body = { |
||||||
# inc_type = ['B'] |
"subject": 'Спасибо за регистрацию', |
||||||
# elif price.m_type == 'E': |
"message": '''Вам выставлен счёт, для оплаты перейдите по ссылке %s''' % r.url, |
||||||
# inc_type = ['B', 'E'] |
"from_email": 'robo@skillbox.ru', |
||||||
# elif price.m_type == 'P': |
"recipient_list": [pay.cps_email], |
||||||
# inc_type = ['B', 'E', 'P'] |
} |
||||||
# for m in CourseMap.objects.filter(course=price.course): |
|
||||||
# if m.get_obj().theme.price_type in inc_type: |
send_mail( |
||||||
# price.included.add(m) |
**body |
||||||
# |
) |
||||||
# |
return r.url |
||||||
# @periodic_task(run_every=timedelta(hours=1)) |
|
||||||
# def price_map_migrator(): |
|
||||||
# for price in Price.objects.exclude(by_time=None): |
|
||||||
# for bill in Bill.objects.filter(service=price, fire_date__lt=datetime.now()): |
|
||||||
# bill.status = 'H' |
|
||||||
# bill.save() |
|
||||||
# |
|
||||||
# |
|
||||||
# @periodic_task(run_every=timedelta(minutes=1)) |
|
||||||
# def sent_service_request_to_amo(): |
|
||||||
# sr = ServiceRequest.objects.filter(send=False, send_date__lt=datetime.now()).exclude(Q(name='TEST')| Q(status='E')).first() |
|
||||||
# if sr: |
|
||||||
# sr.sent_to_amo() |
|
||||||
|
|||||||
@ -1,127 +0,0 @@ |
|||||||
# coding=utf-8 |
|
||||||
import datetime |
|
||||||
from hashlib import md5 |
|
||||||
|
|
||||||
from django.shortcuts import render |
|
||||||
from django.views.decorators.csrf import csrf_exempt |
|
||||||
|
|
||||||
from finance.models import Bill, YandexKassaHistory |
|
||||||
from settings.settings import YANDEX_MONEY_SHOP_PASSWORD |
|
||||||
|
|
||||||
|
|
||||||
def gen_md5(cd): |
|
||||||
return md5(';'.join(( |
|
||||||
cd['action'], |
|
||||||
cd['orderSumAmount'], |
|
||||||
cd['orderSumCurrencyPaycash'], |
|
||||||
cd['orderSumBankPaycash'], |
|
||||||
cd['shopId'], |
|
||||||
cd['invoiceId'], |
|
||||||
cd['customerNumber'], |
|
||||||
YANDEX_MONEY_SHOP_PASSWORD, |
|
||||||
)).encode('utf-8')).hexdigest().upper() |
|
||||||
|
|
||||||
|
|
||||||
@csrf_exempt |
|
||||||
def aviso(request): |
|
||||||
# Страница получения результата о платежах |
|
||||||
data = request.POST |
|
||||||
tmp = {} |
|
||||||
for key, value in data.items(): |
|
||||||
tmp[key] = value |
|
||||||
tmp = str(tmp) |
|
||||||
_time = datetime.datetime.now() |
|
||||||
_log = YandexKassaHistory.objects.create(text=tmp, _type='paymentAvisoResponse') |
|
||||||
result = { |
|
||||||
'performedDatetime': _time.isoformat(), |
|
||||||
'code': '200', |
|
||||||
'shopId': data.get('shopId'), |
|
||||||
'invoiceId': data.get('invoiceId'), |
|
||||||
'message': '' |
|
||||||
} |
|
||||||
if not data.get('md5'): |
|
||||||
return render(request, 'yandexkassa_result.xml', {'check_type': 'paymentAvisoResponse', 'data': result}, |
|
||||||
content_type="application/xhtml+xml") |
|
||||||
|
|
||||||
if data['md5'] == gen_md5(data): |
|
||||||
try: |
|
||||||
bill = Bill.objects.get(id=data['orderNumber']) |
|
||||||
except Bill.DoesNotExist: |
|
||||||
result['message'] = u'Не найден счет по указанным данным' |
|
||||||
|
|
||||||
else: |
|
||||||
if str(bill.user.id) == data['customerNumber']: |
|
||||||
bill.status = 'F' |
|
||||||
bill.real_price = data['shopSumAmount'] |
|
||||||
bill.out_id = data['invoiceId'] |
|
||||||
bill.status_changed = _time |
|
||||||
bill.save() |
|
||||||
result['code'] = '0' |
|
||||||
|
|
||||||
else: |
|
||||||
result['message'] = u'Не найден пользователь, указанный в запросе' |
|
||||||
|
|
||||||
else: |
|
||||||
result['code'] = '1' |
|
||||||
result['message'] = u'Не сходится ключ платежа' |
|
||||||
|
|
||||||
return render(request, 'yandexkassa_result.xml', {'check_type': 'paymentAvisoResponse', 'data': result}, |
|
||||||
content_type="application/xhtml+xml") |
|
||||||
|
|
||||||
|
|
||||||
@csrf_exempt |
|
||||||
def check(request): |
|
||||||
# Страница получения результата о платежах |
|
||||||
data = request.POST |
|
||||||
_time = datetime.datetime.now() |
|
||||||
tmp = {} |
|
||||||
for key, value in data.items(): |
|
||||||
tmp[key] = value |
|
||||||
tmp = str(tmp) |
|
||||||
if data.get('action'): |
|
||||||
YandexKassaHistory.objects.create(text=tmp, _type=data['action']) |
|
||||||
else: |
|
||||||
YandexKassaHistory.objects.create(text=tmp, _type='empty_check') |
|
||||||
|
|
||||||
result = { |
|
||||||
'performedDatetime': _time.isoformat(), |
|
||||||
'code': '200' if data.get('action') == 'checkOrder' else '1', |
|
||||||
'shopId': data.get('shopId'), |
|
||||||
'orderSumAmount': data.get('orderSumAmount'), |
|
||||||
'invoiceId': data.get('invoiceId'), |
|
||||||
'message': '' |
|
||||||
} |
|
||||||
if not data.get('md5'): |
|
||||||
return render(request, 'yandexkassa_result.xml', |
|
||||||
{'check_type': 'checkOrderResponse', |
|
||||||
'data': result}, |
|
||||||
content_type="application/xhtml+xml") |
|
||||||
|
|
||||||
if data['md5'] == gen_md5(data): |
|
||||||
try: |
|
||||||
bill = Bill.objects.get(id=data['orderNumber']) |
|
||||||
except Bill.DoesNotExist: |
|
||||||
result['message'] = u'Не найден счет по указанным данным' |
|
||||||
|
|
||||||
else: |
|
||||||
|
|
||||||
if str(bill.user.id) == data['customerNumber']: |
|
||||||
if data['action'] != 'checkOrder': |
|
||||||
bill.status = 'B' |
|
||||||
bill.out_id = data['invoiceId'] |
|
||||||
bill.status_changed = _time |
|
||||||
bill._method = 'Y' |
|
||||||
bill.inside_data = tmp |
|
||||||
bill.test = True |
|
||||||
bill.save() |
|
||||||
result['code'] = '0' |
|
||||||
|
|
||||||
else: |
|
||||||
result['message'] = u'Не найден пользователь, указанный в запросе' |
|
||||||
else: |
|
||||||
result['code'] = '1' |
|
||||||
result['message'] = u'Не сходится ключ платежа' |
|
||||||
result['tech_message'] = str(data['md5']) + str('_') + str(gen_md5(data)) |
|
||||||
|
|
||||||
return render(request, 'yandexkassa_result.xml', {'check_type': 'checkOrderResponse' if data['action'] == 'checkOrder' else 'cancelOrderResponse', 'data': result}, |
|
||||||
content_type="application/xhtml+xml") |
|
||||||
@ -1,79 +0,0 @@ |
|||||||
# coding=utf-8 |
|
||||||
from datetime import timedelta, datetime |
|
||||||
|
|
||||||
from celery.task import periodic_task |
|
||||||
from django.core.files import File |
|
||||||
from management.letters import sent_new_expired |
|
||||||
|
|
||||||
from access.models import User |
|
||||||
from journals.models import ExamTry, HomeworkTry, DiplomaJ |
|
||||||
from settings.settings import TEACHER |
|
||||||
|
|
||||||
|
|
||||||
# @periodic_task(run_every=timedelta(hours=1)) |
|
||||||
# def check_expired(): |
|
||||||
# # Проверка просроченых задач преподавателя |
|
||||||
# for res in (ExamTry.objects.filter(f_date=None).exclude(expired=True), |
|
||||||
# HomeworkTry.objects.filter(f_date=None).exclude(expired=True)): |
|
||||||
# for _try in res: |
|
||||||
# if _try.parent.get_status_flag() not in ['N', 'F']: |
|
||||||
# # Проверка экзамена |
|
||||||
# if _try.date + timedelta(days=1) < datetime.now(): |
|
||||||
# _try.expired = True |
|
||||||
# _try.save() |
|
||||||
# for user in User.objects.filter(in_role='S2'): |
|
||||||
# sent_new_expired(_try, user.email) |
|
||||||
# |
|
||||||
# |
|
||||||
# @periodic_task(run_every=timedelta(minutes=1)) |
|
||||||
# def check_robo_prep(): |
|
||||||
# teacher = User.objects.get(email=TEACHER) |
|
||||||
# handler = [] |
|
||||||
# for journal in HomeworkTry.objects.filter(teacher=teacher, f_date=None).exclude(success=True, date=None).order_by( |
|
||||||
# 'date'): |
|
||||||
# if journal.parent.get_status_flag not in ['N', 'F']: |
|
||||||
# handler.append(journal) |
|
||||||
# |
|
||||||
# for journal in ExamTry.objects.filter(teacher=teacher, f_date=None).exclude(success=True, date=None).order_by( |
|
||||||
# 'date'): |
|
||||||
# if journal.parent.get_status_flag not in ['N', 'F']: |
|
||||||
# handler.append(journal) |
|
||||||
# |
|
||||||
# print(handler) |
|
||||||
# for _tr in handler: |
|
||||||
# for _cm in _tr.comments.all(): |
|
||||||
# s = False |
|
||||||
# print(_cm.text) |
|
||||||
# if 'GO_TO_SUCCESS' in _cm.text: |
|
||||||
# _tr.success = True |
|
||||||
# _tr.f_date = datetime.now() |
|
||||||
# s = True |
|
||||||
# elif 'GO_TO_FAIL' in _cm.text: |
|
||||||
# _tr.f_date = datetime.now() |
|
||||||
# s = True |
|
||||||
# if s: |
|
||||||
# _tr.save() |
|
||||||
# |
|
||||||
# |
|
||||||
# #@periodic_task(run_every=timedelta(minutes=3)) |
|
||||||
# #def block_warning(): |
|
||||||
# # for tm in CourseThemeJ.objects.filter(material__empty=True): |
|
||||||
# # for n in CourseThemeJ.objects.filter(material__sort__gte=tm.material.sort-1, f_date=None).exclude(date=None): |
|
||||||
# # for u in User.objects.filter(in_role='A'): |
|
||||||
# # letters.block_warning(n, n.material.course.get_title(), u) |
|
||||||
# |
|
||||||
# |
|
||||||
# @periodic_task(run_every=timedelta(minutes=3)) |
|
||||||
# def gen_in_diploma(): |
|
||||||
# for tm in DiplomaJ.objects.filter(gen=False): |
|
||||||
# if not tm.out_image or not tm.in_image: |
|
||||||
# _in, _out = tm.draw_key(*tm.draw_name(*tm.draw_date())) |
|
||||||
# if _in: |
|
||||||
# _in = open(_in, 'rb') |
|
||||||
# tm.in_image.save(File(_in).name, File(_in), save=True) |
|
||||||
# |
|
||||||
# if _out: |
|
||||||
# _out = open(_out, 'rb') |
|
||||||
# tm.out_image.save(File(_out).name, File(_out), save=True) |
|
||||||
# tm.gen = True |
|
||||||
# tm.save() |
|
||||||
Loading…
Reference in new issue