Dmitry Novikov 8 years ago
parent
commit
5163a69ab6
  1. 2
      abonapp/templates/abonapp/dial_log.html
  2. 22
      abonapp/templates/abonapp/editAbon.html
  3. 2
      accounts_app/locale/ru/LC_MESSAGES/django.po
  4. 2
      accounts_app/templates/accounts/ext.htm
  5. 2
      accounts_app/templates/accounts/index.html
  6. 8
      devapp/base_intr.py
  7. 5
      devapp/dev_types.py
  8. 13
      devapp/locale/ru/LC_MESSAGES/django.po
  9. 69
      devapp/models.py
  10. 6
      devapp/templates/devapp/custom_dev_page/olt.html
  11. 4
      devapp/templates/devapp/custom_dev_page/onu.html
  12. 4
      devapp/templates/devapp/devices.html
  13. 1
      devapp/urls.py
  14. 31
      devapp/views.py
  15. 3
      dialing_app/models.py
  16. 8
      dialing_app/templates/index.html
  17. 9
      static/css/custom.css

2
abonapp/templates/abonapp/dial_log.html

@ -21,7 +21,7 @@
<tr>
<td>
<audio preload="metadata" controls>
<source src="{{ log.path_to_media }}/{{ log.calldate|date:"YmdHi" }}-{{ log.src }}-{{ log.dst }}.wav" type="audio/wav"/>
<source src="{{ log.url }}" type="audio/wav"/>
</audio>
</td>
<td>{{ log.calldate|date:'d E Y, H:i:s' }}</td>

22
abonapp/templates/abonapp/editAbon.html

@ -142,11 +142,11 @@
<form role="form" class="form-horizontal" action="{% url 'abonapp:save_user_dev_port' abon_group.pk abon.pk %}" method="post">{% csrf_token %}
<div class="form-group-sm">
<label for="id_method" class="col-sm-2 control-label">{% trans 'Device' %}</label>
<div class="col-sm-10 btn-group btn-group-sm">
<label for="id_method" class="col-sm-4 control-label">{% trans 'Device' %}</label>
<div class="col-sm-8 btn-group btn-group-sm">
{% if device %}
<a href="{% url 'devapp:view' abon_group.pk device.pk %}" target="_blank" class="btn btn-sm btn-default" title="{% trans 'Mac Address' %}: {{ device.mac_addr|default:_('Not assigned') }}">
<span class="glyphicon glyphicon-hdd"></span> {{ device.comment|truncatechars:11 }} {{ device.ip_address }}
<a href="{% url 'devapp:view' abon_group.pk device.pk %}" target="_blank" class="btn btn-sm btn-default" title="{% trans 'Mac Address' %}: {{ device.mac_addr|default:_('Not assigned') }}">
<span class="glyphicon glyphicon-hdd"></span> <span class="hidden-md">{{ device.comment|truncatechars:11 }} {{ device.ip_address }}</span>
</a>
<a href="{% url 'abonapp:clear_dev' abon_group.pk abon.pk %}" class="btn btn-sm btn-danger">
<span class="glyphicon glyphicon-remove-circle"></span> <span class="hidden-xs hidden-md hidden-sm">{% trans 'Remove clutch' %}</span>
@ -161,8 +161,8 @@
{% if device %}
<div class="form-group-sm">
<label for="id_dev_port" class="col-sm-2 control-label">{% trans 'Device port' %}</label>
<div class="col-sm-10">
<label for="id_dev_port" class="col-sm-4 control-label">{% trans 'Device port' %}</label>
<div class="col-sm-8">
<select id="id_dev_port" class="form-control" name="user_port">
<option value="0">{% trans 'Not assigned' %}</option>
{% for port in dev_ports %}
@ -178,14 +178,14 @@
</div>
</div>
<div class="form-group-sm">
<div class="col-sm-offset-2 col-sm-10 checkbox">
<div class="col-sm-offset-4 col-sm-8 checkbox">
<label>
<input type="checkbox" name="is_dynamic_ip"{% if abon.is_dynamic_ip %} checked{% endif %}> {% trans 'Is dynamic network settings' %}
</label>
</div>
</div>
<div class="form-group-sm">
<div class="col-sm-10 col-sm-offset-2">
<div class="col-sm-8 col-sm-offset-4">
<button type="submit" class="btn btn-primary btn-sm">
<span class="glyphicon glyphicon-floppy-disk"></span> {% trans 'Save' %}
</button>
@ -206,8 +206,8 @@
{% for ef in abon.extra_fields.all %}
<div class="form-group-sm">
<label class="col-sm-2 control-label">{{ ef.title }}</label>
<div class="col-sm-10">
<label class="col-sm-4 control-label">{{ ef.title }}</label>
<div class="col-sm-8">
<div class="input-group input-group-sm">
<input type="text" value="{{ ef.data|default:_('Not assigned') }}" class="form-control" pattern="{{ ef.get_regexp }}" name="ex">
@ -226,7 +226,7 @@
{% endfor %}
<div class="form-group-sm">
<div class="col-sm-offset-2 col-sm-10 btn-group btn-group-sm">
<div class="col-sm-offset-4 col-sm-8 btn-group btn-group-sm">
<a href="{% url 'abonapp:extra_field' abon_group.pk abon.pk %}" class="btn btn-success btn-modal" title="{% trans 'Add extra field' %}">
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add' %}
</a>

