diff --git a/abonapp/templates/abonapp/debtors.html b/abonapp/templates/abonapp/debtors.html index 96d16be..1a96975 100644 --- a/abonapp/templates/abonapp/debtors.html +++ b/abonapp/templates/abonapp/debtors.html @@ -47,6 +47,6 @@ - {% include 'toolbar_page.html' with pag=peoples %} + {% include 'pagination.html' %} {% endblock %} \ No newline at end of file diff --git a/abonapp/templates/abonapp/dial_log.html b/abonapp/templates/abonapp/dial_log.html index 169906c..9dc5bd9 100644 --- a/abonapp/templates/abonapp/dial_log.html +++ b/abonapp/templates/abonapp/dial_log.html @@ -42,6 +42,6 @@ - {% include 'toolbar_page.html' with pag=logs %} + {% include 'pagination.html' %} {% endblock %} diff --git a/abonapp/templates/abonapp/invoiceForPayment.html b/abonapp/templates/abonapp/invoiceForPayment.html index 92ff0d4..2f57ad1 100644 --- a/abonapp/templates/abonapp/invoiceForPayment.html +++ b/abonapp/templates/abonapp/invoiceForPayment.html @@ -67,6 +67,6 @@ - {% include 'toolbar_page.html' with pag=invoices %} + {% include 'pagination.html' %} {% endblock %} diff --git a/abonapp/templates/abonapp/log.html b/abonapp/templates/abonapp/log.html index 9b208de..e8ef0e9 100644 --- a/abonapp/templates/abonapp/log.html +++ b/abonapp/templates/abonapp/log.html @@ -51,6 +51,6 @@ - {% include 'toolbar_page.html' with pag=logs %} + {% include 'pagination.html' %} {% endblock %} \ No newline at end of file diff --git a/abonapp/templates/abonapp/payHistory.html b/abonapp/templates/abonapp/payHistory.html index f836fa4..e2fa864 100644 --- a/abonapp/templates/abonapp/payHistory.html +++ b/abonapp/templates/abonapp/payHistory.html @@ -53,5 +53,5 @@ - {% include 'toolbar_page.html' with pag=pay_history %} + {% include 'pagination.html' %} {% endblock %} diff --git a/abonapp/templates/abonapp/task_log.html b/abonapp/templates/abonapp/task_log.html index a3df05e..25692f5 100644 --- a/abonapp/templates/abonapp/task_log.html +++ b/abonapp/templates/abonapp/task_log.html @@ -44,5 +44,5 @@ - {% include 'toolbar_page.html' with pag=tasks %} + {% include 'pagination.html' %} {% endblock %} \ No newline at end of file diff --git a/abonapp/urls.py b/abonapp/urls.py index 5f3f9f4..81022f0 100644 --- a/abonapp/urls.py +++ b/abonapp/urls.py @@ -15,13 +15,13 @@ urlpatterns = [ url(r'^(?P\d+)/', include('abonapp.urls_abon')), - url(r'^log$', views.log_page, name='log'), + url(r'^log$', views.LogListView.as_view(), name='log'), url(r'^del$', views.del_abon, name='del_abon'), url(r'^pay$', views.terminal_pay, name='terminal_pay'), - url(r'^debtors$', views.debtors, name='debtors'), + url(r'^debtors$', views.DebtorsListView.as_view(), name='debtors'), url(r'^ping$', views.abon_ping, name='ping'), diff --git a/abonapp/urls_abon.py b/abonapp/urls_abon.py index 404889c..7299b78 100644 --- a/abonapp/urls_abon.py +++ b/abonapp/urls_abon.py @@ -15,14 +15,14 @@ urlpatterns = [ url(r'^(?P\d+)/services$', views.abon_services, name='abon_services'), url(r'^(?P\d+)/amount', views.abonamount, name='abon_amount'), - url(r'^(?P\d+)/debts', views.invoice_for_payment, name='abon_debts'), - url(r'^(?P\d+)/pay', views.pay_history, name='abon_phistory'), + url(r'^(?P\d+)/debts', views.DebtsListView.as_view(), name='abon_debts'), + url(r'^(?P\d+)/pay', views.PayHistoryListView.as_view(), name='abon_phistory'), url(r'^(?P\d+)/addinvoice$', views.add_invoice, name='add_invoice'), url(r'^(?P\d+)/pick$', views.pick_tariff, name='pick_tariff'), url(r'^(?P\d+)/passport_view$', views.passport_view, name='passport_view'), url(r'^(?P\d+)/chart$', views.charts, name='charts'), - url(r'^(?P\d+)/dials$', views.dials, name='dials'), + url(r'^(?P\d+)/dials$', views.DialsListView.as_view(), name='dials'), url(r'^(?P\d+)/reset_ip$', views.reset_ip, name='reset_ip'), url(r'^(?P\d+)/extra_field$', views.make_extra_field, name='extra_field'), url(r'^(?P\d+)/extra_field/(?P\d+)/delete$', views.extra_field_delete, name='extra_field_delete'), @@ -34,7 +34,7 @@ urlpatterns = [ url(r'^(?P\d+)/dev/$', views.dev, name='dev'), url(r'^(?P\d+)/clear_dev/$', views.clear_dev, name='clear_dev'), - url(r'^(?P\d+)/task_log$', views.task_log, name='task_log'), + url(r'^(?P\d+)/task_log$', views.TaskLogListView.as_view(), name='task_log'), url(r'^(?P\d+)/user_dev$', views.save_user_dev_port, name='save_user_dev_port'), url(r'^(?P\d+)/tel$', views.tels, name='telephones'), diff --git a/abonapp/views.py b/abonapp/views.py index 65fedd9..30abee0 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -230,32 +230,39 @@ def abonamount(request, gid, uid): }, request=request) -@login_required -@mydefs.only_admins -@permission_required('abonapp.can_view_abongroup', (models.AbonGroup, 'pk', 'gid')) -def invoice_for_payment(request, gid, uid): - abon = get_object_or_404(models.Abon, pk=uid) - invoices = models.InvoiceForPayment.objects.filter(abon=abon) - invoices = mydefs.pag_mn(request, invoices) - return render(request, 'abonapp/invoiceForPayment.html', { - 'invoices': invoices, - 'abon_group': abon.group, - 'abon': abon - }) +@method_decorator(permission_required('abonapp.can_view_abongroup', (models.AbonGroup, 'pk', 'gid')), name='dispatch') +class DebtsListView(BaseAbonListView): + context_object_name = 'invoices' + template_name = 'abonapp/invoiceForPayment.html' + def get_queryset(self): + abon = get_object_or_404(models.Abon, pk=self.kwargs.get('uid')) + self.abon = abon + return models.InvoiceForPayment.objects.filter(abon=abon) -@login_required -@mydefs.only_admins -@permission_required('abonapp.can_view_abongroup', (models.AbonGroup, 'pk', 'gid')) -def pay_history(request, gid, uid): - abon = get_object_or_404(models.Abon, pk=uid) - pay_history = models.AbonLog.objects.filter(abon=abon).order_by('-id') - pay_history = mydefs.pag_mn(request, pay_history) - return render(request, 'abonapp/payHistory.html', { - 'pay_history': pay_history, - 'abon_group': abon.group, - 'abon': abon - }) + def get_context_data(self, **kwargs): + context = super(DebtsListView, self).get_context_data(**kwargs) + context['abon_group'] = self.abon.group + context['abon'] = self.abon + return context + + +@method_decorator(permission_required('abonapp.can_view_abongroup', (models.AbonGroup, 'pk', 'gid')), name='dispatch') +class PayHistoryListView(BaseAbonListView): + context_object_name = 'pay_history' + template_name = 'abonapp/payHistory.html' + + def get_queryset(self): + abon = get_object_or_404(models.Abon, pk=self.kwargs.get('uid')) + self.abon = abon + pay_history = models.AbonLog.objects.filter(abon=abon).order_by('-id') + return pay_history + + def get_context_data(self, **kwargs): + context = super(PayHistoryListView, self).get_context_data(**kwargs) + context['abon_group'] = self.abon.group + context['abon'] = self.abon + return context @login_required @@ -447,36 +454,44 @@ def unsubscribe_service(request, gid, uid, abon_tariff_id): return redirect('abonapp:abon_services', gid=gid, uid=uid) -@login_required -@permission_required('abonapp.can_view_abonlog') -def log_page(request): - logs = models.AbonLog.objects.all() - logs = mydefs.pag_mn(request, logs) - return render(request, 'abonapp/log.html', { - 'logs': logs - }) +@method_decorator(login_required, name='dispatch') +@method_decorator(permission_required('abonapp.can_view_abonlog'), name='dispatch') +class LogListView(ListView): + paginate_by = PAGINATION_ITEMS_PER_PAGE + http_method_names = ['get'] + context_object_name = 'logs' + template_name = 'abonapp/log.html' + model = models.AbonLog -@login_required -@permission_required('abonapp.can_view_invoiceforpayment') -def debtors(request): - invs = models.InvoiceForPayment.objects.filter(status=True) - invs = mydefs.pag_mn(request, invs) - return render(request, 'abonapp/debtors.html', { - 'invoices': invs - }) +@method_decorator(login_required, name='dispatch') +@method_decorator(permission_required('abonapp.can_view_invoiceforpayment'), name='dispatch') +class DebtorsListView(ListView): + paginate_by = PAGINATION_ITEMS_PER_PAGE + http_method_names = ['get'] + context_object_name = 'invoices' + template_name = 'abonapp/debtors.html' + queryset = models.InvoiceForPayment.objects.filter(status=True) -@login_required -@permission_required('abonapp.can_view_abongroup', (models.AbonGroup, 'pk', 'gid')) -def task_log(request, gid, uid): - abon = get_object_or_404(models.Abon, pk=uid) - tasks = Task.objects.filter(abon=abon) - return render(request, 'abonapp/task_log.html', { - 'tasks': tasks, - 'abon_group': get_object_or_404(models.AbonGroup, pk=gid), - 'abon': abon - }) +@method_decorator(login_required, name='dispatch') +@method_decorator(permission_required('abonapp.can_view_abongroup', (models.AbonGroup, 'pk', 'gid')), name='dispatch') +class TaskLogListView(ListView): + paginate_by = PAGINATION_ITEMS_PER_PAGE + http_method_names = ['get'] + context_object_name = 'tasks' + template_name = 'abonapp/task_log.html' + + def get_queryset(self): + abon = get_object_or_404(models.Abon, pk=self.kwargs.get('uid')) + self.abon = abon + return Task.objects.filter(abon=abon) + + def get_context_data(self, **kwargs): + context = super(TaskLogListView, self).get_context_data(**kwargs) + context['abon_group'] = self.abon.group + context['abon'] = self.abon + return context @login_required @@ -728,27 +743,34 @@ def abon_ping(request): })) -@login_required -@mydefs.only_admins -def dials(request, gid, uid): - abon = get_object_or_404(models.Abon, pk=uid) - if not request.user.has_perm('abonapp.can_view_abongroup', abon.group): - raise PermissionDenied - if hasattr(abon.group, 'pk') and abon.group.pk != int(gid): - return redirect('abonapp:dials', abon.group.pk, abon.pk) - if abon.telephone is not None and abon.telephone != '': - tel = abon.telephone.replace('+', '') - logs = AsteriskCDR.objects.filter( - Q(src__contains=tel) | Q(dst__contains=tel) - ) - logs = mydefs.pag_mn(request, logs) - else: - logs = None - return render(request, 'abonapp/dial_log.html', { - 'logs': logs, - 'abon_group': get_object_or_404(models.AbonGroup, pk=gid), - 'abon': abon - }) +class DialsListView(BaseAbonListView): + context_object_name = 'logs' + template_name = 'abonapp/dial_log.html' + + def get_queryset(self): + abon = get_object_or_404(models.Abon, pk=self.kwargs.get('uid')) + if not self.request.user.has_perm('abonapp.can_view_abongroup', abon.group): + raise PermissionDenied + self.abon = abon + if abon.telephone is not None and abon.telephone != '': + tel = abon.telephone.replace('+', '') + logs = AsteriskCDR.objects.filter( + Q(src__contains=tel) | Q(dst__contains=tel) + ) + return logs + else: + return AsteriskCDR.objects.empty() + + def get_context_data(self, **kwargs): + context = super(DialsListView, self).get_context_data(**kwargs) + context['abon_group'] = get_object_or_404(models.AbonGroup, pk=self.kwargs.get('gid')) + context['abon'] = self.abon + return context + + def render_to_response(self, context, **response_kwargs): + if hasattr(self.abon.group, 'pk') and self.abon.group.pk != int(self.kwargs.get('gid')): + return redirect('abonapp:dials', self.abon.group.pk, self.abon.pk) + return super(DialsListView, self).render_to_response(context, **response_kwargs) @login_required diff --git a/accounts_app/locale/ru/LC_MESSAGES/django.po b/accounts_app/locale/ru/LC_MESSAGES/django.po index 3af243d..eeb76b2 100644 --- a/accounts_app/locale/ru/LC_MESSAGES/django.po +++ b/accounts_app/locale/ru/LC_MESSAGES/django.po @@ -6,9 +6,7 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-02-27 14:20+0300\n" +"POT-Creation-Date: 2018-02-15 15:15+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Dmitry Novikov nerosketch@gmail.com\n" "Language: ru\n" @@ -19,198 +17,281 @@ 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" -#: accounts_app/models.py:18 +#: models.py:22 msgid "Users must have an telephone number" msgstr "У пользователей должен быть номер телефона" -#: accounts_app/templates/accounts/group.html:7 -#: accounts_app/templates/accounts/group_list.html:7 +#: models.py:49 templates/accounts/acc_list.html:18 +msgid "profile username" +msgstr "Логин" + +#: models.py:50 +msgid "fio" +msgstr "ФИО" + +#: models.py:51 +msgid "birth day" +msgstr "дата рождения" + +#: models.py:52 +msgid "Is active" +msgstr "Активен" + +#: models.py:56 templates/accounts/acc_list.html:20 +#: templates/accounts/create_acc.html:60 templates/accounts/index.html:9 +#: templates/accounts/settings/ch_info.html:37 +msgid "Telephone" +msgstr "Телефон" + +#: models.py:107 +msgid "Can view staff profile" +msgstr "Может просматривать учётку сотрудника" + +#: models.py:109 +msgid "Staff account profile" +msgstr "Учётная запись работника" + +#: models.py:110 +msgid "Staff account profiles" +msgstr "Учётные записи работников" + +#: templates/accounts/acc_list.html:7 templates/accounts/create_acc.html:6 +#: templates/accounts/perms/objects_of_type.html:7 +#: templates/accounts/perms/objects_types.html:8 +#: templates/accounts/perms/perms_edit.html:8 msgid "Administrators" msgstr "Сотрудники" -#: accounts_app/templates/accounts/group.html:8 -#: accounts_app/templates/accounts/group_list.html:8 -msgid "Groups" -msgstr "Группы" +#: templates/accounts/acc_list.html:12 +msgid "Admin accounts list" +msgstr "Список аккаунтов администраторов" + +#: templates/accounts/acc_list.html:17 +msgid "Photo" +msgstr "Фото" + +#: templates/accounts/acc_list.html:19 +msgid "Fullname, or login if name is empty" +msgstr "ФИО (или ник если нет)" + +#: templates/accounts/acc_list.html:21 +#: templates/accounts/settings/ch_info.html:27 +msgid "Email" +msgstr "Адрес электронной почты" + +#: templates/accounts/acc_list.html:38 templates/accounts/acc_list.html:45 +msgid "Not assigned" +msgstr "<Не назначено>" + +#: templates/accounts/acc_list.html:56 +msgid "You have not permissions to delete" +msgstr "У вас нет прав на удаление" + +#: templates/accounts/acc_list.html:65 +msgid "Users not found" +msgstr "Пользователи не найдены" + +#: templates/accounts/acc_list.html:73 +msgid "Add account" +msgstr "Добавить учётную запись" -#: accounts_app/templates/accounts/group.html:44 -#: accounts_app/templates/accounts/profile_chgroup.html:20 -#: accounts_app/templates/accounts/settings/ch_info.html:66 +#: templates/accounts/create_acc.html:7 +msgid "Add" +msgstr "Добавить" + +#: templates/accounts/create_acc.html:14 +msgid "Create new account" +msgstr "Создать новую учётную запись" + +#: templates/accounts/create_acc.html:31 templates/accounts/create_acc.html:35 +msgid "Username" +msgstr "Логин" + +#: templates/accounts/create_acc.html:40 templates/accounts/create_acc.html:45 +msgid "Fullname" +msgstr "Полное имя" + +#: templates/accounts/create_acc.html:50 +msgid "EMail" +msgstr "Адрес электронной почты" + +#: templates/accounts/create_acc.html:65 +#: templates/accounts/settings/ch_info.html:42 +msgid "+[7,8,9,3] and 10,11 digits" +msgstr "+[7,8,9,3] и 10,11 цифр" + +#: templates/accounts/create_acc.html:70 +msgid "Type password" +msgstr "Введите пароль" + +#: templates/accounts/create_acc.html:78 +msgid "Repeat password" +msgstr "Повторите пароль" + +#: templates/accounts/create_acc.html:87 +#: templates/accounts/perms/perms_edit.html:61 +#: templates/accounts/profile_chgroup.html:20 +#: templates/accounts/set_abon_groups_permission.html:20 +#: templates/accounts/settings/ch_info.html:66 msgid "Save" msgstr "Сохранить" -#: accounts_app/templates/accounts/group.html:44 -#: accounts_app/templates/accounts/login.html:55 -#: accounts_app/templates/accounts/profile_chgroup.html:20 -#: accounts_app/templates/accounts/settings/ch_info.html:69 +#: templates/accounts/create_acc.html:90 templates/accounts/login.html:59 +#: templates/accounts/perms/perms_edit.html:64 +#: templates/accounts/profile_chgroup.html:20 +#: templates/accounts/set_abon_groups_permission.html:21 +#: templates/accounts/settings/ch_info.html:69 msgid "Reset" msgstr "Сбросить" -#: accounts_app/templates/accounts/index.html:8 -#: accounts_app/templates/accounts/settings/ch_info.html:37 -msgid "Telephone" -msgstr "Телефон" - -#: accounts_app/templates/accounts/index.html:12 -#: accounts_app/templates/accounts/login.html:35 -#: accounts_app/templates/accounts/settings/ch_info.html:8 -#: accounts_app/templates/accounts/settings/ch_info.html:12 +#: templates/accounts/index.html:13 templates/accounts/login.html:39 +#: templates/accounts/settings/ch_info.html:8 +#: templates/accounts/settings/ch_info.html:12 msgid "User name" msgstr "Логин" -#: accounts_app/templates/accounts/index.html:16 -#: accounts_app/templates/accounts/settings/ch_info.html:18 +#: templates/accounts/index.html:17 templates/accounts/settings/ch_info.html:18 msgid "Name and surname" msgstr "Фамилия и Имя" -#: accounts_app/templates/accounts/index.html:20 +#: templates/accounts/index.html:21 msgid "Is enable" msgstr "Включён-ли" -#: accounts_app/templates/accounts/index.html:24 +#: templates/accounts/index.html:25 msgid "Last login" msgstr "Последняя авторизация" -#: accounts_app/templates/accounts/index.html:29 +#: templates/accounts/index.html:30 msgid "All permissions" msgstr "Административный доступ (все права)" -#: accounts_app/templates/accounts/login.html:5 +#: templates/accounts/login.html:5 msgid "Auth" msgstr "Аутентификация" -#: accounts_app/templates/accounts/login.html:23 -#: accounts_app/templates/accounts/login.html:52 +#: templates/accounts/login.html:27 templates/accounts/login.html:56 msgid "Login" msgstr "Войти" -#: accounts_app/templates/accounts/login.html:43 +#: templates/accounts/login.html:47 msgid "Password" msgstr "Пароль" -#: accounts_app/templates/accounts/profile_chgroup.html:5 -msgid "The responsibility of the administrator of the group of subscribers" -msgstr "Ответственность администратора за группы абонентов" +#: templates/accounts/login.html:70 +msgid "Contact us" +msgstr "Напишите нам" -#: accounts_app/templates/accounts/settings/ch_info.html:27 -msgid "Email" -msgstr "Адрес электронной почты" +#: templates/accounts/perms/objects_of_type.html:9 +#: templates/accounts/perms/objects_types.html:10 +#: templates/accounts/perms/perms_edit.html:10 +msgid "Permission options" +msgstr "Права" -#: accounts_app/templates/accounts/settings/ch_info.html:42 -msgid "+[7,8,9,3] and 10,11 digits" -msgstr "+[7,8,9,3] и 10,11 цифр" +#: templates/accounts/perms/objects_of_type.html:13 +#: templates/accounts/perms/perms_edit.html:16 +msgid "Pick object for edit permissions" +msgstr "Выберите объект для редактирования прав доступа" + +#: templates/accounts/perms/objects_types.html:13 +msgid "Pick the type of object" +msgstr "Выберите тип объекта" + +#: templates/accounts/perms/objects_types.html:21 +msgid "Group" +msgstr "Группа" -#: accounts_app/templates/accounts/settings/ch_info.html:47 +#: templates/accounts/perms/perms_edit.html:24 +msgid "Profile is superuser, permissions to change it makes no sense" +msgstr "" +"Учётная запись является суперпользователем, разрешения менять нет смысла" + +#: templates/accounts/perms/perms_edit.html:30 +msgid "Change permission for that object" +msgstr "Изменение прав доступа для выбранного объекта" + +#: templates/accounts/perms/perms_edit.html:52 +msgid "Not set" +msgstr "Не найдено" + +#: templates/accounts/profile_chgroup.html:5 +msgid "The responsibility of the staff of the group of subscribers" +msgstr "Ответственность работника за группы абонентов" + +#: templates/accounts/set_abon_groups_permission.html:5 +msgid "The list of user groups to which the account has access" +msgstr "Список групп абонентов, к которым учётка имеет доступ" + +#: templates/accounts/settings/ch_info.html:47 msgid "Old password" msgstr "Старый пароль" -#: accounts_app/templates/accounts/settings/ch_info.html:56 +#: templates/accounts/settings/ch_info.html:56 msgid "New password" msgstr "Новый пароль" -#: accounts_app/views.py:42 +#: views.py:45 msgid "Wrong login or password, please try again" msgstr "Неправильный логин или пароль, попробуйте ещё раз" -#: accounts_app/views.py:141 +#: views.py:114 +msgid "Please select an image" +msgstr "Пожалуйста выберите изображение" + +#: views.py:125 +msgid "Avatar successfully changed" +msgstr "Аватар успешно изменён" + +#: views.py:153 msgid "New password is empty, fill it" msgstr "Новый пароль пустой, придумайте себе пароль" -#: accounts_app/views.py:143 +#: views.py:155 msgid "Wrong password" msgstr "Неправильный пароль" -#: accounts_app/views.py:145 +#: views.py:157 msgid "Empty password, fill it" msgstr "Пустой пароль, впишите что-то в пароль" -#: accounts_app/views.py:168 +#: views.py:180 msgid "You forget specify a password for the new account" msgstr "Забыли указать пароль для нового аккаунта" -#: accounts_app/views.py:171 +#: views.py:183 msgid "You forget to repeat a password for the new account" msgstr "Забыли повторить пароль для нового аккаунта" -#: accounts_app/views.py:180 +#: views.py:192 msgid "Subscriber with this name already exist" msgstr "Пользователь с таким именем уже есть" -#: accounts_app/views.py:182 +#: views.py:194 msgid "Passwords does not match, try again" msgstr "Пароли не совпадают, попробуйте ещё раз" -msgid "Administrator" -msgstr "Администратор" - -msgid "Options" -msgstr "Настройки" - -msgid "Not assigned" -msgstr "<Не назначено>" - -msgid "Change self onfo" -msgstr "Изменить инфу о себе" - -msgid "Permission options" -msgstr "Права" - -msgid "Edit" -msgstr "Редактировать" - -msgid "Please select an image" -msgstr "Пожалуйста выберите изображение" - -msgid "Avatar successfully changed" -msgstr "Аватар успешно изменён" - -msgid "Access to groups" -msgstr "Доступ к группам" - -msgid "The list of user groups to which the account has access" -msgstr "Список групп абонентов, к которым учётка имеет доступ" - -msgid "The responsibility of the staff of the group of subscribers" -msgstr "Ответственность работника за группы абонентов" - -msgid "Not set" -msgstr "Не найдено" - -msgid "Change permission for that object" -msgstr "Изменение прав доступа для выбранного объекта" +#: views.py:209 +msgid "Profile has been deleted" +msgstr "Учётная запись удалена" +#: views.py:279 msgid "Permissions has successfully updated" msgstr "Права успешно обновлены" -msgid "Profile is superuser, permissions to change it makes no sense" -msgstr "Учётная запись является суперпользователем, разрешения менять нет смысла" - -msgid "Staff account profile" -msgstr "Учётная запись работника" - -msgid "Staff account profiles" -msgstr "Учётные записи работников" - -msgid "Can view staff profile" -msgstr "Может просматривать учётку сотрудника" - -msgid "Pick object for edit permissions" -msgstr "Выберите объект для редактирования прав доступа" +#~ msgid "The responsibility of the administrator of the group of subscribers" +#~ msgstr "Ответственность администратора за группы абонентов" -msgid "Pick the type of object" -msgstr "Выберите тип объекта" +#~ msgid "Administrator" +#~ msgstr "Администратор" -msgid "Profile has been deleted" -msgstr "Учётная запись удалена" +#~ msgid "Options" +#~ msgstr "Настройки" -msgid "profile username" -msgstr "Логин" - -msgid "fio" -msgstr "ФИО" +#~ msgid "Change self onfo" +#~ msgstr "Изменить инфу о себе" -msgid "birth day" -msgstr "дата рождения" +#~ msgid "Edit" +#~ msgstr "Редактировать" -msgid "Is active" -msgstr "Активен" +#~ msgid "Access to groups" +#~ msgstr "Доступ к группам" diff --git a/accounts_app/templates/accounts/acc_list.html b/accounts_app/templates/accounts/acc_list.html index 7bb82f8..5ee015f 100644 --- a/accounts_app/templates/accounts/acc_list.html +++ b/accounts_app/templates/accounts/acc_list.html @@ -1,23 +1,24 @@ {% extends 'base.html' %} +{% load i18n %} {% block main %} {% include 'message_block.html' %} -

