From ccc1db65e9327a1b00c126d7190e0e31608fa037 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 5 Jul 2017 13:51:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20?= =?UTF-8?q?=D1=81=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8.=20=D0=98=D1=85=20=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=B1=D1=83=D0=B4=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=B2=D1=8F=D0=B7=D0=B0=D1=82=D1=8C=20=D0=B0=D0=B1=D0=BE=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D1=83,=20=D0=B8=20=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=B7=D0=BE=D0=B2=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D1=87?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B7=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/base_intr.py | 10 + devapp/dev_types.py | 58 ++++- devapp/forms.py | 37 +++- devapp/locale/ru/LC_MESSAGES/django.po | 55 ++++- devapp/templates/devapp/add_dev.html | 14 +- .../devapp/{ => custom_dev_page}/olt.html | 15 +- .../templates/devapp/custom_dev_page/onu.html | 33 +++ .../devapp/{ => custom_dev_page}/ports.html | 5 +- devapp/templates/devapp/dev.html | 9 + devapp/templates/devapp/devices.html | 20 +- .../templates/devapp/devices_null_group.html | 4 +- devapp/templates/devapp/ext.htm | 11 +- .../devapp/manage_ports/add_ports.html | 89 ++++++++ .../templates/devapp/manage_ports/list.html | 60 +++++ .../manage_ports/modal_add_edit_port.html | 37 ++++ .../devapp/manage_ports/modal_del_port.html | 18 ++ devapp/urls.py | 11 +- devapp/views.py | 205 +++++++++++++++++- 18 files changed, 646 insertions(+), 45 deletions(-) rename devapp/templates/devapp/{ => custom_dev_page}/olt.html (68%) create mode 100644 devapp/templates/devapp/custom_dev_page/onu.html rename devapp/templates/devapp/{ => custom_dev_page}/ports.html (96%) create mode 100644 devapp/templates/devapp/manage_ports/add_ports.html create mode 100644 devapp/templates/devapp/manage_ports/list.html create mode 100644 devapp/templates/devapp/manage_ports/modal_add_edit_port.html create mode 100644 devapp/templates/devapp/manage_ports/modal_del_port.html diff --git a/devapp/base_intr.py b/devapp/base_intr.py index 37b1218..970ae4b 100644 --- a/devapp/base_intr.py +++ b/devapp/base_intr.py @@ -28,6 +28,16 @@ class DevBase(object, metaclass=ABCMeta): def get_template_name(self): """Получаем путь к html шаблону отображения устройства""" + @staticmethod + @abstractmethod + def has_attachable_to_subscriber(): + """Можно-ли подключать устройство к абоненту""" + + @staticmethod + @abstractmethod + def is_use_device_port(): + """True если при авторизации по opt82 используется порт""" + class BasePort(object, metaclass=ABCMeta): def __init__(self, num, name, status, mac, speed): diff --git a/devapp/dev_types.py b/devapp/dev_types.py index b0e64be..74099df 100644 --- a/devapp/dev_types.py +++ b/devapp/dev_types.py @@ -83,13 +83,21 @@ class DLinkDevice(DevBase, SNMPBaseWorker): return tm def get_template_name(self): - return 'devapp/ports.html' + return 'ports.html' + + @staticmethod + def has_attachable_to_subscriber(): + return True + + @staticmethod + def is_use_device_port(): + return True class ONUdev(BasePort): def __init__(self, num, name, status, mac, speed, signal, snmpWorker): - BasePort.__init__(self, num, name, status, mac, speed) - assert issubclass(snmpWorker.__class__ , SNMPBaseWorker) + super(ONUdev, self).__init__(num, name, status, mac, speed) + assert issubclass(snmpWorker.__class__, SNMPBaseWorker) self.snmp_worker = snmpWorker self.signal = signal @@ -113,7 +121,7 @@ class OLTDevice(DevBase, SNMPBaseWorker): @staticmethod def description(): - return _('PON ONU') + return _('PON OLT') def reboot(self): pass @@ -146,10 +154,42 @@ class OLTDevice(DevBase, SNMPBaseWorker): return tm def get_template_name(self): - return 'devapp/olt.html' + return 'olt.html' + @staticmethod + def has_attachable_to_subscriber(): + return False -DEVICE_TYPES = ( - ('Dl', DLinkDevice), - ('Pn', OLTDevice) -) + @staticmethod + def is_use_device_port(): + return False + + +class OnuDevice(DevBase, SNMPBaseWorker): + + @staticmethod + def description(): + return _('PON ONU') + + def reboot(self): + pass + + def get_ports(self): + pass + + def get_device_name(self): + pass + + def uptime(self): + pass + + def get_template_name(self): + return "onu.html" + + @staticmethod + def has_attachable_to_subscriber(): + return True + + @staticmethod + def is_use_device_port(): + return False diff --git a/devapp/forms.py b/devapp/forms.py index fa1c9e8..11f6c9f 100644 --- a/devapp/forms.py +++ b/devapp/forms.py @@ -1,11 +1,23 @@ # -*- coding: utf-8 -*- from django import forms +from django.utils.translation import ugettext as _ +from django.db import IntegrityError from . import models from mydefs import ip_addr_regex +from djing import MAC_ADDR_REGEX class DeviceForm(forms.ModelForm): + mac_addr = forms.CharField(widget=forms.TextInput(attrs={ + 'pattern': MAC_ADDR_REGEX, + 'required': True, + 'class': 'form-control' + }), error_messages={ + 'required': _('Mac address is required for fill'), + 'unique': _('Device with that mac is already exist') + }) + class Meta: model = models.Device fields = '__all__' @@ -13,7 +25,6 @@ class DeviceForm(forms.ModelForm): 'ip_address': forms.TextInput(attrs={ 'pattern': ip_addr_regex, 'placeholder': '192.168.0.100', - 'required': True, 'class': 'form-control' }), 'comment': forms.Textarea(attrs={ @@ -33,3 +44,27 @@ class DeviceForm(forms.ModelForm): 'class': 'form-control' }) } + + +class PortForm(forms.ModelForm): + class Meta: + model = models.Port + exclude = ['device'] + widgets = { + 'num': forms.NumberInput(attrs={ + 'class': 'form-control', + 'min': '0' + }), + 'descr': forms.TextInput(attrs={ + 'class': 'form-control' + }) + } + + def save(self, commit=True): + try: + super(PortForm, self).save(commit) + except IntegrityError as e: + if "Duplicate entry" in str(e): + raise models.DeviceDBException(_('Port number on device must be unique')) + else: + raise models.DeviceDBException(e) diff --git a/devapp/locale/ru/LC_MESSAGES/django.po b/devapp/locale/ru/LC_MESSAGES/django.po index ba153e3..edc5c92 100644 --- a/devapp/locale/ru/LC_MESSAGES/django.po +++ b/devapp/locale/ru/LC_MESSAGES/django.po @@ -32,7 +32,7 @@ msgid "does not fetch the mac" msgstr "не нашёл мак" #: devapp/dev_types.py:116 -msgid "PON ONU" +msgid "PON OLT" msgstr "ONU Голова" #: devapp/templates/devapp/add_dev.html:7 @@ -134,6 +134,9 @@ msgstr "Добавить группу" msgid "Mac" msgstr "Мак" +msgid "Mac address" +msgstr "Мак адрес" + #: devapp/templates/devapp/olt.html:14 msgid "Name" msgstr "Имя" @@ -148,7 +151,7 @@ msgstr "Ур. сигнала" #: devapp/templates/devapp/olt.html:34 msgid "Ports not found" -msgstr "Онушки не получил" +msgstr "Порты не найдены" #: devapp/templates/devapp/ports.html:9 msgid "Title of the type of switch" @@ -194,6 +197,9 @@ msgstr "Комментарии портов" msgid "Port" msgstr "Порт" +msgid "Ports" +msgstr "Порты" + #: devapp/templates/devapp/ports.html:86 msgid "Title" msgstr "Название" @@ -232,3 +238,48 @@ msgstr "Ошибка SNMP на устройстве" msgid "Edit" msgstr "Редактировать" + +msgid "Device does not exist" +msgstr "Устойство не найдено" + +msgid "Number" +msgstr "Номер" + +msgid "Mode" +msgstr "Режим" + +msgid "Add" +msgstr "Добавить" + +msgid "Add ports" +msgstr "Добавить порты" + +msgid "Device is not have a group, please fix that" +msgstr "У устройства нет группы, пожалуйста, исправьте это" + +msgid "Delete" +msgstr "Удалить" + +msgid "Port does not exist" +msgstr "Порт не найден" + +msgid "Port successfully removed" +msgstr "Порт успешно удалён" + +msgid "PON ONU" +msgstr "Онушка" + +msgid "Are you sure that you want to delete switch port from db?" +msgstr "Вы уверены что хотите удалить порт свича из бд?" + +msgid "Port successfully saved" +msgstr "Порт успешно сохранён" + +msgid "Port number on device must be unique" +msgstr "Номер порта на устройстве должен быть уникальным" + +msgid "Mac address is required for fill" +msgstr "MAC-адрес необходим для заполнения" + +msgid "Device with that mac is already exist" +msgstr "Устройство с этим мак-адресом уже есть" diff --git a/devapp/templates/devapp/add_dev.html b/devapp/templates/devapp/add_dev.html index ba3fc23..5cd2f4e 100644 --- a/devapp/templates/devapp/add_dev.html +++ b/devapp/templates/devapp/add_dev.html @@ -5,13 +5,14 @@ {% include 'message_block.html' %}
@@ -20,7 +21,7 @@
-
{% csrf_token %} + {% csrf_token %}
@@ -31,6 +32,15 @@
+
+ + +
+ + {{ form.mac_addr }}{{ form.mac_addr.errors }} +
+
+
diff --git a/devapp/templates/devapp/olt.html b/devapp/templates/devapp/custom_dev_page/olt.html similarity index 68% rename from devapp/templates/devapp/olt.html rename to devapp/templates/devapp/custom_dev_page/olt.html index f47a296..f376646 100644 --- a/devapp/templates/devapp/olt.html +++ b/devapp/templates/devapp/custom_dev_page/olt.html @@ -2,38 +2,45 @@ {% load i18n %} {% block content %} -
- + + + {% with dip=dev.ip_address grp=dev.user_group.pk %} {% for port in ports %} + {% empty %} - + {% endfor %} + {% endwith %}
## {% trans 'Mac' %} {% trans 'Name' %} {% trans 'Distance(m)' %} {% trans 'Signal' %}#
{% if port.st %} - {% else %} + {% else %} {% endif %} {{ port.mac }} {{ port.nm }} {{ port.sp }} {{ port.signal }} + + + +
{% trans 'Ports not found' %}{% trans 'Ports not found' %}
diff --git a/devapp/templates/devapp/custom_dev_page/onu.html b/devapp/templates/devapp/custom_dev_page/onu.html new file mode 100644 index 0000000..85c02f5 --- /dev/null +++ b/devapp/templates/devapp/custom_dev_page/onu.html @@ -0,0 +1,33 @@ +{% extends request.is_ajax|yesno:'nullcont.htm,devapp/ext.htm' %} +{% load i18n %} +{% block content %} + +
+
+
+
+
{{ dev.get_devtype_display|default:_('Title of the type of switch') }}. + {% if uptime %} + {% trans 'Uptime' %} {{ uptime }} + {% endif %} +
+
+
+
    +
  • {{ dev.ip_address }}
  • +
  • {{ dev.mac_addr }}
  • +
  • {{ dev.comment }}
  • + {% for da in dev_accs %} + {% if da.group %} +
  • {{ da.get_full_name }}
  • + {% else %} +
  • {{ da.get_full_name }}
  • + {% endif %} + {% endfor %} +
