Browse Source

Merge HEAD, branch 'master' of https://github.com/nerosketch/djing into mikrofix

devel
bashmak 9 years ago
parent
commit
429aee12e4
  1. 2
      abonapp/migrations/0012_auto_20170227_1718.py
  2. 3
      abonapp/models.py
  3. 3
      abonapp/pay_systems.py
  4. 2
      abonapp/templates/abonapp/editAbon.html
  5. 211
      abonapp/tests.py
  6. 3
      abonapp/views.py
  7. 2
      agent/mod_mikrotik.py
  8. 3
      djing/settings_example.py
  9. 2
      requirements.txt
  10. BIN
      static/img/gmarkers/dev.xcf

2
abonapp/migrations/0012_auto_20170227_1718.py

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2017-02-27 14:18
# Generated by Django 1.9 on 2017-03-02 18:41
from __future__ import unicode_literals
from django.db import migrations, models

3
abonapp/models.py

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from datetime import datetime
from django.core.exceptions import ValidationError
from django.utils import timezone
from django.db import models
@ -272,7 +273,7 @@ class Abon(UserProfile):
def activate_next_tariff(self, author):
ats = AbonTariff.objects.filter(abon=self).order_by('tariff_priority')
nw = timezone.make_aware(timezone.datetime.now())
nw = timezone.make_aware(datetime.now())
for at in ats:
# усдуга не активна, продолжаем

3
abonapp/pay_systems.py

@ -5,8 +5,7 @@ from .models import Abon, AllTimePayLog
from django.db import DatabaseError
SERV_ID = 'y832r92y8f9e'
SECRET = '302u8u3280'
from djing.settings import pay_SECRET as SECRET, pay_SERV_ID as SERV_ID
#?ACT=1&PAY_ACCOUNT=960849&SERVICE_ID=y832r92y8f9e&PAY_ID=3561234&TRADE_POINT=377&SIGN=32e533a72389fe4e93746509f9d672f8

2
abonapp/templates/abonapp/editAbon.html

@ -9,7 +9,7 @@
<h3 class="panel-title">{% trans 'Change subscriber' %}</h3>
</div>
<div class="panel-body">
<form role="form" class="form-horizontal" action="{% url 'abonapp:abon_home' abon_group.id abon.id %}" method="post">{% csrf_token %}
<form role="form" class="form-horizontal" action="{% url 'abonapp:abon_home' abon_group.pk abon.pk %}" method="post">{% csrf_token %}
<div class="form-group-sm">
<label for="id_username" class="col-sm-4 control-label">{% trans 'login' %}</label>

211
abonapp/tests.py

