From 2d089d469992a20a3091fbf9ff7f46bec13b24f4 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 24 Mar 2017 23:52:51 +0300 Subject: [PATCH 01/13] =?UTF-8?q?=D0=92=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=20=D0=BD=D0=B5=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=BD=D0=BE=D0=BC=20=D0=B0?= =?UTF-8?q?=D0=B4=D0=BC=D0=B8=D0=BD=D0=B5=20=D1=83=D0=BA=D0=B0=D0=B7=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D0=B5=D0=BC=20=D0=B8=D0=BC=D1=8F=20=D1=8D=D1=82?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chatbot/telebot.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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()) From 83a799f4b75c984821e4c4e5473cd944faa86140 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 24 Mar 2017 23:53:01 +0300 Subject: [PATCH 02/13] little bot translations --- chatbot/locale/ru/LC_MESSAGES/django.po | 56 +++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 chatbot/locale/ru/LC_MESSAGES/django.po diff --git a/chatbot/locale/ru/LC_MESSAGES/django.po b/chatbot/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..a0cb984 --- /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, я буду оповещать тебя о событиях в биллинге. Удачной работы ;)" From 0289b7e97d5cdfc301f7cf130dc71f6d4b724492 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 25 Mar 2017 00:13:34 +0300 Subject: [PATCH 03/13] =?UTF-8?q?=D0=92=D0=BE=D1=81=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B8=D0=BB=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B=20=D1=81=20=D1=80=D0=B0=D0=B1=D0=BE=D1=87?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8,=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=BD=D1=8F=D1=82=D0=BD=D0=BE=20=D0=BA?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=20=D0=BE=D0=BD=D0=B8=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BF=D0=B0=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- taskapp/locale/ru/LC_MESSAGES/django.po | 227 ++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 taskapp/locale/ru/LC_MESSAGES/django.po diff --git a/taskapp/locale/ru/LC_MESSAGES/django.po b/taskapp/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..57845fd --- /dev/null +++ b/taskapp/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,227 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-27 12:27+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Dmitry Novikov nerosketch@gmail.com\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" +"%100>=11 && n%100<=14)? 2 : 3);\n" + +msgid "A priority" +msgstr "Приоритет" + +msgid "Access to all tasks" +msgstr "Доступ ко всем задачам" + +msgid "Actions" +msgstr "Действия" + +msgid "Active tasks" +msgstr "Активные задачи" + +msgid "Add new task" +msgstr "Добавьте новую задачу" + +msgid "All my tasks" +msgstr "Все мои задачи" + +msgid "All tasks" +msgstr "Все задачи" + +msgid "All your tasks has been performed" +msgstr "Все ваши задачи выполнены" + +msgid "Attached image" +msgstr "Прикреплённое изображение" + +msgid "Attachment" +msgstr "Приложение" + +msgid "Average" +msgstr "Средний" + +msgid "Begin" +msgstr "Начать" + +msgid "Change task" +msgstr "Изменение задачи" + +msgid "Complete" +msgstr "Завершить" + +msgid "Completed" +msgstr "Выполнена" + +msgid "Completed tasks" +msgstr "Выполненные задачи" + +msgid "Completing tasks" +msgstr "Завершение задачи" + +msgid "Condition" +msgstr "Состояние" + +msgid "Create" +msgstr "Создать" + +msgid "Create task" +msgstr "Создание задачи" + +msgid "Date of create" +msgstr "Дата создания" + +msgid "Delete" +msgstr "Удалить" + +msgid "Delete task" +msgstr "Удаление задачи" + +msgid "Description" +msgstr "Описание" + +msgid "Edit" +msgstr "Редактировать" + +msgid "Employee has not yet signed up for notifications" +msgstr "Исполнитель ещё не подписался на оповещения" + +msgid "Error in the form fields" +msgstr "Ошибка в полях формы" + +msgid "Higher" +msgstr "Высший" + +msgid "Implementers" +msgstr "Исполнители" + +msgid "In fulfilling" +msgstr "На выполнении" + +msgid "Low" +msgstr "Низкий" + +msgid "New" +msgstr "Новая" + +msgid "New tasks" +msgstr "Новые задачи" + +msgid "No responsible employee for the users group" +msgstr "Нет ответственных за группу, в которой находится выбранный абонент" + +msgid "Not assigned" +msgstr "<Не назначено>" + +msgid "Reality (the date by which you must complete the task)" +msgstr "Актуальность (дата, до которой нужно завершить задачу)" + +msgid "Records of all the tasks in the system" +msgstr "Лог всех задач в системе" + +msgid "Remind" +msgstr "Напомнить" + +msgid "Reminders of tasks" +msgstr "Напоминания о задачах" + +msgid "Reset" +msgstr "Сбросить" + +msgid "Save" +msgstr "Сохранить" + +msgid "Scheduled tasks me" +msgstr "Назначенные мной задачи" + +msgid "Short description" +msgstr "Краткое описание" + +msgid "Subscriber" +msgstr "Абонент" + +msgid "Task" +msgstr "Задача" + +msgid "Task author" +msgstr "Кто назначил" + +msgid "Task completed" +msgstr "Задача завершена" + +msgid "Task description" +msgstr "Описание задачи" + +msgid "Task type" +msgstr "Тип задачи" + +msgid "Tasks" +msgstr "Задачи" + +msgid "Tasks to be performed" +msgstr "Задачи, которые необходимо выполнить" + +msgid "The list is empty" +msgstr "Список пуст" + +msgid "The nature of the damage" +msgstr "Характер поломки" + +msgid "The task is valid until" +msgstr "Задача действительна до" + +msgid "The task started" +msgstr "Задача начата" + +msgid "View all tasks" +msgstr "Просмотреть все задачи" + +msgid "You cannot delete task that assigned to you" +msgstr "Вы не можете удалять назначенные на вас задачи" + +msgid "You must select the subscriber" +msgstr "Нужно выбрать абонента" + +msgid "address %s. telephone %s. " +msgstr "по адресу %s тел. %s. " + +msgid "cable break" +msgstr "обрыв кабеля" + +msgid "configure onu" +msgstr "настроить onu" + +msgid "connection" +msgstr "подключение" + +msgid "crimp cable" +msgstr "обжать кабель" + +msgid "locality %s. Task type - %s. " +msgstr "с. %s. Тип задачи - %s. " + +msgid "not chosen" +msgstr "не выбрано" + +msgid "other" +msgstr "другое" + +msgid "periodic disappearance" +msgstr "переодическое пропадание" + +msgid "red cross" +msgstr "красный крестик" + +msgid "router setup" +msgstr "настройка роутера" + +msgid "weak speed" +msgstr "слабая скорость" + +msgid "yellow triangle" +msgstr "жёлтый треугольник" From 118b748ddf41cb5963c0c402349a67e9e2d2b515 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 25 Mar 2017 00:44:57 +0300 Subject: [PATCH 04/13] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- taskapp/locale/ru/LC_MESSAGES/django.po | 408 ++++++++++++++++-------- 1 file changed, 274 insertions(+), 134 deletions(-) diff --git a/taskapp/locale/ru/LC_MESSAGES/django.po b/taskapp/locale/ru/LC_MESSAGES/django.po index 57845fd..ebda813 100644 --- a/taskapp/locale/ru/LC_MESSAGES/django.po +++ b/taskapp/locale/ru/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-02-27 12:27+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" @@ -13,215 +13,355 @@ msgstr "" "%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" -msgid "A priority" -msgstr "Приоритет" - -msgid "Access to all tasks" -msgstr "Доступ ко всем задачам" - -msgid "Actions" -msgstr "Действия" +#: taskapp/forms.py:16 +msgid "Short description" +msgstr "Краткое описание" -msgid "Active tasks" -msgstr "Активные задачи" +#: taskapp/handle.py:14 +msgid "Task" +msgstr "Задача" -msgid "Add new task" -msgstr "Добавьте новую задачу" +#: taskapp/handle.py:23 +msgid "Task completed" +msgstr "Задача завершена" -msgid "All my tasks" -msgstr "Все мои задачи" +#: taskapp/handle.py:31 +#, python-format +msgid "locality %s.\n" +msgstr "с. %s\n" -msgid "All tasks" -msgstr "Все задачи" +#: taskapp/handle.py:33 +#, fuzzy, python-format +#| msgid "address %s. telephone %s. " +msgid "" +"address %s %s.\n" +"telephone %s\n" +msgstr "по адресу %s тел. %s. " -msgid "All your tasks has been performed" -msgstr "Все ваши задачи выполнены" +#: taskapp/handle.py:34 taskapp/models.py:26 +msgid "not chosen" +msgstr "не выбрано" -msgid "Attached image" -msgstr "Прикреплённое изображение" +#: taskapp/handle.py:38 +#, fuzzy, python-format +#| msgid "Task type" +msgid "Task type - %s.\n" +msgstr "Тип задачи" -msgid "Attachment" -msgstr "Приложение" +#: taskapp/models.py:14 +msgid "Higher" +msgstr "Высший" +#: taskapp/models.py:15 msgid "Average" msgstr "Средний" -msgid "Begin" -msgstr "Начать" +#: taskapp/models.py:16 +msgid "Low" +msgstr "Низкий" -msgid "Change task" -msgstr "Изменение задачи" +#: taskapp/models.py:20 +msgid "New" +msgstr "Новая" -msgid "Complete" -msgstr "Завершить" +#: taskapp/models.py:21 +msgid "In fulfilling" +msgstr "На выполнении" +#: taskapp/models.py:22 msgid "Completed" msgstr "Выполнена" -msgid "Completed tasks" -msgstr "Выполненные задачи" +#: taskapp/models.py:27 +msgid "yellow triangle" +msgstr "жёлтый треугольник" -msgid "Completing tasks" -msgstr "Завершение задачи" +#: taskapp/models.py:28 +msgid "red cross" +msgstr "красный крестик" -msgid "Condition" -msgstr "Состояние" +#: taskapp/models.py:29 +msgid "weak speed" +msgstr "слабая скорость" -msgid "Create" -msgstr "Создать" +#: taskapp/models.py:30 +msgid "cable break" +msgstr "обрыв кабеля" -msgid "Create task" -msgstr "Создание задачи" +#: taskapp/models.py:31 +msgid "connection" +msgstr "подключение" -msgid "Date of create" -msgstr "Дата создания" +#: taskapp/models.py:32 +msgid "periodic disappearance" +msgstr "переодическое пропадание" -msgid "Delete" -msgstr "Удалить" +#: taskapp/models.py:33 +msgid "router setup" +msgstr "настройка роутера" + +#: taskapp/models.py:34 +msgid "configure onu" +msgstr "настроить onu" + +#: taskapp/models.py:35 +msgid "crimp cable" +msgstr "обжать кабель" + +#: taskapp/models.py:36 +msgid "other" +msgstr "другое" +#: taskapp/models.py:43 +msgid "Change task" +msgstr "Изменение задачи" + +#: taskapp/models.py:44 +msgid "Create task" +msgstr "Создание задачи" + +#: taskapp/models.py:45 msgid "Delete task" msgstr "Удаление задачи" -msgid "Description" -msgstr "Описание" +#: taskapp/models.py:46 +msgid "Completing tasks" +msgstr "Завершение задачи" -msgid "Edit" -msgstr "Редактировать" +#: taskapp/models.py:47 +msgid "The task started" +msgstr "Задача начата" -msgid "Employee has not yet signed up for notifications" -msgstr "Исполнитель ещё не подписался на оповещения" +#: taskapp/models.py:78 +msgid "Access to all tasks" +msgstr "Доступ ко всем задачам" -msgid "Error in the form fields" -msgstr "Ошибка в полях формы" +#: taskapp/models.py:79 +msgid "Reminders of tasks" +msgstr "Напоминания о задачах" -msgid "Higher" -msgstr "Высший" +#: taskapp/templates/taskapp/add_edit_task.html:7 +#: taskapp/templates/taskapp/tasklist_all.html:7 +#: taskapp/templates/taskapp/view.html:7 +msgid "Tasks" +msgstr "Задачи" -msgid "Implementers" -msgstr "Исполнители" +#: taskapp/templates/taskapp/add_edit_task.html:8 +#: taskapp/templates/taskapp/tasklist.html:48 +#: taskapp/templates/taskapp/tasklist_active.html:46 +#: taskapp/templates/taskapp/tasklist_all.html:54 +#: taskapp/templates/taskapp/tasklist_finish.html:43 +#: taskapp/templates/taskapp/tasklist_own.html:40 +msgid "Edit" +msgstr "Редактировать" -msgid "In fulfilling" -msgstr "На выполнении" +#: taskapp/templates/taskapp/add_edit_task.html:8 +msgid "Create" +msgstr "Создать" -msgid "Low" -msgstr "Низкий" +#: taskapp/templates/taskapp/add_edit_task.html:15 +#: taskapp/templates/taskapp/footer_btns.html:3 +#: taskapp/templates/taskapp/footer_btns.html:4 +#: taskapp/templates/taskapp/tasklist_all.html:75 +#: taskapp/templates/taskapp/tasklist_all.html:76 +msgid "Add new task" +msgstr "Добавьте новую задачу" -msgid "New" -msgstr "Новая" +#: taskapp/templates/taskapp/add_edit_task.html:27 +#: taskapp/templates/taskapp/tasklist.html:10 +#: taskapp/templates/taskapp/tasklist_active.html:10 +#: taskapp/templates/taskapp/tasklist_all.html:22 +#: taskapp/templates/taskapp/tasklist_finish.html:10 +#: taskapp/templates/taskapp/tasklist_own.html:10 +#: taskapp/templates/taskapp/view.html:19 +msgid "Description" +msgstr "Описание" -msgid "New tasks" -msgstr "Новые задачи" +#: taskapp/templates/taskapp/add_edit_task.html:35 +#: taskapp/templates/taskapp/tasklist.html:12 +#: taskapp/templates/taskapp/tasklist_active.html:12 +#: taskapp/templates/taskapp/tasklist_all.html:24 +#: taskapp/templates/taskapp/tasklist_finish.html:12 +#: taskapp/templates/taskapp/tasklist_own.html:11 +msgid "The nature of the damage" +msgstr "Характер поломки" -msgid "No responsible employee for the users group" -msgstr "Нет ответственных за группу, в которой находится выбранный абонент" +#: taskapp/templates/taskapp/add_edit_task.html:43 +#: taskapp/templates/taskapp/tasklist.html:14 +#: taskapp/templates/taskapp/tasklist_active.html:14 +#: taskapp/templates/taskapp/tasklist_all.html:26 +#: taskapp/templates/taskapp/tasklist_finish.html:14 +#: taskapp/templates/taskapp/tasklist_own.html:13 +msgid "A priority" +msgstr "Приоритет" -msgid "Not assigned" -msgstr "<Не назначено>" +#: taskapp/templates/taskapp/add_edit_task.html:51 +#: taskapp/templates/taskapp/tasklist.html:13 +#: taskapp/templates/taskapp/tasklist_active.html:13 +#: taskapp/templates/taskapp/tasklist_all.html:25 +#: taskapp/templates/taskapp/tasklist_finish.html:13 +#: taskapp/templates/taskapp/tasklist_own.html:12 +msgid "Condition" +msgstr "Состояние" + +#: taskapp/templates/taskapp/add_edit_task.html:59 +#: taskapp/templates/taskapp/view.html:30 +msgid "Subscriber" +msgstr "Абонент" +#: taskapp/templates/taskapp/add_edit_task.html:75 msgid "Reality (the date by which you must complete the task)" msgstr "Актуальность (дата, до которой нужно завершить задачу)" -msgid "Records of all the tasks in the system" -msgstr "Лог всех задач в системе" - -msgid "Remind" -msgstr "Напомнить" - -msgid "Reminders of tasks" -msgstr "Напоминания о задачах" - -msgid "Reset" -msgstr "Сбросить" +#: taskapp/templates/taskapp/add_edit_task.html:91 +msgid "Attached image" +msgstr "Прикреплённое изображение" +#: taskapp/templates/taskapp/add_edit_task.html:99 msgid "Save" msgstr "Сохранить" -msgid "Scheduled tasks me" -msgstr "Назначенные мной задачи" - -msgid "Short description" -msgstr "Краткое описание" - -msgid "Subscriber" -msgstr "Абонент" +#: taskapp/templates/taskapp/add_edit_task.html:102 +msgid "Reset" +msgstr "Сбросить" -msgid "Task" -msgstr "Задача" +#: taskapp/templates/taskapp/footer_btns.html:9 +msgid "View all tasks" +msgstr "Просмотреть все задачи" +#: taskapp/templates/taskapp/tasklist.html:11 +#: taskapp/templates/taskapp/tasklist_active.html:11 +#: taskapp/templates/taskapp/tasklist_all.html:23 +#: taskapp/templates/taskapp/tasklist_finish.html:11 msgid "Task author" msgstr "Кто назначил" -msgid "Task completed" -msgstr "Задача завершена" +#: taskapp/templates/taskapp/tasklist.html:15 +#: taskapp/templates/taskapp/tasklist_active.html:15 +#: taskapp/templates/taskapp/tasklist_all.html:27 +#: taskapp/templates/taskapp/tasklist_finish.html:15 +#: taskapp/templates/taskapp/tasklist_own.html:14 +#: taskapp/templates/taskapp/view.html:27 +msgid "Date of create" +msgstr "Дата создания" -msgid "Task description" -msgstr "Описание задачи" +#: taskapp/templates/taskapp/tasklist.html:16 +#: taskapp/templates/taskapp/tasklist_active.html:16 +#: taskapp/templates/taskapp/tasklist_all.html:28 +#: taskapp/templates/taskapp/tasklist_finish.html:16 +#: taskapp/templates/taskapp/tasklist_own.html:15 +#: taskapp/templates/taskapp/view.html:37 +msgid "Attachment" +msgstr "Приложение" -msgid "Task type" -msgstr "Тип задачи" +#: taskapp/templates/taskapp/tasklist.html:17 +#: taskapp/templates/taskapp/tasklist_active.html:17 +#: taskapp/templates/taskapp/tasklist_all.html:29 +#: taskapp/templates/taskapp/tasklist_finish.html:17 +#: taskapp/templates/taskapp/tasklist_own.html:16 +msgid "Actions" +msgstr "Действия" -msgid "Tasks" -msgstr "Задачи" +#: taskapp/templates/taskapp/tasklist.html:41 +msgid "Begin" +msgstr "Начать" -msgid "Tasks to be performed" -msgstr "Задачи, которые необходимо выполнить" +#: taskapp/templates/taskapp/tasklist.html:44 +#: taskapp/templates/taskapp/tasklist_active.html:42 +msgid "Complete" +msgstr "Завершить" +#: taskapp/templates/taskapp/tasklist.html:56 +#: taskapp/templates/taskapp/tasklist_active.html:54 +#: taskapp/templates/taskapp/tasklist_all.html:67 +#: taskapp/templates/taskapp/tasklist_finish.html:56 msgid "The list is empty" msgstr "Список пуст" -msgid "The nature of the damage" -msgstr "Характер поломки" +#: taskapp/templates/taskapp/tasklist_all.html:8 +msgid "All tasks" +msgstr "Все задачи" + +#: taskapp/templates/taskapp/tasklist_all.html:14 +msgid "Records of all the tasks in the system" +msgstr "Лог всех задач в системе" +#: taskapp/templates/taskapp/tasklist_all.html:59 +#: taskapp/templates/taskapp/tasklist_own.html:45 +msgid "Remind" +msgstr "Напомнить" + +#: taskapp/templates/taskapp/tasklist_finish.html:48 +#: taskapp/templates/taskapp/tasklist_own.html:50 +msgid "Delete" +msgstr "Удалить" + +#: taskapp/templates/taskapp/tasklist_own.html:58 +msgid "All your tasks has been performed" +msgstr "Все ваши задачи выполнены" + +#: taskapp/templates/taskapp/view.html:15 +msgid "Task description" +msgstr "Описание задачи" + +#: taskapp/templates/taskapp/view.html:20 +msgid "Implementers" +msgstr "Исполнители" + +#: taskapp/templates/taskapp/view.html:26 msgid "The task is valid until" msgstr "Задача действительна до" -msgid "The task started" -msgstr "Задача начата" +#: taskapp/templates/taskapp/view.html:28 +msgid "time left" +msgstr "" -msgid "View all tasks" -msgstr "Просмотреть все задачи" +#: taskapp/templates/taskapp/view.html:29 +msgid "Task type" +msgstr "Тип задачи" + +#: taskapp/templates/taskapp/view.html:34 +msgid "Not assigned" +msgstr "<Не назначено>" +#: taskapp/views.py:82 msgid "You cannot delete task that assigned to you" msgstr "Вы не можете удалять назначенные на вас задачи" +#: taskapp/views.py:143 +msgid "No responsible employee for the users group" +msgstr "Нет ответственных за группу, в которой находится выбранный абонент" + +#: taskapp/views.py:145 msgid "You must select the subscriber" msgstr "Нужно выбрать абонента" -msgid "address %s. telephone %s. " -msgstr "по адресу %s тел. %s. " - -msgid "cable break" -msgstr "обрыв кабеля" - -msgid "configure onu" -msgstr "настроить onu" - -msgid "connection" -msgstr "подключение" - -msgid "crimp cable" -msgstr "обжать кабель" +#: taskapp/views.py:147 +msgid "Error in the form fields" +msgstr "Ошибка в полях формы" -msgid "locality %s. Task type - %s. " -msgstr "с. %s. Тип задачи - %s. " +#: taskapp/views.py:151 +#, python-format +msgid "User '%s' does not exist" +msgstr "" -msgid "not chosen" -msgstr "не выбрано" +msgid "Active tasks" +msgstr "Активные задачи" -msgid "other" -msgstr "другое" +msgid "All my tasks" +msgstr "Все мои задачи" -msgid "periodic disappearance" -msgstr "переодическое пропадание" +msgid "Completed tasks" +msgstr "Выполненные задачи" -msgid "red cross" -msgstr "красный крестик" +msgid "New tasks" +msgstr "Новые задачи" -msgid "router setup" -msgstr "настройка роутера" +msgid "Scheduled tasks me" +msgstr "Назначенные мной задачи" -msgid "weak speed" -msgstr "слабая скорость" +msgid "Tasks to be performed" +msgstr "Задачи, которые необходимо выполнить" -msgid "yellow triangle" -msgstr "жёлтый треугольник" +msgid "locality %s. Task type - %s. " +msgstr "с. %s. Тип задачи - %s. " From b475d35d82321c374a715248531af5e4d13110e9 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 25 Mar 2017 00:45:49 +0300 Subject: [PATCH 05/13] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/locale/ru/LC_MESSAGES/django.po | 120 +++++++++++++----------- 1 file changed, 65 insertions(+), 55 deletions(-) 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 "Тариф, который вы выбрали, не существует" From ad21c42304d8746a0f77f247350af397e2a33b0b Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 25 Mar 2017 00:47:54 +0300 Subject: [PATCH 06/13] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=82=D0=B8=D0=BF=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mydefs.py | 8 ++++++++ 1 file changed, 8 insertions(+) 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 From 4837a11ece2b636aa7bc331814e4a8dfceb3ed82 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 25 Mar 2017 00:48:19 +0300 Subject: [PATCH 07/13] fixbug --- taskapp/models.py | 18 ++++++++++++------ taskapp/views.py | 24 +++++++++++++----------- 2 files changed, 25 insertions(+), 17 deletions(-) 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') From 21e62c9cdeec637c8a509d7598b3169b484156fb Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 25 Mar 2017 00:54:25 +0300 Subject: [PATCH 08/13] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D1=82=D0=B5=D0=BA=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chatbot/locale/ru/LC_MESSAGES/django.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chatbot/locale/ru/LC_MESSAGES/django.po b/chatbot/locale/ru/LC_MESSAGES/django.po index a0cb984..b5a24c0 100644 --- a/chatbot/locale/ru/LC_MESSAGES/django.po +++ b/chatbot/locale/ru/LC_MESSAGES/django.po @@ -47,7 +47,7 @@ msgstr "Ты ведь %s ?" #: chatbot/telebot.py:135 #, python-format msgid "Recipient '%s' does not subscribed on notifications" -msgstr "Цель оповещения '%s' не подписан на оповещения" +msgstr "%s не подписан на оповещения" msgid "Let's ping, write ip. It will be necessary to wait 10 seconds" msgstr "Давай пинганём, напиши ip. Нужно будет подождать 10 сек" From 560f142bd4599a37d45d778b4c6869cd0216e790 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 25 Mar 2017 14:33:36 +0300 Subject: [PATCH 09/13] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D1=83=20=D0=B2=20=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BA=D0=B5=20?= =?UTF-8?q?=D0=B2=D0=B0=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 22453357bdacde8ce4cf6d7a37da9fcaec3538e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Sat, 25 Mar 2017 14:46:37 +0300 Subject: [PATCH 10/13] Update load_from_nodeny.py --- djing/utils/load_from_nodeny.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/djing/utils/load_from_nodeny.py b/djing/utils/load_from_nodeny.py index ee154b6..f01e43c 100755 --- a/djing/utils/load_from_nodeny.py +++ b/djing/utils/load_from_nodeny.py @@ -72,7 +72,7 @@ def load_groups(cursor): if __name__ == "__main__": - db = MySQLdb.connect(host="10.12.1.6", user="bashmak", passwd="HUhTubP4zT", db="nodeny", charset='utf8') + db = MySQLdb.connect(host="127.0.0.1", user="user", passwd="password", db="db", charset='utf8') cursor = db.cursor() result = dict() From 890d544c57d7a9ece752fd5bfedd81e4c6b7fbc4 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 25 Mar 2017 17:33:32 +0300 Subject: [PATCH 11/13] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=B5=20=D1=81=20=D1=83?= =?UTF-8?q?=D1=81=D0=BB=D1=83=D0=B3=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- djing/utils/load_from_nodeny.py | 47 ++++++++++--- djing/utils/save_from_nodeny.py | 116 ++++++++++++++++++++++++++++---- 2 files changed, 141 insertions(+), 22 deletions(-) diff --git a/djing/utils/load_from_nodeny.py b/djing/utils/load_from_nodeny.py index 30cadb2..ee154b6 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="10.12.1.6", user="bashmak", passwd="HUhTubP4zT", db="nodeny", 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: From b89c5caf930eaede0887f9eb87756fb03903fe76 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 25 Mar 2017 17:51:00 +0300 Subject: [PATCH 12/13] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=B0=20=D1=82=D0=B0=D1=80=D0=B8=D1=84=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tariff_app/templates/tariff_app/tarifs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 %} From 80dfb5cc9b34b12f59115fe59af9e1d8bb7ed3b7 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 25 Mar 2017 18:59:17 +0300 Subject: [PATCH 13/13] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/views.py | 87 +++++++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 38 deletions(-) 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)