diff --git a/abonapp/locale/ru/LC_MESSAGES/django.po b/abonapp/locale/ru/LC_MESSAGES/django.po
index 3b79bff..35431f2 100644
--- a/abonapp/locale/ru/LC_MESSAGES/django.po
+++ b/abonapp/locale/ru/LC_MESSAGES/django.po
@@ -1184,3 +1184,7 @@ msgstr "Инфо."
msgid "Dialing"
msgstr "Звонки"
+
+msgid "Multiple users on the same device port"
+msgstr "Несколько абонентов на одном и том же порту устройства"
+
diff --git a/abonapp/templates/abonapp/group_list.html b/abonapp/templates/abonapp/group_list.html
index ccf7721..761efec 100644
--- a/abonapp/templates/abonapp/group_list.html
+++ b/abonapp/templates/abonapp/group_list.html
@@ -2,7 +2,6 @@
{% load i18n %}
{% block main %}
-
- {% trans 'User groups' %}
@@ -18,7 +17,7 @@
| # |
-
+
{% trans 'Group title' %}
{% if order_by == 'title' %}{% endif %}
@@ -84,6 +83,6 @@
- {% include 'toolbar_page.html' with pag=groups %}
+ {% include 'toolbar_page_cbv.html' %}
{% endblock %}
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.py b/abonapp/urls.py
index f0da48a..5f3f9f4 100644
--- a/abonapp/urls.py
+++ b/abonapp/urls.py
@@ -7,7 +7,7 @@ app_name = 'abonapp'
urlpatterns = [
- url(r'^$', views.grouplist, name='group_list'),
+ url(r'^$', views.GroupListView.as_view(), name='group_list'),
url(r'^addgroup$', views.addgroup, name='add_group'),
url(r'^delgroup', views.delgroup, name='del_group'),
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 ec18a38..b651e57 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,57 @@ 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 BaseAbonListView(ListView, OrderingMixin):
+ paginate_by = PAGINATION_ITEMS_PER_PAGE
+ http_method_names = ['get']
- except mydefs.LogicError as e:
- messages.warning(request, e)
- streets = models.AbonStreet.objects.filter(group=gid)
+class PeoplesListView(BaseAbonListView):
+ context_object_name = 'peoples'
+ template_name = 'abonapp/peoples.html'
- 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')
- })
+ 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
+
+ context = super(PeoplesListView, self).get_context_data(**kwargs)
+
+ 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
@@ -94,24 +105,16 @@ def addgroup(request):
})
-@login_required
-@mydefs.only_admins
-def grouplist(request):
- groups = models.AbonGroup.objects.annotate(usercount=Count('abon')).order_by('title')
- groups = get_objects_for_user(request.user, 'abonapp.can_view_abongroup', klass=groups, accept_global_perms=False)
-
- # фильтр
- directory, field = mydefs.order_helper(request)
- if field:
- groups = groups.order_by(field)
+class GroupListView(BaseAbonListView):
+ context_object_name = 'groups'
+ template_name = 'abonapp/group_list.html'
+ queryset = models.AbonGroup.objects.annotate(usercount=Count('abon')).order_by('title')
- groups = mydefs.pag_mn(request, groups)
-
- return render(request, 'abonapp/group_list.html', {
- 'groups': groups,
- 'dir': directory,
- 'order_by': request.GET.get('order_by')
- })
+ def get_queryset(self):
+ queryset = super(GroupListView, self).get_queryset()
+ queryset = get_objects_for_user(self.request.user, 'abonapp.can_view_abongroup', klass=queryset,
+ accept_global_perms=False)
+ return queryset
@login_required
@@ -774,6 +777,9 @@ def save_user_dev_port(request, gid, uid):
return redirect('abonapp:abon_home', gid, uid)
except models.Abon.DoesNotExist:
pass
+ except models.Abon.MultipleObjectsReturned:
+ messages.error(request, _('Multiple users on the same device port'))
+ return redirect('devapp:manage_ports', abon.device.user_group.pk, abon.device.pk)
abon.dev_port = port
if abon.is_dynamic_ip != is_dynamic_ip:
diff --git a/devapp/templates/devapp/manage_ports/list.html b/devapp/templates/devapp/manage_ports/list.html
index 26b4089..5f59abd 100644
--- a/devapp/templates/devapp/manage_ports/list.html
+++ b/devapp/templates/devapp/manage_ports/list.html
@@ -22,7 +22,7 @@
| {{ port.num }} |
{{ port.descr }} |
{% if port.num_abons > 1 %}
- {% url 'devapp:fix_port_confict' dev.user_group.id dev.id port.id as fixurl %}
+ {% url 'devapp:fix_port_conflict' dev.user_group.id dev.id port.id as fixurl %}
{{ port.num_abons }}. {% blocktrans with furl=fixurl %}Port should not have more than one subscriber, fix that{% endblocktrans %} |
{% else %}
{{ port.num_abons }} |
diff --git a/devapp/urls.py b/devapp/urls.py
index efa5c1c..0667701 100644
--- a/devapp/urls.py
+++ b/devapp/urls.py
@@ -16,7 +16,7 @@ urlpatterns = [
url(r'^(?P\d+)/(?P\d+)/add$', views.add_single_port, name='add_port'),
url(r'^(?P\d+)/(?P\d+)/edit$', views.dev, name='edit'),
url(r'^(\d+)/(?P\d+)/ports$', views.manage_ports, name='manage_ports'),
- url(r'^(?P\d+)/(?P\d+)/ports/(?P\d+)/fix_port_confict$', views.fix_port_confict, name='fix_port_confict'),
+ url(r'^(?P\d+)/(?P\d+)/ports/(?P\d+)/fix_port_conflict$', views.fix_port_conflict, name='fix_port_conflict'),
url(r'^(\d+)/(?P\d+)/ports_add', views.add_ports, name='add_ports'),
url(r'^(\d+)/(?P\d+)/(?P\d+)_(?P[0-1]{1})$', views.toggle_port, name='port_toggle'),
url(r'^(?P\d+)/(?P\d+)/(?P\d+)/del$', views.delete_single_port, name='del_port'),
diff --git a/devapp/views.py b/devapp/views.py
index 08bf2f1..63995da 100644
--- a/devapp/views.py
+++ b/devapp/views.py
@@ -457,6 +457,8 @@ def fix_onu(request):
if parent is not None:
manobj = parent.get_manager_object()
ports = manobj.get_list_keyval('.1.3.6.1.4.1.3320.101.10.1.1.3')
+ text = ' %s' %\
+ (_('Device with mac address %(mac)s does not exist') % {'mac': mac})
for srcmac, snmpnum in ports:
real_mac = ':'.join(['%x' % ord(i) for i in srcmac])
if mac == real_mac:
@@ -465,10 +467,8 @@ def fix_onu(request):
status = 0
text = ' %s' % _('Fixed')
break
- text = ' %s' %\
- (_('Device with mac address %(mac)s does not exist') % {'mac': mac})
else:
- text = text + ' %s' % _('Parent device not found')
+ text = text + '\n%s' % _('Parent device not found')
except Device.DoesNotExist:
pass
return JsonResponse({
@@ -478,7 +478,7 @@ def fix_onu(request):
@login_required
-def fix_port_confict(request, group_id, device_id, port_id):
+def fix_port_conflict(request, group_id, device_id, port_id):
user_group = get_object_or_404(AbonGroup, pk=group_id)
device = get_object_or_404(Device, pk=device_id)
port = get_object_or_404(Port, pk=port_id)
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 по умолчанию была третья: