Browse Source

Merge branch 'devel' of https://github.com/nerosketch/djing into devel

# Conflicts:
#	taskapp/locale/ru/LC_MESSAGES/django.po
devel
bashmak 9 years ago
parent
commit
5a109264d1
  1. 120
      abonapp/locale/ru/LC_MESSAGES/django.po
  2. 87
      abonapp/views.py
  3. 56
      chatbot/locale/ru/LC_MESSAGES/django.po
  4. 20
      chatbot/telebot.py
  5. 47
      djing/utils/load_from_nodeny.py
  6. 116
      djing/utils/save_from_nodeny.py
  7. 8
      mydefs.py
  8. 4
      requirements.txt
  9. 2
      tariff_app/templates/tariff_app/tarifs.html
  10. 18
      taskapp/models.py
  11. 24
      taskapp/views.py

120
abonapp/locale/ru/LC_MESSAGES/django.po

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-28 12:46+0300\n"
"POT-Creation-Date: 2017-03-25 00:40+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Dmitry Novikov nerosketch@gmail.com\n"
"Language: ru\n"
@ -35,59 +35,59 @@ msgstr "ФИО"
msgid "telephone placeholder"
msgstr "+[7,8,9,3] и 10,11 цифр"
#: abonapp/models.py:24
#: abonapp/models.py:26
msgid "fill account"
msgstr "Пополнение счёта"
#: abonapp/models.py:117
#: abonapp/models.py:119
msgid "not enough money"
msgstr "Не хватает денег на счету"
#: abonapp/models.py:123
#: abonapp/models.py:125
msgid "service finish log"
msgstr "Завершение и оплата услуги по истечению срока действия"
#: abonapp/models.py:142
#: abonapp/models.py:144
msgid "finish service perm"
msgstr "Снятие со счёта средств"
#: abonapp/models.py:143
#: abonapp/models.py:145
msgid "activate service perm"
msgstr "Активация услуги абонента"
#: abonapp/models.py:160
#: abonapp/models.py:162
msgid "Digital field"
msgstr "Цифровое поле"
#: abonapp/models.py:161
#: abonapp/models.py:163
msgid "Text field"
msgstr "Текстовое поле"
#: abonapp/models.py:162
#: abonapp/models.py:164
msgid "Floating field"
msgstr "Дробное с плавающей точкой"
#: abonapp/models.py:176
#: abonapp/models.py:178
msgid "Double invalid value"
msgstr "Введите число с плавающей запятой"
#: abonapp/models.py:217
#: abonapp/models.py:219
msgid "Buy service perm"
msgstr "Покупка тарифа абоненту"
#: abonapp/models.py:218
#: abonapp/models.py:220
msgid "Can view passport"
msgstr "Может просматривать паспортные данные"
#: abonapp/models.py:222
#: abonapp/models.py:224
msgid "pay log"
msgstr "Снятие со счёта средств"
#: abonapp/models.py:268
#: abonapp/models.py:270
msgid "Buy service default log"
msgstr "Покупка тарифного плана через админку"
#: abonapp/models.py:283
#: abonapp/models.py:285
msgid "service overdue log"
msgstr "Услуга просрочена, отключаем, и подключаем новую"
@ -100,9 +100,12 @@ msgstr "Услуга просрочена, отключаем, и подключ
#: abonapp/templates/abonapp/debtors.html:8
#: abonapp/templates/abonapp/group_list.html:8
#: abonapp/templates/abonapp/group_list.html:11
#: abonapp/templates/abonapp/group_list.html:47
#: abonapp/templates/abonapp/group_tariffs.html:7
#: abonapp/templates/abonapp/invoiceForPayment.html:7
#: abonapp/templates/abonapp/log.html:7
#: abonapp/templates/abonapp/peoples.html:8
#: abonapp/templates/abonapp/peoples.html:114
msgid "User groups"
msgstr "Группы абонентов"
@ -133,9 +136,10 @@ msgstr ""
#: abonapp/templates/abonapp/addAbon.html:86
#: abonapp/templates/abonapp/addGroup.html:29
#: abonapp/templates/abonapp/addInvoice.html:46
#: abonapp/templates/abonapp/buy_tariff.html:34
#: abonapp/templates/abonapp/buy_tariff.html:38
#: abonapp/templates/abonapp/complete_service.html:49
#: abonapp/templates/abonapp/editAbon.html:89
#: abonapp/templates/abonapp/editAbon.html:96
#: abonapp/templates/abonapp/group_tariffs.html:29
#: abonapp/templates/abonapp/passport_view.html:42
msgid "Save"
msgstr "Сохранить"
@ -159,7 +163,7 @@ msgid "Telephone"
msgstr "Телефон"
#: abonapp/templates/abonapp/addAbon.html:45
#: abonapp/templates/abonapp/editAbon.html:59
#: abonapp/templates/abonapp/editAbon.html:66
#: abonapp/templates/abonapp/viewAbon.html:16
msgid "User group"
msgstr "Группа"
@ -167,7 +171,7 @@ msgstr "Группа"
#: abonapp/templates/abonapp/addAbon.html:53
#: abonapp/templates/abonapp/addInvoice.html:40
#: abonapp/templates/abonapp/debtors.html:22
#: abonapp/templates/abonapp/editAbon.html:80
#: abonapp/templates/abonapp/editAbon.html:87
#: abonapp/templates/abonapp/invoiceForPayment.html:23
#: abonapp/templates/abonapp/log.html:20
#: abonapp/templates/abonapp/payHistory.html:12
@ -176,7 +180,7 @@ msgid "Comment"
msgstr "Комментарий"
#: abonapp/templates/abonapp/addAbon.html:59
#: abonapp/templates/abonapp/editAbon.html:36
#: abonapp/templates/abonapp/editAbon.html:43
#: abonapp/templates/abonapp/peoples.html:39
#: abonapp/templates/abonapp/viewAbon.html:40
msgid "Street"
@ -188,7 +192,7 @@ msgid "Apartment"
msgstr "Квартира"
#: abonapp/templates/abonapp/addAbon.html:76
#: abonapp/templates/abonapp/editAbon.html:66
#: abonapp/templates/abonapp/editAbon.html:73
#: abonapp/templates/abonapp/viewAbon.html:54
msgid "Password"
msgstr "Пароль"
@ -196,14 +200,15 @@ msgstr "Пароль"
#: abonapp/templates/abonapp/addAbon.html:89
#: abonapp/templates/abonapp/addGroup.html:32
#: abonapp/templates/abonapp/addInvoice.html:49
#: abonapp/templates/abonapp/buy_tariff.html:37
#: abonapp/templates/abonapp/buy_tariff.html:41
#: abonapp/templates/abonapp/group_tariffs.html:29
#: abonapp/templates/abonapp/modal_abonamount.html:26
msgid "Reset"
msgstr "Сбросить"
#: abonapp/templates/abonapp/addGroup.html:8
#: abonapp/templates/abonapp/addGroup.html:15
#: abonapp/templates/abonapp/group_list.html:60
#: abonapp/templates/abonapp/group_list.html:63
msgid "Add group"
msgstr "Добавьте группу абонентов"
@ -271,6 +276,7 @@ msgid ""
msgstr "Подробнее:<br/>Вы завершаете тариф"
#: abonapp/templates/abonapp/complete_service.html:39
#, python-format
msgid ""
"The service has been connected: %(time_start)s<br/>\n"
"Today: %(today)s<br/>\n"
@ -280,8 +286,8 @@ msgid ""
"Cashback: %(cashback)s"
msgstr ""
"Услуга была подключена: %(time_start)s<br/>Сегодня: %(today)s<br/>Время "
"использования: %(time_use)s<br/>Полная стоимость услуги: %(amount)s<br/>"
"Итоговая стоимость: %(tcost)s<br/>\n"
"использования: %(time_use)s<br/>Полная стоимость услуги: %(amount)s<br/"
">Итоговая стоимость: %(tcost)s<br/>\n"
"Средства для возврата: %(cashback)s"
#: abonapp/templates/abonapp/debtors.html:9
@ -312,48 +318,54 @@ msgstr "Нет должников"
msgid "Change subscriber"
msgstr "Изменение абонента"
#: abonapp/templates/abonapp/editAbon.html:44
#: abonapp/templates/abonapp/editAbon.html:36
#: abonapp/templates/abonapp/editAbon.html:117
#: abonapp/templates/abonapp/editAbon.html:135
#: abonapp/templates/abonapp/viewAbon.html:50
msgid "Ip Address"
msgstr "IP Адрес"
#: abonapp/templates/abonapp/editAbon.html:51
#: abonapp/templates/abonapp/peoples.html:45
#: abonapp/templates/abonapp/viewAbon.html:46
msgid "House"
msgstr "Дом"
#: abonapp/templates/abonapp/editAbon.html:52
#: abonapp/templates/abonapp/editAbon.html:59
#: abonapp/templates/abonapp/viewAbon.html:22
msgid "Is active"
msgstr "Активен"
#: abonapp/templates/abonapp/editAbon.html:92
#: abonapp/templates/abonapp/editAbon.html:99
msgid "Send account info to user"
msgstr "Отправить данные абоненту"
#: abonapp/templates/abonapp/editAbon.html:104
#: abonapp/templates/abonapp/editAbon.html:111
msgid "Technical information"
msgstr "Техническая информация"
#: abonapp/templates/abonapp/editAbon.html:110
#: abonapp/templates/abonapp/editAbon.html:128
#: abonapp/templates/abonapp/viewAbon.html:50
msgid "Ip Address"
msgstr "IP Адрес"
#: abonapp/templates/abonapp/group_list.html:27
msgid "Number of subscribers"
msgstr "Количество абонентов"
#: abonapp/templates/abonapp/group_list.html:51
#: abonapp/templates/abonapp/group_list.html:54
msgid "Groups was not found"
msgstr "Ещё нет групп"
#: abonapp/templates/abonapp/group_list.html:64
#: abonapp/templates/abonapp/group_list.html:67
#: abonapp/templates/abonapp/log.html:8
msgid "Subscribers actions"
msgstr "История действий абонентов"
#: abonapp/templates/abonapp/group_list.html:67
#: abonapp/templates/abonapp/group_list.html:70
msgid "List of debtors"
msgstr "Список должников"
#: abonapp/templates/abonapp/group_tariffs.html:9
#: abonapp/templates/abonapp/group_tariffs.html:14
msgid "Belonging services for groups"
msgstr "Принадлежность услуг к группам"
#: abonapp/templates/abonapp/invoiceForPayment.html:10
#: abonapp/templates/abonapp/payHistory.html:39
msgid "Debts"
@ -400,7 +412,7 @@ msgstr "История абонента"
msgid "Date"
msgstr "Время"
#: abonapp/templates/abonapp/log.html:40
#: abonapp/templates/abonapp/log.html:46
msgid "Actions not found"
msgstr "Нет событий"
@ -487,6 +499,10 @@ msgstr "Абоненты не найдены"
msgid "Refresh subscribers on NAS"
msgstr "Обновить абонентов в NAS"
#: abonapp/templates/abonapp/peoples.html:115
msgid "Tariffs in groups"
msgstr "Тарифы в группах"
#: abonapp/templates/abonapp/services.html:5
msgid "Services of subscriber"
msgstr "Купленные абонентом услуги (назначенные тарифные планы)"
@ -568,7 +584,6 @@ msgid "create group success msg"
msgstr "Группа успешно создана"
#: abonapp/views.py:54 abonapp/views.py:112 abonapp/views.py:253
#: abonapp/views.py:345
msgid "fix form errors"
msgstr "Некоторые поля заполнены не правильно, проверте ещё раз"
@ -633,27 +648,31 @@ msgstr "Для абонента не задан пароль, он не смож
msgid "Receipt has been created"
msgstr "Квитанция на оплату была создана"
#: abonapp/views.py:342
#: abonapp/views.py:339
msgid "Tariff has been picked"
msgstr "Тариф успешно выбран"
#: abonapp/views.py:408
#: abonapp/views.py:349
msgid "Tariff your picked does not exist"
msgstr "Тариф, который вы выбрали, не существует"
#: abonapp/views.py:406
msgid "Refunds for unused resources"
msgstr "Возврат средств за неиспользованные ресурсы"
#: abonapp/views.py:414
#: abonapp/views.py:412
msgid "Service has been finished successfully"
msgstr "Услуга успешно завершена"
#: abonapp/views.py:417 abonapp/views.py:448
#: abonapp/views.py:415 abonapp/views.py:446
msgid "Not confirmed"
msgstr "Действие не подтверждено"
#: abonapp/views.py:451
#: abonapp/views.py:449
msgid "Service has been activated successfully"
msgstr "Услуга успешно активирована"
#: abonapp/views.py:476
#: abonapp/views.py:474
msgid "User has been detached from service"
msgstr "Абонент отвязан от услуги"
@ -674,12 +693,3 @@ msgstr "История задач"
msgid "Dynamic Field"
msgstr "Динамическое поле"
msgid "Tariffs in groups"
msgstr "Тарифы в группах"
msgid "Belonging services for groups"
msgstr "Принадлежность услуг к группам"
msgid "Tariff your picked does not exist"
msgstr "Тариф, который вы выбрали, не существует"

87
abonapp/views.py

@ -52,10 +52,11 @@ def addgroup(request):
return redirect('abonapp:group_list')
else:
messages.error(request, _('fix form errors'))
except NasFailedResult as e:
messages.error(request, e)
except NasNetworkError as e:
except (NasFailedResult, NasNetworkError) as e:
messages.error(request, e)
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return render(request, 'abonapp/addGroup.html', {
'form': frm
})
@ -88,10 +89,11 @@ def delgroup(request):
get_object_or_404(models.AbonGroup, id=agd).delete()
messages.success(request, _('delete group success msg'))
return mydefs.res_success(request, 'abonapp:group_list')
except NasFailedResult as e:
messages.error(request, e)
except NasNetworkError as e:
except (NasFailedResult, NasNetworkError) as e:
messages.error(request, e)
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return mydefs.res_error(request, 'abonapp:group_list')
@ -111,14 +113,11 @@ def addabon(request, gid):
else:
messages.error(request, _('fix form errors'))
except IntegrityError as e:
messages.error(request, e)
except models.LogicError as e:
messages.error(request, e)
except NasFailedResult as e:
messages.error(request, e)
except NasNetworkError as e:
except (IntegrityError, NasFailedResult, NasNetworkError, models.LogicError) as e:
messages.error(request, e)
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
if not frm:
frm = forms.AbonForm(initial={
@ -159,6 +158,9 @@ def delentity(request):
messages.error(request, e)
except NasFailedResult as e:
messages.error(request, _("NAS says: '%s'") % e)
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return redirect('abonapp:group_list')
@ -177,10 +179,11 @@ def abonamount(request, gid, uid):
return redirect('abonapp:abon_home', gid=gid, uid=uid)
else:
messages.error(request, _('I not know the account id'))
except NasNetworkError as e:
messages.error(request, e)
except NasFailedResult as e:
except (NasNetworkError, NasFailedResult) as e:
messages.error(request, e)
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return render_to_text('abonapp/modal_abonamount.html', {
'abon': abon,
'abon_group': get_object_or_404(models.AbonGroup, id=gid)
@ -258,14 +261,15 @@ def abonhome(request, gid, uid):
messages.error(request, _('Ip address already exist. %s') % e)
frm = forms.AbonForm(instance=abon, initial={'password': passw})
except NasFailedResult as e:
messages.error(request, e)
except NasNetworkError as e:
except (NasFailedResult, NasNetworkError) as e:
messages.error(request, e)
except IpPoolItem.DoesNotExist:
messages.error(request, _('Ip address not found'))
except models.AbonRawPassword.DoesNotExist:
messages.warning(request, _('User has not have password, and cannot login'))
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
if request.user.has_perm('abonapp.change_abon'):
return render(request, 'abonapp/editAbon.html', {
@ -315,10 +319,11 @@ def add_invoice(request, gid, uid):
messages.success(request, _('Receipt has been created'))
return redirect('abonapp:abon_home', gid=gid, uid=uid)
except NasNetworkError as e:
messages.error(request, e)
except NasFailedResult as e:
except (NasNetworkError, NasFailedResult) as e:
messages.error(request, e)
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return render(request, 'abonapp/addInvoice.html', {
'abon': abon,
'invcount': models.InvoiceForPayment.objects.filter(abon=abon).count(),
@ -338,15 +343,16 @@ def pick_tariff(request, gid, uid):
abon.pick_tariff(trf, request.user)
messages.success(request, _('Tariff has been picked'))
return redirect('abonapp:abon_services', gid=gid, uid=abon.id)
except models.LogicError as e:
messages.error(request, e)
except NasFailedResult as e:
except (models.LogicError, NasFailedResult) as e:
messages.error(request, e)
except NasNetworkError as e:
messages.error(request, e)
return redirect('abonapp:abon_services', gid=gid, uid=abon.id)
except Tariff.DoesNotExist:
messages.error(request, _('Tariff your picked does not exist'))
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return render(request, 'abonapp/buy_tariff.html', {
'tariffs': tariffs,
@ -368,10 +374,11 @@ def chpriority(request, gid, uid):
current_abon_tariff.priority_up()
elif act == 'down':
current_abon_tariff.priority_down()
except NasFailedResult as e:
messages.error(request, e)
except NasNetworkError as e:
except (NasFailedResult, NasNetworkError) as e:
messages.error(request, e)
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return redirect('abonapp:abon_home', gid=gid, uid=uid)
@ -416,13 +423,14 @@ def complete_service(request, gid, uid, srvid):
time_use = mydefs.RuTimedelta(timezone.now() - abtar.time_start)
except models.LogicError as e:
messages.error(request, e)
except NasFailedResult as e:
except (models.LogicError, NasFailedResult) as e:
messages.error(request, e)
except NasNetworkError as e:
messages.warning(request, e)
return redirect('abonapp:abon_home', gid, uid)
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return render(request, 'abonapp/complete_service.html', {
'abtar': abtar,
@ -449,12 +457,13 @@ def activate_service(request, gid, uid, srvid):
messages.success(request, _('Service has been activated successfully'))
return redirect('abonapp:abon_services', gid, uid)
except NasFailedResult as e:
except (NasFailedResult, models.LogicError) as e:
messages.error(request, e)
except NasNetworkError as e:
messages.warning(request, e)
except models.LogicError as e:
messages.error(request, e)
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
calc_obj = abtar.tariff.get_calc_type()(abtar)
return render(request, 'abonapp/activate_service.html', {
'abon': abtar.abon,
@ -476,6 +485,9 @@ def unsubscribe_service(request, gid, uid, srvid):
messages.error(request, e)
except NasNetworkError as e:
messages.warning(request, e)
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return redirect('abonapp:abon_home', gid=gid, uid=uid)
@ -483,9 +495,7 @@ def unsubscribe_service(request, gid, uid, srvid):
@mydefs.only_admins
def log_page(request):
logs = models.AbonLog.objects.all()
logs = mydefs.pag_mn(request, logs)
return render(request, 'abonapp/log.html', {
'logs': logs
})
@ -496,10 +506,8 @@ def log_page(request):
def debtors(request):
# peoples_list = models.Abon.objects.filter(invoiceforpayment__status=True)
#peoples_list = mydefs.pag_mn(request, peoples_list)
invs = models.InvoiceForPayment.objects.filter(status=True)
invs = mydefs.pag_mn(request, invs)
return render(request, 'abonapp/debtors.html', {
#'peoples': peoples_list
'invoices': invs
@ -521,6 +529,9 @@ def update_nas(request, group_id):
messages.error(request, e)
except NasNetworkError as e:
messages.warning(request, e)
except mydefs.MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return redirect('abonapp:people_list', gid=group_id)

56
chatbot/locale/ru/LC_MESSAGES/django.po

@ -0,0 +1,56 @@
# 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>, 2017.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-03-24 23:49+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Dmitry Novikov <nerosketch@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \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"
#: chatbot/telebot.py:60
msgid "Let's get acquainted, what is your name? Write your login from billing."
msgstr "Давай знакомиться, как тебя зовут? Напиши свой логин из биллинга."
#: chatbot/telebot.py:80
msgid "I do not know the answer to this yet."
msgstr "Я пока не знаю ответа на это"
#: chatbot/telebot.py:99
msgid ""
"You are not found in the database, check that it correctly pointed out its "
"LOGIN. Try again"
msgstr ""
"Ты не найден в базе, проверь что правильно указал именно свой ЛОГИН. Попробуй ещё"
#: chatbot/telebot.py:122
msgid "It's not like ip address, try again"
msgstr "Это не похоже на ip адрес, попробуй ещё"
#: chatbot/telebot.py:125
#, python-format
msgid "You're '%s', right?"
msgstr "Ты ведь %s ?"
#: chatbot/telebot.py:135
#, python-format
msgid "Recipient '%s' does not subscribed on notifications"
msgstr "%s не подписан на оповещения"
msgid "Let's ping, write ip. It will be necessary to wait 10 seconds"
msgstr "Давай пинганём, напиши ip. Нужно будет подождать 10 сек"
msgid "Yes, it's nice to meet% s, I will notify you about events in billing. Successful work;)"
msgstr "Да, приятно познакомиться %s, я буду оповещать тебя о событиях в биллинге. Удачной работы ;)"

20
chatbot/telebot.py

@ -2,10 +2,11 @@
from telepot import helper, glance, Bot
import os
import socket
import collections
from django.utils.translation import ugettext as _
from .models import TelegramBot, ChatException
from chatbot.models import MessageHistory
from accounts_app.models import UserProfile
import collections
token = '285129725:AAF9Si5_b1n1_cN3vJtwXt0gkgsqKBptut4'
@ -56,7 +57,7 @@ class DjingTelebot(helper.ChatHandler):
self._current_user = tbot.user
self._message_log(initial_msg['text'])
except TelegramBot.DoesNotExist:
self._question('Давай знакомиться, как тебя зовут? Напиши свой логин из биллинга.',
self._question(_("Let's get acquainted, what is your name? Write your login from billing."),
self.question_name)
return True # prevent on_message() from being called on the initial message
@ -76,7 +77,7 @@ class DjingTelebot(helper.ChatHandler):
self._dialog_fn(text)
self._dialog_fn = None
else:
self._sent_reply('Я пока не знаю ответа на это')
self._sent_reply(_('I do not know the answer to this yet.'))
if not self._message_log(text):
return
@ -95,10 +96,10 @@ class DjingTelebot(helper.ChatHandler):
chat_id=self._chat_id
)
except UserProfile.DoesNotExist:
self._question('Ты не найден в базе, проверь что правильно указал именно свой ЛОГИН. Попробуй ещё',
self._question(_("You are not found in the database, check that it correctly pointed out its LOGIN. Try again"),
self.question_name)
return
self._sent_reply('Да, приятно познакомиться %s, я буду оповещать тебя о событиях в биллинге. Удачной работы ;)'
self._sent_reply("Yes, it's nice to meet %s, I will notify you about events in billing. Successful work;)"
% profile.get_full_name())
# заканчивается время диалога
@ -111,25 +112,24 @@ class DjingTelebot(helper.ChatHandler):
# пингуем адрес
def ping(self, ip=None):
if ip is None:
self._question('Давай пинганём, напиши ip. Нужно будет подождать 10 сек', self.ping)
self._question("Let's ping, write ip. It will be necessary to wait 10 seconds", self.ping)
return
try:
socket.inet_aton(ip)
ret = os.popen('`which ping` -c 10 ' + ip).read()
self._sent_reply(ret)
except socket.error:
self._question('Это не похоже на ip адрес, попробуй ещё', self.ping)
self._question(_("It's not like ip address, try again"), self.ping)
def say_me(self):
self._sent_reply('Ты ведь %s ?' % self._current_user.get_full_name())
self._sent_reply(_("You're '%s', right?") % self._current_user.get_full_name())
# Просто отправляем текст оповещения указанному админу
def send_notify(msg_text, account):
print(account)
try:
tb = TelegramBot.objects.get(user=account)
tbot = Bot(token)
tbot.sendMessage(tb.chat_id, msg_text)
except TelegramBot.DoesNotExist:
raise ChatException('Цель оповещения не подписан на оповещения')
raise ChatException(_("Recipient '%s' does not subscribed on notifications") % account.get_full_name())

47
djing/utils/load_from_nodeny.py

@ -2,30 +2,59 @@
# coding=utf-8
import MySQLdb
from json import dumps
from json import dumps, loads
def param_to_python(st):
st = st.replace('$VAR1 = ', '')
st = st.replace("'", '"')
st = st.replace(" =>", ':')
st = st.replace(";", '')
return loads(st)
def load_service(cursor, uid):
sql = "SELECT services.title, services.service_id, services.price, services.description, services.param " \
"FROM services LEFT JOIN users_services ON " \
"(users_services.service_id=services.service_id) WHERE users_services.uid=%d" % uid
cursor.execute(sql)
service_line = cursor.fetchone()
if service_line is not None:
service = {
'title': service_line[0],
'service_id': service_line[1],
'price': service_line[2],
'description': service_line[3],
'param': param_to_python(service_line[4])
}
else:
service = None
return service
def load_users(cursor, grp_id):
# выбираем абонентов
sql = r"SELECT users.name, users.fio, data0._adr_telefon, dictionary.v AS street, data0._adr_house, data0._birthday, users.grp, INET_NTOA(ip_pool.ip) AS ip, users.balance, AES_DECRYPT(users.passwd, 'Vu6saiZa') as decr_passwd FROM users LEFT JOIN data0 ON (data0.uid = users.id) LEFT JOIN dictionary ON (dictionary.k = data0._adr_street AND dictionary.type = 'street') LEFT JOIN ip_pool ON (ip_pool.uid = users.id) WHERE users.grp = %d" % grp_id
sql = r"SELECT users.name, users.fio, data0._adr_telefon, dictionary.v AS street, data0._adr_house, data0._birthday, " \
"users.grp, INET_NTOA(ip_pool.ip) AS ip, users.balance, AES_DECRYPT(users.passwd, 'Vu6saiZa') as decr_passwd, users.id " \
"FROM users LEFT JOIN data0 ON (data0.uid = users.id) LEFT JOIN dictionary ON (dictionary.k = data0._adr_street " \
"AND dictionary.type = 'street') LEFT JOIN ip_pool ON (ip_pool.uid = users.id) WHERE users.grp = %d" % grp_id
cursor.execute(sql)
users = [{
'name': str(res[0]),
'fio': str(res[1]),
'tel': str(res[2]),
'name': res[0],
'fio': res[1],
'tel': res[2],
'street': str(res[3] or ''),
'house': str(res[4]),
'birth': res[5],
'grp': int(res[6]),
'ip': str(res[7] or ''),
'balance': float(res[8]),
'passw': res[9].decode("utf-8") if res[9] is not None else ''
'passw': res[9].decode("utf-8") if res[9] is not None else '',
'service': load_service(cursor, int(res[10]))
} for res in cursor.fetchall()]
return users
def load_groups(cursor):
# выбираем группы
sql = r'SELECT grp_id, grp_name FROM user_grp'
@ -43,12 +72,12 @@ def load_groups(cursor):
if __name__ == "__main__":
db = MySQLdb.connect(host="127.0.0.1", user="<username>", passwd="<password>", db="db", charset='utf8')
db = MySQLdb.connect(host="127.0.0.1", user="user", passwd="password", db="db", charset='utf8')
cursor = db.cursor()
result = dict()
result['groups'] = load_groups(cursor=cursor)
result = load_groups(cursor=cursor)
db.close()
f = open('dump.json', 'w')
f.write(dumps(result, ensure_ascii=False))

116
djing/utils/save_from_nodeny.py

@ -4,13 +4,53 @@
import os
from json import load
import django
from django.utils import timezone
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup()
from abonapp.models import Abon, AbonGroup, AbonRawPassword, AbonStreet
from abonapp.models import Abon, AbonGroup, AbonRawPassword, AbonStreet, AbonTariff
from ip_pool.models import IpPoolItem
from tariff_app.models import Tariff
class DumpService(object):
price = 0.0
speedIn = 0.0
speedOut = 0.0
def __init__(self, obj=None):
if obj is None: return
self.title = obj['title']
self.price = obj['price']
self.description = obj['description']
self.speedIn = int(obj['param']['speed_in1']) / 1000000
self.speedOut = int(obj['param']['speed_out1']) / 1000000
@staticmethod
def build_from_db(obj):
self = DumpService()
self.title = obj.title
self.price = obj.amount
self.description = obj.descr
self.speedIn = obj.speedIn
self.speedOut = obj.speedOut
return self
def __eq__(self, other):
assert isinstance(other, DumpService)
print('DBG:', type(other.price), other.price, type(self.price), self.price)
r = self.price == other.price
r = r and self.speedIn == other.speedIn
r = r and self.speedOut == other.speedOut
return r
def __ne__(self, other):
return not self.__eq__(other)
def __str__(self):
return "%s; '%.2f', %f %f" % (self.title, self.price, self.speedIn, self.speedOut)
class DumpAbon(object):
def __init__(self, obj=None):
@ -22,9 +62,13 @@ class DumpAbon(object):
self.house = obj['house']
self.birth = obj['birth']
self.grp = obj['grp']
self.ip = obj['ip']
self.ip = obj['ip'] if obj['ip'] != '' else None
self.balance = obj['balance']
self.passw = obj['passw']
if obj['service'] is not None:
self.service = DumpService(obj['service'])
else:
self.service = None
@staticmethod
def build_from_django(obj):
@ -36,14 +80,25 @@ class DumpAbon(object):
self.street = obj.street
self.house = obj.house
self.birth = obj.birth_day
self.grp = obj.group.pk
self.ip = obj.ip_address
if obj.group is None:
self.grp = None
else:
self.grp = obj.group.pk
if obj.ip_address is None:
self.ip = None
else:
self.ip = obj.ip_address
self.balance = obj.ballance
try:
raw_passw = AbonRawPassword.objects.get(account=obj)
except AbonRawPassword.DoesNotExist:
raw_passw = ''
self.passw = raw_passw
srv = obj.active_tariff()
if srv is not None:
self.service = DumpService.build_from_db(srv)
else:
self.service = None
return self
def __eq__(self, other):
@ -64,7 +119,25 @@ class DumpAbon(object):
return not self.__eq__(other)
def add_service_if_not_exist(service):
assert isinstance(service, DumpService)
try:
obj = Tariff.objects.get(speedIn=service.speedIn, speedOut=service.speedOut, amount=service.price)
except Tariff.DoesNotExist:
obj = Tariff.objects.create(
title=service.title,
descr=service.description,
speedIn=service.speedIn,
speedOut=service.speedOut,
amount=service.price,
calc_type='Dp'
)
return obj
def load_users(obj, group):
if len(obj) < 1:
return
for usr in obj:
# абонент из дампа
dump_abon = DumpAbon(usr)
@ -77,7 +150,22 @@ def load_users(obj, group):
update_user(abon, dump_abon, group)
except Abon.DoesNotExist:
# добавляем абонента
add_user(dump_abon, group)
abon = add_user(dump_abon, group)
abon_service_from_dump = dump_abon.service
if abon_service_from_dump is None:
continue
abon_service = add_service_if_not_exist(abon_service_from_dump)
try:
AbonTariff.objects.get(abon=abon, tariff=abon_service)
except AbonTariff.DoesNotExist:
calc_obj = abon_service.get_calc_type()(abon_service)
AbonTariff.objects.create(
abon=abon,
tariff=abon_service,
time_start=timezone.now(),
deadline=calc_obj.calc_deadline()
)
def add_user(obj, user_group):
@ -85,14 +173,16 @@ def add_user(obj, user_group):
street = None
ip = None
try:
ip = IpPoolItem.objects.get(ip=obj.ip)
street = AbonStreet.objects.get(name=obj.street)
if obj.ip is not None:
ip = IpPoolItem.objects.get(ip=obj.ip)
street = AbonStreet.objects.get(name=obj.street, group=user_group)
except IpPoolItem.DoesNotExist:
ip = IpPoolItem.objects.create(ip=obj.ip)
if obj.ip is not None:
ip = IpPoolItem.objects.create(ip=obj.ip)
except AbonStreet.DoesNotExist:
street = AbonStreet.objects.create(name=obj.street, group=user_group)
Abon.objects.create(
return Abon.objects.create(
username=obj.name,
fio=obj.fio,
telephone=obj.tel,
@ -111,10 +201,11 @@ def update_user(db_abon, obj, user_group):
street = None
ip = None
try:
ip = IpPoolItem.objects.get(ip=obj.ip)
if obj.ip is not None:
ip = IpPoolItem.objects.get(ip=obj.ip)
street = AbonStreet.objects.get(name=obj.street, group=user_group)
except IpPoolItem.DoesNotExist:
if obj.ip:
if obj.ip is not None:
ip = IpPoolItem.objects.create(ip=obj.ip)
except AbonStreet.DoesNotExist:
street = AbonStreet.objects.create(name=obj.street, group=user_group)
@ -129,13 +220,12 @@ def update_user(db_abon, obj, user_group):
db_abon.save()
if __name__ == "__main__":
with open('dump.json', 'r') as f:
dat = load(f)
for grp in dat['groups']:
for grp in dat:
try:
abgrp=AbonGroup.objects.get(title=grp['gname'])
except AbonGroup.DoesNotExist:

8
mydefs.py

@ -197,3 +197,11 @@ def require_ssl(view):
return HttpResponseRedirect(target_url)
return view(request, *args, **kwargs)
return wrapper
class MultipleException(Exception):
def __init__(self, err_list):
if not isinstance(err_list, list):
raise TypeError
self.err_list = err_list

4
requirements.txt

@ -1,7 +1,7 @@
Django==1.9
Pillow
mysqlclient
telepot
easysnmp
# for testing required xmltodict
xmltodict
mysqlclient
easysnmp

2
tariff_app/templates/tariff_app/tarifs.html

@ -62,7 +62,7 @@
<td>{{ tar.speedOut }}</td>
<td>{{ tar.amount }} руб</td>
<td>{{ tar.time_of_action }} дней</td>
<td>{{ tar.calc_type }}</td>
<td>{{ tar.get_calc_type_display }}</td>
<td>
{% if perms.tariff_app.delete_tariff %}
<a href="{% url 'tarifs:del' tar.id %}" class="btn btn-sm btn-danger">

18
taskapp/models.py

@ -6,7 +6,8 @@ from django.conf import settings
from django.utils import timezone
from django.utils.translation import ugettext as _
from abonapp.models import Abon
from .handle import handle as task_handle
from .handle import handle as task_handle, TaskException
from mydefs import MultipleException
TASK_PRIORITIES = (
@ -117,11 +118,17 @@ def task_handler(sender, instance, **kwargs):
act_type='e',
who=instance.author
)
errors = []
for recipient in instance.recipients.all():
task_handle(
instance, instance.author,
recipient, group
)
try:
task_handle(
instance, instance.author,
recipient, group
)
except TaskException as e:
errors.append(e)
if len(errors) > 0:
raise MultipleException(errors)
#def task_delete(sender, instance, **kwargs):
@ -134,4 +141,3 @@ def task_handler(sender, instance, **kwargs):
models.signals.post_save.connect(task_handler, sender=Task)
#models.signals.post_delete.connect(task_delete, sender=Task)

24
taskapp/views.py

@ -6,11 +6,9 @@ from django.contrib import messages
from abonapp.models import Abon
from django.utils.translation import ugettext as _
from datetime import date
from chatbot.models import TelegramBot
from .models import Task
from mydefs import pag_mn, only_admins, safe_int
from mydefs import pag_mn, only_admins, safe_int, MultipleException
from .forms import TaskFrm
from .handle import TaskException
@login_required
@ -149,12 +147,11 @@ def task_add_edit(request, task_id=0):
messages.error(request, _('Error in the form fields'))
elif uid:
selected_abon = Abon.objects.get(username=str(uid))
except TelegramBot.DoesNotExist:
messages.error(request, _('Employee has not yet signed up for notifications'))
except Abon.DoesNotExist:
messages.warning(request, _("User '%s' does not exist") % str(uid))
except TaskException as e:
messages.error(request, e)
except MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return render(request, 'taskapp/add_edit_task.html', {
'form': frm,
@ -169,8 +166,9 @@ def task_finish(request, task_id):
try:
task = get_object_or_404(Task, id=task_id)
task.finish(request.user)
except TaskException as e:
messages.error(request, e)
except MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return redirect('taskapp:home')
@ -185,6 +183,10 @@ def task_begin(request, task_id):
@login_required
@permission_required('taskapp.can_remind')
def remind(request, task_id):
task = get_object_or_404(Task, id=task_id)
task.save(update_fields=['state'])
try:
task = get_object_or_404(Task, id=task_id)
task.save(update_fields=['state'])
except MultipleException as errs:
for err in errs.err_list:
messages.add_message(request, messages.constants.ERROR, err)
return redirect('taskapp:home')
Loading…
Cancel
Save