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 celery.task import periodic_task |
||||
from datetime import timedelta, datetime |
||||
|
||||
from django.db.models import Q |
||||
|
||||
from finance.models import Price, Bill, ServiceRequest |
||||
from courses.models import CourseMap |
||||
|
||||
|
||||
# @periodic_task(run_every=timedelta(minutes=1)) |
||||
# def price_map_migrator(): |
||||
# for price in Price.objects.filter(included=None).exclude(course=None): |
||||
# if not price.included.exists(): |
||||
# inc_type = [] |
||||
# |
||||
# if price.m_type == 'B': |
||||
# inc_type = ['B'] |
||||
# elif price.m_type == 'E': |
||||
# inc_type = ['B', 'E'] |
||||
# elif price.m_type == 'P': |
||||
# inc_type = ['B', 'E', 'P'] |
||||
# for m in CourseMap.objects.filter(course=price.course): |
||||
# if m.get_obj().theme.price_type in inc_type: |
||||
# price.included.add(m) |
||||
# |
||||
# |
||||
# @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() |
||||
from __future__ import absolute_import, unicode_literals |
||||
from celery import shared_task |
||||
import requests |
||||
from django.core.mail import send_mail |
||||
|
||||
|
||||
@shared_task |
||||
def send_to_yandex(pay): |
||||
r = requests.post('https://money.yandex.ru/eshop.xml', data={ |
||||
'shopId': pay.shop_id, |
||||
'scid': pay.scid, |
||||
'sum': pay.order_amount, |
||||
'customerNumber': pay.customer_number, |
||||
'orderNumber': pay.order_number, |
||||
'cps_email': pay.cps_email, |
||||
}) |
||||
body = { |
||||
"subject": 'Спасибо за регистрацию', |
||||
"message": '''Вам выставлен счёт, для оплаты перейдите по ссылке %s''' % r.url, |
||||
"from_email": 'robo@skillbox.ru', |
||||
"recipient_list": [pay.cps_email], |
||||
} |
||||
|
||||
send_mail( |
||||
**body |
||||
) |
||||
return r.url |
||||
|
||||
@ -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