diff --git a/abonapp/models.py b/abonapp/models.py
index 212ae5c..1119b03 100644
--- a/abonapp/models.py
+++ b/abonapp/models.py
@@ -172,6 +172,7 @@ class Abon(UserProfile):
('can_add_ballance', _('fill account')),
('can_ping', _('Can ping'))
)
+ unique_together = ('device', 'dev_port')
verbose_name = _('Abon')
verbose_name_plural = _('Abons')
diff --git a/abonapp/templates/abonapp/editAbon.html b/abonapp/templates/abonapp/editAbon.html
index e5b21e4..7e0d67f 100644
--- a/abonapp/templates/abonapp/editAbon.html
+++ b/abonapp/templates/abonapp/editAbon.html
@@ -156,7 +156,7 @@
{{ device.comment|truncatechars:11 }} {{ device.ip_address }}
- {% trans 'Remove clutch' %}
+ {% trans 'Remove clutch' %}
{% else %}
diff --git a/abonapp/templates/abonapp/modal_phonebook.html b/abonapp/templates/abonapp/modal_phonebook.html
new file mode 100644
index 0000000..99b4d50
--- /dev/null
+++ b/abonapp/templates/abonapp/modal_phonebook.html
@@ -0,0 +1,32 @@
+{% load i18n %}
+
+
+
+
+
+ | {% trans 'Telephone' %} |
+ {% trans 'Telephone owner' %} |
+
+
+
+{% for t in tels %}
+
+ | {{ t.0 }} |
+ {{ t.1 }} |
+
+{% empty %}
+
+ | {% trans 'Telephone numbers not found' %} |
+
+{% endfor %}
+
+
+
+
diff --git a/agent/commands/dhcp.py b/agent/commands/dhcp.py
index 210ead8..5576f06 100644
--- a/agent/commands/dhcp.py
+++ b/agent/commands/dhcp.py
@@ -10,7 +10,6 @@ def dhcp_commit(client_ip, client_mac, switch_mac, switch_port):
dev = Device.objects.get(mac_addr=switch_mac)
mngr_class = dev.get_manager_klass()
- #port = _('')
if mngr_class.is_use_device_port():
port = Port.objects.get(device=dev, num=switch_port)
abon = Abon.objects.get(dev_port=port, device=dev)
@@ -33,7 +32,7 @@ def dhcp_commit(client_ip, client_mac, switch_mac, switch_port):
except Port.DoesNotExist:
print('N:', _('Port %d on device with mac %s does not exist') % (int(switch_port), switch_mac))
except MultipleObjectsReturned as e:
- print('E:', 'MultipleObjectsReturned:', type(e), e)
+ print('E:', 'MultipleObjectsReturned:', type(e), e, port, dev)
def dhcp_expiry(client_ip):
diff --git a/devapp/dev_types.py b/devapp/dev_types.py
index ffbf7ae..6b2ea37 100644
--- a/devapp/dev_types.py
+++ b/devapp/dev_types.py
@@ -237,10 +237,10 @@ class EltexSwitch(DLinkDevice):
def get_ports(self):
#nams = self.get_list('.1.3.6.1.4.1.171.10.134.2.1.1.100.2.1.3')
- stats = self.get_list('.1.3.6.1.2.1.2.2.1.7')
- oper_stats = self.get_list('.1.3.6.1.2.1.2.2.1.8')
+ stats = list(self.get_list('.1.3.6.1.2.1.2.2.1.7'))
+ oper_stats = list(self.get_list('.1.3.6.1.2.1.2.2.1.8'))
#macs = self.get_list('.1.3.6.1.2.1.2.2.1.6')
- speeds = self.get_list('.1.3.6.1.2.1.31.1.1.1.15')
+ speeds = list(self.get_list('.1.3.6.1.2.1.31.1.1.1.15'))
res = []
for n in range(28):
res.append(EltexPort(self,
@@ -262,7 +262,7 @@ class EltexSwitch(DLinkDevice):
@staticmethod
def has_attachable_to_subscriber():
- return False
+ return True
@staticmethod
def is_use_device_port():
diff --git a/devapp/locale/ru/LC_MESSAGES/django.po b/devapp/locale/ru/LC_MESSAGES/django.po
index 6f29c1c..829e7e7 100644
--- a/devapp/locale/ru/LC_MESSAGES/django.po
+++ b/devapp/locale/ru/LC_MESSAGES/django.po
@@ -334,3 +334,6 @@ msgstr "Исправлено, обновите страницу"
msgid "Fix it"
msgstr "Исправить"
+msgid "Duplicate user and port: %s"
+msgstr "Пользователь с таким портом и устройством уже есть: %s"
+
diff --git a/devapp/models.py b/devapp/models.py
index 8611632..8412abb 100644
--- a/devapp/models.py
+++ b/devapp/models.py
@@ -95,9 +95,9 @@ class Device(models.Model):
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':
+ if self.devtype not in ('On','Dl'):
return
- grp = self.user_group.pk
+ grp = self.user_group.id
code = ''
if grp == 87:
code = 'chk'
@@ -125,6 +125,8 @@ class Device(models.Model):
code = 'yst'
elif grp == 96:
code = 'lzk'
+ elif grp == 51:
+ code = 'sad'
newmac = str(self.mac_addr)
run(["%s/devapp/onu_register.sh" % settings.BASE_DIR, newmac, code])
diff --git a/devapp/views.py b/devapp/views.py
index 43168f1..f2e265c 100644
--- a/devapp/views.py
+++ b/devapp/views.py
@@ -2,6 +2,7 @@
from django.contrib.auth.decorators import login_required
from django.contrib.gis.shortcuts import render_to_text
from django.core.exceptions import PermissionDenied
+from django.db import IntegrityError
from django.db.models import Q
from django.http import HttpResponse
from django.shortcuts import render, redirect, get_object_or_404, resolve_url
@@ -95,24 +96,30 @@ def dev(request, grp, devid=0):
else:
if not request.user.has_perm('devapp.change_device'):
raise PermissionDenied
- 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:
- try:
- already_dev = Device.objects.get(mac_addr=request.POST.get('mac_addr'))
- if already_dev.user_group:
- messages.warning(request, _('You have redirected to existing device'))
- return redirect('devapp:view', already_dev.user_group.pk, already_dev.pk)
- else:
- messages.warning(request, _('Please attach user group for device'))
- return redirect('devapp:fix_device_group', already_dev.pk)
- except Device.DoesNotExist:
- pass
- messages.error(request, _('Form is invalid, check fields and try again'))
+ try:
+ 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:
+ try:
+ already_dev = Device.objects.get(mac_addr=request.POST.get('mac_addr'))
+ if already_dev.user_group:
+ messages.warning(request, _('You have redirected to existing device'))
+ return redirect('devapp:view', already_dev.user_group.pk, already_dev.pk)
+ else:
+ messages.warning(request, _('Please attach user group for device'))
+ return redirect('devapp:fix_device_group', already_dev.pk)
+ except Device.DoesNotExist:
+ pass
+ messages.error(request, _('Form is invalid, check fields and try again'))
+ except IntegrityError as e:
+ if 'unique constraint' in e.message:
+ messages.error(request, _('Duplicate user and port: %s') % e)
+ else:
+ messages.error(request, e)
else:
if devinst is None:
frm = DeviceForm(initial={
diff --git a/queue_mngr.py b/queue_mngr.py
index 78ac157..25d3e47 100755
--- a/queue_mngr.py
+++ b/queue_mngr.py
@@ -18,7 +18,6 @@ obj = {
def on_new_data(client_sock, ip):
- from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release
data = client_sock.recv(16384)
data = loads(data)
action = data['cmd']
@@ -51,5 +50,6 @@ def serve(addr='127.0.0.1', port=5436):
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup()
+ from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release
serve()
diff --git a/static/clientside/custom.css b/static/clientside/custom.css
index 6f3c786..1da3ca9 100644
--- a/static/clientside/custom.css
+++ b/static/clientside/custom.css
@@ -12,8 +12,27 @@ body > .container {
.table thead {
background-color: #ddd;
}
+/* White background in tables */
+.table tr:nth-of-type(2n) {
+ background-color: white;
+}
+
+
.modal-header{border-radius: 4px 4px 0 0;}
.modal-header.warning {background-color: #d2322d;}
.modal-header.success {background-color: #6ad245;}
.modal-header.primary {background-color: #789cbb;}
+
+
+
+html{height: 100%;}
+body{
+ padding: 88px 15px 0;
+ background-image: url(../img/Transparent_snowman_PNG.png);
+ background-repeat: no-repeat;
+ background-position: bottom left;
+ background-attachment: fixed;
+}
+
+
diff --git a/taskapp/templates/taskapp/tasklist.html b/taskapp/templates/taskapp/tasklist.html
index b435074..c206fb9 100644
--- a/taskapp/templates/taskapp/tasklist.html
+++ b/taskapp/templates/taskapp/tasklist.html
@@ -37,7 +37,7 @@
{% if task.abon and task.abon.group %}
{{ task.abon.get_full_name }} |
- {{ task.abon.group.title }}, {{ task.abon.street|default:_('Not assigned') }} {{ task.abon.house|default:_('Not assigned') }} |
+ {{ task.abon.group.title }}, {{ task.abon.street|default:'' }} {{ task.abon.house|default:'' }} |
{% else %}
{% trans 'User does not exist' %} |
--- |