@ -0,0 +1,211 @@
from django.test import TestCase
from django.test.client import Client
from agent import NasNetworkError
from .models import AbonTariff, Abon, AbonGroup, LogicError, AbonRawPassword
from tariff_app.models import Tariff
class AbonTestCase(TestCase):
def setUp(self):
try:
Tariff.objects.create(
title='test_tariff',
descr='taroff descr',
speedIn=1.2,
speedOut=3.0,
amount=3
)
abon = Abon()
abon.username = '1234567'
abon.fio = 'mainuser'
abon.telephone = '+79788328884'
abon.set_password('ps')
abon.is_superuser = True
abon.save()
abon_group = AbonGroup.objects.create(title='abon_group')
abon_group.profiles.add(abon)
except NasNetworkError:
pass
# проверка на пополнение счёта
def test_add_ballance(self):
try:
abon = Abon.objects.get(username='1234567')
ballance = abon.ballance
abon.add_ballance(abon, 13, 'test pay')
abon.save(update_fields=['ballance'])
self.assertEqual(abon.ballance, ballance+13)
ballance = abon.ballance
abon.add_ballance(abon, 5.34, 'test float pay')
abon.save(update_fields=['ballance'])
self.assertEqual(abon.ballance, ballance+5.34)
except NasNetworkError:
pass
# пробуем выбрать услугу
def test_pick_tariff(self):
try:
tariff = Tariff.objects.get(title='test_tariff')
abon = Abon.objects.get(username='1234567')
try:
abon.pick_tariff(tariff, abon)
# нет денег, должно всплыть исключение и сюда дойти мы не должны
self.assertFalse(True)
except LogicError:
pass
act_tar = abon.active_tariff()
# если недостаточно денег на счету
assert abon.ballance <= tariff.amount
# У абонента на счету 0, не должна быть куплена услуга
self.assertEqual(act_tar, None)
# Раз услуги нет то и доступа быть не должно
self.assertTrue(not abon.is_access())
# с деньгами
abon.add_ballance(abon, 7.34, 'add pay for test pick tariff')
abon.pick_tariff(tariff, abon)
act_tar = abon.active_tariff()
# должны получить указанную услугу
self.assertEqual(act_tar, tariff)
# и получить доступ
self.assertTrue(abon.is_access())
except NasNetworkError:
pass
# тестим очередь услуг
def test_services_queue(self):
abon = Abon.objects.get(username='1234567')
tariff = Tariff.objects.get(title='test_tariff')
abon.add_ballance(abon, 9, 'add pay for test services queue')
abon.save()
abon.pick_tariff(tariff, abon)
abon.pick_tariff(tariff, abon)
abon.pick_tariff(tariff, abon)
# снять деньги должно было только за первый выбор, остальные стают в очередь услуг
self.assertEqual(abon.ballance, 6)
c = Client()
# login
c.post('/accounts/login/', {'login': '1234567', 'password': 'ps'})
resp = c.get('/abons/1/1/complete_service1')
print('RESP:', resp)
self.assertEqual(resp.status_code, 200)
resp = c.post('/abons/1/1/complete_service1', data={
'finish_confirm': 'yes'
})
print('RESP:', resp)
# при успешной остановке услуги идёт редирект на др страницу
self.assertEqual(resp.status_code, 302)
# текущей услуги быть не должно
act_tar = abon.active_tariff()
self.assertIsNone(act_tar)
# не активных услуг останется 2
noact_count = AbonTariff.objects.filter(abon=abon).filter(time_start=None).count()
self.assertEqual(noact_count, 2)
# проверяем платёжку alltime
def test_allpay(self):
from hashlib import md5
from djing.settings import pay_SECRET, pay_SERV_ID
import xmltodict
def sig(act, pay_account, pay_id):
md = md5()
s = '_'.join((str(act), str(pay_account), pay_SERV_ID, str(pay_id), pay_SECRET))
md.update(bytes(s, 'utf-8'))
return md.hexdigest()
c = Client()
r = c.get('/abons/pay', {
'ACT': 1, 'PAY_ACCOUNT': '1234567',
'SERVICE_ID': pay_SERV_ID,
'PAY_ID': 3561234,
'TRADE_POINT': 377,
'SIGN': sig(1, 1234567, 3561234)
})
xobj = xmltodict.parse(r.content)
self.assertEqual(int(xobj['pay-response']['status_code']), 21)
r = c.get('/abons/pay', {
'ACT': 4, 'PAY_ACCOUNT': '1234567',
'SERVICE_ID': pay_SERV_ID,
'PAY_ID': 3561234,
'PAY_AMOUNT': 1.0,
'TRADE_POINT': 377,
'SIGN': sig(4, 1234567, 3561234)
})
xobj = xmltodict.parse(r.content)
self.assertEqual(int(xobj['pay-response']['status_code']), 22)
r = c.get('/abons/pay', {
'ACT': 4, 'PAY_ACCOUNT': '1234567',
'SERVICE_ID': pay_SERV_ID,
'PAY_ID': 3561234,
'PAY_AMOUNT': 1.0,
'TRADE_POINT': 377,
'SIGN': sig(4, 1234567, 3561234)
})
xobj = xmltodict.parse(r.content)
self.assertEqual(int(xobj['pay-response']['status_code']), -100)
r = c.get('/abons/pay', {
'ACT': 7, 'PAY_ACCOUNT': '1234567',
'SERVICE_ID': pay_SERV_ID,
'PAY_ID': 3561234,
'PAY_AMOUNT': 1.0,
'TRADE_POINT': 377,
'SIGN': sig(7, 1234567, 3561234)
})
xobj = xmltodict.parse(r.content)
self.assertEqual(int(xobj['pay-response']['status_code']), 11)
abon = Abon.objects.get(username='1234567')
self.assertEqual(abon.ballance, 1)
# пробуем добавить группу абонентов
def test_add_abongroup(self):
abon = Abon.objects.get(username='1234567')
ag = AbonGroup.objects.create(title='%&34%$&*(')
ag.profiles.add(abon)
# пробуем добавить абонента
def test_add_abon(self):
c = Client()
c.login(username='1234567', password='ps')
r = c.get('/abons/1/addabon')
# поглядим на страницу добавления абонента
self.assertEqual(r.status_code, 200)
r = c.post('/abons/1/addabon', {
'username': '123',
'password': 'ps',
'fio': 'Abon Fio',
'telephone': '+79783753914',
'is_active': True
})
self.assertEqual(r.status_code, 302)
r = c.get('/abons/324/addabon')
self.assertEqual(r.status_code, 404)
try:
abn = Abon.objects.get(username='123')
self.assertIsNotNone(abn)
psw = AbonRawPassword.objects.get(account=abn, passw_text='ps')
self.assertIsNotNone(psw)
except Abon.DoesNotExist:
# абонент должен был создаться
self.assertTrue(False)
except AbonRawPassword.DoesNotExist:
# должен быть пароль абонента простым текстом
self.assertTrue(False)
class AbonTariffTestCase(TestCase):
def setUp(self):
abon = Abon.objects.create(
username='1234567',
telephone='+79788328884'
)
tariff = Tariff.objects.create(
title='test_tariff',
descr='taroff descr',
speedIn=1.2,
speedOut=3.0,
amount=3
)
AbonTariff.objects.create(
abon=abon,
tariff=tariff
)

