43 changed files with 1234 additions and 648 deletions
-
19abonapp/admin.py
-
32abonapp/forms.py
-
16abonapp/migrations/0009_auto_20181123_1556.py
-
80abonapp/models.py
-
104abonapp/pay_systems.py
-
5abonapp/templates/abonapp/group_list.html
-
1abonapp/templates/abonapp/invoiceForPayment.html
-
192abonapp/tests.py
-
5abonapp/urls.py
-
308abonapp/views.py
-
2accounts_app/templatetags/acc_tags.py
-
2agent/commands/dhcp.py
-
2clientsideapp/views.py
-
2devapp/views.py
-
2dialing_app/views.py
-
2djing/lib/auth_backends.py
-
9djing/local_settings.py.example
-
15djing/settings.py
-
3djing/urls.py
-
0finapp/__init__.py
-
4finapp/admin.py
-
5finapp/apps.py
-
19finapp/forms.py
-
159finapp/locale/ru/LC_MESSAGES/django.po
-
71finapp/migrations/0001_initial.py
-
0finapp/migrations/__init__.py
-
85finapp/models.py
-
24finapp/templates/finapp/ext.htm
-
4finapp/templates/finapp/fin_report.html
-
53finapp/templates/finapp/payHistory.html
-
62finapp/templates/finapp/payalltimegateway_form.html
-
75finapp/templates/finapp/payalltimegateway_list.html
-
250finapp/tests.py
-
25finapp/urls.py
-
222finapp/views.py
-
2gw_app/tests.py
-
3locale/ru/LC_MESSAGES/django.po
-
2periodic.py
-
1requirements.txt
-
2searchapp/views.py
-
2taskapp/models.py
-
2taskapp/views.py
-
9templates/base.html
@ -1,13 +1,12 @@ |
|||
from django.contrib import admin |
|||
|
|||
from abonapp.models import generic |
|||
from abonapp import models |
|||
|
|||
admin.site.register(generic.Abon) |
|||
admin.site.register(generic.InvoiceForPayment) |
|||
admin.site.register(generic.AbonLog) |
|||
admin.site.register(generic.AbonTariff) |
|||
admin.site.register(generic.AbonStreet) |
|||
admin.site.register(generic.AllTimePayLog) |
|||
admin.site.register(generic.AbonRawPassword) |
|||
admin.site.register(generic.PassportInfo) |
|||
admin.site.register(generic.AdditionalTelephone) |
|||
admin.site.register(models.Abon) |
|||
admin.site.register(models.InvoiceForPayment) |
|||
admin.site.register(models.AbonLog) |
|||
admin.site.register(models.AbonTariff) |
|||
admin.site.register(models.AbonStreet) |
|||
admin.site.register(models.AbonRawPassword) |
|||
admin.site.register(models.PassportInfo) |
|||
admin.site.register(models.AdditionalTelephone) |
|||
@ -0,0 +1,16 @@ |
|||
# Generated by Django 2.1 on 2018-11-23 15:56 |
|||
|
|||
from django.db import migrations |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('abonapp', '0008_auto_20181115_1206'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.DeleteModel( |
|||
name='AllPayLog', |
|||
), |
|||
] |
|||
@ -1,104 +0,0 @@ |
|||
from hashlib import md5 |
|||
from django.utils import timezone |
|||
from djing.lib import safe_int, safe_float |
|||
from .models import Abon, AllTimePayLog |
|||
from django.db import DatabaseError |
|||
from django.conf import settings |
|||
from xmlview.decorators import xml_view |
|||
|
|||
|
|||
@xml_view(root_node='pay-response') |
|||
def allpay(request): |
|||
def bad_ret(err_id, err_description=None): |
|||
now = timezone.now() |
|||
r = { |
|||
'status_code': safe_int(err_id), |
|||
'time_stamp': now.strftime("%d.%m.%Y %H:%M") |
|||
} |
|||
if err_description: |
|||
r.update({'description': err_description}) |
|||
return r |
|||
|
|||
try: |
|||
serv_id = request.GET.get('SERVICE_ID') |
|||
act = safe_int(request.GET.get('ACT')) |
|||
pay_account = request.GET.get('PAY_ACCOUNT') |
|||
pay_id = request.GET.get('PAY_ID') |
|||
pay_amount = safe_float(request.GET.get('PAY_AMOUNT')) |
|||
sign = request.GET.get('SIGN').lower() |
|||
current_date = timezone.now().strftime("%d.%m.%Y %H:%M") |
|||
|
|||
if act <= 0: |
|||
return bad_ret(-101, 'ACT less than zero') |
|||
|
|||
# check sign |
|||
md = md5() |
|||
s = '_'.join((str(act), pay_account or '', serv_id or '', pay_id, getattr(settings, 'PAY_SECRET'))) |
|||
md.update(bytes(s, 'utf-8')) |
|||
our_sign = md.hexdigest() |
|||
if our_sign != sign: |
|||
return bad_ret(-101) |
|||
|
|||
if act == 1: |
|||
abon = Abon.objects.get(username=pay_account) |
|||
fio = abon.fio |
|||
ballance = float(abon.ballance) |
|||
return { |
|||
'balance': ballance, |
|||
'name': fio, |
|||
'account': pay_account, |
|||
'service_id': getattr(settings, 'PAY_SERV_ID'), |
|||
'min_amount': 10.0, |
|||
'max_amount': 5000, |
|||
'status_code': 21, |
|||
'time_stamp': current_date |
|||
} |
|||
elif act == 4: |
|||
trade_point = safe_int(request.GET.get('TRADE_POINT')) |
|||
receipt_num = safe_int(request.GET.get('RECEIPT_NUM')) |
|||
abon = Abon.objects.get(username=pay_account) |
|||
pays = AllTimePayLog.objects.filter(pay_id=pay_id) |
|||
if pays.count() > 0: |
|||
return bad_ret(-100) |
|||
|
|||
abon.add_ballance(None, pay_amount, comment='AllPay %.2f' % pay_amount) |
|||
abon.save(update_fields=('ballance',)) |
|||
|
|||
AllTimePayLog.objects.create( |
|||
pay_id=pay_id, |
|||
summ=pay_amount, |
|||
abon=abon, |
|||
trade_point=trade_point, |
|||
receipt_num=receipt_num |
|||
) |
|||
return { |
|||
'pay_id': pay_id, |
|||
'service_id': serv_id, |
|||
'amount': pay_amount, |
|||
'status_code': 22, |
|||
'time_stamp': current_date |
|||
} |
|||
elif act == 7: |
|||
pay = AllTimePayLog.objects.get(pay_id=pay_id) |
|||
return { |
|||
'status_code': 11, |
|||
'time_stamp': current_date, |
|||
'transaction': { |
|||
'pay_id': pay_id, |
|||
'service_id': serv_id, |
|||
'amount': pay.summ, |
|||
'status': 111, |
|||
'time_stamp': pay.date_add.strftime("%d.%m.%Y %H:%M") |
|||
} |
|||
} |
|||
else: |
|||
return bad_ret(-101, 'ACT is not passed') |
|||
|
|||
except Abon.DoesNotExist: |
|||
return bad_ret(-40) |
|||
except DatabaseError: |
|||
return bad_ret(-90) |
|||
except AllTimePayLog.DoesNotExist: |
|||
return bad_ret(-10) |
|||
except AttributeError: |
|||
return bad_ret(-101) |
|||
@ -0,0 +1,4 @@ |
|||
from django.contrib import admin |
|||
from finapp import models |
|||
|
|||
admin.site.register(models.AllTimePayLog) |
|||
@ -0,0 +1,5 @@ |
|||
from django.apps import AppConfig |
|||
|
|||
|
|||
class FinappConfig(AppConfig): |
|||
name = 'finapp' |
|||
@ -0,0 +1,19 @@ |
|||
from django import forms |
|||
from finapp.models import PayAllTimeGateway |
|||
|
|||
|
|||
class PayAllTimeGatewayForm(forms.ModelForm): |
|||
def __init__(self, *args, **kwargs): |
|||
super().__init__(*args, **kwargs) |
|||
instance = getattr(self, 'instance') |
|||
if instance and instance.pk: |
|||
self.fields['slug'].disabled = True |
|||
|
|||
def clean_slug(self): |
|||
if self.instance and self.instance.pk: |
|||
return self.instance.slug |
|||
return self.data['slug'] |
|||
|
|||
class Meta: |
|||
model = PayAllTimeGateway |
|||
fields = '__all__' |
|||
@ -0,0 +1,159 @@ |
|||
# SOME DESCRIPTIVE TITLE. |
|||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
|||
# This file is distributed under the same license as the PACKAGE package. |
|||
# Dmitry Novikov nerosketch@gmail.com, 2018. |
|||
# |
|||
#, fuzzy |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: PACKAGE VERSION\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"POT-Creation-Date: 2018-11-27 11:42+0300\n" |
|||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
|||
"Last-Translator: Dmitry Novikov nerosketch@gmail.com\n" |
|||
"Language: ru\n" |
|||
"MIME-Version: 1.0\n" |
|||
"Content-Type: text/plain; charset=UTF-8\n" |
|||
"Content-Transfer-Encoding: 8bit\n" |
|||
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" |
|||
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" |
|||
"%100>=11 && n%100<=14)? 2 : 3);\n" |
|||
|
|||
#: models.py:32 templates/finapp/payalltimegateway_list.html:22 |
|||
msgid "Title" |
|||
msgstr "Название" |
|||
|
|||
#: models.py:33 |
|||
msgid "Secret" |
|||
msgstr "Секрет" |
|||
|
|||
#: models.py:34 templates/finapp/payalltimegateway_list.html:23 |
|||
msgid "Service id" |
|||
msgstr "" |
|||
|
|||
#: models.py:35 |
|||
msgid "Slug" |
|||
msgstr "" |
|||
|
|||
#: models.py:46 |
|||
msgid "All time gateway" |
|||
msgstr "Платёжный шлюз AllTime" |
|||
|
|||
#: models.py:65 templates/finapp/payHistory.html:24 |
|||
msgid "Cost" |
|||
msgstr "Цена" |
|||
|
|||
#: models.py:67 templates/finapp/payHistory.html:25 |
|||
msgid "Trade point" |
|||
msgstr "Торговая точка" |
|||
|
|||
#: models.py:73 templates/finapp/payHistory.html:26 |
|||
msgid "Receipt num" |
|||
msgstr "Номер квитанции" |
|||
|
|||
#: models.py:75 |
|||
msgid "Pay gateway" |
|||
msgstr "Платёжный шлюз" |
|||
|
|||
#: templates/finapp/fin_report.html:7 |
|||
msgid "Fin report" |
|||
msgstr "Фин. отчёт" |
|||
|
|||
#: templates/finapp/fin_report.html:12 |
|||
msgid "Money by days" |
|||
msgstr "Денег за дни" |
|||
|
|||
#: templates/finapp/fin_report.html:21 templates/finapp/payHistory.html:23 |
|||
msgid "Date" |
|||
msgstr "Дата" |
|||
|
|||
#: templates/finapp/fin_report.html:32 |
|||
msgid "Pays not found" |
|||
msgstr "Платежи не найдены" |
|||
|
|||
#: templates/finapp/fin_report.html:41 |
|||
msgid "Export to csv" |
|||
msgstr "Экспортировать в csv" |
|||
|
|||
#: templates/finapp/payHistory.html:8 |
|||
#: templates/finapp/payalltimegateway_form.html:7 |
|||
#: templates/finapp/payalltimegateway_list.html:8 |
|||
msgid "Payment system" |
|||
msgstr "Платёжная система" |
|||
|
|||
#: templates/finapp/payHistory.html:9 |
|||
msgid "Payment history" |
|||
msgstr "История платежей" |
|||
|
|||
#: templates/finapp/payHistory.html:21 |
|||
msgid "User" |
|||
msgstr "Абонент" |
|||
|
|||
#: templates/finapp/payHistory.html:22 |
|||
msgid "Pay id" |
|||
msgstr "ID платежа" |
|||
|
|||
#: templates/finapp/payHistory.html:41 |
|||
msgid "Payment history is empty" |
|||
msgstr "История платежей пуста" |
|||
|
|||
#: templates/finapp/payalltimegateway_form.html:10 |
|||
msgid "Change payment gateway" |
|||
msgstr "Редактировать платёжный шлюз" |
|||
|
|||
#: templates/finapp/payalltimegateway_form.html:12 |
|||
msgid "Add payment gateway" |
|||
msgstr "Добавить платёжный шлюз" |
|||
|
|||
#: templates/finapp/payalltimegateway_form.html:20 |
|||
msgid "Make new payment gateway" |
|||
msgstr "Создать новый платёжный шлюз" |
|||
|
|||
#: templates/finapp/payalltimegateway_form.html:33 |
|||
msgid "Type info about payment gateway" |
|||
msgstr "Укажите данные для платёжной системы" |
|||
|
|||
#: templates/finapp/payalltimegateway_form.html:43 |
|||
msgid "Save" |
|||
msgstr "Сохранить" |
|||
|
|||
#: templates/finapp/payalltimegateway_form.html:47 |
|||
#: templates/finapp/payalltimegateway_list.html:62 |
|||
#: templates/finapp/payalltimegateway_list.html:66 |
|||
msgid "Add" |
|||
msgstr "Добвить" |
|||
|
|||
#: templates/finapp/payalltimegateway_form.html:51 |
|||
msgid "Reset" |
|||
msgstr "Сбросить" |
|||
|
|||
#: templates/finapp/payalltimegateway_list.html:13 |
|||
msgid "List of payment gateways" |
|||
msgstr "Список платёжных систем" |
|||
|
|||
#: templates/finapp/payalltimegateway_list.html:24 |
|||
msgid "Pays count" |
|||
msgstr "Количество платежей всего" |
|||
|
|||
#: templates/finapp/payalltimegateway_list.html:36 |
|||
msgid "Edit" |
|||
msgstr "Изменить" |
|||
|
|||
#: templates/finapp/payalltimegateway_list.html:40 |
|||
msgid "Permission required" |
|||
msgstr "Не хватает прав" |
|||
|
|||
#: templates/finapp/payalltimegateway_list.html:53 |
|||
msgid "Payment gateways not found" |
|||
msgstr "Платёжные шлюзы не найдены" |
|||
|
|||
#: views.py:198 |
|||
msgid "New pay gateway created successfully" |
|||
msgstr "Новый платёжный шлюз успешно создан" |
|||
|
|||
#: views.py:221 |
|||
msgid "Payment gateway successfully updated" |
|||
msgstr "Платёжный шлюз успешно обновлён" |
|||
|
|||
msgid "Deleted" |
|||
msgstr "Удалён" |
|||
@ -0,0 +1,71 @@ |
|||
# Generated by Django 2.1 on 2018-11-23 15:56 |
|||
|
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
import encrypted_model_fields.fields |
|||
|
|||
PAY_GW_ID = 0 |
|||
|
|||
|
|||
def make_default_pay_gw(apps, _): |
|||
global PAY_GW_ID |
|||
PayAllTimeGateway = apps.get_model('finapp.PayAllTimeGateway') |
|||
pay_gw = PayAllTimeGateway.objects.first() |
|||
if pay_gw is None: |
|||
pay_gw = PayAllTimeGateway.objects.create( |
|||
title='default', |
|||
secret='secret', |
|||
service_id='service_id', |
|||
slug='default' |
|||
) |
|||
PAY_GW_ID = pay_gw.pk |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
initial = True |
|||
|
|||
dependencies = [ |
|||
('abonapp', '0009_auto_20181123_1556'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.RunSQL(migrations.RunSQL.noop, state_operations=[ |
|||
migrations.CreateModel( |
|||
name='AllTimePayLog', |
|||
fields=[ |
|||
('pay_id', models.CharField(max_length=36, primary_key=True, serialize=False, unique=True)), |
|||
('date_add', models.DateTimeField(auto_now_add=True)), |
|||
('summ', models.FloatField(verbose_name='Cost', default=0.0)), |
|||
('trade_point', models.CharField(blank=True, default=None, max_length=20, null=True, verbose_name='Trade point')), |
|||
('receipt_num', models.BigIntegerField(default=0, verbose_name='Receipt number')), |
|||
('abon', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='abonapp.Abon')), |
|||
], |
|||
options={ |
|||
'db_table': 'all_time_pay_log', |
|||
'ordering': ('-date_add',), |
|||
}, |
|||
) |
|||
]), |
|||
migrations.CreateModel( |
|||
name='PayAllTimeGateway', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('title', models.CharField(max_length=64, verbose_name='Title')), |
|||
('secret', encrypted_model_fields.fields.EncryptedCharField(verbose_name='Secret')), |
|||
('service_id', models.CharField(max_length=64, verbose_name='Service id')), |
|||
('slug', models.SlugField(max_length=32, unique=True, verbose_name='Slug')), |
|||
], |
|||
options={ |
|||
'verbose_name': 'All time gateway', |
|||
'db_table': 'pay_all_time_gateways', |
|||
'ordering': ('title',), |
|||
}, |
|||
), |
|||
migrations.RunPython(make_default_pay_gw), |
|||
migrations.AddField( |
|||
model_name='alltimepaylog', |
|||
name='pay_gw', |
|||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finapp.PayAllTimeGateway', verbose_name='Pay gateway', default=lambda: PAY_GW_ID), |
|||
), |
|||
] |
|||
@ -0,0 +1,85 @@ |
|||
from datetime import datetime |
|||
from django.db import models, connection |
|||
from django.urls import reverse |
|||
from django.utils.translation import ugettext_lazy as _ |
|||
from encrypted_model_fields.fields import EncryptedCharField |
|||
|
|||
from abonapp.models import Abon |
|||
|
|||
|
|||
class AllTimePayLogManager(models.Manager): |
|||
@staticmethod |
|||
def by_days(): |
|||
cur = connection.cursor() |
|||
cur.execute( |
|||
'SELECT SUM(summ) AS alsum, ' |
|||
'DATE_FORMAT(date_add, "%Y-%m-%d") AS pay_date ' |
|||
'FROM all_time_pay_log ' |
|||
'GROUP BY DATE_FORMAT(date_add, "%Y-%m-%d")' |
|||
) |
|||
while True: |
|||
r = cur.fetchone() |
|||
if r is None: |
|||
break |
|||
summ, dat = r |
|||
yield { |
|||
'summ': summ, |
|||
'pay_date': datetime.strptime(dat, '%Y-%m-%d') |
|||
} |
|||
|
|||
|
|||
class PayAllTimeGateway(models.Model): |
|||
title = models.CharField(_('Title'), max_length=64) |
|||
secret = EncryptedCharField(verbose_name=_('Secret'), max_length=64) |
|||
service_id = models.CharField(_('Service id'), max_length=64) |
|||
slug = models.SlugField(_('Slug'), max_length=32, |
|||
unique=True, allow_unicode=False) |
|||
|
|||
def __str__(self): |
|||
return self.title |
|||
|
|||
def get_absolute_url(self): |
|||
return reverse('finapp:edit_pay_gw', self.slug) |
|||
|
|||
class Meta: |
|||
db_table = 'pay_all_time_gateways' |
|||
verbose_name = _('All time gateway') |
|||
ordering = 'title', |
|||
|
|||
|
|||
# Log for pay system "AllTime" |
|||
class AllTimePayLog(models.Model): |
|||
abon = models.ForeignKey( |
|||
Abon, |
|||
on_delete=models.SET_DEFAULT, |
|||
blank=True, |
|||
null=True, |
|||
default=None |
|||
) |
|||
pay_id = models.CharField( |
|||
max_length=36, |
|||
unique=True, |
|||
primary_key=True |
|||
) |
|||
date_add = models.DateTimeField(auto_now_add=True) |
|||
summ = models.FloatField(_('Cost'), default=0.0) |
|||
trade_point = models.CharField( |
|||
_('Trade point'), |
|||
max_length=20, |
|||
default=None, |
|||
null=True, |
|||
blank=True |
|||
) |
|||
receipt_num = models.BigIntegerField(_('Receipt number'), default=0) |
|||
pay_gw = models.ForeignKey(PayAllTimeGateway, |
|||
verbose_name=_('Pay gateway'), |
|||
on_delete=models.CASCADE) |
|||
|
|||
objects = AllTimePayLogManager() |
|||
|
|||
def __str__(self): |
|||
return self.pay_id |
|||
|
|||
class Meta: |
|||
db_table = 'all_time_pay_log' |
|||
ordering = ('-date_add',) |
|||
@ -0,0 +1,24 @@ |
|||
{% extends request.is_ajax|yesno:'bajax.html,base.html' %} |
|||
{% load i18n %} |
|||
|
|||
{% block breadcrumb %}{% endblock %} |
|||
|
|||
{% block page-header %} |
|||
<small>{% trans 'Payment gateways' %}</small> |
|||
{% endblock %} |
|||
|
|||
{% block main %} |
|||
<ul class="nav nav-tabs nav-justified"> |
|||
|
|||
<li class="active"> |
|||
<a href="#">{% trans 'Payment gateways' %}</a> |
|||
</li> |
|||
|
|||
</ul> |
|||
|
|||
<div class="tab-content"> |
|||
<div class="tab-pane active"> |
|||
{% block content %}{% endblock %} |
|||
</div> |
|||
</div> |
|||
{% endblock %} |
|||
@ -0,0 +1,53 @@ |
|||
{% extends 'base.html' %} |
|||
{% load i18n %} |
|||
|
|||
|
|||
{% block breadcrumb %} |
|||
<ol class="breadcrumb"> |
|||
<li><span class="glyphicon glyphicon-home"></span></li> |
|||
<li><a href="{% url 'finapp:alltime_gateways_list' %}">{% trans 'Payment system' %}</a></li> |
|||
<li class="active">{% trans 'Payment history' %}</li> |
|||
</ol> |
|||
{% endblock %} |
|||
|
|||
{% block page-header %}{{ pay_gw.title }}{% endblock %} |
|||
|
|||
|
|||
{% block main %} |
|||
|
|||
<table class="table table-striped table-bordered"> |
|||
<thead> |
|||
<tr> |
|||
<th>{% trans 'User' %}</th> |
|||
<th>{% trans 'Pay id' %}</th> |
|||
<th>{% trans 'Date' %}</th> |
|||
<th>{% trans 'Cost' %}</th> |
|||
<th>{% trans 'Trade point' %}</th> |
|||
<th>{% trans 'Receipt num' %}</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
{% for pay in object_list %} |
|||
<tr> |
|||
<td> |
|||
{% if pay.abon %} |
|||
<a href="{{ pay.abon.get_absolute_url }}">{{ pay.abon }}</a> |
|||
{% else %} |
|||
{% trans 'Deleted' %} |
|||
{% endif %} |
|||
</td> |
|||
<td>{{ pay.pay_id }}</td> |
|||
<td>{{ pay.date_add|date:'D d E Y H:i:s' }}</td> |
|||
<td>{{ pay.summ }}</td> |
|||
<td>{{ pay.trade_point|default_if_none:'—' }}</td> |
|||
<td>{{ pay.receipt_num }}</td> |
|||
</tr> |
|||
{% empty %} |
|||
<tr> |
|||
<td colspan="6">{% trans 'Payment history is empty' %}</td> |
|||
</tr> |
|||
{% endfor %} |
|||
</tbody> |
|||
</table> |
|||
|
|||
{% endblock %} |
|||
@ -0,0 +1,62 @@ |
|||
{% extends request.is_ajax|yesno:'bajax.html,base.html' %} |
|||
{% load i18n bootstrap3 %} |
|||
|
|||
{% block breadcrumb %} |
|||
<ol class="breadcrumb"> |
|||
<li><span class="glyphicon glyphicon-home"></span></li> |
|||
<li><a href="{% url 'finapp:alltime_gateways_list' %}">{% trans 'Payment system' %}</a></li> |
|||
<li class="active"> |
|||
{% if object %} |
|||
{% trans 'Change payment gateway' %} |
|||
{% else %} |
|||
{% trans 'Add payment gateway' %} |
|||
{% endif %} |
|||
</li> |
|||
</ol> |
|||
{% endblock %} |
|||
|
|||
|
|||
{% block page-header %} |
|||
{% trans 'Make new payment gateway' %} |
|||
{% endblock %} |
|||
|
|||
|
|||
{% block main %} |
|||
{% if object %} |
|||
{% url 'finapp:edit_pay_gw' object.slug as form_url %} |
|||
{% else %} |
|||
{% url 'finapp:add_alltime_gateway' as form_url %} |
|||
{% endif %} |
|||
|
|||
<div class="panel panel-default"> |
|||
<div class="panel-heading"> |
|||
<h3 class="panel-title">{% trans 'Type info about payment gateway' %}</h3> |
|||
</div> |
|||
<div class="panel-body"> |
|||
<form role="form" action="{{ form_url }}" method="post">{% csrf_token %} |
|||
<div class="form-group"> |
|||
{% bootstrap_form form %} |
|||
</div> |
|||
<div class="btn-group btn-group-sm"> |
|||
{% if object %} |
|||
<button type="submit" class="btn btn-primary"> |
|||
<span class="glyphicon glyphicon-save"></span> {% trans 'Save' %} |
|||
</button> |
|||
{% else %} |
|||
<button type="submit" class="btn btn-success"> |
|||
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add' %} |
|||
</button> |
|||
{% endif %} |
|||
<button type="reset" class="btn btn-default"> |
|||
<span class="glyphicon glyphicon-remove-circle"></span> {% trans 'Reset' %} |
|||
</button> |
|||
{% if object %} |
|||
<a href="{% url 'finapp:pay_history' object.slug %}" class="btn btn-default"> |
|||
<span class="glyphicon glyphicon-list"></span> {% trans 'Payment history' %} |
|||
</a> |
|||
{% endif %} |
|||
</div> |
|||
</form> |
|||
</div> |
|||
</div> |
|||
{% endblock %} |
|||
@ -0,0 +1,75 @@ |
|||
{% extends 'base.html' %} |
|||
{% load i18n %} |
|||
|
|||
|
|||
{% block breadcrumb %} |
|||
<ol class="breadcrumb"> |
|||
<li><span class="glyphicon glyphicon-home"></span></li> |
|||
<li class="active">{% trans 'Payment system' %}</li> |
|||
</ol> |
|||
{% endblock %} |
|||
|
|||
{% block page-header %} |
|||
{% trans 'List of payment gateways' %} |
|||
{% endblock %} |
|||
|
|||
|
|||
{% block main %} |
|||
|
|||
<table class="table table-striped table-bordered"> |
|||
<thead> |
|||
<tr> |
|||
<th class="col-sm-7">{% trans 'Title' %}</th> |
|||
<th class="col-sm-3">{% trans 'Service id' %}</th> |
|||
<th class="col-sm-1">{% trans 'Pays count' %}</th> |
|||
<th class="col-sm-1"></th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
{% for gw in object_list %} |
|||
<tr> |
|||
<td>{{ gw.title }}</td> |
|||
<td>{{ gw.service_id }}</td> |
|||
<td>{{ gw.pays_count }}</td> |
|||
<td class="btn-group btn-group-sm"> |
|||
{% if perms.finapp.change_payalltimegateway %} |
|||
<a href="{% url 'finapp:edit_pay_gw' gw.slug %}" class="btn btn-default" title="{% trans 'Edit' %}" data-toggle="tooltip"> |
|||
<span class="glyphicon glyphicon-edit"></span> |
|||
</a> |
|||
{% else %} |
|||
<a href="#" class="btn btn-default" title="{% trans 'Permission required' %}" disabled data-toggle="tooltip"> |
|||
<span class="glyphicon glyphicon-edit"></span> |
|||
</a> |
|||
{% endif %} |
|||
{% if perms.finapp.view_alltimepaylog %} |
|||
<a href="{% url 'finapp:pay_history' gw.slug %}" class="btn btn-default" title="{% trans 'Payment history' %}" data-toggle="tooltip"> |
|||
<span class="glyphicon glyphicon-list"></span> |
|||
</a> |
|||
{% endif %} |
|||
</td> |
|||
</tr> |
|||
{% empty %} |
|||
<tr> |
|||
<td colspan="4">{% trans 'Payment gateways not found' %}</td> |
|||
</tr> |
|||
{% endfor %} |
|||
</tbody> |
|||
<tfoot> |
|||
<tr> |
|||
<td colspan="4" class="btn-group btn-group-sm"> |
|||
{% if perms.finapp.add_payalltimegateway %} |
|||
<a href="{% url 'finapp:add_alltime_gateway' %}" class="btn btn-default"> |
|||
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add' %} |
|||
</a> |
|||
{% else %} |
|||
<a href="#" class="btn btn-default" title="{% trans 'Permission required' %}" disabled> |
|||
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add' %} |
|||
</a> |
|||
{% endif %} |
|||
</td> |
|||
</tr> |
|||
</tfoot> |
|||
|
|||
</table> |
|||
|
|||
{% endblock %} |
|||
@ -0,0 +1,250 @@ |
|||
from abc import ABCMeta |
|||
from hashlib import md5 |
|||
|
|||
from django.shortcuts import resolve_url |
|||
from django.test import TestCase |
|||
from django.utils import timezone |
|||
from django.utils.html import escape |
|||
from xmltodict import parse |
|||
|
|||
from abonapp.models import Abon |
|||
from accounts_app.models import UserProfile |
|||
from djing import settings |
|||
from finapp.models import PayAllTimeGateway |
|||
from group_app.models import Group |
|||
|
|||
|
|||
def _make_sign(act: int, pay_account: str, serv_id: str, pay_id, secret: str): |
|||
md = md5() |
|||
s = "%d_%s_%s_%s_%s" % (act, pay_account, serv_id, pay_id, secret) |
|||
md.update(bytes(s, 'utf-8')) |
|||
return md.hexdigest() |
|||
|
|||
|
|||
class MyBaseTestCase(metaclass=ABCMeta): |
|||
def _client_get_check_login(self, url): |
|||
""" |
|||
Checks if url is protected from unauthorized access |
|||
:param url: |
|||
:return: authorized response |
|||
""" |
|||
r = self.client.get(url) |
|||
self.assertRedirects(r, "%s?next=%s" % (getattr(settings, 'LOGIN_URL'), url)) |
|||
self.client.force_login(self.adminuser) |
|||
r = self.client.get(url) |
|||
self.assertEqual(r.status_code, 200) |
|||
return r |
|||
|
|||
def setUp(self): |
|||
grp = Group.objects.create(title='Grp1') |
|||
a1 = Abon.objects.create_user( |
|||
telephone='+79781234567', |
|||
username='abon', |
|||
password='passw1' |
|||
) |
|||
a1.group = grp |
|||
a1.save(update_fields=('group',)) |
|||
my_admin = UserProfile.objects.create_superuser('+79781234567', 'local_superuser', 'ps') |
|||
self.adminuser = my_admin |
|||
self.abon = a1 |
|||
self.group = grp |
|||
|
|||
|
|||
class AllPayTestCase(MyBaseTestCase, TestCase): |
|||
time_format = '%d.%m.%Y %H:%M' |
|||
|
|||
def setUp(self): |
|||
a1 = Abon.objects.create_user( |
|||
telephone='+79785276481', |
|||
username='pay_account1', |
|||
password='passw1' |
|||
) |
|||
a1.ballance = -13.12 |
|||
a1.fio = 'Test Name' |
|||
a1.save(update_fields=('ballance', 'fio')) |
|||
pay_system = PayAllTimeGateway.objects.create( |
|||
title='Test pay system', |
|||
secret='secret', |
|||
service_id='service_id', |
|||
slug='pay_gw_slug' |
|||
) |
|||
self.pay_system = pay_system |
|||
|
|||
def user_pay_view(self): |
|||
print('test_user_pay_view') |
|||
current_date = timezone.now().strftime(self.time_format) |
|||
url = resolve_url('finapp:all_time_pay', self.pay_system.slug) |
|||
service_id = self.pay_system.service_id |
|||
r = self.client.get(url, { |
|||
'ACT': 1, |
|||
'PAY_ACCOUNT': 'pay_account1', |
|||
'SERVICE_ID': service_id, |
|||
'PAY_ID': '840ab457-e7d1-4494-8197-9570da035170', |
|||
'TRADE_POINT': 'term1', |
|||
'SIGN': _make_sign(1, 'pay_account1', service_id, |
|||
'840ab457-e7d1-4494-8197-9570da035170', self.pay_system.secret) |
|||
} |
|||
) |
|||
r = r.content.decode('utf-8') |
|||
o = ''.join(( |
|||
"<pay-response>", |
|||
"<balance>-13.12</balance>", |
|||
"<name>Test Name</name>", |
|||
"<account>pay_account1</account>", |
|||
"<service_id>%s</service_id>" % escape(service_id), |
|||
"<min_amount>10.0</min_amount>", |
|||
"<max_amount>5000</max_amount>", |
|||
"<status_code>21</status_code>", |
|||
"<time_stamp>%s</time_stamp>" % escape(current_date), |
|||
"</pay-response>" |
|||
)) |
|||
self.assertXMLEqual(r, o) |
|||
|
|||
def user_pay_pay(self): |
|||
print('test_user_pay_pay') |
|||
current_date = timezone.now().strftime(self.time_format) |
|||
url = resolve_url('finapp:all_time_pay', self.pay_system.slug) |
|||
service_id = self.pay_system.service_id |
|||
r = self.client.get(url, { |
|||
'ACT': 4, |
|||
'PAY_ACCOUNT': 'pay_account1', |
|||
'PAY_AMOUNT': 18.21, |
|||
'RECEIPT_NUM': 2126235, |
|||
'SERVICE_ID': service_id, |
|||
'PAY_ID': '840ab457-e7d1-4494-8197-9570da035170', |
|||
'TRADE_POINT': 'term1', |
|||
'SIGN': _make_sign(4, 'pay_account1', service_id, |
|||
'840ab457-e7d1-4494-8197-9570da035170', self.pay_system.secret) |
|||
}) |
|||
r = r.content.decode('utf-8') |
|||
xml = ''.join(( |
|||
"<pay-response>", |
|||
"<pay_id>840ab457-e7d1-4494-8197-9570da035170</pay_id>", |
|||
"<service_id>%s</service_id>" % escape(service_id), |
|||
"<amount>18.21</amount>", |
|||
"<status_code>22</status_code>", |
|||
"<time_stamp>%s</time_stamp>" % escape(current_date), |
|||
"</pay-response>" |
|||
)) |
|||
self.test_pay_time = current_date |
|||
self.assertXMLEqual(r, xml) |
|||
|
|||
def user_pay_check(self): |
|||
print('test_user_pay_check') |
|||
current_date = timezone.now().strftime(self.time_format) |
|||
url = resolve_url('finapp:all_time_pay', self.pay_system.slug) |
|||
service_id = self.pay_system.service_id |
|||
r = self.client.get(url, |
|||
{ |
|||
'ACT': 7, |
|||
'SERVICE_ID': service_id, |
|||
'PAY_ID': '840ab457-e7d1-4494-8197-9570da035170', |
|||
'SIGN': _make_sign(7, '', service_id, |
|||
'840ab457-e7d1-4494-8197-9570da035170', self.pay_system.secret) |
|||
} |
|||
) |
|||
r = r.content.decode('utf-8') |
|||
xml = ''.join(( |
|||
"<pay-response>", |
|||
"<status_code>11</status_code>", |
|||
"<time_stamp>%s</time_stamp>" % escape(current_date), |
|||
"<transaction>", |
|||
"<pay_id>840ab457-e7d1-4494-8197-9570da035170</pay_id>", |
|||
"<service_id>%s</service_id>" % escape(service_id), |
|||
"<amount>18.21</amount>", |
|||
"<status>111</status>", |
|||
"<time_stamp>%s</time_stamp>" % escape(self.test_pay_time), |
|||
"</transaction>" |
|||
"</pay-response>" |
|||
)) |
|||
self.assertXMLEqual(r, xml) |
|||
|
|||
def check_ballance(self): |
|||
print('check_ballance') |
|||
url = resolve_url('finapp:all_time_pay', self.pay_system.slug) |
|||
service_id = self.pay_system.service_id |
|||
r = self.client.get(url, |
|||
{ |
|||
'ACT': 1, |
|||
'PAY_ACCOUNT': 'pay_account1', |
|||
'SERVICE_ID': service_id, |
|||
'PAY_ID': '840ab457-e7d1-4494-8197-9570da035170', |
|||
'TRADE_POINT': 'term1', |
|||
'SIGN': _make_sign(1, 'pay_account1', service_id, |
|||
'840ab457-e7d1-4494-8197-9570da035170', self.pay_system.secret) |
|||
} |
|||
) |
|||
r = r.content.decode('utf-8') |
|||
r = parse(r) |
|||
bl = float(r['pay-response']['balance']) |
|||
self.assertEqual(bl, 5.09) |
|||
|
|||
def test_client_does_not_exist(self): |
|||
print('test_client_does_not_exist') |
|||
current_date = timezone.now().strftime(self.time_format) |
|||
url = resolve_url('finapp:all_time_pay', self.pay_system.slug) |
|||
service_id = self.pay_system.service_id |
|||
r = self.client.get(url, { |
|||
'ACT': 1, |
|||
'PAY_ACCOUNT': 'not_existing_acc', |
|||
'SERVICE_ID': service_id, |
|||
'PAY_ID': '840ab457-e7d1-4494-8197-9570da035170', |
|||
'TRADE_POINT': 'term1', |
|||
'SIGN': _make_sign(1, 'not_existing_acc', service_id, |
|||
'840ab457-e7d1-4494-8197-9570da035170', self.pay_system.secret) |
|||
}) |
|||
r = r.content.decode('utf-8') |
|||
self.assertXMLEqual(r, ''.join(( |
|||
"<pay-response>", |
|||
"<status_code>-40</status_code>", |
|||
"<time_stamp>%s</time_stamp>" % escape(current_date), |
|||
"<description>Account does not exist</description>", |
|||
"</pay-response>" |
|||
))) |
|||
|
|||
def try_pay_double(self): |
|||
print('try_pay_double') |
|||
url = resolve_url('finapp:all_time_pay', self.pay_system.slug) |
|||
service_id = self.pay_system.service_id |
|||
r = self.client.get(url, { |
|||
'ACT': 4, |
|||
'PAY_ACCOUNT': 'pay_account1', |
|||
'SERVICE_ID': service_id, |
|||
'PAY_ID': '840ab457-e7d1-4494-8197-9570da035170', |
|||
'TRADE_POINT': 'term1', |
|||
'SIGN': _make_sign(4, 'pay_account1', service_id, |
|||
'840ab457-e7d1-4494-8197-9570da035170', self.pay_system.secret) |
|||
}) |
|||
r = r.content.decode('utf-8') |
|||
r = parse(r) |
|||
status_code = int(r['pay-response']['status_code']) |
|||
self.assertEqual(status_code, -100) |
|||
|
|||
def non_existing_pay(self): |
|||
print('non_existing_pay') |
|||
current_date = timezone.now().strftime(self.time_format) |
|||
uuid = '9f154e93-d800-419a-92f7-da33529138be' |
|||
url = resolve_url('finapp:all_time_pay', self.pay_system.slug) |
|||
service_id = self.pay_system.service_id |
|||
r = self.client.get(url, { |
|||
'ACT': 7, |
|||
'SERVICE_ID': service_id, |
|||
'PAY_ID': uuid, |
|||
'SIGN': _make_sign(7, '', service_id, uuid, self.pay_system.secret) |
|||
}) |
|||
r = r.content.decode('utf-8') |
|||
xml = ''.join(( |
|||
"<pay-response>", |
|||
"<status_code>-10</status_code>", |
|||
"<time_stamp>%s</time_stamp>" % escape(current_date), |
|||
"</pay-response>" |
|||
)) |
|||
self.assertXMLEqual(r, xml) |
|||
|
|||
def test_pays(self): |
|||
self.user_pay_view() |
|||
self.user_pay_pay() |
|||
self.user_pay_check() |
|||
self.check_ballance() |
|||
self.try_pay_double() |
|||
self.non_existing_pay() |
|||
@ -0,0 +1,25 @@ |
|||
from django.urls import path |
|||
from finapp import views |
|||
|
|||
|
|||
app_name = 'finapp' |
|||
|
|||
urlpatterns = [ |
|||
path('', views.AllTimeGatewaysListView.as_view(), |
|||
name='alltime_gateways_list'), |
|||
|
|||
# path('fin_report/', views.BasicFinReport.as_view(), name='fin_report'), |
|||
# path('pay/', views.terminal_pay, name='terminal_pay'), |
|||
|
|||
path('add/', views.AddAllTimeGateway.as_view(), |
|||
name='add_alltime_gateway'), |
|||
|
|||
path('<slug:pay_slug>/pay_history/', views.PayHistoryListView.as_view(), |
|||
name='pay_history'), |
|||
|
|||
path('<slug:pay_slug>/make_pay/', views.AllTimePay.as_view(), |
|||
name='all_time_pay'), |
|||
|
|||
path('<slug:pay_slug>/edit/', views.EditPayUpdateView.as_view(), |
|||
name='edit_pay_gw'), |
|||
] |
|||
@ -0,0 +1,222 @@ |
|||
import csv |
|||
from hashlib import md5 |
|||
|
|||
from django.contrib import messages |
|||
from django.contrib.auth.mixins import PermissionRequiredMixin |
|||
from django.db import DatabaseError |
|||
from django.db.models import Count |
|||
from django.http import HttpResponse |
|||
from django.shortcuts import get_object_or_404, resolve_url |
|||
from django.urls import reverse_lazy |
|||
from django.utils import timezone |
|||
from django.utils.decorators import method_decorator |
|||
from django.views.generic import ListView, DetailView, CreateView, UpdateView |
|||
from django.utils.translation import ugettext_lazy as _ |
|||
from xmlview.decorators import xml_view |
|||
from djing import lib |
|||
from djing.global_base_views import OrderedFilteredList |
|||
from djing.lib import safe_int |
|||
from djing.lib.mixins import LoginAdminMixin, LoginAdminPermissionMixin |
|||
from finapp.forms import PayAllTimeGatewayForm |
|||
from finapp.models import AllTimePayLog, PayAllTimeGateway |
|||
from abonapp.models import Abon |
|||
|
|||
|
|||
class AllTimePay(DetailView): |
|||
http_method_names = 'get', |
|||
model = PayAllTimeGateway |
|||
pk_url_kwarg = 'slug' |
|||
slug_url_kwarg = 'pay_slug' |
|||
|
|||
@staticmethod |
|||
def _bad_ret(err_id, err_description=None): |
|||
now = timezone.now() |
|||
r = { |
|||
'status_code': lib.safe_int(err_id), |
|||
'time_stamp': now.strftime("%d.%m.%Y %H:%M") |
|||
} |
|||
if err_description: |
|||
r.update({'description': err_description}) |
|||
return r |
|||
|
|||
def check_sign(self, data: dict, sign: str) -> bool: |
|||
act = safe_int(data.get('ACT')) |
|||
pay_account = data.get('PAY_ACCOUNT') |
|||
serv_id = data.get('SERVICE_ID') |
|||
pay_id = data.get('PAY_ID') |
|||
md = md5() |
|||
s = '_'.join( |
|||
(str(act), pay_account or '', serv_id or '', |
|||
pay_id, self.object.secret) |
|||
) |
|||
md.update(bytes(s, 'utf-8')) |
|||
our_sign = md.hexdigest() |
|||
return our_sign == sign |
|||
|
|||
@method_decorator(xml_view(root_node='pay-response')) |
|||
def get(self, request, *args, **kwargs): |
|||
self.object = self.get_object() |
|||
act = lib.safe_int(request.GET.get('ACT')) |
|||
self.current_date = timezone.now().strftime("%d.%m.%Y %H:%M") |
|||
|
|||
if act <= 0: |
|||
return self._bad_ret(-101, 'ACT must be more than 0') |
|||
if not self.check_sign(request.GET, request.GET.get('SIGN').lower()): |
|||
self._bad_ret(-101, 'Bad sign') |
|||
|
|||
try: |
|||
if act == 1: |
|||
return self._fetch_user_info(request.GET) |
|||
elif act == 4: |
|||
return self._make_pay(request.GET) |
|||
elif act == 7: |
|||
return self._check_pay(request.GET) |
|||
else: |
|||
return self._bad_ret(-101, 'ACT is not passed') |
|||
except Abon.DoesNotExist: |
|||
return self._bad_ret(-40, 'Account does not exist') |
|||
except DatabaseError: |
|||
return self._bad_ret(-90) |
|||
except AllTimePayLog.DoesNotExist: |
|||
return self._bad_ret(-10) |
|||
except AttributeError: |
|||
return self._bad_ret(-101) |
|||
|
|||
def _fetch_user_info(self, data: dict): |
|||
pay_account = data.get('PAY_ACCOUNT') |
|||
abon = Abon.objects.get(username=pay_account) |
|||
fio = abon.fio |
|||
ballance = float(abon.ballance) |
|||
return { |
|||
'balance': ballance, |
|||
'name': fio, |
|||
'account': pay_account, |
|||
'service_id': self.object.service_id, |
|||
'min_amount': 10.0, |
|||
'max_amount': 5000, |
|||
'status_code': 21, |
|||
'time_stamp': self.current_date |
|||
} |
|||
|
|||
def _make_pay(self, data: dict): |
|||
trade_point = lib.safe_int(data.get('TRADE_POINT')) |
|||
receipt_num = lib.safe_int(data.get('RECEIPT_NUM')) |
|||
pay_account = data.get('PAY_ACCOUNT') |
|||
pay_id = data.get('PAY_ID') |
|||
pay_amount = lib.safe_float(data.get('PAY_AMOUNT')) |
|||
abon = Abon.objects.get(username=pay_account) |
|||
pays = AllTimePayLog.objects.filter(pay_id=pay_id) |
|||
if pays.exists(): |
|||
return self._bad_ret(-100, 'Pay already exists') |
|||
|
|||
abon.add_ballance( |
|||
None, pay_amount, |
|||
comment='%s %.2f' % (self.object.title, pay_amount) |
|||
) |
|||
abon.save(update_fields=('ballance',)) |
|||
|
|||
AllTimePayLog.objects.create( |
|||
pay_id=pay_id, |
|||
summ=pay_amount, |
|||
abon=abon, |
|||
trade_point=trade_point, |
|||
receipt_num=receipt_num, |
|||
pay_gw=self.object |
|||
) |
|||
return { |
|||
'pay_id': pay_id, |
|||
'service_id': data.get('SERVICE_ID'), |
|||
'amount': pay_amount, |
|||
'status_code': 22, |
|||
'time_stamp': self.current_date |
|||
} |
|||
|
|||
def _check_pay(self, data: dict): |
|||
pay_id = data.get('PAY_ID') |
|||
pay = AllTimePayLog.objects.get(pay_id=pay_id) |
|||
return { |
|||
'status_code': 11, |
|||
'time_stamp': self.current_date, |
|||
'transaction': { |
|||
'pay_id': pay_id, |
|||
'service_id': data.get('SERVICE_ID'), |
|||
'amount': pay.summ, |
|||
'status': 111, |
|||
'time_stamp': pay.date_add.strftime("%d.%m.%Y %H:%M") |
|||
} |
|||
} |
|||
|
|||
|
|||
class BasicFinReport(LoginAdminMixin, ListView): |
|||
model = AllTimePayLog |
|||
queryset = AllTimePayLog.objects.by_days() |
|||
template_name = 'finapp/fin_report.html' |
|||
context_object_name = 'logs' |
|||
|
|||
def get(self, request, *args, **kwargs): |
|||
res_format = request.GET.get('f') |
|||
if res_format == 'csv': |
|||
response = HttpResponse(content_type='text/csv') |
|||
response['Content-Disposition'] = 'attachment; filename="report.csv"' |
|||
writer = csv.writer(response, quoting=csv.QUOTE_NONNUMERIC) |
|||
for row in self.object_list: |
|||
writer.writerow( |
|||
(row['summ'], row['pay_date'].strftime('%Y-%m-%d')) |
|||
) |
|||
return response |
|||
return super().get(request, *args, **kwargs) |
|||
|
|||
|
|||
class PayHistoryListView(LoginAdminMixin, PermissionRequiredMixin, |
|||
OrderedFilteredList): |
|||
permission_required = 'group_app.view_group' |
|||
context_object_name = 'pay_history' |
|||
template_name = 'finapp/payHistory.html' |
|||
model = AllTimePayLog |
|||
|
|||
def get_queryset(self): |
|||
pay_history = AllTimePayLog.objects.filter( |
|||
pay_gw__slug=self.kwargs.get('pay_slug') |
|||
).order_by('-date_add') |
|||
return pay_history |
|||
|
|||
def get_context_data(self, **kwargs): |
|||
context = { |
|||
'pay_gw': get_object_or_404(PayAllTimeGateway, slug=self.kwargs.get('pay_slug')) |
|||
} |
|||
context.update(kwargs) |
|||
return super(PayHistoryListView, self).get_context_data(**context) |
|||
|
|||
|
|||
class AddAllTimeGateway(LoginAdminMixin, PermissionRequiredMixin, CreateView): |
|||
permission_required = 'finapp.add_payalltimegateway' |
|||
model = PayAllTimeGateway |
|||
form_class = PayAllTimeGatewayForm |
|||
success_url = reverse_lazy('finapp:alltime_gateways_list') |
|||
|
|||
def form_valid(self, form): |
|||
messages.success(self.request, _('New pay gateway created successfully')) |
|||
return super(AddAllTimeGateway, self).form_valid(form) |
|||
|
|||
|
|||
class AllTimeGatewaysListView(LoginAdminPermissionMixin, ListView): |
|||
permission_required = 'finapp.view_payalltimegateway' |
|||
model = PayAllTimeGateway |
|||
queryset = PayAllTimeGateway.objects.annotate( |
|||
pays_count=Count('alltimepaylog') |
|||
) |
|||
|
|||
|
|||
class EditPayUpdateView(LoginAdminPermissionMixin, UpdateView): |
|||
permission_required = 'finapp.change_payalltimegateway' |
|||
model = PayAllTimeGateway |
|||
form_class = PayAllTimeGatewayForm |
|||
pk_url_kwarg = 'slug' |
|||
slug_url_kwarg = 'pay_slug' |
|||
|
|||
def get_success_url(self): |
|||
return resolve_url('finapp:edit_pay_gw', self.object.slug) |
|||
|
|||
def form_valid(self, form): |
|||
messages.success(self.request, _('Payment gateway successfully updated')) |
|||
return super(EditPayUpdateView, self).form_valid(form) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue