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 "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Dmitry Novikov nerosketch@gmail.com\n" "Last-Translator: Dmitry Novikov nerosketch@gmail.com\n"
"Language: ru\n" "Language: ru\n"
@ -35,59 +35,59 @@ msgstr "ФИО"
msgid "telephone placeholder" msgid "telephone placeholder"
msgstr "+[7,8,9,3] и 10,11 цифр" msgstr "+[7,8,9,3] и 10,11 цифр"
#: abonapp/models.py:24
#: abonapp/models.py:26
msgid "fill account" msgid "fill account"
msgstr "Пополнение счёта" msgstr "Пополнение счёта"
#: abonapp/models.py:117
#: abonapp/models.py:119
msgid "not enough money" msgid "not enough money"
msgstr "Не хватает денег на счету" msgstr "Не хватает денег на счету"
#: abonapp/models.py:123
#: abonapp/models.py:125
msgid "service finish log" msgid "service finish log"
msgstr "Завершение и оплата услуги по истечению срока действия" msgstr "Завершение и оплата услуги по истечению срока действия"
#: abonapp/models.py:142
#: abonapp/models.py:144
msgid "finish service perm" msgid "finish service perm"
msgstr "Снятие со счёта средств" msgstr "Снятие со счёта средств"
#: abonapp/models.py:143
#: abonapp/models.py:145
msgid "activate service perm" msgid "activate service perm"
msgstr "Активация услуги абонента" msgstr "Активация услуги абонента"
#: abonapp/models.py:160
#: abonapp/models.py:162
msgid "Digital field" msgid "Digital field"
msgstr "Цифровое поле" msgstr "Цифровое поле"
#: abonapp/models.py:161
#: abonapp/models.py:163
msgid "Text field" msgid "Text field"
msgstr "Текстовое поле" msgstr "Текстовое поле"
#: abonapp/models.py:162
#: abonapp/models.py:164
msgid "Floating field" msgid "Floating field"
msgstr "Дробное с плавающей точкой" msgstr "Дробное с плавающей точкой"
#: abonapp/models.py:176
#: abonapp/models.py:178
msgid "Double invalid value" msgid "Double invalid value"
msgstr "Введите число с плавающей запятой" msgstr "Введите число с плавающей запятой"
#: abonapp/models.py:217
#: abonapp/models.py:219
msgid "Buy service perm" msgid "Buy service perm"
msgstr "Покупка тарифа абоненту" msgstr "Покупка тарифа абоненту"
#: abonapp/models.py:218
#: abonapp/models.py:220
msgid "Can view passport" msgid "Can view passport"
msgstr "Может просматривать паспортные данные" msgstr "Может просматривать паспортные данные"
#: abonapp/models.py:222
#: abonapp/models.py:224
msgid "pay log" msgid "pay log"
msgstr "Снятие со счёта средств" msgstr "Снятие со счёта средств"
#: abonapp/models.py:268
#: abonapp/models.py:270
msgid "Buy service default log" msgid "Buy service default log"
msgstr "Покупка тарифного плана через админку" msgstr "Покупка тарифного плана через админку"
#: abonapp/models.py:283
#: abonapp/models.py:285
msgid "service overdue log" msgid "service overdue log"
msgstr "Услуга просрочена, отключаем, и подключаем новую" msgstr "Услуга просрочена, отключаем, и подключаем новую"
@ -100,9 +100,12 @@ msgstr "Услуга просрочена, отключаем, и подключ
#: abonapp/templates/abonapp/debtors.html:8 #: abonapp/templates/abonapp/debtors.html:8
#: abonapp/templates/abonapp/group_list.html:8 #: abonapp/templates/abonapp/group_list.html:8
#: abonapp/templates/abonapp/group_list.html:11 #: 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/invoiceForPayment.html:7
#: abonapp/templates/abonapp/log.html:7 #: abonapp/templates/abonapp/log.html:7
#: abonapp/templates/abonapp/peoples.html:8 #: abonapp/templates/abonapp/peoples.html:8
#: abonapp/templates/abonapp/peoples.html:114
msgid "User groups" msgid "User groups"
msgstr "Группы абонентов" msgstr "Группы абонентов"
@ -133,9 +136,10 @@ msgstr ""
#: abonapp/templates/abonapp/addAbon.html:86 #: abonapp/templates/abonapp/addAbon.html:86
#: abonapp/templates/abonapp/addGroup.html:29 #: abonapp/templates/abonapp/addGroup.html:29
#: abonapp/templates/abonapp/addInvoice.html:46 #: 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/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 #: abonapp/templates/abonapp/passport_view.html:42
msgid "Save" msgid "Save"
msgstr "Сохранить" msgstr "Сохранить"
@ -159,7 +163,7 @@ msgid "Telephone"
msgstr "Телефон" msgstr "Телефон"
#: abonapp/templates/abonapp/addAbon.html:45 #: abonapp/templates/abonapp/addAbon.html:45
#: abonapp/templates/abonapp/editAbon.html:59
#: abonapp/templates/abonapp/editAbon.html:66
#: abonapp/templates/abonapp/viewAbon.html:16 #: abonapp/templates/abonapp/viewAbon.html:16
msgid "User group" msgid "User group"
msgstr "Группа" msgstr "Группа"
@ -167,7 +171,7 @@ msgstr "Группа"
#: abonapp/templates/abonapp/addAbon.html:53 #: abonapp/templates/abonapp/addAbon.html:53
#: abonapp/templates/abonapp/addInvoice.html:40 #: abonapp/templates/abonapp/addInvoice.html:40
#: abonapp/templates/abonapp/debtors.html:22 #: 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/invoiceForPayment.html:23
#: abonapp/templates/abonapp/log.html:20 #: abonapp/templates/abonapp/log.html:20
#: abonapp/templates/abonapp/payHistory.html:12 #: abonapp/templates/abonapp/payHistory.html:12
@ -176,7 +180,7 @@ msgid "Comment"
msgstr "Комментарий" msgstr "Комментарий"
#: abonapp/templates/abonapp/addAbon.html:59 #: 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/peoples.html:39
#: abonapp/templates/abonapp/viewAbon.html:40 #: abonapp/templates/abonapp/viewAbon.html:40
msgid "Street" msgid "Street"
@ -188,7 +192,7 @@ msgid "Apartment"
msgstr "Квартира" msgstr "Квартира"
#: abonapp/templates/abonapp/addAbon.html:76 #: abonapp/templates/abonapp/addAbon.html:76
#: abonapp/templates/abonapp/editAbon.html:66
#: abonapp/templates/abonapp/editAbon.html:73
#: abonapp/templates/abonapp/viewAbon.html:54 #: abonapp/templates/abonapp/viewAbon.html:54
msgid "Password" msgid "Password"
msgstr "Пароль" msgstr "Пароль"
@ -196,14 +200,15 @@ msgstr "Пароль"
#: abonapp/templates/abonapp/addAbon.html:89 #: abonapp/templates/abonapp/addAbon.html:89
#: abonapp/templates/abonapp/addGroup.html:32 #: abonapp/templates/abonapp/addGroup.html:32
#: abonapp/templates/abonapp/addInvoice.html:49 #: 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 #: abonapp/templates/abonapp/modal_abonamount.html:26
msgid "Reset" msgid "Reset"
msgstr "Сбросить" msgstr "Сбросить"
#: abonapp/templates/abonapp/addGroup.html:8 #: abonapp/templates/abonapp/addGroup.html:8
#: abonapp/templates/abonapp/addGroup.html:15 #: abonapp/templates/abonapp/addGroup.html:15
#: abonapp/templates/abonapp/group_list.html:60
#: abonapp/templates/abonapp/group_list.html:63
msgid "Add group" msgid "Add group"
msgstr "Добавьте группу абонентов" msgstr "Добавьте группу абонентов"
@ -271,6 +276,7 @@ msgid ""
msgstr "Подробнее:<br/>Вы завершаете тариф" msgstr "Подробнее:<br/>Вы завершаете тариф"
#: abonapp/templates/abonapp/complete_service.html:39 #: abonapp/templates/abonapp/complete_service.html:39
#, python-format
msgid "" msgid ""
"The service has been connected: %(time_start)s<br/>\n" "The service has been connected: %(time_start)s<br/>\n"
"Today: %(today)s<br/>\n" "Today: %(today)s<br/>\n"
@ -280,8 +286,8 @@ msgid ""
"Cashback: %(cashback)s" "Cashback: %(cashback)s"
msgstr "" msgstr ""
"Услуга была подключена: %(time_start)s<br/>Сегодня: %(today)s<br/>Время " "Услуга была подключена: %(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" "Средства для возврата: %(cashback)s"
#: abonapp/templates/abonapp/debtors.html:9 #: abonapp/templates/abonapp/debtors.html:9
@ -312,48 +318,54 @@ msgstr "Нет должников"
msgid "Change subscriber" msgid "Change subscriber"
msgstr "Изменение абонента" 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/peoples.html:45
#: abonapp/templates/abonapp/viewAbon.html:46 #: abonapp/templates/abonapp/viewAbon.html:46
msgid "House" msgid "House"
msgstr "Дом" msgstr "Дом"
#: abonapp/templates/abonapp/editAbon.html:52
#: abonapp/templates/abonapp/editAbon.html:59
#: abonapp/templates/abonapp/viewAbon.html:22 #: abonapp/templates/abonapp/viewAbon.html:22
msgid "Is active" msgid "Is active"
msgstr "Активен" msgstr "Активен"
#: abonapp/templates/abonapp/editAbon.html:92
#: abonapp/templates/abonapp/editAbon.html:99
msgid "Send account info to user" msgid "Send account info to user"
msgstr "Отправить данные абоненту" msgstr "Отправить данные абоненту"
#: abonapp/templates/abonapp/editAbon.html:104
#: abonapp/templates/abonapp/editAbon.html:111
msgid "Technical information" msgid "Technical information"
msgstr "Техническая информация" 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 #: abonapp/templates/abonapp/group_list.html:27
msgid "Number of subscribers" msgid "Number of subscribers"
msgstr "Количество абонентов" msgstr "Количество абонентов"
#: abonapp/templates/abonapp/group_list.html:51
#: abonapp/templates/abonapp/group_list.html:54
msgid "Groups was not found" msgid "Groups was not found"
msgstr "Ещё нет групп" msgstr "Ещё нет групп"
#: abonapp/templates/abonapp/group_list.html:64
#: abonapp/templates/abonapp/group_list.html:67
#: abonapp/templates/abonapp/log.html:8 #: abonapp/templates/abonapp/log.html:8
msgid "Subscribers actions" msgid "Subscribers actions"
msgstr "История действий абонентов" msgstr "История действий абонентов"
#: abonapp/templates/abonapp/group_list.html:67
#: abonapp/templates/abonapp/group_list.html:70
msgid "List of debtors" msgid "List of debtors"
msgstr "Список должников" 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/invoiceForPayment.html:10
#: abonapp/templates/abonapp/payHistory.html:39 #: abonapp/templates/abonapp/payHistory.html:39
msgid "Debts" msgid "Debts"
@ -400,7 +412,7 @@ msgstr "История абонента"
msgid "Date" msgid "Date"
msgstr "Время" msgstr "Время"
#: abonapp/templates/abonapp/log.html:40
#: abonapp/templates/abonapp/log.html:46
msgid "Actions not found" msgid "Actions not found"
msgstr "Нет событий" msgstr "Нет событий"
@ -487,6 +499,10 @@ msgstr "Абоненты не найдены"
msgid "Refresh subscribers on NAS" msgid "Refresh subscribers on NAS"
msgstr "Обновить абонентов в NAS" msgstr "Обновить абонентов в NAS"
#: abonapp/templates/abonapp/peoples.html:115
msgid "Tariffs in groups"
msgstr "Тарифы в группах"
#: abonapp/templates/abonapp/services.html:5 #: abonapp/templates/abonapp/services.html:5
msgid "Services of subscriber" msgid "Services of subscriber"
msgstr "Купленные абонентом услуги (назначенные тарифные планы)" msgstr "Купленные абонентом услуги (назначенные тарифные планы)"
@ -568,7 +584,6 @@ msgid "create group success msg"
msgstr "Группа успешно создана" msgstr "Группа успешно создана"
#: abonapp/views.py:54 abonapp/views.py:112 abonapp/views.py:253 #: abonapp/views.py:54 abonapp/views.py:112 abonapp/views.py:253
#: abonapp/views.py:345
msgid "fix form errors" msgid "fix form errors"
msgstr "Некоторые поля заполнены не правильно, проверте ещё раз" msgstr "Некоторые поля заполнены не правильно, проверте ещё раз"
@ -633,27 +648,31 @@ msgstr "Для абонента не задан пароль, он не смож
msgid "Receipt has been created" msgid "Receipt has been created"
msgstr "Квитанция на оплату была создана" msgstr "Квитанция на оплату была создана"
#: abonapp/views.py:342
#: abonapp/views.py:339
msgid "Tariff has been picked" msgid "Tariff has been picked"
msgstr "Тариф успешно выбран" 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" msgid "Refunds for unused resources"
msgstr "Возврат средств за неиспользованные ресурсы" msgstr "Возврат средств за неиспользованные ресурсы"
#: abonapp/views.py:414
#: abonapp/views.py:412
msgid "Service has been finished successfully" msgid "Service has been finished successfully"
msgstr "Услуга успешно завершена" msgstr "Услуга успешно завершена"
#: abonapp/views.py:417 abonapp/views.py:448
#: abonapp/views.py:415 abonapp/views.py:446
msgid "Not confirmed" msgid "Not confirmed"
msgstr "Действие не подтверждено" msgstr "Действие не подтверждено"
#: abonapp/views.py:451
#: abonapp/views.py:449
msgid "Service has been activated successfully" msgid "Service has been activated successfully"
msgstr "Услуга успешно активирована" msgstr "Услуга успешно активирована"
#: abonapp/views.py:476
#: abonapp/views.py:474
msgid "User has been detached from service" msgid "User has been detached from service"
msgstr "Абонент отвязан от услуги" msgstr "Абонент отвязан от услуги"
@ -674,12 +693,3 @@ msgstr "История задач"
msgid "Dynamic Field" msgid "Dynamic Field"
msgstr "Динамическое поле" 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') return redirect('abonapp:group_list')
else: else:
messages.error(request, _('fix form errors')) 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) 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', { return render(request, 'abonapp/addGroup.html', {
'form': frm 'form': frm
}) })
@ -88,10 +89,11 @@ def delgroup(request):
get_object_or_404(models.AbonGroup, id=agd).delete() get_object_or_404(models.AbonGroup, id=agd).delete()
messages.success(request, _('delete group success msg')) messages.success(request, _('delete group success msg'))
return mydefs.res_success(request, 'abonapp:group_list') 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) 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') return mydefs.res_error(request, 'abonapp:group_list')
@ -111,14 +113,11 @@ def addabon(request, gid):
else: else:
messages.error(request, _('fix form errors')) 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) 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: if not frm:
frm = forms.AbonForm(initial={ frm = forms.AbonForm(initial={
@ -159,6 +158,9 @@ def delentity(request):
messages.error(request, e) messages.error(request, e)
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, _("NAS says: '%s'") % 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') return redirect('abonapp:group_list')
@ -177,10 +179,11 @@ def abonamount(request, gid, uid):
return redirect('abonapp:abon_home', gid=gid, uid=uid) return redirect('abonapp:abon_home', gid=gid, uid=uid)
else: else:
messages.error(request, _('I not know the account id')) 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) 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', { return render_to_text('abonapp/modal_abonamount.html', {
'abon': abon, 'abon': abon,
'abon_group': get_object_or_404(models.AbonGroup, id=gid) '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) messages.error(request, _('Ip address already exist. %s') % e)
frm = forms.AbonForm(instance=abon, initial={'password': passw}) 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) messages.error(request, e)
except IpPoolItem.DoesNotExist: except IpPoolItem.DoesNotExist:
messages.error(request, _('Ip address not found')) messages.error(request, _('Ip address not found'))
except models.AbonRawPassword.DoesNotExist: except models.AbonRawPassword.DoesNotExist:
messages.warning(request, _('User has not have password, and cannot login')) 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'): if request.user.has_perm('abonapp.change_abon'):
return render(request, 'abonapp/editAbon.html', { return render(request, 'abonapp/editAbon.html', {
@ -315,10 +319,11 @@ def add_invoice(request, gid, uid):
messages.success(request, _('Receipt has been created')) messages.success(request, _('Receipt has been created'))
return redirect('abonapp:abon_home', gid=gid, uid=uid) 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) 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', { return render(request, 'abonapp/addInvoice.html', {
'abon': abon, 'abon': abon,
'invcount': models.InvoiceForPayment.objects.filter(abon=abon).count(), 'invcount': models.InvoiceForPayment.objects.filter(abon=abon).count(),
@ -338,15 +343,16 @@ def pick_tariff(request, gid, uid):
abon.pick_tariff(trf, request.user) abon.pick_tariff(trf, request.user)
messages.success(request, _('Tariff has been picked')) messages.success(request, _('Tariff has been picked'))
return redirect('abonapp:abon_services', gid=gid, uid=abon.id) 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) messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.error(request, e) messages.error(request, e)
return redirect('abonapp:abon_services', gid=gid, uid=abon.id) return redirect('abonapp:abon_services', gid=gid, uid=abon.id)
except Tariff.DoesNotExist: except Tariff.DoesNotExist:
messages.error(request, _('Tariff your picked does not exist')) 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', { return render(request, 'abonapp/buy_tariff.html', {
'tariffs': tariffs, 'tariffs': tariffs,
@ -368,10 +374,11 @@ def chpriority(request, gid, uid):
current_abon_tariff.priority_up() current_abon_tariff.priority_up()
elif act == 'down': elif act == 'down':
current_abon_tariff.priority_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) 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) 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) 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) messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.warning(request, e) messages.warning(request, e)
return redirect('abonapp:abon_home', gid, uid) 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', { return render(request, 'abonapp/complete_service.html', {
'abtar': abtar, 'abtar': abtar,
@ -449,12 +457,13 @@ def activate_service(request, gid, uid, srvid):
messages.success(request, _('Service has been activated successfully')) messages.success(request, _('Service has been activated successfully'))
return redirect('abonapp:abon_services', gid, uid) return redirect('abonapp:abon_services', gid, uid)
except NasFailedResult as e:
except (NasFailedResult, models.LogicError) as e:
messages.error(request, e) messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.warning(request, 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) calc_obj = abtar.tariff.get_calc_type()(abtar)
return render(request, 'abonapp/activate_service.html', { return render(request, 'abonapp/activate_service.html', {
'abon': abtar.abon, 'abon': abtar.abon,
@ -476,6 +485,9 @@ def unsubscribe_service(request, gid, uid, srvid):
messages.error(request, e) messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.warning(request, 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) return redirect('abonapp:abon_home', gid=gid, uid=uid)
@ -483,9 +495,7 @@ def unsubscribe_service(request, gid, uid, srvid):
@mydefs.only_admins @mydefs.only_admins
def log_page(request): def log_page(request):
logs = models.AbonLog.objects.all() logs = models.AbonLog.objects.all()
logs = mydefs.pag_mn(request, logs) logs = mydefs.pag_mn(request, logs)
return render(request, 'abonapp/log.html', { return render(request, 'abonapp/log.html', {
'logs': logs 'logs': logs
}) })
@ -496,10 +506,8 @@ def log_page(request):
def debtors(request): def debtors(request):
# peoples_list = models.Abon.objects.filter(invoiceforpayment__status=True) # peoples_list = models.Abon.objects.filter(invoiceforpayment__status=True)
#peoples_list = mydefs.pag_mn(request, peoples_list) #peoples_list = mydefs.pag_mn(request, peoples_list)
invs = models.InvoiceForPayment.objects.filter(status=True) invs = models.InvoiceForPayment.objects.filter(status=True)
invs = mydefs.pag_mn(request, invs) invs = mydefs.pag_mn(request, invs)
return render(request, 'abonapp/debtors.html', { return render(request, 'abonapp/debtors.html', {
#'peoples': peoples_list #'peoples': peoples_list
'invoices': invs 'invoices': invs
@ -521,6 +529,9 @@ def update_nas(request, group_id):
messages.error(request, e) messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.warning(request, 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) 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 from telepot import helper, glance, Bot
import os import os
import socket import socket
import collections
from django.utils.translation import ugettext as _
from .models import TelegramBot, ChatException from .models import TelegramBot, ChatException
from chatbot.models import MessageHistory from chatbot.models import MessageHistory
from accounts_app.models import UserProfile from accounts_app.models import UserProfile
import collections
token = '285129725:AAF9Si5_b1n1_cN3vJtwXt0gkgsqKBptut4' token = '285129725:AAF9Si5_b1n1_cN3vJtwXt0gkgsqKBptut4'
@ -56,7 +57,7 @@ class DjingTelebot(helper.ChatHandler):
self._current_user = tbot.user self._current_user = tbot.user
self._message_log(initial_msg['text']) self._message_log(initial_msg['text'])
except TelegramBot.DoesNotExist: except TelegramBot.DoesNotExist:
self._question('Давай знакомиться, как тебя зовут? Напиши свой логин из биллинга.',
self._question(_("Let's get acquainted, what is your name? Write your login from billing."),
self.question_name) self.question_name)
return True # prevent on_message() from being called on the initial message 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(text)
self._dialog_fn = None self._dialog_fn = None
else: else:
self._sent_reply('Я пока не знаю ответа на это')
self._sent_reply(_('I do not know the answer to this yet.'))
if not self._message_log(text): if not self._message_log(text):
return return
@ -95,10 +96,10 @@ class DjingTelebot(helper.ChatHandler):
chat_id=self._chat_id chat_id=self._chat_id
) )
except UserProfile.DoesNotExist: 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) self.question_name)
return 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()) % profile.get_full_name())
# заканчивается время диалога # заканчивается время диалога
@ -111,25 +112,24 @@ class DjingTelebot(helper.ChatHandler):
# пингуем адрес # пингуем адрес
def ping(self, ip=None): def ping(self, ip=None):
if ip is 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 return
try: try:
socket.inet_aton(ip) socket.inet_aton(ip)
ret = os.popen('`which ping` -c 10 ' + ip).read() ret = os.popen('`which ping` -c 10 ' + ip).read()
self._sent_reply(ret) self._sent_reply(ret)
except socket.error: except socket.error:
self._question('Это не похоже на ip адрес, попробуй ещё', self.ping)
self._question(_("It's not like ip address, try again"), self.ping)
def say_me(self): 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): def send_notify(msg_text, account):
print(account)
try: try:
tb = TelegramBot.objects.get(user=account) tb = TelegramBot.objects.get(user=account)
tbot = Bot(token) tbot = Bot(token)
tbot.sendMessage(tb.chat_id, msg_text) tbot.sendMessage(tb.chat_id, msg_text)
except TelegramBot.DoesNotExist: 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 # coding=utf-8
import MySQLdb 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): 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) cursor.execute(sql)
users = [{ 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 ''), 'street': str(res[3] or ''),
'house': str(res[4]), 'house': str(res[4]),
'birth': res[5], 'birth': res[5],
'grp': int(res[6]), 'grp': int(res[6]),
'ip': str(res[7] or ''), 'ip': str(res[7] or ''),
'balance': float(res[8]), '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()] } for res in cursor.fetchall()]
return users return users
def load_groups(cursor): def load_groups(cursor):
# выбираем группы # выбираем группы
sql = r'SELECT grp_id, grp_name FROM user_grp' sql = r'SELECT grp_id, grp_name FROM user_grp'
@ -43,12 +72,12 @@ def load_groups(cursor):
if __name__ == "__main__": 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() cursor = db.cursor()
result = dict() result = dict()
result['groups'] = load_groups(cursor=cursor)
result = load_groups(cursor=cursor)
db.close() db.close()
f = open('dump.json', 'w') f = open('dump.json', 'w')
f.write(dumps(result, ensure_ascii=False)) f.write(dumps(result, ensure_ascii=False))

116
djing/utils/save_from_nodeny.py

@ -4,13 +4,53 @@
import os import os
from json import load from json import load
import django import django
from django.utils import timezone
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup() 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 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): class DumpAbon(object):
def __init__(self, obj=None): def __init__(self, obj=None):
@ -22,9 +62,13 @@ class DumpAbon(object):
self.house = obj['house'] self.house = obj['house']
self.birth = obj['birth'] self.birth = obj['birth']
self.grp = obj['grp'] self.grp = obj['grp']
self.ip = obj['ip']
self.ip = obj['ip'] if obj['ip'] != '' else None
self.balance = obj['balance'] self.balance = obj['balance']
self.passw = obj['passw'] self.passw = obj['passw']
if obj['service'] is not None:
self.service = DumpService(obj['service'])
else:
self.service = None
@staticmethod @staticmethod
def build_from_django(obj): def build_from_django(obj):
@ -36,14 +80,25 @@ class DumpAbon(object):
self.street = obj.street self.street = obj.street
self.house = obj.house self.house = obj.house
self.birth = obj.birth_day 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 self.balance = obj.ballance
try: try:
raw_passw = AbonRawPassword.objects.get(account=obj) raw_passw = AbonRawPassword.objects.get(account=obj)
except AbonRawPassword.DoesNotExist: except AbonRawPassword.DoesNotExist:
raw_passw = '' raw_passw = ''
self.passw = 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 return self
def __eq__(self, other): def __eq__(self, other):
@ -64,7 +119,25 @@ class DumpAbon(object):
return not self.__eq__(other) 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): def load_users(obj, group):
if len(obj) < 1:
return
for usr in obj: for usr in obj:
# абонент из дампа # абонент из дампа
dump_abon = DumpAbon(usr) dump_abon = DumpAbon(usr)
@ -77,7 +150,22 @@ def load_users(obj, group):
update_user(abon, dump_abon, group) update_user(abon, dump_abon, group)
except Abon.DoesNotExist: 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): def add_user(obj, user_group):
@ -85,14 +173,16 @@ def add_user(obj, user_group):
street = None street = None
ip = None ip = None
try: 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: 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: except AbonStreet.DoesNotExist:
street = AbonStreet.objects.create(name=obj.street, group=user_group) street = AbonStreet.objects.create(name=obj.street, group=user_group)
Abon.objects.create(
return Abon.objects.create(
username=obj.name, username=obj.name,
fio=obj.fio, fio=obj.fio,
telephone=obj.tel, telephone=obj.tel,
@ -111,10 +201,11 @@ def update_user(db_abon, obj, user_group):
street = None street = None
ip = None ip = None
try: 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) street = AbonStreet.objects.get(name=obj.street, group=user_group)
except IpPoolItem.DoesNotExist: except IpPoolItem.DoesNotExist:
if obj.ip:
if obj.ip is not None:
ip = IpPoolItem.objects.create(ip=obj.ip) ip = IpPoolItem.objects.create(ip=obj.ip)
except AbonStreet.DoesNotExist: except AbonStreet.DoesNotExist:
street = AbonStreet.objects.create(name=obj.street, group=user_group) 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() db_abon.save()
if __name__ == "__main__": if __name__ == "__main__":
with open('dump.json', 'r') as f: with open('dump.json', 'r') as f:
dat = load(f) dat = load(f)
for grp in dat['groups']:
for grp in dat:
try: try:
abgrp=AbonGroup.objects.get(title=grp['gname']) abgrp=AbonGroup.objects.get(title=grp['gname'])
except AbonGroup.DoesNotExist: except AbonGroup.DoesNotExist:

8
mydefs.py

@ -197,3 +197,11 @@ def require_ssl(view):
return HttpResponseRedirect(target_url) return HttpResponseRedirect(target_url)
return view(request, *args, **kwargs) return view(request, *args, **kwargs)
return wrapper 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 Django==1.9
Pillow Pillow
mysqlclient
telepot telepot
easysnmp
# for testing required xmltodict # for testing required xmltodict
xmltodict xmltodict
mysqlclient
easysnmp

2
tariff_app/templates/tariff_app/tarifs.html

@ -62,7 +62,7 @@
<td>{{ tar.speedOut }}</td> <td>{{ tar.speedOut }}</td>
<td>{{ tar.amount }} руб</td> <td>{{ tar.amount }} руб</td>
<td>{{ tar.time_of_action }} дней</td> <td>{{ tar.time_of_action }} дней</td>
<td>{{ tar.calc_type }}</td>
<td>{{ tar.get_calc_type_display }}</td>
<td> <td>
{% if perms.tariff_app.delete_tariff %} {% if perms.tariff_app.delete_tariff %}
<a href="{% url 'tarifs:del' tar.id %}" class="btn btn-sm btn-danger"> <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 import timezone
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from abonapp.models import Abon 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 = ( TASK_PRIORITIES = (
@ -117,11 +118,17 @@ def task_handler(sender, instance, **kwargs):
act_type='e', act_type='e',
who=instance.author who=instance.author
) )
errors = []
for recipient in instance.recipients.all(): 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): #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_save.connect(task_handler, sender=Task)
#models.signals.post_delete.connect(task_delete, 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 abonapp.models import Abon
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from datetime import date from datetime import date
from chatbot.models import TelegramBot
from .models import Task 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 .forms import TaskFrm
from .handle import TaskException
@login_required @login_required
@ -149,12 +147,11 @@ def task_add_edit(request, task_id=0):
messages.error(request, _('Error in the form fields')) messages.error(request, _('Error in the form fields'))
elif uid: elif uid:
selected_abon = Abon.objects.get(username=str(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: except Abon.DoesNotExist:
messages.warning(request, _("User '%s' does not exist") % str(uid)) 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', { return render(request, 'taskapp/add_edit_task.html', {
'form': frm, 'form': frm,
@ -169,8 +166,9 @@ def task_finish(request, task_id):
try: try:
task = get_object_or_404(Task, id=task_id) task = get_object_or_404(Task, id=task_id)
task.finish(request.user) 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') return redirect('taskapp:home')
@ -185,6 +183,10 @@ def task_begin(request, task_id):
@login_required @login_required
@permission_required('taskapp.can_remind') @permission_required('taskapp.can_remind')
def remind(request, task_id): 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') return redirect('taskapp:home')
Loading…
Cancel
Save