2
accounts_app/locale/ru/LC_MESSAGES/django.po

@ -153,7 +153,7 @@ msgid "Change self onfo"
msgstr "Изменить инфу о себе"
msgid "Permission options"
msgstr "Настройка прав"
msgstr "Права"
msgid "Edit"
msgstr "Редактировать"

2
accounts_app/templates/accounts/ext.htm

@ -20,7 +20,7 @@
{% else %}
<img alt="ava" src="/static/img/user_ava.gif"/>
{% endif %}
<div class="caption btn-group btn-group-sm btn-group-justified">
<div class="caption btn-group btn-group-sm">
{% if userprofile == request.user %}
<a href="{% url 'acc_app:setup_info' %}" class="btn btn-primary">
<span class="glyphicon glyphicon-edit"></span>

2
accounts_app/templates/accounts/index.html

@ -2,7 +2,7 @@
{% load i18n %}
{% block content %}
<div class="table-responsive">
<div class="table">
<table class="table table-striped table-bordered">
<tbody>
<tr>

8
devapp/base_intr.py

@ -73,8 +73,12 @@ class SNMPBaseWorker(object, metaclass=ABCMeta):
return self.ses.set(oid, value)
def get_list(self, oid):
l = self.ses.walk(oid)
return [e.value for e in l]
return self.ses.walk(oid)
def get_list_keyval(self, oid):
for v in self.ses.walk(oid):
snmpnum = v.oid.split('.')[-1:]
yield v.value, snmpnum[0] if len(snmpnum) > 0 else None
def get_item(self, oid):
return self.ses.get(oid).value

5
devapp/dev_types.py

@ -191,18 +191,17 @@ class OnuDevice(DevBase, SNMPBaseWorker):
return
try:
status = self.get_item('.1.3.6.1.4.1.3320.101.10.1.1.26.%d' % num)
print('Status', status)
signal = self.get_item('.1.3.6.1.4.1.3320.101.10.5.1.5.%d' % num)
print(signal)
distance = self.get_item('.1.3.6.1.4.1.3320.101.10.1.1.27.%d' % num)
mac = ':'.join(['%x' % ord(i) for i in self.get_item('.1.3.6.1.4.1.3320.101.10.1.1.3.%d' % num)])
uptime = self.get_item('.1.3.6.1.2.1.2.2.1.9.%d' % num)
return {
'status': status,
'signal': int(signal) / 10 if signal != 'NOSUCHINSTANCE' else 0,
'name': self.get_item('.1.3.6.1.2.1.2.2.1.2.%d' % num),
'mac': mac,
'distance': int(distance) / 10 if distance != 'NOSUCHINSTANCE' else 0,
'uptime': RuTimedelta(timedelta(seconds=int(self.get_item('.1.3.6.1.2.1.2.2.1.9.%d' % num)) / 100))
'uptime': RuTimedelta(timedelta(seconds=int(uptime) / 100)) if uptime != 'NOSUCHINSTANCE' else 0
}
except EasySNMPTimeoutError:
return {'err': _('ONU not connected')}

13
devapp/locale/ru/LC_MESSAGES/django.po

@ -77,6 +77,9 @@ msgstr "Тип устройства"
msgid "SNMP password"
msgstr "Пароль SNMP"
msgid "SNMP Num"
msgstr "SNMP Ном."
#: devapp/templates/devapp/add_dev.html:62 devapp/templates/devapp/dev.html:50
msgid "Map point"
msgstr "Точка топологии"
@ -321,3 +324,13 @@ msgstr "ONU ошибка"
msgid "ONU not connected"
msgstr "ONU не в сети"
msgid "Parent device not found"
msgstr "Вышестоящее устройство не найдено"
msgid "Fixed"
msgstr "Исправлено, обновите страницу"
msgid "Fix it"
msgstr "Исправить"

