diff --git a/abonapp/locale/ru/LC_MESSAGES/django.po b/abonapp/locale/ru/LC_MESSAGES/django.po index 854e734..a3384f5 100644 --- a/abonapp/locale/ru/LC_MESSAGES/django.po +++ b/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 "Подробнее:
Вы завершаете тариф" #: abonapp/templates/abonapp/complete_service.html:39 +#, python-format msgid "" "The service has been connected: %(time_start)s
\n" "Today: %(today)s
\n" @@ -280,8 +286,8 @@ msgid "" "Cashback: %(cashback)s" msgstr "" "Услуга была подключена: %(time_start)s
Сегодня: %(today)s
Время " -"использования: %(time_use)s
Полная стоимость услуги: %(amount)s
" -"Итоговая стоимость: %(tcost)s
\n" +"использования: %(time_use)s
Полная стоимость услуги: %(amount)s
Итоговая стоимость: %(tcost)s
\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 "Тариф, который вы выбрали, не существует" diff --git a/abonapp/views.py b/abonapp/views.py index 1157c69..05d2985 100644 --- a/abonapp/views.py +++ b/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) diff --git a/chatbot/locale/ru/LC_MESSAGES/django.po b/chatbot/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..b5a24c0 --- /dev/null +++ b/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 , 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 \n" +"Language-Team: LANGUAGE \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, я буду оповещать тебя о событиях в биллинге. Удачной работы ;)" diff --git a/chatbot/telebot.py b/chatbot/telebot.py index 201af45..3b4a905 100755 --- a/chatbot/telebot.py +++ b/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()) diff --git a/djing/utils/load_from_nodeny.py b/djing/utils/load_from_nodeny.py index 30cadb2..f01e43c 100755 --- a/djing/utils/load_from_nodeny.py +++ b/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="", passwd="", 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)) diff --git a/djing/utils/save_from_nodeny.py b/djing/utils/save_from_nodeny.py index a1f1acd..060a43e 100755 --- a/djing/utils/save_from_nodeny.py +++ b/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: diff --git a/mydefs.py b/mydefs.py index 51e7256..5dd7ff6 100644 --- a/mydefs.py +++ b/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 diff --git a/requirements.txt b/requirements.txt index c81232b..0c626de 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ Django==1.9 Pillow -mysqlclient telepot -easysnmp # for testing required xmltodict xmltodict +mysqlclient +easysnmp diff --git a/tariff_app/templates/tariff_app/tarifs.html b/tariff_app/templates/tariff_app/tarifs.html index 16006e4..213fead 100644 --- a/tariff_app/templates/tariff_app/tarifs.html +++ b/tariff_app/templates/tariff_app/tarifs.html @@ -62,7 +62,7 @@ {{ tar.speedOut }} {{ tar.amount }} руб {{ tar.time_of_action }} дней - {{ tar.calc_type }} + {{ tar.get_calc_type_display }} {% if perms.tariff_app.delete_tariff %} diff --git a/taskapp/models.py b/taskapp/models.py index c58530f..649ad70 100644 --- a/taskapp/models.py +++ b/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) - diff --git a/taskapp/views.py b/taskapp/views.py index aafbf8d..8200cf5 100644 --- a/taskapp/views.py +++ b/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')