Список аккаунтов администраторов

+

{% trans 'Admin accounts list' %}

- - - - - + + + + + @@ -30,10 +31,20 @@ - - + + {% if usr.id == request.user.id or perms.acc_app.delete_userprofile %} {% else %} @@ -51,7 +62,7 @@ {% empty %} - + {% endfor %} @@ -59,7 +70,7 @@ @@ -69,6 +80,6 @@
ФотоНикФИО (или ник если нет){% trans 'Photo' %}{% trans 'profile username' %}{% trans 'Fullname, or login if name is empty' %}
{{ usr.username }} {{ usr.get_full_name }}
Нет пользователей{% trans 'Users not found' %}
- +
- {% include 'toolbar_page.html' with pag=users %} + {% include 'pagination.html' %} {% endblock %} diff --git a/accounts_app/templates/accounts/create_acc.html b/accounts_app/templates/accounts/create_acc.html index db66c68..9901ca0 100644 --- a/accounts_app/templates/accounts/create_acc.html +++ b/accounts_app/templates/accounts/create_acc.html @@ -3,15 +3,15 @@ {% include 'message_block.html' %}
-

Создайте новый аккаунт

+

{% trans 'Create new account' %}

@@ -28,26 +28,26 @@
{% csrf_token %}
- +
-
- +
-
- +
- +
- +
@@ -75,7 +75,7 @@
- +
@@ -84,10 +84,10 @@
diff --git a/accounts_app/templates/accounts/login.html b/accounts_app/templates/accounts/login.html index 4859768..029d1ac 100644 --- a/accounts_app/templates/accounts/login.html +++ b/accounts_app/templates/accounts/login.html @@ -67,7 +67,7 @@