69
devapp/models.py

@ -90,6 +90,40 @@ class Device(models.Model):
def __str__(self):
return "%s: (%s) %s %s" % (self.comment, self.get_devtype_display(), self.ip_address, self.mac_addr or '')
def update_dhcp(self):
if self.devtype != 'On':
return
grp = self.user_group.pk
code = ''
if grp == 87:
code = 'chk'
elif grp == 85:
code = 'drf'
elif grp == 86:
code = 'eme'
elif grp == 84:
code = 'kunc'
elif grp == 47:
code = 'mtr'
elif grp == 60:
code = 'nvg'
elif grp == 65:
code = 'ohot'
elif grp == 89:
code = 'psh'
elif grp == 92:
code = 'str'
elif grp == 80:
code = 'uy'
elif grp == 79 or grp == 91:
code = 'zrk'
elif grp == 95:
code = 'yst'
elif grp == 96:
code = 'lzk'
newmac = str(self.mac_addr)
run(["%s/devapp/onu_register.sh" % settings.BASE_DIR, newmac, code])
class Port(models.Model):
device = models.ForeignKey(Device, verbose_name=_('Device'))
@ -109,37 +143,4 @@ class Port(models.Model):
verbose_name_plural = _('Ports')
def dev_post_save_signal(sender, instance, **kwargs):
if instance.devtype != 'On':
return
grp = instance.user_group.pk
code = ''
if grp == 87:
code = 'chk'
elif grp == 85:
code = 'drf'
elif grp == 86:
code = 'eme'
elif grp == 84:
code = 'kunc'
elif grp == 47:
code = 'mtr'
elif grp == 60:
code = 'nvg'
elif grp == 65:
code = 'ohot'
elif grp == 89:
code = 'psh'
elif grp == 92:
code = 'str'
elif grp == 80:
code = 'uy'
elif grp == 79 or grp == 91:
code = 'zrk'
elif grp == 95:
code = 'yst'
newmac = str(instance.mac_addr)
run(["%s/devapp/onu_register.sh" % settings.BASE_DIR, newmac, code])
models.signals.post_save.connect(dev_post_save_signal, sender=Device)

6
devapp/templates/devapp/custom_dev_page/olt.html

@ -14,8 +14,9 @@
<thead>
<tr>
<th class="col-xs-1">#</th>
<th class="col-xs-1">{% trans 'SNMP Num' %}</th>
<th class="col-xs-4">{% trans 'Name' %}</th>
<th class="col-xs-4">{% trans 'Mac' %}</th>
<th class="col-xs-3">{% trans 'Mac' %}</th>
<th class="col-xs-2">{% trans 'Signal' %}</th>
<th class="col-xs-1">#</th>
</tr>
@ -29,6 +30,7 @@
{% else %}<span class="glyphicon glyphicon-warning-sign text-danger"></span>
{% endif %}
</td>
<td>{{ port.num }}</td>
<td>{{ port.nm }}</td>
<td>{{ port.mac }}</td>
<td>{{ port.signal }}</td>
@ -40,7 +42,7 @@
</tr>
{% empty %}
<tr>
<td colspan="6">{% trans 'Ports not found' %}</td>
<td colspan="7">{% trans 'Ports not found' %}</td>
</tr>
{% endfor %}
{% endwith %}

4
devapp/templates/devapp/custom_dev_page/onu.html

@ -77,6 +77,10 @@
<span class="text-danger">
<b>{% trans 'Mac on OLT' %}</b>: {{ onu_details.mac }}
<h4 class="glyphicon glyphicon-exclamation-sign" title="{% trans 'Mac-addresses does not match' %}" data-toggle="tooltip"></h4>
<a href="{% url 'devapp:fix_onu' %}" data-param="{{ dev.mac_addr }}" class="btn btn-default btn-xs btn-cmd" title="{% trans 'Fix it' %}" data-toggle="tooltip">
<span class="glyphicon glyphicon-fire"></span>
<span class="hidden-xs">{% trans 'Fix it' %}</span>
</a>
</span>
{% else %}
<b>{% trans 'Mac on OLT' %}</b>: {{ onu_details.mac }}

4
devapp/templates/devapp/devices.html