+
+
+
+
+ +{% endblock %} diff --git a/devapp/templates/devapp/ports.html b/devapp/templates/devapp/custom_dev_page/ports.html similarity index 96% rename from devapp/templates/devapp/ports.html rename to devapp/templates/devapp/custom_dev_page/ports.html index d2cad97..9488ecf 100644 --- a/devapp/templates/devapp/ports.html +++ b/devapp/templates/devapp/custom_dev_page/ports.html @@ -7,7 +7,10 @@
{{ dev.get_devtype_display|default:_('Title of the type of switch') }}. - {% trans 'Uptime' %} {{ uptime }}
+ {% if uptime %} + {% trans 'Uptime' %} {{ uptime }} + {% endif %} +
diff --git a/devapp/templates/devapp/dev.html b/devapp/templates/devapp/dev.html index 1e74645..17a5167 100644 --- a/devapp/templates/devapp/dev.html +++ b/devapp/templates/devapp/dev.html @@ -19,6 +19,15 @@
+
+ + +
+ + {{ form.mac_addr }}{{ form.mac_addr.errors }} +
+
+
diff --git a/devapp/templates/devapp/devices.html b/devapp/templates/devapp/devices.html index 3e1c133..74e86b8 100644 --- a/devapp/templates/devapp/devices.html +++ b/devapp/templates/devapp/devices.html @@ -27,6 +27,7 @@ {% if order_by == 'comment' %}{% endif %} + {% trans 'Mac address' %} {% trans 'Device type' %} @@ -38,19 +39,21 @@ + {% with can_del_dev=perms.devapp.delete_device can_ch_dev=perms.devapp.change_device %} {% for dev in devices %} - {{ dev.ip_address }} + {{ dev.ip_address }} {{ dev.comment }} + {{ dev.mac_addr }} {{ dev.get_devtype_display }} - {% if perms.devapp.delete_device %} - + {% if can_del_dev %} + {% endif %} - {% if perms.devapp.change_device %} - + {% if can_ch_dev %} + {% endif %} @@ -58,15 +61,16 @@ {% empty %} - {% trans 'Devices does not found' %}. {% trans 'Create' %} + {% trans 'Devices does not found' %}. {% trans 'Create' %} {% endfor %} + {% endwith %} - - + + {% trans 'Create' %} diff --git a/devapp/templates/devapp/devices_null_group.html b/devapp/templates/devapp/devices_null_group.html index bca5f07..569825c 100644 --- a/devapp/templates/devapp/devices_null_group.html +++ b/devapp/templates/devapp/devices_null_group.html @@ -58,7 +58,7 @@ {% empty %} - {% trans 'Devices does not found' %}. {% trans 'Create' %} + {% trans 'Devices does not found' %}. {% trans 'Create' %} {% endfor %} @@ -66,7 +66,7 @@ - + {% trans 'Create' %} diff --git a/devapp/templates/devapp/ext.htm b/devapp/templates/devapp/ext.htm index 05bdbcd..7273f5a 100644 --- a/devapp/templates/devapp/ext.htm +++ b/devapp/templates/devapp/ext.htm @@ -21,7 +21,7 @@ @@ -42,4 +47,4 @@
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/devapp/templates/devapp/manage_ports/add_ports.html b/devapp/templates/devapp/manage_ports/add_ports.html new file mode 100644 index 0000000..0addfc8 --- /dev/null +++ b/devapp/templates/devapp/manage_ports/add_ports.html @@ -0,0 +1,89 @@ +{% extends request.is_ajax|yesno:'bajax.html,base.html' %} +{% load i18n %} +{% block main %} + + + + {% include 'message_block.html' %} + + + +
+
+

