From 3ab48e8a19f54b81590dadbd53a5fae7976a1eb6 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 7 Feb 2018 22:47:53 +0300 Subject: [PATCH] Refactoring abonapp.views.peoples from function view to ClassBasedView --- abonapp/templates/abonapp/peoples.html | 2 +- abonapp/urls_abon.py | 2 +- abonapp/views.py | 84 ++++++++++++++------------ docs/install.md | 2 +- 4 files changed, 49 insertions(+), 41 deletions(-) diff --git a/abonapp/templates/abonapp/peoples.html b/abonapp/templates/abonapp/peoples.html index 7b68bf5..0632827 100644 --- a/abonapp/templates/abonapp/peoples.html +++ b/abonapp/templates/abonapp/peoples.html @@ -167,6 +167,6 @@ -{% include 'toolbar_page.html' with pag=peoples %} + {% include 'toolbar_page_cbv.html' %} {% endblock %} diff --git a/abonapp/urls_abon.py b/abonapp/urls_abon.py index 13cf863..755b33f 100644 --- a/abonapp/urls_abon.py +++ b/abonapp/urls_abon.py @@ -3,7 +3,7 @@ from . import views urlpatterns = [ - url(r'^$', views.peoples, name='people_list'), + url(r'^$', views.PeoplesListView.as_view(), name='people_list'), url(r'^addabon$', views.addabon, name='add_abon'), url(r'^services$', views.chgroup_tariff, name='ch_group_tariff'), url(r'^phonebook$', views.phonebook, name='phonebook'), diff --git a/abonapp/views.py b/abonapp/views.py index 31559e9..65b68b4 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -2,14 +2,16 @@ from json import dumps from django.contrib.gis.shortcuts import render_to_text from django.core.exceptions import PermissionDenied -from django.db import IntegrityError, ProgrammingError +from django.db import IntegrityError, ProgrammingError, transaction from django.db.models import Count, Q, signals -from django.db import transaction from django.shortcuts import render, redirect, get_object_or_404, resolve_url from django.contrib.auth.decorators import login_required -from django.http import HttpResponse +from django.http import HttpResponse, HttpResponseBadRequest from django.contrib import messages from django.utils.translation import gettext_lazy as _ +from django.utils.decorators import method_decorator +from django.views.generic import ListView +from django.conf import settings from statistics.models import StatCache from tariff_app.models import Tariff @@ -24,48 +26,54 @@ from dialing_app.models import AsteriskCDR from statistics.models import getModel from guardian.shortcuts import get_objects_for_user, assign_perm from guardian.decorators import permission_required_or_403 as permission_required +from djing.global_base_views import OrderingMixin -@login_required -@mydefs.only_admins -def peoples(request, gid): - abon_group = get_object_or_404(models.AbonGroup, pk=gid) - if not request.user.has_perm('abonapp.can_view_abongroup', abon_group): - raise PermissionDenied - street_id = mydefs.safe_int(request.GET.get('street')) - peoples_list = models.Abon.objects.select_related('group', 'street') - if street_id > 0: - peoples_list = peoples_list.filter(group=abon_group, street=street_id) - else: - peoples_list = peoples_list.filter(group=abon_group) +PAGINATION_ITEMS_PER_PAGE = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) - # фильтр - dr, field = mydefs.order_helper(request) - if field: - peoples_list = peoples_list.order_by(field) - try: - peoples_list = mydefs.pag_mn(request, peoples_list) - for abon in peoples_list: - if abon.ip_address is not None: - try: - abon.stat_cache = StatCache.objects.get(ip=abon.ip_address) - except StatCache.DoesNotExist: - pass +@method_decorator([login_required, mydefs.only_admins], name='dispatch') +class PeoplesListView(ListView, OrderingMixin): + context_object_name = 'peoples' + template_name = 'abonapp/peoples.html' + paginate_by = PAGINATION_ITEMS_PER_PAGE + http_method_names = ['get'] - except mydefs.LogicError as e: - messages.warning(request, e) + def get_queryset(self): + street_id = mydefs.safe_int(self.request.GET.get('street')) + gid = mydefs.safe_int(self.kwargs.get('gid')) + peoples_list = models.Abon.objects.select_related('group', 'street') + if street_id > 0: + peoples_list = peoples_list.filter(group__pk=gid, street=street_id) + else: + peoples_list = peoples_list.filter(group__pk=gid) + + try: + for abon in peoples_list: + if abon.ip_address is not None: + try: + abon.stat_cache = StatCache.objects.get(ip=abon.ip_address) + except StatCache.DoesNotExist: + pass + except mydefs.LogicError as e: + messages.warning(self.request, e) + + return peoples_list + + def get_context_data(self, **kwargs): + gid = mydefs.safe_int(self.kwargs.get('gid')) + if gid == 0: + return HttpResponseBadRequest('group id is broken') + abon_group = get_object_or_404(models.AbonGroup, pk=gid) + if not self.request.user.has_perm('abonapp.can_view_abongroup', abon_group): + raise PermissionDenied - streets = models.AbonStreet.objects.filter(group=gid) + context = super(PeoplesListView, self).get_context_data(**kwargs) - return render(request, 'abonapp/peoples.html', { - 'peoples': peoples_list, - 'abon_group': get_object_or_404(models.AbonGroup, pk=gid), - 'streets': streets, - 'street_id': street_id, - 'dir': dr, - 'order_by': request.GET.get('order_by') - }) + context['streets'] = models.AbonStreet.objects.filter(group=gid) + context['street_id'] = mydefs.safe_int(self.request.GET.get('street')) + context['abon_group'] = abon_group + return context @login_required diff --git a/docs/install.md b/docs/install.md index 1194e9d..29fc7ef 100644 --- a/docs/install.md +++ b/docs/install.md @@ -12,7 +12,7 @@ Затем установим зависимости ``` -# dnf -y install python3 python3-devel python3-pip python3-pillow mariadb mariadb-devel uwsgi nginx uwsgi-plugin-python3 redis net-snmp net-snmp-libs net-snmp-utils net-snmp-devel net-snmp-python git redhat-rpm-config +# dnf -y install python3 python3-devel python3-pip python3-pillow mariadb mariadb-devel uwsgi nginx uwsgi-plugin-python3 net-snmp net-snmp-libs net-snmp-utils net-snmp-devel net-snmp-python git redhat-rpm-config ``` Лучше чтоб версия python по умолчанию была третья: