diff --git a/accounts_app/templates/accounts/ext.htm b/accounts_app/templates/accounts/ext.htm index 19cf4e1..b17ed8c 100644 --- a/accounts_app/templates/accounts/ext.htm +++ b/accounts_app/templates/accounts/ext.htm @@ -20,23 +20,23 @@ {% else %} ava {% endif %} -
+
{% if userprofile == request.user %} - + - {% trans 'Edit' %} + {% endif %} {% if request.user.is_superuser %} {% if userprofile.is_superuser %} - {% trans 'Permission options' %} + {% else %} - + - {% trans 'Permission options' %} + {% endif %} {% endif %} diff --git a/accounts_app/templates/accounts/settings/test.html b/accounts_app/templates/accounts/settings/test.html deleted file mode 100644 index 62441f6..0000000 --- a/accounts_app/templates/accounts/settings/test.html +++ /dev/null @@ -1,14 +0,0 @@ -

- - -

diff --git a/bugs.txt b/bugs.txt deleted file mode 100644 index e06fe34..0000000 --- a/bugs.txt +++ /dev/null @@ -1,8 +0,0 @@ -- (GUI) Иконки возле кнопок не настроены, натыканы случайно -- В abonapp.complete_service нельзя досрочно завершить услугу пока нет связи с NAS'ом -- Надо указывать в /usr/lib/python3.5/site-packages/django/contrib/auth/decorators.py raise_exception=True -- Пароли абонентов надо шифровать ключом для паролей -- Доделать везде переводы -- Не надо коннектиться к микротику когда не собираемся ничего изменять. А то при сохранении залогинились и вышли без действий -- Не удаляет просроченные услуги если не пингуется NAS -! Проверить дату завершения услуги diff --git a/devapp/forms.py b/devapp/forms.py index 826c714..af3e5e6 100644 --- a/devapp/forms.py +++ b/devapp/forms.py @@ -11,8 +11,7 @@ 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' + 'required': True }), error_messages={ 'required': _('Mac address is required for fill'), 'unique': _('Device with that mac is already exist') @@ -20,31 +19,18 @@ class DeviceForm(forms.ModelForm): class Meta: model = models.Device - fields = '__all__' + exclude = ['map_dot'] widgets = { 'ip_address': forms.TextInput(attrs={ 'pattern': ip_addr_regex, - 'placeholder': '192.168.0.100', - 'class': 'form-control' + 'placeholder': '192.168.0.100' }), 'comment': forms.TextInput(attrs={ - 'required': True, - 'class': 'form-control' - }), - 'devtype': forms.Select(attrs={ - 'class': 'form-control' - }), - 'man_passw': forms.PasswordInput(attrs={ - 'class': 'form-control' - }, render_value=True), - 'map_dot': forms.Select(attrs={ - 'class': 'form-control' + 'required': True }), + 'man_passw': forms.PasswordInput(render_value=True), 'user_group': forms.Select(attrs={ 'class': 'form-control' - }), - 'parent_dev': forms.Select(attrs={ - 'class': 'form-control' }) } @@ -55,11 +41,7 @@ class PortForm(forms.ModelForm): exclude = ['device'] widgets = { 'num': forms.NumberInput(attrs={ - 'class': 'form-control', 'min': '0' - }), - 'descr': forms.TextInput(attrs={ - 'class': 'form-control' }) } diff --git a/devapp/migrations/0004_auto_20171103_0006.py b/devapp/migrations/0004_auto_20171103_0006.py new file mode 100644 index 0000000..6d077e1 --- /dev/null +++ b/devapp/migrations/0004_auto_20171103_0006.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-11-03 00:06 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import djing.fields +import mydefs + + +class Migration(migrations.Migration): + + dependencies = [ + ('devapp', '0003_auto_20170927_1838'), + ] + + operations = [ + migrations.RemoveField( + model_name='device', + name='map_dot', + ), + migrations.AlterField( + model_name='device', + name='comment', + field=models.CharField(max_length=256, verbose_name='Comment'), + ), + migrations.AlterField( + model_name='device', + name='devtype', + field=models.CharField(choices=[('Dl', 'DLink switch'), ('Pn', 'PON OLT'), ('On', 'PON ONU'), ('Ex', 'Eltex switch')], default='Dl', max_length=2, verbose_name='Device type'), + ), + migrations.AlterField( + model_name='device', + name='ip_address', + field=mydefs.MyGenericIPAddressField(max_length=8, protocol='ipv4', verbose_name='Ip address'), + ), + migrations.AlterField( + model_name='device', + name='mac_addr', + field=djing.fields.MACAddressField(blank=True, integer=True, null=True, unique=True, verbose_name='Mac address'), + ), + migrations.AlterField( + model_name='device', + name='man_passw', + field=models.CharField(blank=True, max_length=16, null=True, verbose_name='SNMP password'), + ), + migrations.AlterField( + model_name='device', + name='parent_dev', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='devapp.Device', verbose_name='Parent device'), + ), + migrations.AlterField( + model_name='device', + name='user_group', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='abonapp.AbonGroup', verbose_name='User group'), + ), + migrations.AlterField( + model_name='port', + name='descr', + field=models.CharField(blank=True, max_length=60, null=True, verbose_name='Description'), + ), + migrations.AlterField( + model_name='port', + name='device', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='devapp.Device', verbose_name='Device'), + ), + migrations.AlterField( + model_name='port', + name='num', + field=models.PositiveSmallIntegerField(default=0, verbose_name='Number'), + ), + ] diff --git a/devapp/models.py b/devapp/models.py index 5e8a4a2..6552dd5 100644 --- a/devapp/models.py +++ b/devapp/models.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- +import requests from django.db import models - from djing.fields import MACAddressField from .base_intr import DevBase -from mydefs import MyGenericIPAddressField, MyChoicesAdapter +from mydefs import MyGenericIPAddressField, MyChoicesAdapter, ip2int from . import dev_types -from mapapp.models import Dot from subprocess import run from django.conf import settings from django.utils.translation import ugettext_lazy as _ +from json.decoder import JSONDecodeError DEVICE_TYPES = ( @@ -23,15 +23,34 @@ class DeviceDBException(Exception): pass +class DeviceManager(models.Manager): + @staticmethod + def wrap_monitoring_info(devices_queryset): + nag_url = getattr(settings, 'NAGIOS_URL') + if nag_url: + addrs = ['h=%s' % hex(ip2int(dev.ip_address))[2:] for dev in devices_queryset] + url = '%s/host/status/arr?%s' % (nag_url, '&'.join(addrs)) + try: + res = requests.get(url).json() + except (requests.exceptions.ConnectionError, JSONDecodeError): + return + for dev in devices_queryset: + inf = [x for x in res if x.get('address') == dev.ip_address] + if len(inf) > 0: + setattr(dev, 'mon', inf[0].get('current_status')) + return devices_queryset + + class Device(models.Model): - ip_address = MyGenericIPAddressField() - mac_addr = MACAddressField(null=True, blank=True, unique=True) - comment = models.CharField(max_length=256) - devtype = models.CharField(max_length=2, default=DEVICE_TYPES[0][0], choices=MyChoicesAdapter(DEVICE_TYPES)) - man_passw = models.CharField(max_length=16, null=True, blank=True) - map_dot = models.ForeignKey(Dot, on_delete=models.SET_NULL, null=True, blank=True) - user_group = models.ForeignKey('abonapp.AbonGroup', on_delete=models.SET_NULL, null=True, blank=True) - parent_dev = models.ForeignKey('self', blank=True, null=True, on_delete=models.SET_NULL) + ip_address = MyGenericIPAddressField(verbose_name=_('Ip address')) + mac_addr = MACAddressField(verbose_name=_('Mac address'), null=True, blank=True, unique=True) + comment = models.CharField(_('Comment'), max_length=256) + devtype = models.CharField(_('Device type'), max_length=2, default=DEVICE_TYPES[0][0], choices=MyChoicesAdapter(DEVICE_TYPES)) + man_passw = models.CharField(_('SNMP password'), max_length=16, null=True, blank=True) + user_group = models.ForeignKey('abonapp.AbonGroup', verbose_name=_('User group'), on_delete=models.SET_NULL, null=True, blank=True) + parent_dev = models.ForeignKey('self', verbose_name=_('Parent device'), blank=True, null=True, on_delete=models.SET_NULL) + + objects = DeviceManager() class Meta: db_table = 'dev' @@ -44,8 +63,10 @@ class Device(models.Model): def get_abons(self): pass - def get_stat(self): - pass + def get_status(self): + url = getattr(settings, 'NAGIOS_URL') + if url: + return requests.get('%s/host/status?addr=%s' % (url, self.ip_address)) def get_manager_klass(self): klasses = [kl for kl in DEVICE_TYPES if kl[0] == self.devtype] @@ -65,9 +86,9 @@ class Device(models.Model): class Port(models.Model): - device = models.ForeignKey(Device) - num = models.PositiveSmallIntegerField(default=0) - descr = models.CharField(max_length=60, null=True, blank=True) + device = models.ForeignKey(Device, verbose_name=_('Device')) + num = models.PositiveSmallIntegerField(_('Number'), default=0) + descr = models.CharField(_('Description'), max_length=60, null=True, blank=True) def __str__(self): return "%d: %s" % (int(self.num), self.descr) diff --git a/devapp/templates/devapp/add_dev.html b/devapp/templates/devapp/add_dev.html index f5b1ed8..c64232e 100644 --- a/devapp/templates/devapp/add_dev.html +++ b/devapp/templates/devapp/add_dev.html @@ -1,5 +1,6 @@ {% extends request.is_ajax|yesno:'bajax.html,base.html' %} {% load i18n %} +{% load bootstrap3 %} {% block main %}
-
- -
diff --git a/devapp/templates/devapp/dev.html b/devapp/templates/devapp/dev.html index 43e627d..310d3a7 100644 --- a/devapp/templates/devapp/dev.html +++ b/devapp/templates/devapp/dev.html @@ -1,114 +1,67 @@ {% extends request.is_ajax|yesno:'nullcont.htm,devapp/ext.htm' %} {% load i18n %} +{% load bootstrap3 %} {% block content %} -
-
-

{% trans 'Device info' %}

-
-
- - {% csrf_token %} - -
- - -
- - {{ form.ip_address }}{{ form.ip_address.errors }} -
-
- -
- - -
- - {{ form.mac_addr }} - {% if already_dev %} - - - {{ already_dev.comment }} - - - {% endif %} -
- {{ form.mac_addr.errors }} -
- -
- - -
- - {{ form.comment }}{{ form.comment.errors }} -
-
- -
- +
+
+

{% trans 'Device info' %}

+
+
-
- - {{ form.devtype }}{{ form.devtype.errors }} -
-
+ {% csrf_token %} -
- + {% bootstrap_icon 'globe' as ic %} + {% bootstrap_field form.ip_address addon_before=ic %} -
- - {{ form.man_passw }}{{ form.man_passw.errors }} -
-
+ {% bootstrap_icon 'globe' as ic %} + {% bootstrap_field form.mac_addr addon_before=ic %} -
- + {% bootstrap_icon 'comment' as ic %} + {% bootstrap_field form.comment addon_before=ic %} -
- - {{ form.map_dot }}{{ form.devtype.errors }} -
-
+ {% bootstrap_icon 'hdd' as ic %} + {% bootstrap_field form.devtype addon_before=ic %} -
- + {% bootstrap_icon 'lock' as ic %} + {% bootstrap_field form.man_passw addon_before=ic %} -
- - {{ form.user_group }}{{ form.user_group.errors }} -
-
+ {% bootstrap_icon 'subscript' as ic %} + {% bootstrap_field form.user_group addon_before=ic %} -
- +
+ -
- - - {% if selected_parent_dev %} - - - {% else %} - - - {% endif %} - {{ form.parent_dev.errors }} -
-
- -
- - + + {% else %} + + + {% endif %} + + {{ form.parent_dev.errors }}
- - -
+
+ +
+ + +
+ +
+
{% endblock %} diff --git a/devapp/templates/devapp/devices.html b/devapp/templates/devapp/devices.html index 74e86b8..09e3bee 100644 --- a/devapp/templates/devapp/devices.html +++ b/devapp/templates/devapp/devices.html @@ -15,21 +15,23 @@ + - + + - + + {% empty %} - + {% endfor %} {% endwith %} @@ -69,7 +79,7 @@ -
# - + {% trans 'Ip address' %} {% if order_by == 'ip_address' %}{% endif %} - + {% trans 'Comment' %} {% if order_by == 'comment' %}{% endif %} {% trans 'Mac address' %} - + {% trans 'Monitoring output' %} + {% trans 'Device type' %} {% if order_by == 'devtype' %}{% endif %} @@ -42,9 +44,17 @@ {% with can_del_dev=perms.devapp.delete_device can_ch_dev=perms.devapp.change_device %} {% for dev in devices %}
+ {% if dev.mon.current_state == '0' %} + + {% else %} + + {% endif %} + {{ dev.ip_address }} {{ dev.comment }}{{ dev.mac_addr }}{{ dev.mac_addr|default:_('Not assigned') }}{{ dev.mon.plugin_output }} {{ dev.get_devtype_display }} {% if can_del_dev %} @@ -61,7 +71,7 @@
{% trans 'Devices does not found' %}. {% trans 'Create' %}{% trans 'Devices does not found' %}. {% trans 'Create' %}
+ {% trans 'Create' %} diff --git a/devapp/templates/devapp/fix_dev_group.html b/devapp/templates/devapp/fix_dev_group.html new file mode 100644 index 0000000..26ce519 --- /dev/null +++ b/devapp/templates/devapp/fix_dev_group.html @@ -0,0 +1,82 @@ +{% extends request.is_ajax|yesno:'bajax.html,base.html' %} +{% load i18n %} +{% load bootstrap3 %} +{% block main %} + + + + +{% include 'message_block.html' %} + +
+
+

{% trans 'Fix device group' %}

+
+
+ +
{% csrf_token %} + + {% bootstrap_icon 'globe' as ic %} + {% bootstrap_field form.ip_address addon_before=ic %} + + {% bootstrap_icon 'globe' as ic %} + {% bootstrap_field form.mac_addr addon_before=ic %} + + {% bootstrap_icon 'comment' as ic %} + {% bootstrap_field form.comment addon_before=ic %} + + {% bootstrap_icon 'hdd' as ic %} + {% bootstrap_field form.devtype addon_before=ic %} + + {% bootstrap_icon 'lock' as ic %} + {% bootstrap_field form.man_passw addon_before=ic %} + +
+ +
+ + {% bootstrap_icon 'subscript' %} + + {{ form.user_group }} +
+
+ +
+ + +
+ + + {% if selected_parent_dev %} + + + {% else %} + + + {% endif %} + + {{ form.parent_dev.errors }} +
+
+ +
+ + +
+ +
+
+
+ +{% 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 index 7442975..2fa567a 100644 --- a/devapp/templates/devapp/manage_ports/modal_add_edit_port.html +++ b/devapp/templates/devapp/manage_ports/modal_add_edit_port.html @@ -1,9 +1,14 @@ -{% load i18n %} +{% load i18n %}{% load bootstrap3 %} {% if port_id %} -
{% else %} -{% endif %}{% csrf_token %} + {% url 'devapp:edit_port' gid did port_id as frm_url %} +{% else %} + {% url 'devapp:add_port' gid did as frm_url %} +{% endif %} + +{% csrf_token %} +