3
abonapp/views.py

@ -392,6 +392,9 @@ def complete_service(request, gid, uid, srvid):
res_amount = calc_obj.calc_amount()
cashback = abtar.tariff.amount - res_amount
if abtar.abon.group is None:
abon.group = get_object_or_404(models.AbonGroup, pk=gid)
abon.save(update_fields=['group'])
if int(abtar.abon.pk) != int(uid) or int(abtar.abon.group.pk) != int(gid):
# если что-то написали в урле вручную, то вернём на путь истинный
return redirect('abonapp:compl_srv', gid=abtar.abon.group.pk, uid=abtar.abon.pk, srvid=srvid)

2
agent/mod_mikrotik.py

@ -173,6 +173,8 @@ class TransmitterManager(BaseTransmitter):
assert isinstance(cmd, list)
result_iter = self.ar.talk_iter(cmd)
for rt in result_iter:
if len(rt) < 2:
continue
if rt[0] == '!trap':
raise NasFailedResult(rt[1]['=message'])
yield rt

3
djing/settings_example.py

@ -157,3 +157,6 @@ LOGIN_REDIRECT_URL = reverse_lazy('acc_app:profile')
LOGOUT_URL = reverse_lazy('acc_app:logout_link')
PAGINATION_ITEMS_PER_PAGE=10
pay_SERV_ID = '<service id>'
pay_SECRET = '<secret>'

2
requirements.txt

@ -3,3 +3,5 @@ Pillow
mysqlclient
telepot
easysnmp
# for testing required xmltodict
xmltodict

BIN
static/img/gmarkers/dev.xcf

Loading…
Cancel
Save