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 }} - + {% 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 %} + + + + + + + + + + +{% for t in tels %} + + + + +{% empty %} + + + +{% endfor %} + +
{% trans 'Telephone' %}{% trans 'Telephone owner' %}
{{ t.0 }}{{ t.1 }}
{% trans 'Telephone numbers not found' %}
+ +
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' %} ---