@ -12,7 +12,7 @@
<h3>{% trans 'Devices' %}</h3>
<div class="table-responsive">
<table class="table table-striped table-bordered">
<table class="table table-bordered">
<thead>
<tr>
<th>#</th>
@ -56,7 +56,7 @@
<td><a href="{% url 'devapp:view' dev.user_group.pk dev.pk %}">{{ dev.ip_address }}</a></td>
<td>{{ dev.comment }}</td>
<td>{{ dev.mac_addr|default:_('Not assigned') }}</td>
<td>{{ dev.mon.plugin_output|default:'&ndash;' }}</td>
<td class="hidden-xs hidden-sm">{{ dev.mon.plugin_output|default:'&ndash;' }}</td>
<td>{{ dev.get_devtype_display }}</td>
<td class="btn-group btn-group-xs btn-group-justified">
{% if can_del_dev %}

1
devapp/urls.py

@ -6,6 +6,7 @@ from . import views
urlpatterns = [
url(r'^$', views.group_list, name='group_list'),
url(r'^devices_without_groups$', views.devices_null_group, name='devices_null_group'),
url(r'^fix_onu/$', views.fix_onu, name='fix_onu'),
url(r'^(?P<grp>\d+)$', views.devices, name='devs'),
url(r'^(?P<grp>\d+)/add$', views.dev, name='add'),
url(r'^(\d+)/(?P<did>\d+)$', views.devview, name='view'),

31
devapp/views.py

@ -93,6 +93,7 @@ def dev(request, grp, devid=0):
frm = DeviceForm(request.POST, instance=devinst)
if frm.is_valid():
ndev = frm.save()
ndev.update_dhcp()
messages.success(request, _('Device info has been saved'))
return redirect('devapp:edit', ndev.user_group.pk, ndev.pk)
else:
@ -415,3 +416,33 @@ def fix_device_group(request, did):
'dev': dev,
'selected_parent_dev': dev.parent_dev
})
@login_required
def fix_onu(request):
mac = request.GET.get('cmd_param')
status = 1
text = '<span class="glyphicon glyphicon-exclamation-sign"></span>'
try:
onu = Device.objects.get(mac_addr=mac, devtype='On')
parent = onu.parent_dev
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')
for srcmac, snmpnum in ports:
real_mac = ':'.join(['%x' % ord(i) for i in srcmac])
if mac == real_mac:
onu.snmp_item_num = snmpnum
onu.save(update_fields=['snmp_item_num'])
status = 0
text = '<span class="glyphicon glyphicon-ok"></span> <span class="hidden-xs">%s</span>' % _('Fixed')
break
else:
text = text + ' %s' % _('Parent device not found')
except Device.DoesNotExist:
pass
return HttpResponse(dumps({
'status': status,
'dat': text
}))

3
dialing_app/models.py

@ -59,5 +59,8 @@ class AsteriskCDR(models.Model):
return "%s/recording/bug" % path
return "%s/monitor" % path
def url(self):
return "%s/%s-%s-%s.wav" % ( self.path_to_media(), self.calldate.strftime('%Y/%m/%d/%H_%M'), self.src, self.dst )
class Meta:
db_table = 'cdr'

8
dialing_app/templates/index.html

@ -20,13 +20,14 @@
</thead>
<tbody>
{% for log in logs %}
<tr>
<tr>
{% with lurl=log.url %}
<td class="btn-group btn-group-xs btn-group-justify">
<button class="btn btn-default player-btn disabled">
<span class="glyphicon glyphicon-play"></span>
<audio preload="metadata" src="{{ log.path_to_media }}/{{ log.calldate|date:"Y/m/d/H_i" }}-{{ log.src }}-{{ log.dst }}.wav"></audio>
<audio preload="metadata" src="{{ lurl }}"></audio>
</button>
<a href="{{ log.path_to_media }}/{{ log.calldate|date:"Y/m/d/H_i" }}-{{ log.src }}-{{ log.dst }}.wav" class="btn btn-default disabled" target="_blank" title="{% trans 'Download' %}">
<a href="{{ lurl }}" class="btn btn-default disabled" target="_blank" title="{% trans 'Download' %}">
<span class="glyphicon glyphicon-download-alt"></span>
</a>
</td>
@ -38,6 +39,7 @@
<td>{{ log.answer|date:'d M, H:i:s' }}</td>
<td>{{ log.end|date:'d M, H:i:s' }}</td>
<td>{{ log.locate_disposition }}</td>
{% endwith %}
</tr>
{% empty %}
<tr>

9
static/css/custom.css

@ -75,7 +75,7 @@ body {
.main {
margin-top: 10px;
display: table;
/*display: table;*/
}
.table-responsive thead {
@ -267,10 +267,3 @@ div#loading>div.gif {
border-style: ridge;
}
@media (max-width: 767px) {
.nav-tabs.nav-justified > li {
float: left;
width: 50%;
}
}
Loading…
Cancel
Save