- Напишите нам is-ttk@ya.ru. + {% trans 'Contact us' %} is-ttk@ya.ru.

diff --git a/accounts_app/templates/accounts/perms/objects_of_type.html b/accounts_app/templates/accounts/perms/objects_of_type.html index e5adbcf..4c7d6df 100644 --- a/accounts_app/templates/accounts/perms/objects_of_type.html +++ b/accounts_app/templates/accounts/perms/objects_of_type.html @@ -29,6 +29,6 @@
- {% include 'toolbar_page.html' with pag=objects %} + {% include 'pagination.html' %} {% endblock %} diff --git a/accounts_app/urls.py b/accounts_app/urls.py index ad6d058..7ae5796 100644 --- a/accounts_app/urls.py +++ b/accounts_app/urls.py @@ -13,7 +13,7 @@ urlpatterns = [ url(r'^me$', views.profile_show, name='profile'), - url(r'^$', views.acc_list, name='accounts_list'), + url(r'^$', views.AccountsListView.as_view(), name='accounts_list'), url(r'^add$', views.create_profile, name='create_profile'), @@ -22,7 +22,7 @@ urlpatterns = [ url(r'^(?P\d+)$', views.profile_show, name='other_profile'), url(r'^(?P\d+)/perms$', views.perms, name='setup_perms'), - url(r'^(?P\d+)/perms/(?P[a-z_]+\.[a-zA-Z_]+)$', views.perms_klasses, name='perms_klasses'), + url(r'^(?P\d+)/perms/(?P[a-z_]+\.[a-zA-Z_]+)$', views.PermissionClassListView.as_view(), name='perms_klasses'), url(r'^(?P\d+)/perms/(?P[a-z_]+\.[a-zA-Z_]+)/(?P\d+)$', views.perms_edit, name='perms_edit'), url(r'^(?P\d+)/chgroup$', views.chgroup, name='profile_setup_group'), url(r'^(?P\d+)/del$', views.delete_profile, name='delete_profile'), diff --git a/accounts_app/views.py b/accounts_app/views.py index a929d03..1b971b0 100644 --- a/accounts_app/views.py +++ b/accounts_app/views.py @@ -5,7 +5,11 @@ from django.core.exceptions import PermissionDenied from django.urls import NoReverseMatch from django.shortcuts import render, redirect, get_object_or_404 from django.contrib import messages +from django.utils.decorators import method_decorator from django.utils.translation import ugettext as _ +from django.views.generic import ListView +from django.conf import settings + from abonapp.models import AbonGroup from photo_app.models import Photo @@ -15,6 +19,11 @@ from guardian.decorators import permission_required_or_403 as permission_require from guardian.shortcuts import get_objects_for_user, assign_perm, remove_perm +class BaseAccListView(ListView): + http_method_names = ['get'] + paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) + + @login_required @mydefs.only_admins def home(request): @@ -208,15 +217,15 @@ def delete_profile(request, uid): return redirect('acc_app:accounts_list') -@login_required -@mydefs.only_admins -def acc_list(request): - users = UserProfile.objects.filter(is_admin=True).exclude(pk=request.user.pk) - users = get_objects_for_user(request.user, 'accounts_app.can_view_userprofile', users) - users = mydefs.pag_mn(request, users) - return render(request, 'accounts/acc_list.html', { - 'users': users - }) +@method_decorator([login_required, mydefs.only_admins], name='dispatch') +class AccountsListView(BaseAccListView): + template_name = 'accounts/acc_list.html' + context_object_name = 'users' + + def get_queryset(self): + users = UserProfile.objects.filter(is_admin=True).exclude(pk=self.request.user.pk) + users = get_objects_for_user(self.request.user, 'accounts_app.can_view_userprofile', users) + return users @login_required @@ -235,24 +244,32 @@ def perms(request, uid): }) -@login_required -def perms_klasses(request, uid, klass_name): - if not request.user.is_superuser: - raise PermissionDenied - from django.apps import apps - userprofile = get_object_or_404(UserProfile, pk=uid) - app_label, model_name = klass_name.split('.', 1) - klass = apps.get_model(app_label, model_name) +@method_decorator(login_required, name='dispatch') +class PermissionClassListView(BaseAccListView): + template_name = 'accounts/perms/objects_of_type.html' + context_object_name = 'objects' - objects = klass.objects.all() - objects = mydefs.pag_mn(request, objects) + def get(self, request, *args, **kwargs): + if not request.user.is_superuser: + raise PermissionDenied + return super(PermissionClassListView, self).get(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(PermissionClassListView, self).get_context_data(**kwargs) + context['klass'] = self.kwargs.get('klass_name') + context['klass_name'] = self.required_klass_name._meta.verbose_name + context['userprofile'] = get_object_or_404(UserProfile, pk=self.kwargs.get('uid')) + return context + + def get_queryset(self): + from django.apps import apps + klass_name = self.kwargs.get('klass_name') + app_label, model_name = klass_name.split('.', 1) + klass = apps.get_model(app_label, model_name) + objects = klass.objects.all() + self.required_klass_name = klass + return objects - return render(request, 'accounts/perms/objects_of_type.html', { - 'userprofile': userprofile, - 'klass': klass_name, - 'klass_name': klass._meta.verbose_name, - 'objects': objects - }) @login_required def perms_edit(request, uid, klass_name, obj_id): diff --git a/clientsideapp/views.py b/clientsideapp/views.py index a66e35c..212517f 100644 --- a/clientsideapp/views.py +++ b/clientsideapp/views.py @@ -8,7 +8,7 @@ from django.utils.translation import gettext_lazy as _ from abonapp.models import AbonLog, InvoiceForPayment, Abon from tariff_app.models import Tariff -from mydefs import pag_mn, LogicError +from mydefs import LogicError from agent import NasFailedResult, NasNetworkError @@ -20,7 +20,6 @@ def home(request): @login_required def pays(request): pay_history = AbonLog.objects.filter(abon=request.user).order_by('-id') - pay_history = pag_mn(request, pay_history) return render(request, 'clientsideapp/pays.html', { 'pay_history': pay_history }) diff --git a/devapp/templates/devapp/devices_null_group.html b/devapp/templates/devapp/devices_null_group.html index 816bcbe..bdfa539 100644 --- a/devapp/templates/devapp/devices_null_group.html +++ b/devapp/templates/devapp/devices_null_group.html @@ -16,19 +16,19 @@ - + {% trans 'Ip address' %} {% if order_by == 'ip_address' %}{% endif %} - + {% trans 'Comment' %} {% if order_by == 'comment' %}{% endif %} - + {% trans 'Device type' %} {% if order_by == 'devtype' %}{% endif %} @@ -78,6 +78,6 @@
- {% include 'toolbar_page.html' with pag=devices %} + {% include 'pagination.html' %} {% endblock %} \ No newline at end of file diff --git a/devapp/templates/devapp/group_list.html b/devapp/templates/devapp/group_list.html index de193b2..3b7448d 100644 --- a/devapp/templates/devapp/group_list.html +++ b/devapp/templates/devapp/group_list.html @@ -46,6 +46,6 @@
- {% include 'toolbar_page.html' with pag=groups %} + {% include 'pagination.html' %} {% endblock %} diff --git a/devapp/urls.py b/devapp/urls.py index e7983a7..af836d4 100644 --- a/devapp/urls.py +++ b/devapp/urls.py @@ -4,8 +4,8 @@ from . import views app_name = 'devapp' urlpatterns = [ - url(r'^$', views.group_list, name='group_list'), - url(r'^devices_without_groups$', views.devices_null_group, name='devices_null_group'), + url(r'^$', views.GroupsListView.as_view(), name='group_list'), + url(r'^devices_without_groups$', views.DevicesWithoutGroupsListView.as_view(), name='devices_null_group'), url(r'^fix_onu/$', views.fix_onu, name='fix_onu'), url(r'^(?P\d+)$', views.DevicesListView.as_view(), name='devs'), url(r'^(?P\d+)/add$', views.dev, name='add'), diff --git a/devapp/views.py b/devapp/views.py index 7d1b6d2..f932d9d 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -13,7 +13,7 @@ from django.utils.translation import gettext_lazy as _, gettext from easysnmp import EasySNMPTimeoutError, EasySNMPError from django.views.generic import ListView, DetailView -from mydefs import pag_mn, res_success, res_error, only_admins, ping, order_helper, ip_addr_regex +from mydefs import res_success, res_error, only_admins, ping, ip_addr_regex from abonapp.models import AbonGroup, Abon from django.conf import settings from guardian.decorators import permission_required_or_403 as permission_required @@ -30,12 +30,15 @@ from mydefs import safe_int PAGINATION_ITEMS_PER_PAGE = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) +class BaseDeviceListView(ListView): + http_method_names = ['get'] + paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) + + @method_decorator([login_required, only_admins], name='dispatch') -class DevicesListView(ListView, OrderingMixin): +class DevicesListView(BaseDeviceListView, OrderingMixin): context_object_name = 'devices' template_name = 'devapp/devices.html' - paginate_by = PAGINATION_ITEMS_PER_PAGE - http_method_names = ['get'] def get_queryset(self): group_id = safe_int(self.kwargs.get('group_id')) @@ -59,22 +62,11 @@ class DevicesListView(ListView, OrderingMixin): return response -@login_required -@only_admins -def devices_null_group(request): - devs = Device.objects.filter(user_group=None).only('comment', 'devtype', 'user_group', 'pk', 'ip_address') - - dr, field = order_helper(request) - if field: - devs = devs.order_by(field) - - devs = pag_mn(request, devs) - - return render(request, 'devapp/devices_null_group.html', { - 'devices': devs, - 'dir': dr, - 'order_by': request.GET.get('order_by') - }) +@method_decorator([login_required, only_admins], name='dispatch') +class DevicesWithoutGroupsListView(BaseDeviceListView, OrderingMixin): + context_object_name = 'devices' + template_name = 'devapp/devices_null_group.html' + queryset = Device.objects.filter(user_group=None).only('comment', 'devtype', 'user_group', 'pk', 'ip_address') @login_required @@ -412,14 +404,17 @@ def toggle_port(request, device_id, portid, status=0): return redirect('devapp:view', dev.user_group.pk if dev.user_group is not None else 0, device_id) -@login_required -@only_admins -def group_list(request): - groups = AbonGroup.objects.all().order_by('title') - groups = get_objects_for_user(request.user, 'abonapp.can_view_abongroup', klass=groups, accept_global_perms=False) - return render(request, 'devapp/group_list.html', { - 'groups': groups - }) +@method_decorator([login_required, only_admins], name='dispatch') +class GroupsListView(BaseDeviceListView): + context_object_name = 'groups' + template_name = 'devapp/group_list.html' + model = AbonGroup + + def get_queryset(self): + groups = super(GroupsListView, self).get_queryset() + groups = get_objects_for_user(self.request.user, 'abonapp.can_view_abongroup', klass=groups, + accept_global_perms=False) + return groups @login_required diff --git a/djing/urls.py b/djing/urls.py index 4846a4c..bc1a3f0 100644 --- a/djing/urls.py +++ b/djing/urls.py @@ -1,5 +1,5 @@ from django.conf.urls import url, include -# from django.conf import settings +from django.conf import settings from django.contrib import admin from .views import home @@ -21,11 +21,9 @@ urlpatterns = [ ] -# if settings.DEBUG: -# from django.conf.urls.static import static -# from django.contrib.staticfiles.urls import staticfiles_urlpatterns -# from django.contrib import admin +if settings.DEBUG: + from django.conf.urls.static import static + from django.contrib.staticfiles.urls import staticfiles_urlpatterns -# urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -# urlpatterns += staticfiles_urlpatterns() -# urlpatterns += [url(r'^admin/', admin.site.urls)] + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + urlpatterns += staticfiles_urlpatterns() diff --git a/msg_app/templates/msg_app/conversations.html b/msg_app/templates/msg_app/conversations.html index b39e2e0..de0331b 100644 --- a/msg_app/templates/msg_app/conversations.html +++ b/msg_app/templates/msg_app/conversations.html @@ -57,6 +57,6 @@
- {% include 'toolbar_page.html' with pag=conversations %} + {% include 'pagination.html' %} {% endblock %} diff --git a/msg_app/urls.py b/msg_app/urls.py index 21a320c..e5e037a 100644 --- a/msg_app/urls.py +++ b/msg_app/urls.py @@ -6,7 +6,7 @@ app_name = 'msg_app' urlpatterns = [ - url(r'^$', views.home, name='home'), + url(r'^$', views.ConversationsListView.as_view(), name='home'), url(r'^new$', views.new_conversation, name='new_conversation'), url(r'^(?P\d+)/$', views.to_conversation, name='to_conversation'), url(r'^(?P\d+)/(?P\d+)/del$', views.remove_msg, name='remove_msg'), diff --git a/msg_app/views.py b/msg_app/views.py index 431dddb..406e54b 100644 --- a/msg_app/views.py +++ b/msg_app/views.py @@ -3,24 +3,26 @@ from django.contrib.auth.decorators import login_required from django.contrib.gis.shortcuts import render_to_text from django.core.exceptions import PermissionDenied from django.http import HttpResponse +from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _ from django.contrib import messages from django.shortcuts import render, redirect, get_object_or_404 +from django.views.generic import ListView + from chatbot.models import MessageQueue -from mydefs import pag_mn from .models import Conversation, MessageError, Message from .forms import ConversationForm, MessageForm -@login_required -def home(request): - # TODO: optimise queries - conversations = Conversation.objects.fetch(request.user) - conversations = pag_mn(request, conversations, 8) - return render(request, 'msg_app/conversations.html', { - 'conversations': conversations - }) +@method_decorator(login_required, name='dispatch') +class ConversationsListView(ListView): + context_object_name = 'conversations' + template_name = 'msg_app/conversations.html' + + def get_queryset(self): + # TODO: optimise queries + return Conversation.objects.fetch(self.request.user) @login_required @@ -90,4 +92,3 @@ def check_news(request): else: r = {'auth': False} return HttpResponse(dumps(r)) - diff --git a/mydefs.py b/mydefs.py index 1e0fcba..49b6020 100644 --- a/mydefs.py +++ b/mydefs.py @@ -8,15 +8,16 @@ import os from functools import wraps from django.http import HttpResponse, Http404, HttpResponseRedirect from django.shortcuts import redirect -from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from django.db import models from django.conf import settings - PAGINATION_ITEMS_PER_PAGE = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) DEBUG = getattr(settings, 'DEBUG', False) -ip_addr_regex = r'^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' +ip_addr_regex = r'^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \ + r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \ + r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \ + r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' def ip2int(addr): @@ -61,19 +62,6 @@ def res_error(request, text): raise Http404(text) -# Pagination -def pag_mn(request, objs, count_per_page=PAGINATION_ITEMS_PER_PAGE): - page = request.GET.get('p') - pgn = Paginator(objs, count_per_page) - try: - objs = pgn.page(page) - except PageNotAnInteger: - objs = pgn.page(1) - except EmptyPage: - objs = pgn.page(pgn.num_pages) - return objs - - class MyGenericIPAddressField(models.GenericIPAddressField): description = "Int32 notation ip address" @@ -124,26 +112,6 @@ class MyChoicesAdapter(Iterator): return res -# Для сортировки таблиц -# через get должно быть передано order_by=<поле в бд> а в dir= направление сортировки -# возвращает новое направление сортировки и поле для сортировки с направлением -def order_helper(request): - print('DEPRECATION: use global_base_views.OrderingMixin') - dr = request.GET.get('dir') - dfx = '' - if dr == 'down': - dr = 'up' - dfx = '-' - else: - dr = 'down' - - orby = request.GET.get('order_by') - if orby: - return dr, dfx + orby - else: - return dr, orby - - # Декоратор проверяет аккаунт, чтоб не пускать клиентов в страницы администрации def only_admins(fn): @wraps(fn) @@ -163,7 +131,6 @@ def ping(hostname, count=1): # Русифицированный вывод timedelta class RuTimedelta(timedelta): - def __new__(cls, tm): if isinstance(tm, timedelta): return timedelta.__new__( @@ -174,19 +141,19 @@ class RuTimedelta(timedelta): ) def __str__(self): - #hours, remainder = divmod(self.seconds, 3600) - #minutes, seconds = divmod(remainder, 60) - #text_date = "%d:%d" % ( + # hours, remainder = divmod(self.seconds, 3600) + # minutes, seconds = divmod(remainder, 60) + # text_date = "%d:%d" % ( # hours, # minutes - #) + # ) if self.days > 1: ru_days = 'дней' if 5 > self.days > 1: ru_days = 'дня' elif self.days == 1: ru_days = 'день' - #text_date = '%d %s %s' % (self.days, ru_days, text_date) + # text_date = '%d %s %s' % (self.days, ru_days, text_date) text_date = '%d %s' % (self.days, ru_days) else: text_date = '' @@ -199,17 +166,18 @@ def require_ssl(view): the page. from: https://gist.github.com/ckinsey/9709984 """ + @wraps(view) def wrapper(request, *args, **kwargs): if not DEBUG and not request.is_secure(): target_url = "https://" + request.META['HTTP_HOST'] + request.path_info 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 @@ -222,8 +190,10 @@ class LogicError(Exception): def singleton(class_): instances = {} + def getinstance(*args, **kwargs): if class_ not in instances: instances[class_] = class_(*args, **kwargs) return instances[class_] + return getinstance diff --git a/tariff_app/locale/ru/LC_MESSAGES/django.po b/tariff_app/locale/ru/LC_MESSAGES/django.po index 3f3b442..b10fbe9 100644 --- a/tariff_app/locale/ru/LC_MESSAGES/django.po +++ b/tariff_app/locale/ru/LC_MESSAGES/django.po @@ -132,3 +132,8 @@ msgstr "Пробная логика" msgid "Add new periodic pay" msgstr "Добавить периодический платёж" +msgid "Service" +msgstr "Услуга" + +msgid "Services" +magstr "Услуги" diff --git a/tariff_app/migrations/0007_auto_20180215_1423.py b/tariff_app/migrations/0007_auto_20180215_1423.py new file mode 100644 index 0000000..5be9de2 --- /dev/null +++ b/tariff_app/migrations/0007_auto_20180215_1423.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-02-15 14:23 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('tariff_app', '0006_auto_20180122_1732'), + ] + + operations = [ + migrations.AlterModelOptions( + name='tariff', + options={'ordering': ['title'], 'verbose_name': 'Service', 'verbose_name_plural': 'Services'}, + ), + migrations.AlterModelTable( + name='tariff', + table='tariffs', + ), + ] diff --git a/tariff_app/models.py b/tariff_app/models.py index 6173277..1e6aac6 100644 --- a/tariff_app/models.py +++ b/tariff_app/models.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from datetime import datetime from django.db import models, IntegrityError from django.utils.translation import gettext_lazy as _ @@ -19,8 +18,11 @@ class Tariff(models.Model): choices=MyChoicesAdapter(TARIFF_CHOICES)) is_admin = models.BooleanField(_('Tech service'), default=False) - # Возвращает потомок класса TariffBase, методы которого дают нужную логику оплаты по тарифу def get_calc_type(self): + """ + :return: Child of tariff_app.base_intr.TariffBase, + methods which provide the desired logic of payments + """ calc_code = self.calc_type for choice_pair in TARIFF_CHOICES: choice_code, logic_class = choice_pair @@ -37,6 +39,12 @@ class Tariff(models.Model): def __str__(self): return "%s (%.2f)" % (self.title, self.amount) + class Meta: + db_table = 'tariffs' + ordering = ['title'] + verbose_name = _('Service') + verbose_name_plural = _('Services') + class PeriodicPay(models.Model): name = models.CharField(_('Periodic pay name'), max_length=64) diff --git a/tariff_app/templates/tariff_app/periodic_pays/list.html b/tariff_app/templates/tariff_app/periodic_pays/list.html index 6bcac38..e9df0f7 100644 --- a/tariff_app/templates/tariff_app/periodic_pays/list.html +++ b/tariff_app/templates/tariff_app/periodic_pays/list.html @@ -57,6 +57,6 @@ - {% include 'toolbar_page.html' with pag=pays %} + {% include 'pagination.html' %} {% endblock %} diff --git a/tariff_app/templates/tariff_app/tarifs.html b/tariff_app/templates/tariff_app/tarifs.html index 7361a14..db15e85 100644 --- a/tariff_app/templates/tariff_app/tarifs.html +++ b/tariff_app/templates/tariff_app/tarifs.html @@ -7,25 +7,25 @@ - + {% trans 'tariff' %} {% if order_by == 'title' %}{% endif %} - + {% trans 'Speed In' %} {% if order_by == 'speedIn' %}{% endif %} - + {% trans 'Speed Out' %} {% if order_by == 'speedOut' %}{% endif %} - + {% trans 'Price' %} {% if order_by == 'amount' %}{% endif %} @@ -59,7 +59,7 @@ {% empty %} - {% trans 'Услуги пока не существуют' %}. + {% trans 'Services does not exist yet' %}. {% if perms.tariff_app.add_tariff %} {% trans 'Create' %} {% endif %} @@ -84,6 +84,6 @@ - {% include 'toolbar_page.html' with pag=tariflist %} + {% include 'pagination.html' %} {% endblock %} diff --git a/tariff_app/urls.py b/tariff_app/urls.py index 947b831..1548b9e 100644 --- a/tariff_app/urls.py +++ b/tariff_app/urls.py @@ -5,12 +5,12 @@ from . import views app_name = 'tariff_app' urlpatterns = [ - url(r'^$', views.tarifs, name='home'), + url(r'^$', views.TariffsListView.as_view(), name='home'), url(r'^(?P\d+)$', views.edit_tarif, name='edit'), url(r'^add$', views.edit_tarif, name='add'), url(r'^del(?P\d+)$', views.del_tarif, name='del'), - url(r'^periodic_pays$', views.periodic_pays, name='periodic_pays'), + url(r'^periodic_pays$', views.PeriodicPaysListView.as_view(), name='periodic_pays'), url(r'^periodic_pays/add$', views.periodic_pay, name='periodic_pay_add'), url(r'^periodic_pays/(?P\d+)$', views.periodic_pay, name='periodic_pay_edit') ] diff --git a/tariff_app/views.py b/tariff_app/views.py index 6dc56e4..1e51fee 100644 --- a/tariff_app/views.py +++ b/tariff_app/views.py @@ -1,34 +1,34 @@ # -*- coding: utf-8 -*- from django.contrib.auth.decorators import login_required from django.contrib.gis.shortcuts import render_to_text +from django.utils.decorators import method_decorator from django.utils.translation import ugettext as _ from django.shortcuts import render, get_object_or_404, redirect from django.contrib import messages from django.core.exceptions import PermissionDenied +from django.views.generic import ListView +from django.conf import settings from guardian.decorators import permission_required_or_403 as permission_required +from djing.global_base_views import OrderingMixin from .models import Tariff, PeriodicPay import mydefs from . import forms -@login_required -@mydefs.only_admins -def tarifs(request): - tars = Tariff.objects.order_by('title') - - # фильтр - direct, field = mydefs.order_helper(request) - if field: - tars = tars.order_by(field) +class BaseServiceListView(ListView): + http_method_names = ['get'] + paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) - tars = mydefs.pag_mn(request, tars) - return render(request, 'tariff_app/tarifs.html', { - 'tariflist': tars, - 'dir': direct, - 'order_by': request.GET.get('order_by') - }) +@method_decorator([login_required, mydefs.only_admins], name='dispatch') +class TariffsListView(BaseServiceListView, OrderingMixin): + """ + Show Services(Tariffs) list + """ + template_name = 'tariff_app/tarifs.html' + context_object_name = 'tariflist' + model = Tariff @login_required @@ -74,14 +74,12 @@ def del_tarif(request, tid): return render_to_text('tariff_app/modal_del_warning.html', {'tid': tid}, request=request) -@login_required -@permission_required('tariff_app.can_view_periodic_pay') -def periodic_pays(request): - pays = PeriodicPay.objects.all() - pays = mydefs.pag_mn(request, pays) - return render(request, 'tariff_app/periodic_pays/list.html', { - 'pays': pays - }) +@method_decorator(login_required, name='dispatch') +@method_decorator(permission_required('tariff_app.can_view_periodic_pay'), name='dispatch') +class PeriodicPaysListView(BaseServiceListView): + context_object_name = 'pays' + model = PeriodicPay + template_name = 'tariff_app/periodic_pays/list.html' @login_required diff --git a/templates/toolbar_page.html b/templates/toolbar_page.html deleted file mode 100644 index 58f6d33..0000000 --- a/templates/toolbar_page.html +++ /dev/null @@ -1,26 +0,0 @@ -{% if pag.paginator.num_pages > 1 %} -{% load dpagination %} -
-
- -
-
-{% endif %}