{{ dev.comment }}

+
+
+ + {% csrf_token %} + + + + + + + + + + + + {% with gid=dev.user_group.pk did=dev.pk can_del_port=perms.devapp.delete_port %} + {% for port in ports %} + + + + + + + {% endfor %} + {% endwith %} + + + + + + +
#{% trans 'Mode' %}{% trans 'Description' %}
{% if port.status %} + + {% else %} + + {% endif %}{{ port.pid }}{{ port.mode }} + + + + {% if port.from_db %} + {% if can_del_port %} + + {% else %} + + {% endif %} + + + {% else %} + + + + {% endif %} + +
+ {% if perms.devapp.add_port %} + + {% endif %} +
+ + + + +
+
+ +{% endblock %} diff --git a/devapp/templates/devapp/manage_ports/list.html b/devapp/templates/devapp/manage_ports/list.html new file mode 100644 index 0000000..c2421ba --- /dev/null +++ b/devapp/templates/devapp/manage_ports/list.html @@ -0,0 +1,60 @@ +{% extends request.is_ajax|yesno:'nullcont.htm,devapp/ext.htm' %} +{% load i18n %} +{% block content %} + +
+
+
+ + + + + + + + + + + {% with gid=dev.user_group.pk did=dev.pk can_del_port=perms.devapp.delete_port can_edit_port=perms.devapp.change_port %} + {% for port in ports %} + + + + + + {% empty %} + + + + {% endfor %} + {% endwith %} + + + + + + + +
{% trans 'Number' %}{% trans 'Description' %}#
{{ port.num }}{{ port.descr }} + {% if can_del_port %} + + + + {% endif %} + {% if can_edit_port %} + + + + {% endif %} +
{% trans 'Ports not found' %}
+ {% if perms.devapp.add_port %} + + {% trans 'Add ports' %} + + {% endif %} +
+
+
+
+ +{% endblock %} diff --git a/devapp/templates/devapp/manage_ports/modal_add_edit_port.html b/devapp/templates/devapp/manage_ports/modal_add_edit_port.html new file mode 100644 index 0000000..7442975 --- /dev/null +++ b/devapp/templates/devapp/manage_ports/modal_add_edit_port.html @@ -0,0 +1,37 @@ +{% load i18n %} + +{% if port_id %} +
{% else %} +{% endif %}{% csrf_token %} + + + + + +
diff --git a/devapp/templates/devapp/manage_ports/modal_del_port.html b/devapp/templates/devapp/manage_ports/modal_del_port.html new file mode 100644 index 0000000..33e15d2 --- /dev/null +++ b/devapp/templates/devapp/manage_ports/modal_del_port.html @@ -0,0 +1,18 @@ +{% load i18n %} + +
{% csrf_token %} + + + + + +
diff --git a/devapp/urls.py b/devapp/urls.py index c79a932..e9700eb 100644 --- a/devapp/urls.py +++ b/devapp/urls.py @@ -5,11 +5,16 @@ from . import views urlpatterns = [ url(r'^$', views.group_list, name='group_list'), - url(r'^add$', views.dev, name='add'), url(r'^devices_without_groups$', views.devices_null_group, name='devices_null_group'), url(r'^(?P\d+)$', views.devices, name='devs'), + url(r'^(?P\d+)/add$', views.dev, name='add'), url(r'^(\d+)/(?P\d+)$', views.devview, name='view'), url(r'^(\d+)/(?P\d+)/del$', views.devdel, name='del'), - url(r'^(\d+)/(?P\d+)/edit$', views.dev, name='edit'), - url(r'^(\d+)/(?P\d+)/(?P\d+)_(?P[0-1]{1})$', views.toggle_port, name='port_toggle') + 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'^(\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'), + url(r'^(?P\d+)/(?P\d+)/(?P\d+)/edit$', views.edit_single_port, name='edit_port') ] diff --git a/devapp/views.py b/devapp/views.py index 65126a4..0bbc25f 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -1,15 +1,17 @@ # -*- coding: utf-8 -*- from django.contrib.auth.decorators import login_required, permission_required +from django.contrib.gis.shortcuts import render_to_text from django.core.exceptions import PermissionDenied from django.shortcuts import render, redirect, get_object_or_404, resolve_url from django.contrib import messages from django.utils.translation import ugettext_lazy as _ from easysnmp import EasySNMPTimeoutError, EasySNMPError -from .models import Device +from .models import Device, Port, DeviceDBException from mydefs import pag_mn, res_success, res_error, only_admins, ping, order_helper -from .forms import DeviceForm -from abonapp.models import AbonGroup +from .forms import DeviceForm, PortForm +from abonapp.models import AbonGroup, Abon +from djing.settings import DEFAULT_SNMP_PASSWORD @login_required @@ -61,12 +63,15 @@ def devdel(request, did): return res_success(request, back_url) except Device.DoesNotExist: return res_error(request, _('Delete failed')) + except DeviceDBException as e: + return res_error(request, e) @login_required @only_admins -def dev(request, devid=0): +def dev(request, grp, devid=0): devinst = get_object_or_404(Device, id=devid) if devid != 0 else None + user_group = get_object_or_404(AbonGroup, pk=grp) if request.method == 'POST': if devid == 0: @@ -79,14 +84,26 @@ def dev(request, devid=0): if frm.is_valid(): frm.save() messages.success(request, _('Device info has been saved')) + return redirect('devapp:devs', grp) else: messages.error(request, _('Form is invalid, check fields and try again')) else: - frm = DeviceForm(instance=devinst) + if devinst is None: + frm = DeviceForm(initial={ + 'user_group': user_group, + 'devtype': request.GET.get('t'), + 'mac_addr': request.GET.get('mac'), + 'comment': request.GET.get('c'), + 'ip_address': request.GET.get('ip'), + 'man_passw': DEFAULT_SNMP_PASSWORD + }) + else: + frm = DeviceForm(instance=devinst) if devinst is None: return render(request, 'devapp/add_dev.html', { - 'form': frm + 'form': frm, + 'group': user_group }) else: return render(request, 'devapp/dev.html', { @@ -95,14 +112,179 @@ def dev(request, devid=0): }) +@login_required +@permission_required('devapp.change_device') +def manage_ports(request, devid): + try: + dev = Device.objects.get(pk=devid) + if dev.user_group is None: + messages.error(request, _('Device is not have a group, please fix that')) + return redirect('devapp:group_list') + ports = Port.objects.filter(device=dev) + + except Device.DoesNotExist: + messages.error(request, _('Device does not exist')) + return redirect('devapp:view', dev.user_group.pk if dev.user_group else 0, did=devid) + except DeviceDBException as e: + messages.error(request, e) + return render(request, 'devapp/manage_ports/list.html', { + 'ports': ports, + 'dev': dev + }) + + +@login_required +@permission_required('devapp.add_port') +def add_ports(request, devid): + class TempPort: + def __init__(self, pid, text, status, from_db, pk=None): + self.pid = pid + self.text = text + self.status = status + self.from_db = from_db + self.pk = pk + + def __eq__(self, other): + return self.pid == other.pid + + def __hash__(self): + return self.pid + + def __str__(self): + return "p:%d\tM:%s\tT:%s" % (self.pid, self.text) + + try: + dev = Device.objects.get(pk=devid) + if dev.user_group is None: + messages.error(request, _('Device is not have a group, please fix that')) + return redirect('devapp:group_list') + if request.method == 'POST': + ports = zip( + request.POST.getlist('p_text'), + request.POST.getlist('pids') + ) + for port_text, port_num in ports: + if port_text == '' or port_text is None: + continue + try: + port = Port.objects.get(num=port_num, device=dev) + port.descr = port_text + port.save(update_fields=['descr']) + except Port.DoesNotExist: + Port.objects.create( + num=port_num, + device=dev, + descr=port_text + ) + + db_ports = Port.objects.filter(device=dev) + db_ports = [TempPort(p.num, p.descr, None, True, p.pk) for p in db_ports] + + manager = dev.get_manager_klass()(dev.ip_address, dev.man_passw) + ports = manager.get_ports() + if ports is not None: + ports = [TempPort(p.num, p.nm, p.st, False) for p in ports] + res_ports = set(db_ports + ports) + else: + res_ports = db_ports + + except Device.DoesNotExist: + messages.error(request, _('Device does not exist')) + return redirect('devapp:group_list') + except DeviceDBException as e: + messages.error(request, e) + return render(request, 'devapp/manage_ports/add_ports.html', { + 'ports': res_ports, + 'dev': dev + }) + + +@login_required +@permission_required('devapp.delete_port') +def delete_single_port(request, grp, did, portid): + try: + if request.method == 'POST': + if request.POST.get('confirm') == 'yes': + Port.objects.get(pk=portid).delete() + messages.success(request, _('Port successfully removed')) + else: + return render_to_text('devapp/manage_ports/modal_del_port.html', { + 'grp': grp, + 'did': did, + 'port_id': portid + }, request=request) + except Port.DoesNotExist: + messages.error(request, _('Port does not exist')) + except DeviceDBException as e: + messages.error(request, e) + return redirect('devapp:manage_ports', grp, did) + + +@login_required +@permission_required('devapp.add_port') +def edit_single_port(request, grp, did, pid): + try: + port = Port.objects.get(pk=pid) + if request.method == 'POST': + frm = PortForm(request.POST, instance=port) + if frm.is_valid(): + frm.save() + messages.success(request, _('Port successfully saved')) + else: + messages.error(request, _('Form is invalid, check fields and try again')) + return redirect('devapp:manage_ports', grp, did) + + frm = PortForm(instance=port) + return render_to_text('devapp/manage_ports/modal_add_edit_port.html', { + 'port_id': pid, + 'did': did, + 'gid': grp, + 'form': frm + }, request=request) + except Port.DoesNotExist: + messages.error(request, _('Port does not exist')) + except DeviceDBException as e: + messages.error(request, e) + return redirect('devapp:manage_ports', grp, did) + + +@login_required +@permission_required('devapp.add_port') +def add_single_port(request, grp, did): + try: + device = Device.objects.get(pk=did) + if request.method == 'POST': + frm = PortForm(request.POST, instance=Port(device=device)) + if frm.is_valid(): + frm.save() + messages.success(request, _('Port successfully saved')) + return redirect('devapp:manage_ports', grp, did) + else: + messages.error(request, _('Form is invalid, check fields and try again')) + else: + frm = PortForm(initial={ + 'num': request.GET.get('n'), + 'descr': request.GET.get('t') + }) + return render_to_text('devapp/manage_ports/modal_add_edit_port.html', { + 'did': did, + 'gid': grp, + 'form': frm + }, request=request) + except Device.DoesNotExist: + messages.error(request, _('Device does not exist')) + except DeviceDBException as e: + messages.error(request, e) + return redirect('devapp:manage_ports', grp, did) + + @login_required @only_admins def devview(request, did): - ports = None uptime = 0 dev = get_object_or_404(Device, id=did) - template_name = 'devapp/ports.html' + template_name = 'ports.html' try: if ping(dev.ip_address): if dev.man_passw: @@ -118,11 +300,14 @@ def devview(request, did): messages.error(request, _('wait for a reply from the SNMP Timeout')) except EasySNMPError: messages.error(request, _('SNMP error on device')) + except DeviceDBException as e: + messages.error(request, e) - return render(request, template_name, { + return render(request, 'devapp/custom_dev_page/'+template_name, { 'dev': dev, 'ports': ports, - 'uptime': uptime + 'uptime': uptime, + 'dev_accs': Abon.objects.filter(device=dev) })