From 580ea9378aed9ef23ed4804be21c74b167b2d527 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 31 May 2017 13:18:04 +0300 Subject: [PATCH 001/142] =?UTF-8?q?FIXBUG:=20=D0=9D=D0=B5=20=D0=B3=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=B8=D0=BC=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=81=20=D0=B2=D0=B5=D0=B4=D1=83=D1=89=D0=B8=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=BD=D1=83=D0=BB=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/forms.py | 1 + 1 file changed, 1 insertion(+) diff --git a/abonapp/forms.py b/abonapp/forms.py index cf31d19..cc27e2d 100644 --- a/abonapp/forms.py +++ b/abonapp/forms.py @@ -12,6 +12,7 @@ from .formfields import MACAddressField def generate_random_username(length=6, chars=digits, split=2, delimiter=''): username = ''.join([choice(chars) for i in range(length)]) + username = str(int(username)) if split: username = delimiter.join([username[start:start+split] for start in range(0, len(username), split)]) From e2210a2974922d6901a223886427bc429f6ccb1f Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 31 May 2017 17:33:06 +0300 Subject: [PATCH 002/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8C=20=D0=BE=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B5=20=D0=BA=D0=B5=D1=88=D0=B0?= =?UTF-8?q?=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc.txt b/Doc.txt index c361607..0b24ce0 100644 --- a/Doc.txt +++ b/Doc.txt @@ -13,3 +13,6 @@ и ваш класс для своей логики расчёта тарифа ВАЖНО! Для отработки своевременного выключения услуги, время на сервере биллинга и NAS должно быть настроено точно. + +Таблицу кеша статистики лучше сделать в памяти т.к. будет часто обновляться +ALTER TABLE flowcache ENGINE=MEMORY; From 51fbaca2c084b54a53c423bc18cc522abbe1081a Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 31 May 2017 17:34:19 +0300 Subject: [PATCH 003/142] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BD=D1=83=D0=B6=D0=BD=D0=BE=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D0=BE=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/forms.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/abonapp/forms.py b/abonapp/forms.py index cc27e2d..fc07833 100644 --- a/abonapp/forms.py +++ b/abonapp/forms.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -from django.http import QueryDict from datetime import datetime from django.utils.translation import ugettext as _ from django import forms @@ -98,9 +97,6 @@ class Opt82Form(forms.ModelForm): 'port': forms.NumberInput(attrs={'class': 'form-control', 'required': ''}) } - #def save(self, commit=True): - # super().save(commit=commit) - class AbonGroupForm(forms.ModelForm): class Meta: From f374d3ad0f22c59ef5f76440e98df3074de7df93 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 31 May 2017 17:35:40 +0300 Subject: [PATCH 004/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D0=B9=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0=20=D1=81=D1=82=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D0=BA=D0=B8=20=D1=82=D1=80=D0=B0=D1=84=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0,=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=B5?= =?UTF-8?q?=D1=81=D0=BB=D0=B8=20=D1=81=D1=80=D0=B0=D1=84=D0=B8=D0=BA=20?= =?UTF-8?q?=D0=B1=D1=8B=D0=BB=20=D1=81=D0=B5=D0=B3=D0=BE=D0=B4=D0=BD=D1=8F?= =?UTF-8?q?=20=D1=82=D0=BE=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B8=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D1=82=D0=BE=D1=80=D0=BB=D1=8C=D0=BA=D0=BE=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=8B=20=D0=B8=20=D0=BC=D0=B8=D0=BD=D1=83?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD=D0=B5=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D1=84=D0=B8=D0=BA=D0=B0,=20=D0=B8=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B5=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B8=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=B5=D1=89=D1=91=20=D0=B8=20=D0=B4=D0=B5=D0=BD?= =?UTF-8?q?=D1=8C=20=D0=BD=D0=B5=D0=B4=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/templates/abonapp/peoples.html | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/abonapp/templates/abonapp/peoples.html b/abonapp/templates/abonapp/peoples.html index ddaf443..16e9538 100644 --- a/abonapp/templates/abonapp/peoples.html +++ b/abonapp/templates/abonapp/peoples.html @@ -69,13 +69,17 @@ {% endif %} {{ human.username }} - {% if human.is_online %} + {% if human.stat_cache and human.stat_cache.is_online %} {% endif %} - {% if human.traf %} - {{ human.traf.cur_time|date:"H:i" }} + {% if human.stat_cache %} + {% if human.stat_cache.is_today %} + {{ human.stat_cache.last_time|date:"H:i" }} + {% else %} + {{ human.stat_cache.last_time|date:"D H:i" }} + {% endif %} {% endif %} {{ human.ip_address|default:_('Not assigned') }} From dab98a8b5400ab8522b7ffdb5757d85f92df8654 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 31 May 2017 17:36:51 +0300 Subject: [PATCH 005/142] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20view=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=D0=B0=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D0=BA=D0=B8=20=D1=82=D1=80=D0=B0=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/views.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/abonapp/views.py b/abonapp/views.py index db135c9..1152242 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -11,7 +11,7 @@ from django.http import HttpResponse from django.contrib import messages from django.utils.translation import ugettext_lazy as _ -from statistics.models import getModel +from statistics.models import StatCache from tariff_app.models import Tariff from agent import NasFailedResult, Transmitter, NasNetworkError from . import forms @@ -33,8 +33,6 @@ def peoples(request, gid): else: peoples_list = peoples_list.filter(group=gid) - StatModel = getModel() - # фильтр dr, field = mydefs.order_helper(request) if field: @@ -44,10 +42,10 @@ def peoples(request, gid): peoples_list = mydefs.pag_mn(request, peoples_list) for abon in peoples_list: if abon.ip_address is not None: - traf = StatModel.objects.traffic_by_ip(abon.ip_address) - if traf[1] is not None: - abon.traf = traf[1] - abon.is_online =traf[0] + try: + abon.stat_cache = StatCache.objects.get(ip=abon.ip_address) + except StatCache.DoesNotExist: + pass except mydefs.LogicError as e: messages.warning(request, e) From 5fd543c23cafeea3af4615f8e0b7b47e86063b4e Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 31 May 2017 17:39:25 +0300 Subject: [PATCH 006/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=20=D0=BA=D0=B5?= =?UTF-8?q?=D1=88=D0=B0=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=82=D1=80=D0=B0=D1=84=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- statistics/migrations/0002_statcache.py | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 statistics/migrations/0002_statcache.py diff --git a/statistics/migrations/0002_statcache.py b/statistics/migrations/0002_statcache.py new file mode 100644 index 0000000..4710120 --- /dev/null +++ b/statistics/migrations/0002_statcache.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-05-31 17:37 +from __future__ import unicode_literals + +from django.db import migrations, models +import mydefs +import statistics.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('statistics', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='StatCache', + fields=[ + ('last_time', statistics.fields.UnixDateTimeField()), + ('ip', mydefs.MyGenericIPAddressField(max_length=8, primary_key=True, protocol='ipv4', serialize=False)), + ('octets', models.PositiveIntegerField(default=0)), + ('packets', models.PositiveIntegerField(default=0)), + ], + options={ + 'db_table': 'flowcache', + }, + ), + ] From ae181c61b9f384bf13a6fcc7382fd206a9df651f Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 31 May 2017 17:44:08 +0300 Subject: [PATCH 007/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=20=D0=BA=D0=B5?= =?UTF-8?q?=D1=88=D0=B0=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- statistics/models.py | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/statistics/models.py b/statistics/models.py index 6a34c7f..00ea0e3 100644 --- a/statistics/models.py +++ b/statistics/models.py @@ -1,26 +1,14 @@ import math from datetime import datetime, timedelta, date, time -from django.db import models, ProgrammingError, connection +from django.db import models, connection +from django.utils.timezone import now + from mydefs import MyGenericIPAddressField from .fields import UnixDateTimeField -from mydefs import LogicError class StatManager(models.Manager): - def traffic_by_ip(self, ip): - try: - traf = self.order_by('-cur_time').filter(ip=ip, octets__gt=524288)[0] - now = datetime.now() - if traf.cur_time < now - timedelta(minutes=55): - return False, traf - else: - return True, traf - except IndexError: - return False, None - except ProgrammingError as e: - raise LogicError(e) - def chart(self, ip_addr, count_of_parts=12, want_date=date.today()): def byte_to_mbit(x): return ((x/60)*8)/2**20 @@ -42,7 +30,7 @@ class StatManager(models.Manager): charts_times = split_list(charts_times, count_of_parts) charts_times = [avarage(t) for t in charts_times] - charts_data = map(lambda x, y: (x, y), charts_times, charts_octets) + charts_data = zip(charts_times, charts_octets) charts_data = ["{x: new Date(%d), y: %.2f}" % (cd[0], cd[1]) for cd in charts_data] midnight = datetime.combine(want_date, time.min) charts_data.append("{x:new Date(%d),y:0}" % (int(charts_times[-1:][0]) + 1)) @@ -97,10 +85,27 @@ class StatElem(models.Model): abstract = True -def getModel(want_date=datetime.now()): +def getModel(want_date=now()): class DynamicStatElem(StatElem): class Meta: db_table = 'flowstat_%s' % want_date.strftime("%d%m%Y") abstract = False return DynamicStatElem + + +class StatCache(models.Model): + last_time = UnixDateTimeField() + ip = MyGenericIPAddressField(primary_key=True) + octets = models.PositiveIntegerField(default=0) + packets = models.PositiveIntegerField(default=0) + + def is_online(self): + return self.last_time < now() - timedelta(minutes=55) + + def is_today(self): + return date.today() == self.last_time.date() + + + class Meta: + db_table = 'flowcache' From d1d2153fbbfb61b096a46730ffd593df2fde9c54 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 31 May 2017 17:46:15 +0300 Subject: [PATCH 008/142] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BB=D0=BE=D0=B3=D0=B0=20=D0=B7=D0=B2?= =?UTF-8?q?=D0=BE=D0=BD=D0=BA=D0=BE=D0=B2=20=D0=BA=D0=B0=D0=BA=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dialing_app/migrations/0001_initial.py | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 dialing_app/migrations/0001_initial.py diff --git a/dialing_app/migrations/0001_initial.py b/dialing_app/migrations/0001_initial.py new file mode 100644 index 0000000..9459b1a --- /dev/null +++ b/dialing_app/migrations/0001_initial.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-05-30 13:33 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='AsteriskCDR', + fields=[ + ('calldate', models.DateTimeField(default='0000-00-00 00:00:00', primary_key=True, serialize=False)), + ('clid', models.CharField(default='', max_length=80)), + ('src', models.CharField(default='', max_length=80)), + ('dst', models.CharField(default='', max_length=80)), + ('dcontext', models.CharField(default='', max_length=80)), + ('channel', models.CharField(default='', max_length=80)), + ('dstchannel', models.CharField(default='', max_length=80)), + ('lastapp', models.CharField(default='', max_length=80)), + ('lastdata', models.CharField(default='', max_length=80)), + ('duration', models.IntegerField(default=0)), + ('billsec', models.IntegerField(default=0)), + ('start', models.DateTimeField(blank=True, default=None, null=True)), + ('answer', models.DateTimeField(blank=True, default=None, null=True)), + ('end', models.DateTimeField(blank=True, default=None, null=True)), + ('disposition', models.CharField(choices=[('NO ANSWER', 'No answer'), ('FAILED', 'Failed'), ('BUSY', 'Busy'), ('ANSWERED', 'Answered'), ('UNKNOWN', 'Unknown')], default='', max_length=45)), + ('amaflags', models.IntegerField(default=0)), + ('accountcode', models.CharField(default='', max_length=20)), + ('userfield', models.CharField(default='', max_length=255)), + ('uniqueid', models.CharField(default='', max_length=32)), + ], + options={ + 'db_table': 'cdr', + }, + ), + ] From 7492fdcd7a2cc66967724a013f2b2dbe286ba2a6 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 31 May 2017 17:46:40 +0300 Subject: [PATCH 009/142] =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D1=8F=D1=8F=20?= =?UTF-8?q?=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- statistics/migrations/0002_delete_statelem.py | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 statistics/migrations/0002_delete_statelem.py diff --git a/statistics/migrations/0002_delete_statelem.py b/statistics/migrations/0002_delete_statelem.py deleted file mode 100644 index 8fd4fbe..0000000 --- a/statistics/migrations/0002_delete_statelem.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-25 13:27 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('statistics', '0001_initial'), - ] - - operations = [ - migrations.DeleteModel( - name='StatElem', - ), - ] From bfc59e6a8adb2f2809b107ac2f8924975acf1078 Mon Sep 17 00:00:00 2001 From: http Date: Wed, 31 May 2017 17:59:29 +0300 Subject: [PATCH 010/142] =?UTF-8?q?FIXBUG:=20=D1=81=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D1=83=D1=81=20online=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B0=D0=BB=D1=81=D1=8F=20=D0=BD=D0=B0=D0=BE=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=D0=BE=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- statistics/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/statistics/models.py b/statistics/models.py index 00ea0e3..4b32e15 100644 --- a/statistics/models.py +++ b/statistics/models.py @@ -101,7 +101,7 @@ class StatCache(models.Model): packets = models.PositiveIntegerField(default=0) def is_online(self): - return self.last_time < now() - timedelta(minutes=55) + return self.last_time > now() - timedelta(minutes=55) def is_today(self): return date.today() == self.last_time.date() From b1972c2f0bfdc4b4140c97c0b48f73df581f9c42 Mon Sep 17 00:00:00 2001 From: http Date: Wed, 31 May 2017 17:59:59 +0300 Subject: [PATCH 011/142] =?UTF-8?q?=D0=BD=D0=B5=20=D0=BD=D0=B0=D0=B4=D0=BE?= =?UTF-8?q?=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent/netflow/djing_flow.conf | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 agent/netflow/djing_flow.conf diff --git a/agent/netflow/djing_flow.conf b/agent/netflow/djing_flow.conf deleted file mode 100644 index eccdbfa..0000000 --- a/agent/netflow/djing_flow.conf +++ /dev/null @@ -1,6 +0,0 @@ -# Config for djing flow - -version = "0.1"; - -# количество строк на запрос -mysql_rows_per_request = 65735; From a61f960a9e04d49324841e60dd90b740cc9dbf38 Mon Sep 17 00:00:00 2001 From: bashmak Date: Thu, 1 Jun 2017 13:40:19 +0300 Subject: [PATCH 012/142] FIXBUG --- abonapp/pay_systems.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/abonapp/pay_systems.py b/abonapp/pay_systems.py index f0f0606..4835348 100644 --- a/abonapp/pay_systems.py +++ b/abonapp/pay_systems.py @@ -62,13 +62,15 @@ def allpay(request): pays = AllTimePayLog.objects.filter(pay_id=pay_id) if pays.count() > 0: return bad_ret(-100) + + # тут в author передаём учётку абонента, т.к. это он сам через терминал пополняет + abon.add_ballance(abon, pay_amount, comment='AllPay %.2f' % pay_amount) + abon.save(update_fields=['ballance']) + AllTimePayLog.objects.create( pay_id=pay_id, summ=pay_amount ) - # тут в author передаём учётку абонента, т.к. это он сам через терминал пополняет - abon.add_ballance(abon, pay_amount, comment='AllPay %.2f' % pay_amount) - abon.save(update_fields=['ballance']) current_date = timezone.now().strftime("%d.%m.%Y %H:%M:%S") return "" \ "\n" +\ From 379ff1cb70d4f05dfd706daaaedad44cbd3e1904 Mon Sep 17 00:00:00 2001 From: bashmak Date: Thu, 1 Jun 2017 13:41:33 +0300 Subject: [PATCH 013/142] =?UTF-8?q?=D0=A1=D0=BD=D0=BE=D0=B2=D0=B0=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B2=D0=BE=D0=B4=D0=B8=D0=BC=20=D0=BF=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D1=91=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=83=D1=81?= =?UTF-8?q?=D0=BB=D1=83=D0=B3=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/templates/abonapp/peoples.html | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/abonapp/templates/abonapp/peoples.html b/abonapp/templates/abonapp/peoples.html index 2b04bfd..0e95b5e 100644 --- a/abonapp/templates/abonapp/peoples.html +++ b/abonapp/templates/abonapp/peoples.html @@ -50,7 +50,7 @@ {% if order_by == 'house' %}{% endif %} {% trans 'Telephone' %} - + {% trans 'Service' %} {% trans 'Ballance' %} @@ -87,16 +87,16 @@ {{ human.street|default:_('Not assigned') }} {{ human.house|default:_('Not assigned') }} {{ human.telephone }} - + + {% if human.active_tariff %} + {% if perms.tariff_app.change_tariff %} + {{ human.active_tariff.title }} + {% else %} + {{ human.active_tariff.title }} + {% endif %} + {% else %}——— + {% endif %} + {{ human.ballance }} {% if perms.abonapp.delete_abon %} @@ -108,7 +108,7 @@ {% empty %} - + {% trans 'Subscribers not found' %}. {% if perms.abonapp.add_abon %} {% trans 'Add abon' %} @@ -119,7 +119,7 @@ - + {% if perms.abonapp.add_abon %} {% trans 'Add abon' %} From 8885777a8eb5734747824c9bad6487cca7eaad43 Mon Sep 17 00:00:00 2001 From: bashmak Date: Thu, 1 Jun 2017 14:02:04 +0300 Subject: [PATCH 014/142] =?UTF-8?q?=D0=94=D0=BB=D1=8F=20=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D1=82=D0=B5=D0=B6=D0=B5=D0=B9=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B0=D1=82=D0=BE=D0=BC=D0=B0=D1=80=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D1=82=D1=80=D0=B0=D0=BD=D0=B7=D0=B0=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20django?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abonapp/views.py b/abonapp/views.py index 1152242..6de44c6 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -4,6 +4,7 @@ from django.contrib.gis.shortcuts import render_to_text from django.core.exceptions import PermissionDenied from django.db import IntegrityError, ProgrammingError from django.db.models import Count, Q +from django.db.transaction import atomic from django.shortcuts import render, redirect, get_object_or_404, resolve_url from django.contrib.auth.decorators import login_required, permission_required from django.utils import timezone @@ -351,7 +352,7 @@ def opt82(request, gid, uid): return redirect('abonapp:abon_home', gid=gid, uid=uid) -@mydefs.require_ssl +@atomic def terminal_pay(request): from .pay_systems import allpay ret_text = allpay(request) From 42e3b6a6c3a1c8489d76f913c5e86b5f213f2446 Mon Sep 17 00:00:00 2001 From: http Date: Thu, 1 Jun 2017 15:32:41 +0300 Subject: [PATCH 015/142] =?UTF-8?q?=D0=B2=D1=8B=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D1=83=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=83?= =?UTF-8?q?=D1=81=D0=BB=D1=83=D0=B3=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clientsideapp/templates/clientsideapp/services.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clientsideapp/templates/clientsideapp/services.html b/clientsideapp/templates/clientsideapp/services.html index b900a28..c9e39a7 100644 --- a/clientsideapp/templates/clientsideapp/services.html +++ b/clientsideapp/templates/clientsideapp/services.html @@ -21,8 +21,8 @@
  • {% if abon_tariff == current_service %} - + {% else %} From 8c51ec3b1e2efaac649843bd73452d51f5693a67 Mon Sep 17 00:00:00 2001 From: http Date: Thu, 1 Jun 2017 15:33:20 +0300 Subject: [PATCH 016/142] FIXBUG --- abonapp/forms.py | 1 - 1 file changed, 1 deletion(-) diff --git a/abonapp/forms.py b/abonapp/forms.py index fc07833..2bb9bad 100644 --- a/abonapp/forms.py +++ b/abonapp/forms.py @@ -11,7 +11,6 @@ from .formfields import MACAddressField def generate_random_username(length=6, chars=digits, split=2, delimiter=''): username = ''.join([choice(chars) for i in range(length)]) - username = str(int(username)) if split: username = delimiter.join([username[start:start+split] for start in range(0, len(username), split)]) From c6e309e4781b87ec29877e54ab35594353425f23 Mon Sep 17 00:00:00 2001 From: http Date: Thu, 1 Jun 2017 15:34:08 +0300 Subject: [PATCH 017/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B0=D1=82=D0=BE=D0=BC=D0=B0=D1=80=D0=BD=D1=83=D1=8E?= =?UTF-8?q?=20=D1=82=D1=80=D0=B0=D0=BD=D0=B7=D0=B0=D0=BA=D1=86=D0=B8=D1=8E?= =?UTF-8?q?=20=D0=B2=20=D0=BF=D0=BB=D0=B0=D1=82=D1=91=D0=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abonapp/views.py b/abonapp/views.py index 1152242..6de44c6 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -4,6 +4,7 @@ from django.contrib.gis.shortcuts import render_to_text from django.core.exceptions import PermissionDenied from django.db import IntegrityError, ProgrammingError from django.db.models import Count, Q +from django.db.transaction import atomic from django.shortcuts import render, redirect, get_object_or_404, resolve_url from django.contrib.auth.decorators import login_required, permission_required from django.utils import timezone @@ -351,7 +352,7 @@ def opt82(request, gid, uid): return redirect('abonapp:abon_home', gid=gid, uid=uid) -@mydefs.require_ssl +@atomic def terminal_pay(request): from .pay_systems import allpay ret_text = allpay(request) From 18bea3eb4803be1a9311af918a803339c06ddb2e Mon Sep 17 00:00:00 2001 From: bashmak Date: Fri, 2 Jun 2017 13:51:57 +0300 Subject: [PATCH 018/142] =?UTF-8?q?FIXBUG:=20=D0=BF=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- accounts_app/locale/ru/LC_MESSAGES/django.po | 6 ++++++ accounts_app/views.py | 16 +++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/accounts_app/locale/ru/LC_MESSAGES/django.po b/accounts_app/locale/ru/LC_MESSAGES/django.po index ba3578d..16426bd 100644 --- a/accounts_app/locale/ru/LC_MESSAGES/django.po +++ b/accounts_app/locale/ru/LC_MESSAGES/django.po @@ -184,3 +184,9 @@ msgstr "Редактировать" msgid "Set a task" msgstr "Дать задачу" + +msgid "Empty password, fill it" +msgstr "Пустой пароль, впишите что-то в пароль" + +msgid "New password is empty, fill it" +msgstr "Новый пароль пустой, придумайте себе пароль" diff --git a/accounts_app/views.py b/accounts_app/views.py index b8c8961..910328d 100644 --- a/accounts_app/views.py +++ b/accounts_app/views.py @@ -4,7 +4,6 @@ from django.contrib.auth import authenticate, login, logout from django.core.exceptions import PermissionDenied from django.core.urlresolvers import NoReverseMatch from django.shortcuts import render, redirect, get_object_or_404, resolve_url -from django.http import Http404 from django.contrib.auth.models import Group, Permission from django.contrib import messages from django.utils.translation import ugettext as _ @@ -129,14 +128,21 @@ def ch_info(request): user.telephone = request.POST.get('telephone') psw = request.POST.get('oldpasswd') - if psw != '': + if psw != '' and psw is not None: if user.check_password(psw): newpasswd = request.POST.get('newpasswd') - user.set_password(newpasswd) + if newpasswd != '' and newpasswd is not None: + user.set_password(newpasswd) + user.save() + request.user = user + logout(request) + return redirect('acc_app:other_profile', uid=user.pk) + else: + messages.error(request, _('New password is empty, fill it')) else: messages.error(request, _('Wrong password')) - user.save() - request.user = user + else: + messages.warning(request, _('Empty password, fill it')) return render(request, 'accounts/settings/ch_info.html', { 'user': request.user From f51e8eb1f89014d087ed7f4f337e1f09e4001706 Mon Sep 17 00:00:00 2001 From: bashmak Date: Fri, 2 Jun 2017 15:39:07 +0300 Subject: [PATCH 019/142] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D1=8F=D0=BB=20=D0=B0=D1=82=D0=BE=D0=BC=D0=B0=D1=80?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D1=82=D1=80=D0=B0=D0=BD=D0=B7=D0=B0=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BA=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=BC=20=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/views.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/abonapp/views.py b/abonapp/views.py index 6de44c6..6b450fd 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -190,6 +190,7 @@ def delentity(request): @login_required @permission_required('abonapp.can_add_ballance') +@atomic def abonamount(request, gid, uid): abon = get_object_or_404(models.Abon, pk=uid) try: @@ -398,6 +399,7 @@ def add_invoice(request, gid, uid): @login_required @permission_required('abonapp.can_buy_tariff') +@atomic def pick_tariff(request, gid, uid): grp = get_object_or_404(models.AbonGroup, pk=gid) abon = get_object_or_404(models.Abon, pk=uid) @@ -457,6 +459,7 @@ def chpriority(request, gid, uid): @login_required @permission_required('abonapp.can_complete_service') +@atomic def complete_service(request, gid, uid, srvid): abtar = get_object_or_404(models.AbonTariff, pk=srvid) abon = abtar.abon @@ -516,6 +519,7 @@ def complete_service(request, gid, uid, srvid): @login_required @permission_required('abonapp.can_activate_service') +@atomic def activate_service(request, gid, uid, srvid): abtar = get_object_or_404(models.AbonTariff, pk=srvid) amount = abtar.calc_amount_service() From ebeea963331d9de2c6757946ffac649bd9f22cc9 Mon Sep 17 00:00:00 2001 From: bashmak Date: Fri, 2 Jun 2017 15:39:24 +0300 Subject: [PATCH 020/142] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D1=8F=D0=BB=20=D0=B0=D1=82=D0=BE=D0=BC=D0=B0=D1=80?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D1=82=D1=80=D0=B0=D0=BD=D0=B7=D0=B0=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BA=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=BC=20=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clientsideapp/locale/ru/LC_MESSAGES/django.po | 38 ++++++++++++++++++ clientsideapp/views.py | 39 +++++++++++-------- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/clientsideapp/locale/ru/LC_MESSAGES/django.po b/clientsideapp/locale/ru/LC_MESSAGES/django.po index 6b08e8a..d418db2 100644 --- a/clientsideapp/locale/ru/LC_MESSAGES/django.po +++ b/clientsideapp/locale/ru/LC_MESSAGES/django.po @@ -162,3 +162,41 @@ msgstr "Комментарий" #: clientsideapp/templates/clientsideapp/pays.html:25 msgid "You have not spent payments" msgstr "У вас нет проведённых платежей" + +msgid "Buy the service via user side, service '%s'" +msgstr "Покупка тарифного плана через личный кабинет, тариф '%s'" + +msgid "" +"You are subscribed on new service. " +"That will enable service when your current service has expired." + +msgstr "" +"Вы подписались на новую услугу. Она встала на очередь подключений. " +"Когда закончится ваша текущая услуга, то включится эта" + +msgid "Service '%s' has been finished" +msgstr "Услуга '%s' успешно завершена" + +msgid "The service '%s' wan successfully activated" +msgstr "Услуга '%s' успешно активирована" + +msgid "Early terminated service '%s' via client side" +msgstr "Досрочное завершение услуги '%s' из личного кабинета" + +msgid "Act is not confirmed" +msgstr "Действие не подтверждено" + +msgid "Temporary network bug" +msgstr "Временные неполадки в сети" + +msgid "You has been successfully unsubscribed from service, '%s'" +msgstr "Вы успешно отписались от услуги, '%s'" + +msgid "The service was not found" +msgstr "Указанная подписка на услугу не найдена" + +msgid "Are you not sure that you want buy the service?" +msgstr "Вы не уверены что хотите оплатить долг?" + +msgid "Your account have not enough money" +msgstr "Недостаточно средств на счету" diff --git a/clientsideapp/views.py b/clientsideapp/views.py index fb3d785..5db6210 100644 --- a/clientsideapp/views.py +++ b/clientsideapp/views.py @@ -4,6 +4,8 @@ from django.contrib.gis.shortcuts import render_to_text from django.shortcuts import render, get_object_or_404, redirect from django.contrib import messages from django.utils import timezone +from django.db.transaction import atomic +from django.utils.translation import ugettext_lazy as _ from abonapp.models import AbonLog, AbonTariff, InvoiceForPayment, Abon from tariff_app.models import Tariff @@ -41,16 +43,17 @@ def services(request): @login_required +@atomic def buy_service(request, srv_id): abon = get_object_or_404(Abon, pk=request.user.pk) service = get_object_or_404(Tariff, pk=srv_id) try: current_service = abon.active_tariff() if request.method == 'POST': - abon.pick_tariff(service, request.user, 'Покупка тарифного плана через личный кабинет, тариф "%s"' - % service) - messages.success(request, 'Вы подписались на новую услугу. Она встала на очередь подключений. ' - 'Когда закончится ваша текущая услуга, то включится эта') + abon.pick_tariff(service, request.user, _("Buy the service via user side, service '%s'") + % service) + messages.success(request, _('You are subscribed on new service. ' + 'That will enable service when your current service has expired.')) else: return render_to_text('clientsideapp/modal_service_buy.html', { 'service': service, @@ -64,6 +67,7 @@ def buy_service(request, srv_id): @login_required +@atomic def complete_service(request, srv_id): abtar = get_object_or_404(AbonTariff, id=srv_id) service = abtar.tariff @@ -75,15 +79,15 @@ def complete_service(request, srv_id): if finish_confirm == 'yes': # удаляем запись о текущей услуге. abtar.delete() - messages.success(request, 'Услуга "%s" успешно завершена' % service.title) + messages.success(request, _("Service '%s' has been finished") % service.title) AbonLog.objects.create( abon=abtar.abon, amount=0.0, author=abtar.abon, - comment='Досрочное завершение услуги "%s" из личного кабинета' % service.title + comment=_("Early terminated service '%s' via client side") % service.title ) else: - messages.error(request, 'Действие не подтверждено') + messages.error(request, _('Act is not confirmed')) else: time_use = RuTimedelta(timezone.now() - abtar.time_start) return render_to_text('clientsideapp/modal_complete_service.html', { @@ -96,11 +100,12 @@ def complete_service(request, srv_id): except NasFailedResult as e: messages.error(request, e) except NasNetworkError: - messages.error(request, 'Временные неполадки') + messages.error(request, _('Temporary network bug')) return redirect('client_side:services') @login_required +@atomic def unsubscribe_service(request, srv_id): abtar = get_object_or_404(AbonTariff, id=srv_id) service = abtar.tariff @@ -109,24 +114,25 @@ def unsubscribe_service(request, srv_id): # досрочно завершаем услугу if request.POST.get('finish_confirm') == 'yes': AbonTariff.objects.get(pk=srv_id).delete() - messages.success(request, 'Вы успешно отписались от услуги, "%s"' % service.title) + messages.success(request, _("You has been successfully unsubscribed from service, '%s'") % service.title) else: - messages.error(request, 'Действие не подтверждено') + messages.error(request, _('Act is not confirmed')) else: return render_to_text('clientsideapp/modal_unsubscribe_service.html', { 'abtar': abtar, 'service': service }, request=request) except AbonTariff.DoesNotExist: - messages.error(request, 'Указанная подписка на услугу не найдена') + messages.error(request, _('The service was not found')) except NasFailedResult as e: messages.error(request, e) except NasNetworkError: - messages.error(request, 'Временные неполадки') + messages.error(request, _('Temporary network bug')) return redirect('client_side:services') @login_required +@atomic def activate_service(request, srv_id): abtar = get_object_or_404(AbonTariff, id=srv_id) service = abtar.tariff @@ -136,9 +142,9 @@ def activate_service(request, srv_id): # активируем услугу if request.POST.get('finish_confirm') == 'yes': abtar.activate(request.user) - messages.success(request, 'Услуга "%s" успешно активирована' % service.title) + messages.success(request, _("The service '%s' wan successfully activated") % service.title) else: - messages.error(request, 'Запрос не подтверждён') + messages.error(request, _('Act is not confirmed')) return redirect('client_side:services') except NasFailedResult as e: messages.error(request, e) @@ -164,6 +170,7 @@ def debts_list(request): @login_required +@atomic def debt_buy(request, d_id): debt = get_object_or_404(InvoiceForPayment, id=d_id) abon = get_object_or_404(Abon, id=request.user.id) @@ -171,9 +178,9 @@ def debt_buy(request, d_id): try: sure = request.POST.get('sure') if sure != 'on': - raise LogicError('Вы не уверены что хотите оплатить долг?') + raise LogicError(_("Are you not sure that you want buy the service?")) if abon.ballance < debt.amount: - raise LogicError('Не достаточно средств на счету') + raise LogicError(_('Your account have not enough money')) abon.make_pay(request.user, debt.amount) debt.set_ok() From e871d4f4f925948c02d5c580ecb09014a25ae165 Mon Sep 17 00:00:00 2001 From: bashmak Date: Fri, 2 Jun 2017 16:56:50 +0300 Subject: [PATCH 021/142] =?UTF-8?q?=D1=83=D0=BA=D1=80=D0=B0=D1=81=D0=B8?= =?UTF-8?q?=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/templates/devapp/ports.html | 78 ++++++------------------------ 1 file changed, 14 insertions(+), 64 deletions(-) diff --git a/devapp/templates/devapp/ports.html b/devapp/templates/devapp/ports.html index 21ea774..d2cad97 100644 --- a/devapp/templates/devapp/ports.html +++ b/devapp/templates/devapp/ports.html @@ -14,29 +14,30 @@ {% for port in ports %} {% if port.st %} {% if port.sp == 10 %} -
    +
    {% elif port.sp == 100 %} -
    +
    {% elif port.sp == 1000 %} -
    +
    {% else %} -
    +
    {% endif %} {% else %} -
    +
    {% endif %} - + {{ port.num }} - + {% else %} + + + + {% endif %}
    {% empty %}

    {% trans 'We have not received info, please check options :(' %}

    @@ -65,58 +66,7 @@ - 1 - Err:Disable - port Eth1 state Down - 21 Dec 12:14:55 - - - 2 - Err:bug - port Eth1 state Up - 21 Dec 12:15:23 - - - 3 - Err:Other - port Eth1 state Up - 21 Dec 12:15:45 - - - 1 - Err:Disable - port Eth1 state Down - 21 Dec 12:14:55 - - - 1 - Err:Disable - port Eth1 state Down - 21 Dec 12:14:55 - - - 1 - Err:Disable - port Eth1 state Down - 21 Dec 12:14:55 - - - 1 - Err:Disable - port Eth1 state Down - 21 Dec 12:14:55 - - - 1 - Err:Disable - port Eth1 state Down - 21 Dec 12:14:55 - - - 1 - Err:Disable - port Eth1 state Down - 21 Dec 12:14:55 + Coming soon.. From bb8c8351445e83c2443ac0de9d3c9c904facd02e Mon Sep 17 00:00:00 2001 From: bashmak Date: Fri, 2 Jun 2017 16:57:02 +0300 Subject: [PATCH 022/142] =?UTF-8?q?=D1=83=D0=BA=D1=80=D0=B0=D1=81=D0=B8?= =?UTF-8?q?=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/locale/ru/LC_MESSAGES/django.po | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/devapp/locale/ru/LC_MESSAGES/django.po b/devapp/locale/ru/LC_MESSAGES/django.po index c376b20..4350c64 100644 --- a/devapp/locale/ru/LC_MESSAGES/django.po +++ b/devapp/locale/ru/LC_MESSAGES/django.po @@ -41,11 +41,11 @@ msgstr "ONU Голова" #: devapp/templates/devapp/group_list.html:7 #: devapp/templates/devapp/group_list.html:10 msgid "Groups" -msgstr "" +msgstr "Группы" #: devapp/templates/devapp/add_dev.html:8 msgid "Add new device" -msgstr "" +msgstr "Добавить устройство" #: devapp/templates/devapp/add_dev.html:14 #: devapp/templates/devapp/ports.html:143 @@ -84,7 +84,7 @@ msgstr "Точка топологии" #: devapp/templates/devapp/add_dev.html:71 devapp/templates/devapp/dev.html:59 msgid "User group" -msgstr "" +msgstr "Группа" #: devapp/templates/devapp/add_dev.html:81 devapp/templates/devapp/dev.html:69 msgid "Save" @@ -118,7 +118,7 @@ msgstr "Устройства без группы" #: devapp/templates/devapp/group_list.html:18 msgid "Group title" -msgstr "" +msgstr "Название" #: devapp/templates/devapp/group_list.html:28 #, fuzzy @@ -128,7 +128,7 @@ msgstr "Эта точка не пингуется" #: devapp/templates/devapp/group_list.html:37 msgid "Add group" -msgstr "" +msgstr "Добавить группу" #: devapp/templates/devapp/olt.html:13 msgid "Mac" @@ -224,3 +224,9 @@ msgstr "Ошибка SNMP на устройстве" msgid "Edit" msgstr "Редактировать" + +msgid "Enable port" +msgstr "Включить порт" + +msgid "Disable port" +msgstr "Выключить порт" From 6112fdb2998be6ab9aede28bac88a414f6ffe7e7 Mon Sep 17 00:00:00 2001 From: bashmak Date: Fri, 2 Jun 2017 17:00:50 +0300 Subject: [PATCH 023/142] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D1=81=D0=BA=D0=BB=D0=BE=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/locale/ru/LC_MESSAGES/django.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abonapp/locale/ru/LC_MESSAGES/django.po b/abonapp/locale/ru/LC_MESSAGES/django.po index 5be7d30..e94f112 100644 --- a/abonapp/locale/ru/LC_MESSAGES/django.po +++ b/abonapp/locale/ru/LC_MESSAGES/django.po @@ -853,7 +853,7 @@ msgid "SNMP error on device" msgstr "Ошибка в SNMP на устройстве" msgid "Charts" -msgstr "Графики" +msgstr "График" msgid "Sub information" msgstr "Информация абонента" From 1ed45e2370192cfd9559a997f2e591d660eea37c Mon Sep 17 00:00:00 2001 From: bashmak Date: Fri, 2 Jun 2017 17:04:12 +0300 Subject: [PATCH 024/142] =?UTF-8?q?=D0=97=D0=B0=D0=B2=D0=B5=D1=80=D1=88?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=83=D1=87=D1=91=D1=82=20=D0=B2=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=B7=D0=BE=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bugs.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/bugs.txt b/bugs.txt index fa0bb2e..b93b54a 100644 --- a/bugs.txt +++ b/bugs.txt @@ -7,4 +7,3 @@ - Доделать везде переводы - Не надо коннектиться к микротику когда не собираемся ничего изменять. А то при сохранении залогинились и вышли без действий - Не удаляет просроченные услуги если не пингуется NAS -- Надо отменить учёт временной зоны From 9a96374bec123e10e9f80cf93a750f3d758ce3a8 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Mon, 5 Jun 2017 18:11:02 +0300 Subject: [PATCH 025/142] FIXBUG --- clientsideapp/templates/clientsideapp/ext.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clientsideapp/templates/clientsideapp/ext.html b/clientsideapp/templates/clientsideapp/ext.html index 5e2b2bd..da140c9 100644 --- a/clientsideapp/templates/clientsideapp/ext.html +++ b/clientsideapp/templates/clientsideapp/ext.html @@ -11,7 +11,7 @@ -/head> + +
    + +{% 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) }) From 0883996aceb1946278ef5bfe9949f7a548874ec9 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 5 Jul 2017 13:51:49 +0300 Subject: [PATCH 080/142] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/migrations/0005_auto_20170502_2232.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devapp/migrations/0005_auto_20170502_2232.py b/devapp/migrations/0005_auto_20170502_2232.py index 104ce71..91cbe61 100644 --- a/devapp/migrations/0005_auto_20170502_2232.py +++ b/devapp/migrations/0005_auto_20170502_2232.py @@ -15,6 +15,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='device', name='devtype', - field=models.CharField(choices=[('Dl', 'DLink switch'), ('Pn', 'PON ONU')], default='Dl', max_length=2), + field=models.CharField(choices=[('Dl', 'DLink switch'), ('Pn', 'PON OLT')], default='Dl', max_length=2), ), ] From fc2168a61f2a0d129af20e066fc8765ab773d935 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 5 Jul 2017 13:52:19 +0300 Subject: [PATCH 081/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- accounts_app/locale/ru/LC_MESSAGES/django.po | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/accounts_app/locale/ru/LC_MESSAGES/django.po b/accounts_app/locale/ru/LC_MESSAGES/django.po index 571b3b8..d3c7a5c 100644 --- a/accounts_app/locale/ru/LC_MESSAGES/django.po +++ b/accounts_app/locale/ru/LC_MESSAGES/django.po @@ -188,3 +188,9 @@ msgstr "Редактировать" msgid "Set a task" msgstr "Дать задачу" + +msgid "Please select an image" +msgstr "Пожалуйста выберите изображение" + +msgid "Avatar successfully changed" +msgstr "Аватар успешно изменён" From 3964455bfaf590458ee3fac30fb42ae49e91b192 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 5 Jul 2017 13:53:09 +0300 Subject: [PATCH 082/142] =?UTF-8?q?=D0=9F=D1=80=D0=B8=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D1=82=D0=B0=20=D0=BD=D0=B5=20=D1=83=D1=87?= =?UTF-8?q?=D0=B8=D1=82=D1=8B=D0=B2=D0=B0=D0=B5=D0=BC=20=D0=B4=D0=B8=D0=BD?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9=20=D0=BE?= =?UTF-8?q?=D0=BD=20=D0=B8=D0=BB=D0=B8=20=D0=BD=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent/mod_mikrotik.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/agent/mod_mikrotik.py b/agent/mod_mikrotik.py index 05cf43f..2d17233 100644 --- a/agent/mod_mikrotik.py +++ b/agent/mod_mikrotik.py @@ -375,8 +375,7 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager): def add_user_range(self, user_list): for usr in user_list: - if hasattr(usr, 'is_dhcp') and not usr.is_dhcp(): - self.add_user(usr) + self.add_user(usr) def remove_user_range(self, users): queue_ids = [usr.queue_id for usr in users if usr is not None] From b552f3b3cbc12a67ad8ae2b3b6de845bcbc84f21 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 5 Jul 2017 13:54:38 +0300 Subject: [PATCH 083/142] =?UTF-8?q?Super()=20=D0=B2=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=20=D0=BD=D0=BE=D1=82=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- photo_app/models.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/photo_app/models.py b/photo_app/models.py index edc9748..5f33500 100644 --- a/photo_app/models.py +++ b/photo_app/models.py @@ -27,9 +27,7 @@ class Photo(models.Model): def save(self, *args, **kwargs): if not self.image: return - - super().save() - + super(Photo, self).save() im = Image.open(self.image.path) im.thumbnail((759, 759), Image.ANTIALIAS) @@ -44,8 +42,7 @@ class Photo(models.Model): im.save(fname) os.remove(self.image.path) self.image = "%s.%s" % (hs, ext) - super().save() - + super(Photo, self).save() # class Meta: # unique_together = (('image',),) From a49570fded18a77d8efcc77837f5cfa5c90acfa0 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 5 Jul 2017 13:55:21 +0300 Subject: [PATCH 084/142] =?UTF-8?q?ajax=20=D1=82=D0=B0=D0=B1=D1=8B=20?= =?UTF-8?q?=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D0=BD=D0=B5=20=D0=BD?= =?UTF-8?q?=D1=83=D0=B6=D0=BD=D1=8B,=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B8=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/js/my.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/static/js/my.js b/static/js/my.js index d7be95e..34416b7 100644 --- a/static/js/my.js +++ b/static/js/my.js @@ -72,15 +72,6 @@ $(document).ajaxError(function (ev, jqXHR, ajaxSettings, thrownError) { $(document).ready(function () { - // ajax tabs - $('.nav-tabs a').on('show.bs.tab', function (e) { - var ct = $(e.target).attr('href'); - var remoteUrl = $(this).attr('data-tab-remote'); - if (remoteUrl !== '') { - $(ct).load(remoteUrl); - } - }); - // Live html5 image preview if (window.File && window.FileReader && window.FileList && window.Blob) { $('input[type=file].live_review').on('change', function () { From 1ee557f383a752dc1bdb7c01f1535c6173e4b931 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 5 Jul 2017 13:56:27 +0300 Subject: [PATCH 085/142] =?UTF-8?q?=D0=90=D0=B4=D0=B0=D0=BF=D1=82=D0=B5?= =?UTF-8?q?=D1=80=20=D0=B4=D0=BB=D1=8F=20calc=5Ftype=20choices=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B6=D0=BD=D0=BE=20=D0=B1=D1=8B=D0=BB=D0=BE=20=D1=83?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D1=82=D0=B8=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tariff_app/models.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/tariff_app/models.py b/tariff_app/models.py index 04aa970..0981537 100644 --- a/tariff_app/models.py +++ b/tariff_app/models.py @@ -5,21 +5,13 @@ from .custom_tariffs import TariffBase, TARIFF_CHOICES from mydefs import MyChoicesAdapter -# Класс похож на адаптер. Предназначен для Django CHOICES чтоб можно было передавать классывместо просто описания поля, -# классы передавать для того чтоб по значению из базы понять какой класс нужно взять для расчёта стоимости тарифа. -class _TariffChoicesAdapter(MyChoicesAdapter): - # На вход принимает кортеж кортежей, вложенный из 2х элементов: кода и класса, как: TARIFF_CHOICES - def __init__(self): - super().__init__(TARIFF_CHOICES) - - class Tariff(models.Model): title = models.CharField(max_length=32) descr = models.CharField(max_length=256) speedIn = models.FloatField(default=0.0) speedOut = models.FloatField(default=0.0) amount = models.FloatField(default=0.0) - calc_type = models.CharField(max_length=2, default=TARIFF_CHOICES[0][0], choices=_TariffChoicesAdapter()) + calc_type = models.CharField(max_length=2, default=TARIFF_CHOICES[0][0], choices=MyChoicesAdapter(TARIFF_CHOICES)) is_admin = models.BooleanField(default=False) # Возвращает потомок класса TariffBase, методы которого дают нужную логику оплаты по тарифу From 7fc1d0457e38532b505436c08166791ca7bdbfdc Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 5 Jul 2017 13:56:56 +0300 Subject: [PATCH 086/142] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8?= =?UTF-8?q?=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tariff_app/templates/tariff_app/tarifs.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tariff_app/templates/tariff_app/tarifs.html b/tariff_app/templates/tariff_app/tarifs.html index 70e88d6..0105d1c 100644 --- a/tariff_app/templates/tariff_app/tarifs.html +++ b/tariff_app/templates/tariff_app/tarifs.html @@ -43,10 +43,11 @@ + {% with can_ch_trf=perms.tariff_app.change_tariff can_del_trf=perms.tariff_app.delete_tariff %} {% for tar in tariflist %} - {% if perms.tariff_app.change_tariff %} + {% if can_ch_trf %} {{ tar.title }} {% else %} {{ tar.title }} @@ -57,7 +58,7 @@ {{ tar.amount }} руб {{ tar.get_calc_type_display }} - {% if perms.tariff_app.delete_tariff %} + {% if can_del_trf %} @@ -73,6 +74,7 @@ {% endfor %} + {% endwith %} {% if perms.tariff_app.add_tariff %} From e83b4baefcad7a858a93813ffd61f43587bb769c Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 5 Jul 2017 16:30:58 +0300 Subject: [PATCH 087/142] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8=20=D0=B0=D0=B1=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/migrations/0021_auto_20170705_1403.py | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 abonapp/migrations/0021_auto_20170705_1403.py diff --git a/abonapp/migrations/0021_auto_20170705_1403.py b/abonapp/migrations/0021_auto_20170705_1403.py new file mode 100644 index 0000000..16a2a15 --- /dev/null +++ b/abonapp/migrations/0021_auto_20170705_1403.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-07-05 14:03 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('devapp', '0006_auto_20170705_1403'), + ('abonapp', '0020_auto_20170517_1655'), + ] + + operations = [ + migrations.RemoveField( + model_name='abon', + name='opt82', + ), + migrations.DeleteModel( + name='Opt82', + ), + migrations.AddField( + model_name='abon', + name='dev_port', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='devapp.Port'), + ), + migrations.AddField( + model_name='abon', + name='device', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='devapp.Device'), + ), + migrations.AddField( + model_name='abon', + name='is_dynamic_ip', + field=models.BooleanField(default=False), + ), + migrations.DeleteModel( + name='AbonDevice', + ), + ] From 869f7d8ca1aa322c070619a0653441c18dc7d7b4 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 5 Jul 2017 16:32:55 +0300 Subject: [PATCH 088/142] =?UTF-8?q?=D0=9F=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- statistics/migrations/0002_statcache.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/statistics/migrations/0002_statcache.py b/statistics/migrations/0002_statcache.py index 4710120..391ea4e 100644 --- a/statistics/migrations/0002_statcache.py +++ b/statistics/migrations/0002_statcache.py @@ -28,4 +28,7 @@ class Migration(migrations.Migration): 'db_table': 'flowcache', }, ), + migrations.DeleteModel( + name='StatElem', + ), ] From ced88f1d1670888a4fbaf33295f47f793e66f182 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 5 Jul 2017 16:33:34 +0300 Subject: [PATCH 089/142] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8=20=D0=B0=D0=B1=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/migrations/0006_auto_20170705_1403.py | 48 ++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 devapp/migrations/0006_auto_20170705_1403.py diff --git a/devapp/migrations/0006_auto_20170705_1403.py b/devapp/migrations/0006_auto_20170705_1403.py new file mode 100644 index 0000000..33d3b75 --- /dev/null +++ b/devapp/migrations/0006_auto_20170705_1403.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-07-05 14:03 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import djing.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('devapp', '0005_auto_20170502_2232'), + ] + + operations = [ + migrations.RemoveField( + model_name='portstates', + name='port', + ), + migrations.RemoveField( + model_name='port', + name='speed', + ), + migrations.AddField( + model_name='device', + name='mac_addr', + field=djing.fields.MACAddressField(blank=True, integer=True, null=True, unique=True), + ), + migrations.AddField( + model_name='device', + name='parent_dev', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='devapp.Device'), + ), + migrations.AddField( + model_name='port', + name='descr', + field=models.CharField(blank=True, max_length=60, null=True), + ), + migrations.AlterField( + model_name='device', + name='devtype', + field=models.CharField(choices=[('Dl', 'DLink switch'), ('Pn', 'PON OLT'), ('On', 'PON ONU')], default='Dl', max_length=2), + ), + migrations.DeleteModel( + name='PortStates', + ), + ] From c5b05225394b483f37953ec9f38dec2efbc42bd5 Mon Sep 17 00:00:00 2001 From: bashmak Date: Thu, 6 Jul 2017 16:03:55 +0300 Subject: [PATCH 090/142] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent/commands/dhcp.py | 1 - 1 file changed, 1 deletion(-) diff --git a/agent/commands/dhcp.py b/agent/commands/dhcp.py index 8fe1579..fd39c4e 100644 --- a/agent/commands/dhcp.py +++ b/agent/commands/dhcp.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -from builtins import print from django.core.exceptions import MultipleObjectsReturned from django.utils.translation import ugettext as _ from abonapp.models import Abon From 4e6365cab9ec34aac370e53a387ad847920ecf3b Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Sat, 8 Jul 2017 14:37:00 +0300 Subject: [PATCH 091/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20uptime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/templates/devapp/olt.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/devapp/templates/devapp/olt.html b/devapp/templates/devapp/olt.html index f47a296..0e7fa10 100644 --- a/devapp/templates/devapp/olt.html +++ b/devapp/templates/devapp/olt.html @@ -6,6 +6,9 @@
    + {% if uptime %} + {% trans 'Uptime' %} {{ uptime }} + {% endif %} From 6d02eb304a805b89782ed3a8e6e44b5ab9caa023 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Sat, 8 Jul 2017 14:37:27 +0300 Subject: [PATCH 092/142] =?UTF-8?q?=D0=B2=D1=8B=D1=80=D0=B0=D0=B2=D0=BD?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BB=D0=BE=D0=B3=D0=BE=D1=82=D0=B8=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/css/custom.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/static/css/custom.css b/static/css/custom.css index 78c1330..06e30fb 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -247,3 +247,8 @@ button[data-toggle=offcanvas]{ * Сужаем аудио элемент чтоб скрыть большинство контролов */ audio{width: 100px;} + +a.navbar-brand { + padding-left: 88px; +} + From d1fa4a35c8773a187670962afc1ad47de9f874e2 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Thu, 13 Jul 2017 16:58:36 +0300 Subject: [PATCH 093/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=20title=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0?= =?UTF-8?q?=20=D0=BC=D0=B0=D0=BA=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B0.=20=D0=98=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=B0=20=D0=B2=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BE=D0=BA=20=D0=BF=D0=BE=D1=80=D1=82=D0=BE=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/templates/abonapp/editAbon.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/abonapp/templates/abonapp/editAbon.html b/abonapp/templates/abonapp/editAbon.html index 1ee030e..e3b2bcc 100644 --- a/abonapp/templates/abonapp/editAbon.html +++ b/abonapp/templates/abonapp/editAbon.html @@ -140,7 +140,7 @@
    {% if device %} - + {{ device.comment|truncatechars:11 }} {{ device.ip_address }} @@ -162,9 +162,9 @@ {% for port in dev_ports %} {% if port == abon.dev_port %} - + {% else %} - + {% endif %} {% empty %} From 69abcc31a73ddf016ecdfc1e1d0ba2c067860d4e Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Thu, 13 Jul 2017 17:01:07 +0300 Subject: [PATCH 094/142] =?UTF-8?q?FIXBUG:=20=D0=BA=D0=BE=D0=B3=D0=B4?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=20=D0=B2=D1=8B=D0=B1=D1=80=D0=B0=D0=BD=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=80=D1=82=20=D1=82=D0=BE=20=D0=B2=D1=8B=D0=BB?= =?UTF-8?q?=D0=B5=D1=82=D0=B0=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/views.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/abonapp/views.py b/abonapp/views.py index 5ed1b9e..2771ee5 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -851,10 +851,13 @@ def save_user_dev_port(request, gid, uid): if request.method != 'POST': messages.error(request, _('Method is not POST')) return redirect('abonapp:abon_home', gid, uid) - user_port = request.POST.get('user_port') + user_port = mydefs.safe_int(request.POST.get('user_port')) is_dynamic_ip = request.POST.get('is_dynamic_ip') try: - port = DevPort.objects.get(pk=user_port) + if user_port == 0: + port = None + else: + port = DevPort.objects.get(pk=user_port) abon = models.Abon.objects.get(pk=uid) abon.dev_port = port if abon.is_dynamic_ip != is_dynamic_ip: From 2c0e35c524943a9127df8a46181da715608ef664 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Thu, 13 Jul 2017 17:02:10 +0300 Subject: [PATCH 095/142] =?UTF-8?q?FIXBUG:=20=D0=BA=D0=BE=D0=B3=D0=B4?= =?UTF-8?q?=D0=B0=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=BE=20=D0=BD=D0=B5=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF?= =?UTF-8?q?=D0=BD=D0=BE,=20=D1=82=D0=BE=20=D0=BD=D0=B5=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=B0=D1=82=D1=8B=D0=B2=D0=B0=D0=BB=D0=BE?= =?UTF-8?q?=D1=81=D1=8C=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BE=D0=B1=20=D1=8D=D1=82=D0=BE=D0=BC=20=D0=B8?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=BB=D0=B5=D1=82=D0=B0=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/views.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/devapp/views.py b/devapp/views.py index 6c65228..2d0a23b 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -154,6 +154,7 @@ def add_ports(request, devid): return "p:%d\tM:%s\tT:%s" % (self.pid, self.text) try: + res_ports = list() dev = Device.objects.get(pk=devid) if dev.user_group is None: messages.error(request, _('Device is not have a group, please fix that')) @@ -193,6 +194,8 @@ def add_ports(request, devid): return redirect('devapp:group_list') except DeviceDBException as e: messages.error(request, e) + except EasySNMPTimeoutError: + messages.error(request, _('wait for a reply from the SNMP Timeout')) return render(request, 'devapp/manage_ports/add_ports.html', { 'ports': res_ports, 'dev': dev From ed08ba5449dd98724365d00e9f114f15586bf913 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Thu, 13 Jul 2017 17:06:05 +0300 Subject: [PATCH 096/142] =?UTF-8?q?=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D0=B5=D1=81=D0=BB=D0=B8=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=BE=20=D0=BD=D0=B5=20=D0=B4=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=83=D0=BF=D0=BD=D0=BE=20=D0=BD=D0=B0=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B5=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D1=80=D1=82?= =?UTF-8?q?=D0=BE=D0=B2,=20=D1=82=D0=BE=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B8=D1=82=D1=8C?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=BD?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/templates/devapp/manage_ports/add_ports.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/devapp/templates/devapp/manage_ports/add_ports.html b/devapp/templates/devapp/manage_ports/add_ports.html index 0addfc8..33bb77c 100644 --- a/devapp/templates/devapp/manage_ports/add_ports.html +++ b/devapp/templates/devapp/manage_ports/add_ports.html @@ -70,10 +70,14 @@
    From ba60bb6cafe8893cf49498878b11171c7a4b2ba3 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Thu, 13 Jul 2017 17:21:42 +0300 Subject: [PATCH 097/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D1=81=D1=8B=D0=BB=D1=8C=20=D0=BD=D0=B0=20=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=B0,=20=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D1=81=D0=BA=D0=BE=D0=B5=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE,?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B4=D0=BF=D0=B8=D1=81=D0=B8=20=D1=87=D1=82?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B8=D1=82=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=B6=D0=B4=D0=BE=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/devapp/custom_dev_page/onu.html | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/devapp/templates/devapp/custom_dev_page/onu.html b/devapp/templates/devapp/custom_dev_page/onu.html index 85c02f5..0a70d20 100644 --- a/devapp/templates/devapp/custom_dev_page/onu.html +++ b/devapp/templates/devapp/custom_dev_page/onu.html @@ -14,16 +14,25 @@
    From b581b2533c0c02bb20325dc042767fd2b00bd6f0 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Thu, 13 Jul 2017 17:22:38 +0300 Subject: [PATCH 098/142] =?UTF-8?q?=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4=D0=BE=D0=B2..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/locale/ru/LC_MESSAGES/django.po | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/devapp/locale/ru/LC_MESSAGES/django.po b/devapp/locale/ru/LC_MESSAGES/django.po index edc5c92..2ba0d21 100644 --- a/devapp/locale/ru/LC_MESSAGES/django.po +++ b/devapp/locale/ru/LC_MESSAGES/django.po @@ -1,4 +1,3 @@ -# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE"S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Dmitry Novikov nerosketch@gmail.com, 2017. @@ -33,7 +32,7 @@ msgstr "не нашёл мак" #: devapp/dev_types.py:116 msgid "PON OLT" -msgstr "ONU Голова" +msgstr "PON OLT голова" #: devapp/templates/devapp/add_dev.html:7 #: devapp/templates/devapp/devices.html:7 @@ -283,3 +282,10 @@ msgstr "MAC-адрес необходим для заполнения" msgid "Device with that mac is already exist" msgstr "Устройство с этим мак-адресом уже есть" + +msgid "Parent device" +msgstr "Родительское устройство" + +msgid "Attached user" +msgstr "Прикрепленный абонент" + From fb3fb799af90955debb4c9de935a60dd3e22ba2e Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Sat, 15 Jul 2017 10:25:01 +0300 Subject: [PATCH 099/142] =?UTF-8?q?FIXBUG:=20=D0=B2=D1=8B=D0=BB=D0=B5?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=D0=BE=20=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=8B=D1=82=D0=B0=D0=B5=D0=BC=D1=81=D1=8F=20=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D1=8C=20=D0=B8=20=D0=BD=D0=B5=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- searchapp/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/searchapp/views.py b/searchapp/views.py index e9155fe..4e5a8d4 100644 --- a/searchapp/views.py +++ b/searchapp/views.py @@ -4,12 +4,14 @@ from django.shortcuts import render from django.utils.html import escape from abonapp.models import Abon from mydefs import ip_addr_regex +from django.contrib.auth.decorators import login_required def replace_without_case(orig, old, new): return re.sub(old, new, orig, flags=re.IGNORECASE) +@login_required def home(request): s = request.GET.get('s') s = s.replace('+', '') From b113b23dfd306f1970842da7a6eb1ba053b21e95 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Sat, 15 Jul 2017 10:26:23 +0300 Subject: [PATCH 100/142] =?UTF-8?q?FIXBUG:=20=D0=BD=D0=B5=20=D0=B2=D0=B8?= =?UTF-8?q?=D0=B4=D0=BD=D0=BE=20=D0=B1=D1=8B=D0=BB=D0=BE=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D1=83=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=82=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/all_base.html | 3 --- 1 file changed, 3 deletions(-) diff --git a/templates/all_base.html b/templates/all_base.html index 7c66202..956692e 100644 --- a/templates/all_base.html +++ b/templates/all_base.html @@ -44,9 +44,6 @@ - {% url 'client_side:home' as client_url %} - Кабинет клиента -
    - {% if perms.devapp.add_port %} + {% if perms.devapp.add_port and ports %} + {% else %} + {% endif %}
    @@ -31,10 +21,14 @@ {% for log in logs %} - diff --git a/dialing_app/templates/vmail.html b/dialing_app/templates/vmail.html new file mode 100644 index 0000000..fb4169a --- /dev/null +++ b/dialing_app/templates/vmail.html @@ -0,0 +1,57 @@ +{% extends request.is_ajax|yesno:'nullcont.htm,ext.html' %} +{% load i18n %} +{% load telephone_filters %} +{% block content %} + +
    +
    - + + + + + {{ log.calldate|date:'d E Y, H:i:s' }} {{ log.src|abon_if_telephone|safe }}
    + + + + + + + + + + + + + + + {% for vmail in vmessages %} + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
    {% trans 'Play' %}{% trans 'calldate' %}{% trans 'src' %}{% trans 'Type' %}{% trans 'duration' %}{% trans 'start' %}{% trans 'answer' %}{% trans 'end' %}{% trans 'disposition' %}
    + + + + + {{ vmail.calldate|date:'d E Y, H:i:s' }}{{ vmail.src|abon_if_telephone|safe }} + {% if vmail.userfield == 'request' %}{% trans 'Request' %} + {% elif vmail.userfield == 'report' %}{% trans 'Report' %} + {% else %}{{ vmail.userfield }}{% endif %} + {{ vmail.duration }}{{ vmail.start|date:'d E Y, H:i:s' }}{{ vmail.answer|date:'d E Y, H:i:s' }}{{ vmail.end|date:'d E Y, H:i:s' }}{{ vmail.locate_disposition }}
    {% trans 'Calls was not found' %}
    +
    + + {% include 'toolbar_page.html' with pag=vmessages %} + +{% endblock %} diff --git a/dialing_app/urls.py b/dialing_app/urls.py index 20b529f..a35f0e2 100644 --- a/dialing_app/urls.py +++ b/dialing_app/urls.py @@ -4,5 +4,6 @@ from . import views urlpatterns = [ url(r'^$', views.home, name='home'), - url(r'^to_abon(?P\+?\d+)$', views.to_abon, name='to_abon') + url(r'^to_abon(?P\+?\d+)$', views.to_abon, name='to_abon'), + url(r'^voicemail$', views.vmail, name='vmail') ] diff --git a/dialing_app/views.py b/dialing_app/views.py index 9125ccc..a190c23 100644 --- a/dialing_app/views.py +++ b/dialing_app/views.py @@ -13,8 +13,10 @@ from .models import AsteriskCDR def home(request): logs = AsteriskCDR.objects.order_by('-calldate') logs = pag_mn(request, logs) + title = _('Last calls') return render(request, 'index.html', { - 'logs': logs + 'logs': logs, + 'title': title }) @@ -34,3 +36,14 @@ def to_abon(request, tel): else: return redirect('abonapp:group_list') + +@login_required +@only_admins +def vmail(request): + title = _('Voice mail') + cdr = AsteriskCDR.objects.filter(userfield='request').order_by('-calldate') + cdr = pag_mn(request, cdr) + return render(request, 'vmail.html', { + 'title': title, + 'vmessages': cdr + }) \ No newline at end of file diff --git a/static/js/my.js b/static/js/my.js index 34416b7..7dc9601 100644 --- a/static/js/my.js +++ b/static/js/my.js @@ -40,7 +40,6 @@ $(document).ajaxError(function (ev, jqXHR, ajaxSettings, thrownError) { var hr = a.attr('href'); var tx = a.text(); selecthid.val(hr.substr(1)); - console.debug(tx); selectbtn.text(tx).removeClass('hidden'); selectinp.addClass('hidden').val(tx); }; @@ -70,6 +69,54 @@ $(document).ajaxError(function (ev, jqXHR, ajaxSettings, thrownError) { })(jQuery); +// AudioPlayer +(function ($) { + $.fn.aplayer = function(){ + + var def_play = function(e){ + var audiotag = e.data['audiotag'][0]; + + if(audiotag.readyState == 0){ + $(this).prop('disabled', true); + return; + }else + $(this).prop('disabled', false); + + if(audiotag.paused) + audiotag.play(); + else + audiotag.pause(); + }; + + var def_canplay = function(){ + var els = $(this).parent(); + els.prop('disabled', false).removeClass('disabled'); + els.siblings().prop('disabled', false).removeClass('disabled'); + }; + + var def_on_play = function(){ + $(this).siblings('span.glyphicon').attr('class', 'glyphicon glyphicon-pause'); + }; + + var def_on_pause = function(){ + $(this).siblings('span.glyphicon').attr('class', 'glyphicon glyphicon-play'); + }; + + this.each(function(){ + var i = $(this); + var audiotag = i.children('audio'); + var icon = i.children('span.glyphicon'); + i.on('click', {'audiotag': audiotag}, def_play); + audiotag.on('canplay', def_canplay); + audiotag.on('play', def_on_play); + audiotag.on('pause', def_on_pause); + }); + + }; +})(jQuery); + + + $(document).ready(function () { // Live html5 image preview @@ -138,6 +185,8 @@ $(document).ready(function () { self.html(r.dat); }); return false; - }) + }); + + $('button.player-btn').aplayer(); }); From 603c73cbe485373e81e4be69c2263d16d323323e Mon Sep 17 00:00:00 2001 From: bashmak Date: Mon, 17 Jul 2017 15:36:02 +0300 Subject: [PATCH 105/142] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=83=D1=82=D0=B8=D0=BB=D0=B8,=20=D0=BE=D0=BD=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=BD=D1=83=D0=B6=D0=BD=D1=8B=20=D0=B1=D0=BE=D0=BB?= =?UTF-8?q?=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- djing/utils/load_dot_from_nodeny.py | 32 ---- djing/utils/load_from_nodeny.py | 92 --------- djing/utils/push_snmp_passw.py | 45 ----- djing/utils/save_dot_from_nodeny.py | 29 --- djing/utils/save_from_nodeny.py | 280 ---------------------------- 5 files changed, 478 deletions(-) delete mode 100644 djing/utils/load_dot_from_nodeny.py delete mode 100755 djing/utils/load_from_nodeny.py delete mode 100644 djing/utils/push_snmp_passw.py delete mode 100644 djing/utils/save_dot_from_nodeny.py delete mode 100755 djing/utils/save_from_nodeny.py diff --git a/djing/utils/load_dot_from_nodeny.py b/djing/utils/load_dot_from_nodeny.py deleted file mode 100644 index e8310d7..0000000 --- a/djing/utils/load_dot_from_nodeny.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/env python3 -# coding=utf-8 - -import os -import MySQLdb -from json import dumps - - -if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") - - db = MySQLdb.connect(host="localhost", user="root", passwd="ps", db="nodeny", charset='utf8') - cursor = db.cursor() - - result = dict() - - # выбираем абонентов - sql = r"SELECT location, descr FROM places WHERE location LIKE 'Сад_%'" - cursor.execute(sql) - places = list() - res = cursor.fetchone() - while res: - places.append({ - 'loc': res[0], - 'descr': res[1] - }) - res = cursor.fetchone() - - db.close() - f = open('../../places.json', 'w') - f.write(dumps(places, ensure_ascii=False).encode('utf8')) - f.close() diff --git a/djing/utils/load_from_nodeny.py b/djing/utils/load_from_nodeny.py deleted file mode 100755 index c8aa523..0000000 --- a/djing/utils/load_from_nodeny.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/env python3 -# coding=utf-8 - -import MySQLdb -from json import dumps, loads - - -def param_to_python(st): - st = st.replace('$VAR1 = ', '') - st = st.replace("'", '"') - st = st.replace(" =>", ':') - st = st.replace(";", '') - return loads(st) - - -def load_service(cursor, uid): - sql = "SELECT services.title, services.service_id, services.price, services.description, services.param " \ - "FROM services LEFT JOIN users_services ON " \ - "(users_services.service_id=services.service_id) WHERE users_services.uid=%d" % uid - cursor.execute(sql) - service_line = cursor.fetchone() - if service_line is not None: - service = { - 'title': service_line[0], - 'service_id': service_line[1], - 'price': service_line[2], - 'description': service_line[3], - 'param': param_to_python(service_line[4]) - } - else: - service = None - return service - - -def load_users(cursor, grp_id): - # выбираем абонентов - sql = r"SELECT users.name, users.fio, data0._adr_telefon, dictionary.v AS street, data0._adr_house, data0._birthday, " \ - "users.grp, INET_NTOA(ip_pool.ip) AS ip, users.balance, AES_DECRYPT(users.passwd, 'Vu6saiZa') as decr_passwd, users.id, " \ - "mac_uid.device_mac, mac_uid.device_port, mac_uid.oneconnect " \ - "FROM users " \ - "LEFT JOIN data0 ON (data0.uid = users.id) LEFT JOIN dictionary ON (dictionary.k = data0._adr_street AND dictionary.type = 'street') " \ - "LEFT JOIN mac_uid ON (mac_uid.uid=users.id) " \ - "LEFT JOIN ip_pool ON (ip_pool.uid = users.id) WHERE users.grp = %d" % grp_id - cursor.execute(sql) - users = [{ - 'name': res[0], - 'fio': res[1], - 'tel': res[2], - 'street': str(res[3] or ''), - 'house': str(res[4]), - 'birth': res[5], - 'grp': int(res[6]), - 'ip': str(res[7] or ''), - 'balance': float(res[8]), - 'passw': res[9].decode("utf-8") if res[9] is not None else '', - 'service': load_service(cursor, int(res[10])), - 'opt82': { - 'dev_mac': res[11], - 'dev_port': res[12], - 'oneconnect': res[13] - } - } for res in cursor.fetchall()] - return users - - -def load_groups(cursor): - # выбираем группы - sql = r'SELECT grp_id, grp_name FROM user_grp' - cursor.execute(sql) - groups = list() - for res in cursor.fetchall(): - users = load_users(cursor=cursor, grp_id=int(res[0])) - groups.append({ - 'gid': int(res[0]), - 'gname': res[1], - 'users': users - }) - return groups - - - -if __name__ == "__main__": - db = MySQLdb.connect(host="127.0.0.1", user="user", passwd="password", db="db", charset='utf8') - cursor = db.cursor() - - result = dict() - - result = load_groups(cursor=cursor) - db.close() - f = open('dump.json', 'w') - f.write(dumps(result, ensure_ascii=False)) - f.close() diff --git a/djing/utils/push_snmp_passw.py b/djing/utils/push_snmp_passw.py deleted file mode 100644 index 7d9d181..0000000 --- a/djing/utils/push_snmp_passw.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -import telnetlib -from mydefs import ping -from socket import error -from multiprocessing import Process - - -# Пробуем настроить свичи через telnet на snmp - - -def cmd(ip): - tn = telnetlib.Telnet(ip) - tn.read_until("login: ") - tn.write("\n") - tn.read_until("Password: ") - tn.write("\n") - - tn.write("create snmp community ertNjuWr ReadWrite\n") - tn.write("save\n") - tn.write("save config\n") - tn.write("save config config_id 1\n") - - tn.write("log\n") - print((tn.read_all())) - tn.close() - - -def prc(ip): - try: - if ping(ip): - cmd(ip) - except error: - print(('Error connect to', ip)) - - -if __name__ == '__main__': - proc_list = list() - with open('swips.txt', 'r') as f: - for ln in f: - ip = ln.strip() - p = Process(target=prc, args=(ip,)) - p.start() - proc_list.append(p) - for proc in proc_list: - proc.join() diff --git a/djing/utils/save_dot_from_nodeny.py b/djing/utils/save_dot_from_nodeny.py deleted file mode 100644 index e58f844..0000000 --- a/djing/utils/save_dot_from_nodeny.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/env python3 -# coding=utf-8 - -import os -from json import load -import django - - -if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") - django.setup() - from devapp.models import Device - - with open('../../places.json', 'r') as f: - dat = load(f) - - for dt in dat: - if dt['descr']: - dt['descr']=dt['descr'].replace('10.15.', '10.115.') - dt['loc']=dt['loc'].encode('utf8') - try: - dev = Device.objects.get(ip_address=dt['descr']) - except Device.DoesNotExist: - dev = Device( - ip_address=dt['descr'] - ) - dev.comment=dt['loc'] - dev.save() - print((dt['descr'], dt['loc'], dev)) diff --git a/djing/utils/save_from_nodeny.py b/djing/utils/save_from_nodeny.py deleted file mode 100755 index ab5cc4b..0000000 --- a/djing/utils/save_from_nodeny.py +++ /dev/null @@ -1,280 +0,0 @@ -#!/bin/env python3 -# coding=utf-8 - -import os -from json import load -import django -from django.utils import timezone -from django.core.exceptions import ValidationError -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") -django.setup() -from abonapp.models import Abon, AbonGroup, AbonRawPassword, AbonStreet, AbonTariff, Opt82 -from ip_pool.models import IpPoolItem -from tariff_app.models import Tariff - - -class DumpService(object): - price = 0.0 - speedIn = 0.0 - speedOut = 0.0 - - def __init__(self, obj=None): - if obj is None: return - self.title = obj['title'] - self.price = obj['price'] - self.description = obj['description'] - self.speedIn = int(obj['param']['speed_in1']) / 1000000 - self.speedOut = int(obj['param']['speed_out1']) / 1000000 - - @staticmethod - def build_from_db(obj): - self = DumpService() - self.title = obj.title - self.price = obj.amount - self.description = obj.descr - self.speedIn = obj.speedIn - self.speedOut = obj.speedOut - return self - - def __eq__(self, other): - assert isinstance(other, DumpService) - print('DBG:', type(other.price), other.price, type(self.price), self.price) - r = self.price == other.price - r = r and self.speedIn == other.speedIn - r = r and self.speedOut == other.speedOut - return r - - def __ne__(self, other): - return not self.__eq__(other) - - def __str__(self): - return "%s; '%.2f', %f %f" % (self.title, self.price, self.speedIn, self.speedOut) - - -class DumpAbon(object): - - def __init__(self, obj=None): - if obj is None: return - self.name = obj['name'] - self.fio = obj['fio'] - self.tel = obj['tel'] - self.street = obj['street'] - self.house = obj['house'] - self.birth = obj['birth'] - self.grp = obj['grp'] - self.ip = obj['ip'] if obj['ip'] != '' else None - self.balance = obj['balance'] - self.passw = obj['passw'] - if obj['opt82']['dev_mac'] is not None and obj['opt82']['dev_port'] is not None: - self.opt82 = { - 'dev_mac': obj['opt82']['dev_mac'], - 'dev_port': obj['opt82']['dev_port'] - } - - if obj['service'] is not None: - self.service = DumpService(obj['service']) - else: - self.service = None - - @staticmethod - def build_from_django(obj): - assert isinstance(obj, Abon) - self = DumpAbon() - self.name = obj.username - self.fio = obj.fio - self.tel = obj.telephone - self.street = obj.street - self.house = obj.house - self.birth = obj.birth_day - if obj.group is None: - self.grp = None - else: - self.grp = obj.group.pk - if obj.ip_address is None: - self.ip = None - else: - self.ip = obj.ip_address - self.balance = obj.ballance - try: - raw_passw = AbonRawPassword.objects.get(account=obj) - except AbonRawPassword.DoesNotExist: - raw_passw = '' - self.passw = raw_passw - srv = obj.active_tariff() - if srv is not None: - self.service = DumpService.build_from_db(srv) - else: - self.service = None - if obj.opt82 is not None and obj.opt82.mac is not None and obj.opt82.port is not None: - self.opt82 = { - 'dev_mac': obj.opt82.mac, - 'dev_port': obj.opt82.port - } - return self - - def __eq__(self, other): - assert isinstance(other, DumpAbon) - r = self.name == other.name - r = r and self.name == other.name - r = r and self.fio == other.fio - r = r and self.tel == other.tel - r = r and self.street == other.street - r = r and self.house == other.house - r = r and self.birth == other.birth - r = r and self.grp == other.grp - r = r and self.ip == other.ip - r = r and self.balance == other.ballance - return r - - def __ne__(self, other): - return not self.__eq__(other) - - -def add_service_if_not_exist(service): - assert isinstance(service, DumpService) - try: - obj = Tariff.objects.get(speedIn=service.speedIn, speedOut=service.speedOut, amount=service.price) - except Tariff.DoesNotExist: - obj = Tariff.objects.create( - title=service.title, - descr=service.description, - speedIn=service.speedIn, - speedOut=service.speedOut, - amount=service.price, - calc_type='Dp' - ) - return obj - - -def add_raw_password_if_not_exist(acc, raw_passw): - try: - psw = AbonRawPassword.objects.get(account=acc) - #if psw != raw_passw: - # psw.passw_text = raw_passw - # psw.save(update_fields=['passw_text']) - except AbonRawPassword.DoesNotExist: - psw = AbonRawPassword.objects.create(account=acc, passw_text=raw_passw) - return psw - - -def add_opt82_if_not_exist(mac, port): - print(mac, port) - try: - opt82 = Opt82.objects.get(mac=mac, port=port) - except Opt82.DoesNotExist: - opt82 = Opt82.objects.create(mac=mac, port=port) - return opt82 - - -def load_users(obj, group): - if len(obj) < 1: - return - for usr in obj: - # абонент из дампа - dump_abon = DumpAbon(usr) - # абонент из биллинга - print('\t', dump_abon.name, dump_abon.fio, dump_abon.ip) - try: - abon = Abon.objects.get(username=dump_abon.name) - bl_abon = DumpAbon.build_from_django(abon) - if bl_abon != dump_abon: - update_user(abon, dump_abon, group) - except Abon.DoesNotExist: - # добавляем абонента - abon = add_user(dump_abon, group) - if abon is None: - raise Exception("Чё за херня!? Не создался абонент") - - abon_service_from_dump = dump_abon.service - if abon_service_from_dump is None: - continue - abon_service = add_service_if_not_exist(abon_service_from_dump) - try: - AbonTariff.objects.get(abon=abon, tariff=abon_service) - except AbonTariff.DoesNotExist: - calc_obj = abon_service.get_calc_type()(abon_service) - AbonTariff.objects.create( - abon=abon, - tariff=abon_service, - time_start=timezone.now(), - deadline=calc_obj.calc_deadline() - ) - try: - if hasattr(dump_abon, 'opt82'): - abon.opt82 = add_opt82_if_not_exist(dump_abon.opt82['dev_mac'], dump_abon.opt82['dev_port']) - abon.save(update_fields=['opt82']) - except ValidationError as e: - print('\t', e) - - -def add_user(obj, user_group): - assert isinstance(obj, DumpAbon) - street = None - ip = None - try: - if obj.ip is not None: - ip = IpPoolItem.objects.get(ip=obj.ip) - street = AbonStreet.objects.get(name=obj.street, group=user_group) - except IpPoolItem.DoesNotExist: - if obj.ip is not None: - ip = IpPoolItem.objects.create(ip=obj.ip) - except AbonStreet.DoesNotExist: - street = AbonStreet.objects.create(name=obj.street, group=user_group) - - abon = Abon() - abon.username = obj.name - abon.fio = obj.fio - abon.telephone = obj.tel - abon.street = street - abon.house = obj.house - abon.birth_day = obj.birth - abon.group = user_group - abon.ip_address = ip - abon.ballance = obj.balance - abon.set_password(obj.passw) - abon.save() - add_raw_password_if_not_exist(abon, obj.passw) - return abon - - -def update_user(db_abon, obj, user_group): - assert isinstance(obj, DumpAbon) - assert isinstance(db_abon, Abon) - street = None - ip = None - try: - if obj.ip is not None: - ip = IpPoolItem.objects.get(ip=obj.ip) - street = AbonStreet.objects.get(name=obj.street, group=user_group) - except IpPoolItem.DoesNotExist: - if obj.ip is not None: - ip = IpPoolItem.objects.create(ip=obj.ip) - except AbonStreet.DoesNotExist: - street = AbonStreet.objects.create(name=obj.street, group=user_group) - db_abon.fio = obj.fio - db_abon.telephone = obj.tel - db_abon.street = street - db_abon.house = obj.house - #db_abon.birth_day = datetime(obj.birth) - db_abon.group = user_group - db_abon.ip_address = ip - db_abon.ballance = obj.balance - db_abon.set_password(obj.passw) - db_abon.save() - add_raw_password_if_not_exist(db_abon, obj.passw) - - -if __name__ == "__main__": - - with open('dump.json', 'r') as f: - dat = load(f) - - for grp in dat: - try: - abgrp=AbonGroup.objects.get(title=grp['gname']) - except AbonGroup.DoesNotExist: - abgrp = AbonGroup.objects.create( - title=grp['gname'] - ) - print(grp['gname']) - load_users(grp['users'], abgrp) From 3409a967f7ff3c241a74d69d62f6a3219c10431b Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Mon, 17 Jul 2017 15:36:47 +0300 Subject: [PATCH 106/142] =?UTF-8?q?=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D0=B0=20=D1=81=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D1=81=D0=BA=D0=BE=D0=B9=20=D1=83?= =?UTF-8?q?=D1=87=D1=91=D1=82=D0=BA=D0=B8=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B8=D0=B2=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- accounts_app/templates/accounts/index.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/accounts_app/templates/accounts/index.html b/accounts_app/templates/accounts/index.html index 1ab3684..b90ee3b 100644 --- a/accounts_app/templates/accounts/index.html +++ b/accounts_app/templates/accounts/index.html @@ -2,6 +2,7 @@ {% load i18n %} {% block content %} +
    @@ -32,5 +33,6 @@ {% endif %}
    +
    -{% endblock %} \ No newline at end of file +{% endblock %} From 9b86f8cf891b3d964d1d095ef3db24be184dba14 Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 22 Jul 2017 11:07:46 +0300 Subject: [PATCH 107/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B8=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8E=20tooltip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/js/my.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/static/js/my.js b/static/js/my.js index 7dc9601..082f437 100644 --- a/static/js/my.js +++ b/static/js/my.js @@ -189,4 +189,6 @@ $(document).ready(function () { $('button.player-btn').aplayer(); + $('[data-toggle="tooltip"]').tooltip({container:'body'}); + }); From cba5321760cbf8c08efdae9eed24d2682702e910 Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 22 Jul 2017 11:08:40 +0300 Subject: [PATCH 108/142] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BD=D1=83=D0=B6=D0=BD=D1=8B=D1=83=D1=8E=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D1=81=D0=BA=D0=B0=D0=B7=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- taskapp/templates/taskapp/footer_btns.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taskapp/templates/taskapp/footer_btns.html b/taskapp/templates/taskapp/footer_btns.html index ae9c76e..add4901 100644 --- a/taskapp/templates/taskapp/footer_btns.html +++ b/taskapp/templates/taskapp/footer_btns.html @@ -1,6 +1,6 @@ {% load i18n %} {% if perms.taskapp.add_task %} - + {% trans 'Add new task' %} {% endif %} From 157fec76d1554a48590a4396f3a2f1172cd0821f Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 22 Jul 2017 11:35:32 +0300 Subject: [PATCH 109/142] =?UTF-8?q?=D0=9F=D0=BE=D0=BC=D0=B5=D0=BD=D1=8F?= =?UTF-8?q?=D0=BB=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20"=D0=BD=D0=B0=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8"=20=D0=BD=D0=B0=20"=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BB=D0=B5=D0=BD=D0=BE".=20=D0=A1=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=8F=D0=BD=D0=B8=D0=B5=D0=BC=20"=D0=BD=D0=B0=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D1=82=D0=BE=20=D0=BD=D0=B5=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D1=83=D0=B5=D1=82=D1=81=D1=8F",=20=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D1=87=D0=B0=D1=82=D1=8C=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D1=87=D0=B8=20=D0=BA=D0=B0=D0=BA=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8=D0=B3=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- taskapp/models.py | 8 ++++---- taskapp/templates/taskapp/ext.htm | 14 +++++++------- taskapp/templates/taskapp/tasklist.html | 18 +++++++++--------- taskapp/templates/taskapp/tasklist_all.html | 16 +++++++++------- ...klist_active.html => tasklist_failed.html} | 12 ++++++------ .../templates/taskapp/tasklist_finish.html | 19 +++++++------------ taskapp/templates/taskapp/tasklist_own.html | 2 +- taskapp/templates/taskapp/view.html | 10 +++++----- taskapp/urls.py | 4 ++-- taskapp/views.py | 10 +++++----- 10 files changed, 55 insertions(+), 58 deletions(-) rename taskapp/templates/taskapp/{tasklist_active.html => tasklist_failed.html} (84%) diff --git a/taskapp/models.py b/taskapp/models.py index e484e04..f4db733 100644 --- a/taskapp/models.py +++ b/taskapp/models.py @@ -18,7 +18,7 @@ TASK_PRIORITIES = ( TASK_STATES = ( ('S', _('New')), - ('C', _('In fulfilling')), + ('C', _('Confused')), ('F', _('Completed')) ) @@ -44,7 +44,7 @@ class ChangeLog(models.Model): ('c', _('Create task')), ('d', _('Delete task')), ('f', _('Completing tasks')), - ('b', _('The task started')) + ('b', _('The task failed')) ) act_type = models.CharField(max_length=1, choices=ACT_CHOICES) when = models.DateTimeField(auto_now_add=True) @@ -89,8 +89,8 @@ class Task(models.Model): ) self.save(update_fields=['state', 'out_date']) - def begin(self, current_user): - self.state = 'C' # Начата + def do_fail(self, current_user): + self.state = 'C' # Провалена ChangeLog.objects.create( task=self, act_type='b', diff --git a/taskapp/templates/taskapp/ext.htm b/taskapp/templates/taskapp/ext.htm index c955a40..04412ba 100644 --- a/taskapp/templates/taskapp/ext.htm +++ b/taskapp/templates/taskapp/ext.htm @@ -23,13 +23,6 @@
  • - {% url 'taskapp:active_tasks' as taskactive %} - - - {% trans 'Active tasks' %} - - - {% url 'taskapp:finished_tasks' as taskfin %} @@ -44,6 +37,13 @@ + {% url 'taskapp:failed_tasks' as taskfailed %} + + + {% trans 'Failed tasks' %} + + + {% url 'taskapp:my_tasks' as taskmy %} diff --git a/taskapp/templates/taskapp/tasklist.html b/taskapp/templates/taskapp/tasklist.html index 7788eaa..a14091c 100644 --- a/taskapp/templates/taskapp/tasklist.html +++ b/taskapp/templates/taskapp/tasklist.html @@ -33,7 +33,7 @@ {% endif %} {% endif %} - {{ task.id }} + {{ task.pk }} {% if task.abon and task.abon.group %} {{ task.abon.get_full_name }} @@ -45,19 +45,19 @@ {{ task.get_mode_display }} {{ task.descr }} - {{ task.author.username }} - {{ task.time_of_create|date:'d N Y H:i:s' }} + {{ task.time_of_create|date:'d E H:i' }} - - - - - + + + + + {% if perms.taskapp.change_task %} - + {% endif %} diff --git a/taskapp/templates/taskapp/tasklist_all.html b/taskapp/templates/taskapp/tasklist_all.html index 6878c2a..710efc1 100644 --- a/taskapp/templates/taskapp/tasklist_all.html +++ b/taskapp/templates/taskapp/tasklist_all.html @@ -46,7 +46,7 @@ {% endif %} {% endif %} - {{ task.id }} + {{ task.pk }} {% if task.abon and task.abon.group %} {{ task.abon.get_full_name }} @@ -59,22 +59,24 @@ {{ task.get_mode_display }} {{ task.descr }} {% if task.author %} - {{ task.author.username }} + + {{ task.author.username }} + {% else %} {% trans 'Not assigned' %} {% endif %} {{ task.get_state_display }} - {{ task.time_of_create|date:'d N Y H:i:s' }} + {{ task.time_of_create|date:'d E H:i' }} - + {% if perms.taskapp.change_task %} - + {% endif %} {% if perms.taskapp.can_remind %} - + {% endif %} @@ -90,7 +92,7 @@ {% if perms.taskapp.add_task %} - + {% trans 'Add new task' %} {% endif %} diff --git a/taskapp/templates/taskapp/tasklist_active.html b/taskapp/templates/taskapp/tasklist_failed.html similarity index 84% rename from taskapp/templates/taskapp/tasklist_active.html rename to taskapp/templates/taskapp/tasklist_failed.html index c325927..d93402d 100644 --- a/taskapp/templates/taskapp/tasklist_active.html +++ b/taskapp/templates/taskapp/tasklist_failed.html @@ -33,7 +33,7 @@ {% endif %} {% endif %} - {{ task.id }} + {{ task.pk }} {% if task.abon and task.abon.group %} {{ task.abon.get_full_name }} @@ -45,16 +45,16 @@ {{ task.get_mode_display }} {{ task.descr }} - {{ task.author.username }} - {{ task.time_of_create|date:'d N Y H:i:s' }} + {{ task.time_of_create|date:'d E H:i' }} - - + + {% if perms.taskapp.change_task %} - + {% endif %} diff --git a/taskapp/templates/taskapp/tasklist_finish.html b/taskapp/templates/taskapp/tasklist_finish.html index 3dab8a6..70caf9e 100644 --- a/taskapp/templates/taskapp/tasklist_finish.html +++ b/taskapp/templates/taskapp/tasklist_finish.html @@ -8,12 +8,12 @@ # {% trans 'Name' %} - {% trans 'Address' %} + {% trans 'Address' %} {% trans 'The nature of the damage' %} {% trans 'Description' %} {% trans 'Task author' %} {% trans 'Date of create' %} - {% trans 'Actions' %} + # @@ -33,7 +33,7 @@ {% endif %} {% endif %} - {{ task.id }} + {{ task.pk }} {% if task.abon and task.abon.group %} {{ task.abon.get_full_name }} @@ -45,21 +45,16 @@ {{ task.get_mode_display }} {{ task.descr }} - {{ task.author.username }} - {{ task.time_of_create|date:'d N Y H:i:s' }} + {{ task.time_of_create|date:'d E H:i' }} - + {% if perms.taskapp.change_task %} - + {% endif %} - {% if perms.taskapp.delete_task %} - - - - {% endif %} {% empty %} diff --git a/taskapp/templates/taskapp/tasklist_own.html b/taskapp/templates/taskapp/tasklist_own.html index 030d4db..19f4348 100644 --- a/taskapp/templates/taskapp/tasklist_own.html +++ b/taskapp/templates/taskapp/tasklist_own.html @@ -46,7 +46,7 @@ {{ task.get_mode_display }} {{ task.descr }} {{ task.get_state_display }} - {{ task.time_of_create|date:'d N Y H:i:s' }} + {{ task.time_of_create|date:'d E H:i' }} {% if perms.taskapp.change_task %} diff --git a/taskapp/templates/taskapp/view.html b/taskapp/templates/taskapp/view.html index 5dfe159..0c0a927 100644 --- a/taskapp/templates/taskapp/view.html +++ b/taskapp/templates/taskapp/view.html @@ -5,7 +5,7 @@ {% include 'message_block.html' %} @@ -18,23 +18,23 @@

    {% trans 'Description' %}: {{ task.descr }}

    - {% trans 'Task author' %}: {{ task.author.username }}
    + {% trans 'Task author' %}: {{ task.author.username }}
    {% trans 'Implementers' %}: {% trans 'A priority' %}: {{ task.get_priority_display }}
    {% trans 'The task is valid until' %} {{ task.out_date|date:'d E Y' }}
    - {% trans 'Date of create' %} {{ task.time_of_create|date:'d E Y' }}
    + {% trans 'Date of create' %} {{ task.time_of_create|date:'d E Y H:i:s' }}
    {% trans 'time left' %} {{ time_diff }}
    {% trans 'Task type' %}: {{ task.get_mode_display }}
    {% trans 'Condition' %}: {{ task.get_state_display }}
    {% trans 'Subscriber' %} {% if task.abon %} - {{ task.abon.get_full_name }} + {{ task.abon.get_full_name }} {% else %} {% trans 'Not assigned' %} {% endif %}
    diff --git a/taskapp/urls.py b/taskapp/urls.py index e297e3c..e921f3b 100644 --- a/taskapp/urls.py +++ b/taskapp/urls.py @@ -9,10 +9,10 @@ urlpatterns = [ url(r'^(?P\d+)/edit$', views.task_add_edit, name='edit'), url(r'^(?P\d+)/delete$', views.task_delete, name='delete'), url(r'^(?P\d+)/fin$', views.task_finish, name='finish'), - url(r'^(?P\d+)/begin$', views.task_begin, name='begin'), + url(r'^(?P\d+)/fail$', views.task_failed, name='fail'), url(r'^(?P\d+)/remind', views.remind, name='remind'), url(r'^add$', views.task_add_edit, name='add'), - url(r'^active$', views.active_tasks, name='active_tasks'), + url(r'^failed$', views.failed_tasks, name='failed_tasks'), url(r'^finished$', views.finished_tasks, name='finished_tasks'), url(r'^own$', views.own_tasks, name='own_tasks'), url(r'^my$', views.my_tasks, name='my_tasks'), diff --git a/taskapp/views.py b/taskapp/views.py index ceb764e..c4e1966 100644 --- a/taskapp/views.py +++ b/taskapp/views.py @@ -23,10 +23,10 @@ def home(request): @login_required @only_admins -def active_tasks(request): - tasks = Task.objects.filter(recipients=request.user, state='C') # На выполнении +def failed_tasks(request): + tasks = Task.objects.filter(recipients=request.user, state='C') # Проваленные tasks = pag_mn(request, tasks) - return render(request, 'taskapp/tasklist_active.html', { + return render(request, 'taskapp/tasklist_failed.html', { 'tasks': tasks }) @@ -174,9 +174,9 @@ def task_finish(request, task_id): @login_required @only_admins -def task_begin(request, task_id): +def task_failed(request, task_id): task = get_object_or_404(Task, id=task_id) - task.begin(request.user) + task.do_fail(request.user) return redirect('taskapp:home') From 4d275cc6a871d4a91bea05077efe595beaafb1ac Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 22 Jul 2017 11:45:56 +0300 Subject: [PATCH 110/142] ref --- clientsideapp/templates/clientsideapp/ext.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/clientsideapp/templates/clientsideapp/ext.html b/clientsideapp/templates/clientsideapp/ext.html index da140c9..b19ef15 100644 --- a/clientsideapp/templates/clientsideapp/ext.html +++ b/clientsideapp/templates/clientsideapp/ext.html @@ -71,13 +71,11 @@ Ваш балланс {{ subscriber.ballance }} руб. - - + -
    {% if request.user.is_staff %} From e38421dadf85929e155b2552992b35e6fae588b3 Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 22 Jul 2017 11:47:00 +0300 Subject: [PATCH 111/142] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20"=D0=9F=D1=80=D0=B2=D0=BE=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE"=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- taskapp/locale/ru/LC_MESSAGES/django.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/taskapp/locale/ru/LC_MESSAGES/django.po b/taskapp/locale/ru/LC_MESSAGES/django.po index 9bedd56..019c4d3 100644 --- a/taskapp/locale/ru/LC_MESSAGES/django.po +++ b/taskapp/locale/ru/LC_MESSAGES/django.po @@ -63,8 +63,8 @@ msgid "New" msgstr "Новая" #: taskapp/models.py:21 -msgid "In fulfilling" -msgstr "На выполнении" +msgid "Confused" +msgstr "Провалена" #: taskapp/models.py:22 msgid "Completed" @@ -127,8 +127,8 @@ msgid "Completing tasks" msgstr "Завершение задачи" #: taskapp/models.py:47 -msgid "The task started" -msgstr "Задача начата" +msgid "The task failed" +msgstr "Задача провалена" #: taskapp/models.py:78 msgid "Access to all tasks" @@ -281,8 +281,8 @@ msgid "User does not exist" msgstr "Абонент не найден" #: taskapp/templates/taskapp/tasklist.html:53 -msgid "Begin" -msgstr "Начать" +msgid "Mark as unsuccessful" +msgstr "Отметить задачу как проваленную" #: taskapp/templates/taskapp/tasklist.html:56 #: taskapp/templates/taskapp/tasklist_active.html:53 @@ -358,8 +358,8 @@ msgstr "Нужно выбрать абонента" msgid "Error in the form fields" msgstr "Ошибка в полях формы" -msgid "Active tasks" -msgstr "Активные задачи" +msgid "Failed tasks" +msgstr "Проваленные задачи" msgid "All my tasks" msgstr "Все мои задачи" From 5d69b3bb6bb5fbf732203dfa5fc755bb5a9548e6 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Sat, 22 Jul 2017 11:48:41 +0300 Subject: [PATCH 112/142] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BF=D1=83=D1=82=D1=8C=20=D1=83=20=D0=B7=D0=B2?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D1=8F=D0=BC=20asterisk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dialing_app/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dialing_app/models.py b/dialing_app/models.py index 0e60f4f..ff6c720 100644 --- a/dialing_app/models.py +++ b/dialing_app/models.py @@ -57,7 +57,7 @@ class AsteriskCDR(models.Model): return "%s/recording/request" % path elif self.userfield == 'report': return "%s/recording/bug" % path - return path + return "%s/monitor" % path class Meta: db_table = 'cdr' From 8501ffb5b84f53eb88a099b9a8d5a1fe568738ef Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Sat, 22 Jul 2017 11:50:44 +0300 Subject: [PATCH 113/142] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=80=D0=B0=D1=81=D1=82=D1=8F=D0=B3=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BB=D1=8F=20=D1=80=D1=83=D0=BF?= =?UTF-8?q?=D0=BF=D1=8B=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dialing_app/templates/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dialing_app/templates/index.html b/dialing_app/templates/index.html index ed89478..adc5061 100644 --- a/dialing_app/templates/index.html +++ b/dialing_app/templates/index.html @@ -21,7 +21,7 @@ {% for log in logs %} - +
    +
    + + +
    + + + {% if selected_parent_dev %} + + + {% else %} + + + {% endif %} + {{ form.parent_dev.errors }} +
    +
    +
    - + {% else %} - + {% endif %} {{ form.abon.errors }}
    From 9eb69619df7cc315d5042ee3ac4af9f4cdb4dce2 Mon Sep 17 00:00:00 2001 From: bashmak Date: Mon, 24 Jul 2017 14:21:23 +0300 Subject: [PATCH 120/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D1=81=20=D1=83?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/forms.py | 10 ++++ abonapp/locale/ru/LC_MESSAGES/django.po | 27 ++++++++++ .../templates/abonapp/modal_addstreet.html | 38 +++++++++++++ .../templates/abonapp/modal_editstreet.html | 38 +++++++++++++ abonapp/templates/abonapp/peoples.html | 8 +++ abonapp/urls_abon.py | 3 ++ abonapp/views.py | 54 +++++++++++++++++++ 7 files changed, 178 insertions(+) create mode 100644 abonapp/templates/abonapp/modal_addstreet.html create mode 100644 abonapp/templates/abonapp/modal_editstreet.html diff --git a/abonapp/forms.py b/abonapp/forms.py index 8d57d36..1666c8a 100644 --- a/abonapp/forms.py +++ b/abonapp/forms.py @@ -121,3 +121,13 @@ class ExtraFieldForm(forms.ModelForm): 'field_type': forms.Select(attrs={'class': 'form-control'}), 'data': forms.TextInput(attrs={'class': 'form-control'}) } + + +class AbonStreetForm(forms.ModelForm): + class Meta: + model = models.AbonStreet + fields = '__all__' + widgets = { + 'name': forms.TextInput(attrs={'class': 'form-control', 'required':'', 'autofocus':''}), + 'group': forms.Select(attrs={'class': 'form-control'}) + } diff --git a/abonapp/locale/ru/LC_MESSAGES/django.po b/abonapp/locale/ru/LC_MESSAGES/django.po index bc5df87..46877c6 100644 --- a/abonapp/locale/ru/LC_MESSAGES/django.po +++ b/abonapp/locale/ru/LC_MESSAGES/django.po @@ -653,6 +653,33 @@ msgstr "Не найдены улицы для группы" msgid "Services of subscriber" msgstr "Купленные абонентом услуги (назначенные тарифные планы)" +msgid "Add street" +msgstr "Добавить улицу" + +msgid "Edit streets" +msgstr "Редактировать улицы" + +msgid "Street successfully saved" +msgstr "Улица успешно сохранена" + +msgid "Streets has been saved" +msgstr "Улицы сохранены" + +msgid "Street title" +msgstr "Название улицы" + +msgid "One of these streets has not been found" +msgstr "Одна из этих улиц не была найдена" + +msgid "The street has not been found" +msgstr "Улица не найдена" + +msgid "The street successfully deleted" +msgstr "Улица успешно удалена" + +msgid "Streets has not been found" +msgstr "Улицы не найдены" + #: abonapp/templates/abonapp/services.html:9 msgid "Priority" msgstr "Приоритет" diff --git a/abonapp/templates/abonapp/modal_addstreet.html b/abonapp/templates/abonapp/modal_addstreet.html new file mode 100644 index 0000000..c723157 --- /dev/null +++ b/abonapp/templates/abonapp/modal_addstreet.html @@ -0,0 +1,38 @@ +{% load i18n %} +
    {% csrf_token %} + + + {% include 'message_block.html' %} + + + +
    diff --git a/abonapp/templates/abonapp/modal_editstreet.html b/abonapp/templates/abonapp/modal_editstreet.html new file mode 100644 index 0000000..bf2b39d --- /dev/null +++ b/abonapp/templates/abonapp/modal_editstreet.html @@ -0,0 +1,38 @@ +{% load i18n %} +
    {% csrf_token %} + + + {% include 'message_block.html' %} + + + +
    diff --git a/abonapp/templates/abonapp/peoples.html b/abonapp/templates/abonapp/peoples.html index 0d7d4f7..6dd709f 100644 --- a/abonapp/templates/abonapp/peoples.html +++ b/abonapp/templates/abonapp/peoples.html @@ -149,6 +149,14 @@ {% empty %} {% trans 'No streets found for that group' %} {% endfor %} + diff --git a/abonapp/urls_abon.py b/abonapp/urls_abon.py index ce80f13..357900b 100644 --- a/abonapp/urls_abon.py +++ b/abonapp/urls_abon.py @@ -6,6 +6,9 @@ urlpatterns = [ url(r'^$', views.peoples, name='people_list'), url(r'^addabon$', views.addabon, name='add_abon'), url(r'^services$', views.chgroup_tariff, name='ch_group_tariff'), + url(r'^street/add$', views.street_add, name='street_add'), + url(r'^street/edit', views.street_edit, name='street_edit'), + url(r'^street/(?P\d+)/delete$', views.street_del, name='street_del'), url(r'^(?P\d+)$', views.abonhome, name='abon_home'), url(r'^(?P\d+)/services$', views.abon_services, name='abon_services'), diff --git a/abonapp/views.py b/abonapp/views.py index f579a05..8d0b6ab 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -873,6 +873,60 @@ def save_user_dev_port(request, gid, uid): return redirect('abonapp:abon_home', gid, uid) +@login_required +@permission_required('abonapp.add_abonstreet') +def street_add(request, gid): + if request.method == 'POST': + frm = forms.AbonStreetForm(request.POST) + if frm.is_valid(): + frm.save() + messages.success(request, _('Street successfully saved')) + return redirect('abonapp:people_list', gid) + else: + messages.error(request, _('fix form errors')) + else: + frm = forms.AbonStreetForm(initial={'group': gid}) + return render_to_text('abonapp/modal_addstreet.html', { + 'form': frm, + 'gid': gid + }, request=request) + + +@login_required +@permission_required('abonapp.change_abonstreet') +def street_edit(request, gid): + try: + if request.method == 'POST': + streets_pairs = [(int(sid), sname) for sid, sname in zip(request.POST.getlist('sid'), request.POST.getlist('sname'))] + for sid, sname in streets_pairs: + street = models.AbonStreet.objects.get(pk=sid) + street.name = sname + street.save() + messages.success(request, _('Streets has been saved')) + else: + return render_to_text('abonapp/modal_editstreet.html', { + 'gid': gid, + 'streets': models.AbonStreet.objects.filter(group=gid) + }, request=request) + + except models.AbonStreet.DoesNotExist: + messages.error(request, _('One of these streets has not been found')) + + return redirect('abonapp:people_list', gid) + + +@login_required +@permission_required('abonapp.delete_abonstreet') +def street_del(request, gid, sid): + try: + models.AbonStreet.objects.get(pk=sid, group=gid).delete() + messages.success(request, _('The street successfully deleted')) + except models.AbonStreet.DoesNotExist: + messages.error(request, _('The street has not been found')) + return redirect('abonapp:people_list', gid) + + + # API's def abons(request): From 81dc1a4f0cbff4ba9927d200e46c1ace6f29bc45 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Sat, 29 Jul 2017 13:53:25 +0300 Subject: [PATCH 121/142] =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D1=82=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/abonapp/views.py b/abonapp/views.py index 8d0b6ab..ec65647 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -22,6 +22,7 @@ from devapp.models import Device, Port as DevPort from datetime import datetime, date from taskapp.models import Task from dialing_app.models import AsteriskCDR +from statistics.models import getModel, get_dates @login_required @@ -678,7 +679,6 @@ def clear_dev(request, gid, uid): @login_required @mydefs.only_admins def charts(request, gid, uid): - from statistics.models import getModel high = 100 wandate = request.GET.get('wantdate') @@ -725,7 +725,7 @@ def charts(request, gid, uid): 'abon': abon, 'charts_data': ',\n'.join(charts_data) if charts_data is not None else None, 'high': high, - 'dates': StatElem.objects.get_dates() + 'dates': get_dates() }) From 23fac2bbcc4756158b9cb44d02d052ad98009e5c Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Sat, 29 Jul 2017 13:53:45 +0300 Subject: [PATCH 122/142] =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D1=82=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- statistics/models.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/statistics/models.py b/statistics/models.py index 9bf6b38..c222edc 100644 --- a/statistics/models.py +++ b/statistics/models.py @@ -7,6 +7,12 @@ from mydefs import MyGenericIPAddressField from .fields import UnixDateTimeField +def get_dates(): + tables = connection.introspection.table_names() + tables = [t.replace('flowstat_', '') for t in tables if t.startswith('flowstat_')] + return [datetime.strptime(t, '%d%m%Y').date() for t in tables] + + class StatManager(models.Manager): def chart(self, ip_addr, count_of_parts=12, want_date=date.today()): @@ -41,11 +47,6 @@ class StatManager(models.Manager): else: return - def get_dates(self): - tables = connection.introspection.table_names() - tables = [t.replace('flowstat_', '') for t in tables if t.startswith('flowstat_')] - return [datetime.strptime(t, '%d%m%Y').date() for t in tables] - class StatElem(models.Model): cur_time = UnixDateTimeField(primary_key=True) @@ -55,11 +56,19 @@ class StatElem(models.Model): objects = StatManager() + # ReadOnly def save(self, *args, **kwargs): - return + pass + # ReadOnly def delete(self, *args, **kwargs): - return + pass + + def delete_month(self): + cursor = connection.cursor() + table_name = self._meta.db_table + sql = "DROP TABLE %s;" % table_name + cursor.execute(sql) @staticmethod def percentile(N, percent, key=lambda x:x): From 08ae94452f665f6b6152df9efb14ec6101bfcfcb Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Sat, 29 Jul 2017 13:54:53 +0300 Subject: [PATCH 123/142] =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=20?= =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BE=D0=B4=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D1=87=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devapp/forms.py b/devapp/forms.py index 09a823d..826c714 100644 --- a/devapp/forms.py +++ b/devapp/forms.py @@ -27,7 +27,7 @@ class DeviceForm(forms.ModelForm): 'placeholder': '192.168.0.100', 'class': 'form-control' }), - 'comment': forms.Textarea(attrs={ + 'comment': forms.TextInput(attrs={ 'required': True, 'class': 'form-control' }), From 69f36b831d610f8b33be22d7be4c3cdf47da5e07 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Sat, 29 Jul 2017 13:55:24 +0300 Subject: [PATCH 124/142] fixbug --- mapapp/templates/maps/map_tooltip.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mapapp/templates/maps/map_tooltip.html b/mapapp/templates/maps/map_tooltip.html index b7488b1..a628124 100644 --- a/mapapp/templates/maps/map_tooltip.html +++ b/mapapp/templates/maps/map_tooltip.html @@ -1,7 +1,7 @@

    {{ dot.title }}

    {% for dev in devs %} - + {{ dev.comment }} {% empty %} From db6c18f2276a90c61457b30cb62af951dbd2df54 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Sat, 29 Jul 2017 13:55:49 +0300 Subject: [PATCH 125/142] fixbug --- devapp/dev_types.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/devapp/dev_types.py b/devapp/dev_types.py index 74099df..c759242 100644 --- a/devapp/dev_types.py +++ b/devapp/dev_types.py @@ -62,9 +62,10 @@ class DLinkDevice(DevBase, SNMPBaseWorker): macs = self.get_list(oids['get_ports']['macs']) speeds = self.get_list(oids['get_ports']['speeds']) res = [] - ln = len(macs) + ln = len(speeds) for n in range(ln): status = True if int(stats[n]) == 1 else False + print(len(nams), len(speeds), len(macs)) res.append(DLinkPort( n+1, nams[n] if len(nams) > 0 else _('does not fetch the name'), From 7b97df542d79542e29d942f37c44e240ca0f02f5 Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 29 Jul 2017 14:59:04 +0300 Subject: [PATCH 126/142] Init commit --- systemd_units/djing_telebot.service | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 systemd_units/djing_telebot.service diff --git a/systemd_units/djing_telebot.service b/systemd_units/djing_telebot.service new file mode 100644 index 0000000..535b8c0 --- /dev/null +++ b/systemd_units/djing_telebot.service @@ -0,0 +1,15 @@ +[Unit] +Description=A job for djing + +[Service] +Type=simple +ExecStart=/usr/bin/python3 ./telebot.py > /dev/null +PIDFile=/run/telebot.py.pid +WorkingDirectory=/srv/http/djing +TimeoutSec=9 +Restart=always +User=http +Group=http + +[Install] +WantedBy=multi-user.target From 987e18c1a7f66e6f08310ff2ddd7ddc93a7c4dc6 Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 29 Jul 2017 14:59:48 +0300 Subject: [PATCH 127/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20pid=20=D0=B4=D0=BB=D1=8F=20=D0=BE?= =?UTF-8?q?=D1=82=D1=81=D0=BB=D0=B5=D0=B6=D0=B8=D0=B2=D0=B0=D0=B3=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 952569a..327d758 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,3 +8,4 @@ xmltodict mysqlclient easysnmp rq +pid From 41f68fdfeee2947faed9cf9548468c8cdd8e342b Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 29 Jul 2017 15:00:18 +0300 Subject: [PATCH 128/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20pid=20=D1=87=D1=82=D0=BE=D0=B1=20?= =?UTF-8?q?=D0=BE=D1=82=D1=81=D0=BB=D0=B5=D0=B6=D0=B8=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- telebot.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/telebot.py b/telebot.py index 8669551..b34d78d 100755 --- a/telebot.py +++ b/telebot.py @@ -1,12 +1,14 @@ #!/usr/bin/python3 # -*- coding: utf-8 -*- import os +from pid.decorator import pidfile import django from telepot import DelegatorBot from telepot.delegate import per_chat_id, create_open, pave_event_space -if __name__ == '__main__': +@pidfile() +def main(): os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") django.setup() from chatbot.telebot import token, DjingTelebot @@ -16,3 +18,7 @@ if __name__ == '__main__': ), ]) bot.message_loop(run_forever='Listening ...') + + +if __name__ == '__main__': + main() From a92922fd1150656af61344a26a297eb178e44ab3 Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 29 Jul 2017 15:12:07 +0300 Subject: [PATCH 129/142] init commit --- systemd_units/djing_queue.service | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 systemd_units/djing_queue.service diff --git a/systemd_units/djing_queue.service b/systemd_units/djing_queue.service new file mode 100644 index 0000000..830a585 --- /dev/null +++ b/systemd_units/djing_queue.service @@ -0,0 +1,15 @@ +[Unit] +Description=Djing queue manager + +[Service] +Type=simple +ExecStart=/usr/bin/python3 ./queue_mngr.py > /dev/null +PIDFile=/run/queue_mngr.py.pid +WorkingDirectory=/var/www/djing +TimeoutSec=15 +Restart=always +User=http +Group=http + +[Install] +WantedBy=multi-user.target From a78b7aa0a4ba1fcff5a4566b7d4168fb2079c8a1 Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 29 Jul 2017 15:12:28 +0300 Subject: [PATCH 130/142] fix --- systemd_units/djing_telebot.service | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/systemd_units/djing_telebot.service b/systemd_units/djing_telebot.service index 535b8c0..e7676af 100644 --- a/systemd_units/djing_telebot.service +++ b/systemd_units/djing_telebot.service @@ -1,11 +1,11 @@ [Unit] -Description=A job for djing +Description=Djing telegram bot [Service] Type=simple ExecStart=/usr/bin/python3 ./telebot.py > /dev/null PIDFile=/run/telebot.py.pid -WorkingDirectory=/srv/http/djing +WorkingDirectory=/var/www/djing TimeoutSec=9 Restart=always User=http From 46e035b381b792c7a58580dd54a9d2065431fc8b Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 29 Jul 2017 15:25:20 +0300 Subject: [PATCH 131/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20pid=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- queue_mngr.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/queue_mngr.py b/queue_mngr.py index 4faefa3..a5b7835 100755 --- a/queue_mngr.py +++ b/queue_mngr.py @@ -2,6 +2,7 @@ import os import sys from rq import Connection, Worker +from pid.decorator import pidfile import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") from agent import NasFailedResult, NasNetworkError @@ -11,7 +12,8 @@ from django.core.exceptions import ValidationError """ Заустить этот скрипт как демон, он соединяет redis и django """ -if __name__ == '__main__': +@pidfile() +def main(): try: django.setup() with Connection(): @@ -22,3 +24,7 @@ if __name__ == '__main__': print('NAS:', e) except (ValidationError, ValueError) as e: print('ERROR:', e) + + +if __name__ == "__main__": + main() From 9f5817b4922794083e75c2b8befadfb44ea492d0 Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 29 Jul 2017 18:57:51 +0300 Subject: [PATCH 132/142] =?UTF-8?q?=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D0=BE=D0=BD=D1=83=D1=88=D0=BA=D0=B8=20=D1=80=D0=B5=D0=B3=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B8=D1=80=D1=83=D1=8E=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8=20=D0=BE=D0=BD=D1=83=D1=88=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/models.py | 35 +++++++++++++++++++++++++++++++++++ devapp/onu_register.sh | 32 ++++++++++++++++++++++++++++++++ djing/__init__.py | 32 +++++--------------------------- 3 files changed, 72 insertions(+), 27 deletions(-) create mode 100755 devapp/onu_register.sh diff --git a/devapp/models.py b/devapp/models.py index 6561425..a028786 100644 --- a/devapp/models.py +++ b/devapp/models.py @@ -6,6 +6,8 @@ from .base_intr import DevBase from mydefs import MyGenericIPAddressField, MyChoicesAdapter from .dev_types import DLinkDevice, OLTDevice, OnuDevice from mapapp.models import Dot +from subprocess import call +from django.conf import settings DEVICE_TYPES = ( @@ -66,3 +68,36 @@ class Port(models.Model): class Meta: db_table = 'dev_port' unique_together = (('device', 'num')) + + +def dev_post_save_signal(sender, instance, **kwargs): + if instance.devtype != 'On': + return + grp = instance.user_group.pk + 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' + newmac = str(instance.mac_addr) + call(["%s/devapp/onu_register.sh" % settings.BASE_DIR, newmac, code]) + + +models.signals.post_save.connect(dev_post_save_signal, sender=Device) diff --git a/devapp/onu_register.sh b/devapp/onu_register.sh new file mode 100755 index 0000000..32bd6a7 --- /dev/null +++ b/devapp/onu_register.sh @@ -0,0 +1,32 @@ +#!/bin/bash + + +# old mac address +if [[ $1 =~ ^([0-9A-Fa-f]{1,2}[:-]){5}([0-9A-Fa-f]{1,2})$ ]]; then + MAC=$1 +else + echo "Bad mac $MAC addr" + exit +fi + + +# part code +if [[ $2 =~ ^[a-zA-Z]+$ ]]; then + PART_CODE=$2 +else + echo 'code must contains only letters' + exit +fi + + +DHCP_PATH='/home/bashmak/Projects/djing/macs' +PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin + + +if grep "${MAC}" "${DHCP_PATH}/${PART_CODE}.conf" > /dev/null; then + # mac is already exists + exit +else + # add new mac + echo "subclass \"${PART_CODE}\" \"${MAC}\";" >> "${DHCP_PATH}/${PART_CODE}.conf" +fi diff --git a/djing/__init__.py b/djing/__init__.py index 8c21558..f71a4cf 100644 --- a/djing/__init__.py +++ b/djing/__init__.py @@ -1,39 +1,17 @@ import importlib -import warnings - -from django.conf import settings from netaddr import mac_unix, mac_eui48 -MAC_ADDR_REGEX = r'^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$' +MAC_ADDR_REGEX = r'^([0-9A-Fa-f]{1,2}[:-]){5}([0-9A-Fa-f]{1,2})$' class mac_linux(mac_unix): """MAC format with zero-padded all upper-case hex and colon separated""" - word_fmt = '%.2X' + word_fmt = '%x' + def default_dialect(eui_obj=None): - # Check to see if a default dialect class has been specified in settings, - # using 'module.dialect_cls' string and use importlib and getattr to retrieve dialect class. 'module' is the module and - # 'dialect_cls' is the class name of the custom dialect. The dialect must either be defined or imported by the module's - # __init__.py if the module is a package. - from .fields import MACAddressField # Remove import at v1.4 - if hasattr(settings, 'MACADDRESS_DEFAULT_DIALECT') and not MACAddressField.dialect: - module, dialect_cls = settings.MACADDRESS_DEFAULT_DIALECT.split('.') - dialect = getattr(importlib.import_module(module), dialect_cls, mac_linux) - return dialect - else: - if MACAddressField.dialect: # Remove this "if" statement at v1.4 - warnings.warn( - "The set_dialect class method on MACAddressField has been deprecated, in favor of the default_dialect " - "utility function and settings.MACADDRESS_DEFAULT_DIALECT. See macaddress.__init__.py source or the " - "project README for more information.", - DeprecationWarning, - ) - return MACAddressField.dialect - if eui_obj: - return eui_obj.dialect - else: - return mac_linux + return mac_linux + def format_mac(eui_obj, dialect): # Format a EUI instance as a string using the supplied dialect class, allowing custom string classes by From bdefe33175b9545e17e5c683e9a6dd6f5443a055 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Mon, 31 Jul 2017 11:46:17 +0300 Subject: [PATCH 133/142] =?UTF-8?q?=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=BF=D1=80=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE=20=D1=83=D0=B6=D0=B5?= =?UTF-8?q?=20=D0=B5=D1=81=D1=82=D1=8C=20=D0=B2=20=D0=B1=D0=B0=D0=B7=D0=B5?= =?UTF-8?q?,=20=D1=82=D0=BE=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D0=B0,=20=D0=B2=D0=B5=D0=B4=D1=83=D1=89=D0=B0=D1=8F=20=D0=BD?= =?UTF-8?q?=20=D1=8D=D1=82=D0=BE=20=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D1=83=D1=8E=D1=89=D0=B5=D0=B5=20=D1=83=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/templates/devapp/add_dev.html | 12 ++++++++++-- devapp/views.py | 12 +++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/devapp/templates/devapp/add_dev.html b/devapp/templates/devapp/add_dev.html index 5cd2f4e..4838e99 100644 --- a/devapp/templates/devapp/add_dev.html +++ b/devapp/templates/devapp/add_dev.html @@ -37,7 +37,15 @@
    - {{ form.mac_addr }}{{ form.mac_addr.errors }} + {{ form.mac_addr }} + {% if already_dev %} + + + {% for err in form.mac_addr.errors %}{{ err }}{% endfor %} + {{ already_dev.comment }} + + + {% endif %}
    @@ -99,4 +107,4 @@ -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/devapp/views.py b/devapp/views.py index d3b124a..f8faf8b 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -75,6 +75,7 @@ def devdel(request, did): 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) + already_dev = None if request.method == 'POST': if devid == 0: @@ -85,10 +86,14 @@ def dev(request, grp, devid=0): raise PermissionDenied frm = DeviceForm(request.POST, instance=devinst) if frm.is_valid(): - frm.save() + ndev = frm.save() messages.success(request, _('Device info has been saved')) - return redirect('devapp:devs', grp) + return redirect('devapp:edit', grp, ndev.pk) else: + try: + already_dev = Device.objects.get(mac_addr=request.POST.get('mac_addr')) + except Device.DoesNotExist: + pass messages.error(request, _('Form is invalid, check fields and try again')) else: if devinst is None: @@ -106,7 +111,8 @@ def dev(request, grp, devid=0): if devinst is None: return render(request, 'devapp/add_dev.html', { 'form': frm, - 'group': user_group + 'group': user_group, + 'already_dev': already_dev }) else: return render(request, 'devapp/dev.html', { From 5eb18c838192edbcc1611e40263c8c09dc01b942 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Mon, 31 Jul 2017 11:46:42 +0300 Subject: [PATCH 134/142] =?UTF-8?q?=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=BF=D1=80=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE=20=D1=83=D0=B6=D0=B5?= =?UTF-8?q?=20=D0=B5=D1=81=D1=82=D1=8C=20=D0=B2=20=D0=B1=D0=B0=D0=B7=D0=B5?= =?UTF-8?q?,=20=D1=82=D0=BE=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D0=B0,=20=D0=B2=D0=B5=D0=B4=D1=83=D1=89=D0=B0=D1=8F=20=D0=BD?= =?UTF-8?q?=20=D1=8D=D1=82=D0=BE=20=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D1=83=D1=8E=D1=89=D0=B5=D0=B5=20=D1=83=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/locale/ru/LC_MESSAGES/django.po | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/devapp/locale/ru/LC_MESSAGES/django.po b/devapp/locale/ru/LC_MESSAGES/django.po index 7e402dd..2d29775 100644 --- a/devapp/locale/ru/LC_MESSAGES/django.po +++ b/devapp/locale/ru/LC_MESSAGES/django.po @@ -294,3 +294,7 @@ msgstr "Найти устройство" msgid "Find the subscriber" msgstr "Найти абонента" + +msgid "View the device" +msgstr "Посмотреть устройство" + From 3bdf337098fd70fea58b077837bf273db223de20 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Mon, 31 Jul 2017 11:48:22 +0300 Subject: [PATCH 135/142] =?UTF-8?q?=D0=B8=D0=B3=D0=BD=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=20=D0=BD=D0=B5=20=D1=81=D1=82=D0=B0=D0=BD=D0=B4=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D0=BD=D1=8B=D0=B5=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=20queue=20=D0=B2=20=D0=BC=D0=B8=D0=BA=D1=80=D0=BE=D1=82=D0=B8?= =?UTF-8?q?=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent/mod_mikrotik.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/agent/mod_mikrotik.py b/agent/mod_mikrotik.py index 2e515c5..e1345b3 100644 --- a/agent/mod_mikrotik.py +++ b/agent/mod_mikrotik.py @@ -201,15 +201,18 @@ class TransmitterManager(BaseTransmitter, metaclass=ABCMeta): speedIn=parse_speed(speeds[1]), speedOut=parse_speed(speeds[0]) ) - a = AbonStruct( - uid=int(info['=name'][3:]), - # FIXME: тут в разных микротиках или =target-addresses или =target - ip=info['=target'][:-3], - tariff=t, - is_active=False if info['=disabled'] == 'false' else True - ) - a.queue_id = info['=.id'] - return a + try: + a = AbonStruct( + uid=int(info['=name'][3:]), + # FIXME: тут в разных микротиках или =target-addresses или =target + ip=info['=target'][:-3], + tariff=t, + is_active=False if info['=disabled'] == 'false' else True + ) + a.queue_id = info['=.id'] + return a + except ValueError: + pass class QueueManager(TransmitterManager, metaclass=ABCMeta): From add5361025ddc7203d17af44ac8aa24206f1bd2d Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Mon, 31 Jul 2017 13:03:25 +0300 Subject: [PATCH 136/142] =?UTF-8?q?=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=BF=D1=80=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE=20=D1=83=D0=B6=D0=B5?= =?UTF-8?q?=20=D0=B5=D1=81=D1=82=D1=8C=20=D0=B2=20=D0=B1=D0=B0=D0=B7=D0=B5?= =?UTF-8?q?,=20=D1=82=D0=BE=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D0=B0,=20=D0=B2=D0=B5=D0=B4=D1=83=D1=89=D0=B0=D1=8F=20=D0=BD?= =?UTF-8?q?=20=D1=8D=D1=82=D0=BE=20=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D1=83=D1=8E=D1=89=D0=B5=D0=B5=20=D1=83=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/templates/devapp/add_dev.html | 2 +- devapp/views.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/devapp/templates/devapp/add_dev.html b/devapp/templates/devapp/add_dev.html index 4838e99..0646437 100644 --- a/devapp/templates/devapp/add_dev.html +++ b/devapp/templates/devapp/add_dev.html @@ -41,12 +41,12 @@ {% if already_dev %} - {% for err in form.mac_addr.errors %}{{ err }}{% endfor %} {{ already_dev.comment }} {% endif %} + {{ form.mac_addr.errors }}
    diff --git a/devapp/views.py b/devapp/views.py index f8faf8b..46bab38 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -118,7 +118,9 @@ def dev(request, grp, devid=0): return render(request, 'devapp/dev.html', { 'form': frm, 'dev': devinst, - 'selected_parent_dev': devinst.parent_dev or None + 'selected_parent_dev': devinst.parent_dev or None, + 'group': user_group, + 'already_dev': already_dev }) From b157551c84ad6c7bec01bd1027d22ff623dacfc6 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Mon, 31 Jul 2017 13:04:10 +0300 Subject: [PATCH 137/142] =?UTF-8?q?=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=BF=D1=80=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE=20=D1=83=D0=B6=D0=B5?= =?UTF-8?q?=20=D0=B5=D1=81=D1=82=D1=8C=20=D0=B2=20=D0=B1=D0=B0=D0=B7=D0=B5?= =?UTF-8?q?,=20=D1=82=D0=BE=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D0=B0,=20=D0=B2=D0=B5=D0=B4=D1=83=D1=89=D0=B0=D1=8F=20=D0=BD?= =?UTF-8?q?=20=D1=8D=D1=82=D0=BE=20=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D1=83=D1=8E=D1=89=D0=B5=D0=B5=20=D1=83=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/templates/devapp/dev.html | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/devapp/templates/devapp/dev.html b/devapp/templates/devapp/dev.html index e80bab6..43e627d 100644 --- a/devapp/templates/devapp/dev.html +++ b/devapp/templates/devapp/dev.html @@ -8,7 +8,7 @@
    -
    {% csrf_token %} + {% csrf_token %}
    @@ -22,11 +22,19 @@
    -
    +
    - {{ form.mac_addr }}{{ form.mac_addr.errors }} + {{ form.mac_addr }} + {% if already_dev %} + + + {{ already_dev.comment }} + + + {% endif %}
    -
    + {{ form.mac_addr.errors }} +
    @@ -103,4 +111,4 @@
    -{% endblock %} \ No newline at end of file +{% endblock %} From b2343942252e01984a0b2f03c8ac6f1751169db8 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Mon, 31 Jul 2017 13:05:06 +0300 Subject: [PATCH 138/142] fix --- devapp/onu_register.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/devapp/onu_register.sh b/devapp/onu_register.sh index 32bd6a7..c835550 100755 --- a/devapp/onu_register.sh +++ b/devapp/onu_register.sh @@ -19,7 +19,7 @@ else fi -DHCP_PATH='/home/bashmak/Projects/djing/macs' +DHCP_PATH='/etc/dhcp/macs' PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin @@ -29,4 +29,6 @@ if grep "${MAC}" "${DHCP_PATH}/${PART_CODE}.conf" > /dev/null; then else # add new mac echo "subclass \"${PART_CODE}\" \"${MAC}\";" >> "${DHCP_PATH}/${PART_CODE}.conf" + /usr/bin/sudo /usr/bin/systemctl restart dhcpd.service fi + From 8bb817274097ecf541c5c570ff6a1026545cdd94 Mon Sep 17 00:00:00 2001 From: bashmak Date: Thu, 10 Aug 2017 14:19:50 +0300 Subject: [PATCH 139/142] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D1=82=D0=B8=D0=BB=D1=8C=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?10gb=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/css/custom.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/static/css/custom.css b/static/css/custom.css index 38991ed..b3e2810 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -155,6 +155,9 @@ a.port-img{ text-decoration: none; } +/* 10GBit/s */ +.port.ten{background-color: #a4fff7;} + /* 1GBit/s */ .port.giga{background-color: #caccfb;} From b378cf95d609f77b20bdcb04fbfc440ff572045f Mon Sep 17 00:00:00 2001 From: bashmak Date: Thu, 10 Aug 2017 14:44:15 +0300 Subject: [PATCH 140/142] =?UTF-8?q?=D0=A8=D1=80=D0=B8=D1=84=D1=82=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D0=BD=D1=8C=D1=88=D0=B5=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B4=D0=BF=D0=B8=D1=81=D0=B8=20=D0=BE=20=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D1=80=D0=BE=D1=81=D1=82=D0=B8=20=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/css/custom.css | 1 + 1 file changed, 1 insertion(+) diff --git a/static/css/custom.css b/static/css/custom.css index b3e2810..d698291 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -138,6 +138,7 @@ td.btn-group { border-radius: 3px; padding: 6px; width: 79px; + font-size: x-small; } .port .port-img{ background-image: url(/static/img/icon-port-64x64-grey.png); From 5b8f21cf299c86eeda99c1ef8c0b435221ebe84d Mon Sep 17 00:00:00 2001 From: bashmak Date: Thu, 10 Aug 2017 14:57:39 +0300 Subject: [PATCH 141/142] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8E=20=D0=B4=D0=BB=D1=8F=20Eltex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/dev_types.py | 99 +++++++++++++------ devapp/locale/ru/LC_MESSAGES/django.po | 2 + devapp/models.py | 9 +- .../devapp/custom_dev_page/ports.html | 6 ++ 4 files changed, 84 insertions(+), 32 deletions(-) diff --git a/devapp/dev_types.py b/devapp/dev_types.py index c759242..d9798cc 100644 --- a/devapp/dev_types.py +++ b/devapp/dev_types.py @@ -5,22 +5,6 @@ from datetime import timedelta from .base_intr import DevBase, SNMPBaseWorker, BasePort - -oids = { - 'reboot': '.1.3.6.1.4.1.2021.8.1.101.1', - 'get_ports': { - 'names': '.1.3.6.1.4.1.171.10.134.2.1.1.100.2.1.3', - 'stats': '.1.3.6.1.2.1.2.2.1.7', - 'macs': '.1.3.6.1.2.1.2.2.1.6', - 'speeds': '.1.3.6.1.2.1.31.1.1.1.15' - }, - 'name': '.1.3.6.1.2.1.1.1.0', - 'position': '.1.3.6.1.2.1.1.5.0', - 'toggle_port': '.1.3.6.1.2.1.2.2.1.7', - 'uptime': '.1.3.6.1.2.1.1.8.0' -} - - class DLinkPort(BasePort): def __init__(self, num, name, status, mac, speed, snmpWorker): @@ -31,15 +15,13 @@ class DLinkPort(BasePort): # выключаем этот порт def disable(self): self.snmp_worker.set_int_value( - "%s.%d" % (oids['toggle_port'], self.num), - 2 + "%s.%d" % ('.1.3.6.1.2.1.2.2.1.7', self.num), 2 ) # включаем этот порт def enable(self): self.snmp_worker.set_int_value( - "%s.%d" % (oids['toggle_port'], self.num), - 1 + "%s.%d" % ('.1.3.6.1.2.1.2.2.1.7', self.num), 1 ) @@ -54,18 +36,17 @@ class DLinkDevice(DevBase, SNMPBaseWorker): return _('DLink switch') def reboot(self): - pass + return self.get_item('.1.3.6.1.4.1.2021.8.1.101.1') def get_ports(self): - nams = self.get_list(oids['get_ports']['names']) - stats = self.get_list(oids['get_ports']['stats']) - macs = self.get_list(oids['get_ports']['macs']) - speeds = self.get_list(oids['get_ports']['speeds']) + 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') + 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') res = [] ln = len(speeds) for n in range(ln): status = True if int(stats[n]) == 1 else False - print(len(nams), len(speeds), len(macs)) res.append(DLinkPort( n+1, nams[n] if len(nams) > 0 else _('does not fetch the name'), @@ -76,10 +57,10 @@ class DLinkDevice(DevBase, SNMPBaseWorker): return res def get_device_name(self): - return self.get_item(oids['name']) + return self.get_item('.1.3.6.1.2.1.1.1.0') def uptime(self): - uptimestamp = safe_int(self.get_item(oids['uptime'])) + uptimestamp = safe_int(self.get_item('.1.3.6.1.2.1.1.8.0')) tm = RuTimedelta(timedelta(seconds=uptimestamp/100)) or RuTimedelta(timedelta()) return tm @@ -194,3 +175,65 @@ class OnuDevice(DevBase, SNMPBaseWorker): @staticmethod def is_use_device_port(): return False + + +class EltexPort(BasePort): + + def __init__(self, num, name, status, mac, speed, snmpWorker): + BasePort.__init__(self, num, name, status, mac, speed) + assert issubclass(snmpWorker.__class__ , SNMPBaseWorker) + self.snmp_worker = snmpWorker + + # выключаем этот порт + def disable(self): + self.snmp_worker.set_int_value( + "%s.%d" % ('.1.3.6.1.2.1.2.2.1.7', self.num), + 2 + ) + + # включаем этот порт + def enable(self): + self.snmp_worker.set_int_value( + "%s.%d" % ('.1.3.6.1.2.1.2.2.1.7', self.num), + 1 + ) + + +class EltexSwitch(DLinkDevice): + + @staticmethod + def description(): + return _('Eltex switch') + + 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') + #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') + res = [] + for n in range(28): + res.append(EltexPort( + n+1, + '',#nams[n] if len(nams) > 0 else _('does not fetch the name'), + True if int(stats[n]) == 1 else False, + '',#macs[n] if len(macs) > 0 else _('does not fetch the mac'), + int(speeds[n]) if len(speeds) > 0 and int(oper_stats[n]) == 1 else 0, + self)) + return res + + def get_device_name(self): + return self.get_item('.1.3.6.1.2.1.1.5.0') + + def uptime(self): + uptimestamp = safe_int(self.get_item('.1.3.6.1.2.1.1.3.0')) + tm = RuTimedelta(timedelta(seconds=uptimestamp/100)) or RuTimedelta(timedelta()) + return tm + + @staticmethod + def has_attachable_to_subscriber(): + return False + + @staticmethod + def is_use_device_port(): + return False diff --git a/devapp/locale/ru/LC_MESSAGES/django.po b/devapp/locale/ru/LC_MESSAGES/django.po index 2d29775..7a6f8e3 100644 --- a/devapp/locale/ru/LC_MESSAGES/django.po +++ b/devapp/locale/ru/LC_MESSAGES/django.po @@ -298,3 +298,5 @@ msgstr "Найти абонента" msgid "View the device" msgstr "Посмотреть устройство" +msgid "Eltex switch" +msgstr "Элтекс свич" diff --git a/devapp/models.py b/devapp/models.py index a028786..eef53b5 100644 --- a/devapp/models.py +++ b/devapp/models.py @@ -4,16 +4,17 @@ from django.db import models from djing.fields import MACAddressField from .base_intr import DevBase from mydefs import MyGenericIPAddressField, MyChoicesAdapter -from .dev_types import DLinkDevice, OLTDevice, OnuDevice +from . import dev_types from mapapp.models import Dot from subprocess import call from django.conf import settings DEVICE_TYPES = ( - ('Dl', DLinkDevice), - ('Pn', OLTDevice), - ('On', OnuDevice) + ('Dl', dev_types.DLinkDevice), + ('Pn', dev_types.OLTDevice), + ('On', dev_types.OnuDevice), + ('Ex', dev_types.EltexSwitch) ) diff --git a/devapp/templates/devapp/custom_dev_page/ports.html b/devapp/templates/devapp/custom_dev_page/ports.html index 9488ecf..e6f8884 100644 --- a/devapp/templates/devapp/custom_dev_page/ports.html +++ b/devapp/templates/devapp/custom_dev_page/ports.html @@ -18,10 +18,16 @@ {% if port.st %} {% if port.sp == 10 %}
    + 10 mbps {% elif port.sp == 100 %}
    + 100 mbps {% elif port.sp == 1000 %}
    + 1 gbps + {% elif port.sp == 10000 %} +
    + 10 gbps {% else %}
    {% endif %} From 3bc35540a070bd988e449685b5328b7c42ae49c7 Mon Sep 17 00:00:00 2001 From: bashmak Date: Mon, 14 Aug 2017 13:04:58 +0300 Subject: [PATCH 142/142] =?UTF-8?q?FIXBUG:=20=D0=BE=D0=BF=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=D0=B5=D0=BD=D0=BD=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=B4?= =?UTF-8?q?=D1=83=D0=B1=D0=BB=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=D0=BE?= =?UTF-8?q?=D1=81=D1=8C=20=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D1=83=20=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=80=D0=B0=D0=B7=20?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B1=D1=8B=D0=BB?= =?UTF-8?q?=D0=BE=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- taskapp/handle.py | 73 ++++++++++++++++++++++++++--------------------- taskapp/handle.sh | 2 +- taskapp/models.py | 18 ++++-------- taskapp/views.py | 8 ++++++ 4 files changed, 55 insertions(+), 46 deletions(-) diff --git a/taskapp/handle.py b/taskapp/handle.py index be59da7..e31303f 100644 --- a/taskapp/handle.py +++ b/taskapp/handle.py @@ -2,41 +2,50 @@ from django.utils.translation import ugettext as _ from chatbot.telebot import send_notify from chatbot.models import ChatException +from mydefs import MultipleException class TaskException(Exception): pass -def handle(task, author, recipient, abon_group): - try: - dst_account = recipient - text = _('Task') - # Если сигнал самому себе то молчим - if author == recipient: - return - # Если задача 'На выполнении' то молчим - if task.state == 'C': - return - # Если задача завершена - elif task.state == 'F': - text = _('Task completed') - # Меняем цель назначения на автора, т.к. при завершении - # идёт оповещение автору о выполнении - dst_account = author - if task.abon is not None: - fulltext="%s:\n%s\n" % (text, task.abon.get_full_name()) - else: - fulltext="%s\n" % text - fulltext += _('locality %s.\n') % abon_group.title - if task.abon: - fulltext += _('address %s %s.\ntelephone %s\n') % ( - task.abon.street.name if task.abon.street is not None else '<'+_('not chosen')+'>', - task.abon.house, - task.abon.telephone - ) - fulltext += _('Task type - %s.') % task.get_mode_display() + '\n' - fulltext += task.descr if task.descr else '' - send_notify(fulltext, dst_account) - except ChatException as e: - raise TaskException(e) +def handle(task, author, recipients, abon_group): + errors = [] + for recipient in recipients: + try: + dst_account = recipient + text = _('Task') + # Если сигнал самому себе то молчим + if author == recipient: + return + # Если задача завершена или провалена + elif task.state == 'F' or task.state == 'C': + text = _('Task completed') + if task.abon is not None: + fulltext = "%s:\n%s\n" % (text, task.abon.get_full_name()) + else: + fulltext = "%s\n" % text + fulltext += _('locality %s.\n') % abon_group.title + if task.abon: + fulltext += _('address %s %s.\ntelephone %s\n') % ( + task.abon.street.name if task.abon.street is not None else '<'+_('not chosen')+'>', + task.abon.house, + task.abon.telephone + ) + fulltext += _('Task type - %s.') % task.get_mode_display() + '\n' + fulltext += task.descr if task.descr else '' + + print('task.state:', task.state) + + if task.state == 'F' or task.state == 'C': + # Если задача завершена или провалена то отправляем одно оповещение автору + try: + send_notify(fulltext, author) + except ChatException as e: + raise TaskException(e) + else: + send_notify(fulltext, dst_account) + except ChatException as e: + errors.append(e) + if len(errors) > 0: + raise MultipleException(errors) diff --git a/taskapp/handle.sh b/taskapp/handle.sh index e08b533..8ac380f 100755 --- a/taskapp/handle.sh +++ b/taskapp/handle.sh @@ -44,6 +44,6 @@ fi FULLTEXT="$text: $ABON_FIO. $ABON_ADDR $ABON_TEL. $ABON_GRP. $FAIL_MODE. $DESCR" -echo "TO $RECIPIENT_TEL: $FULLTEXT" >> /tmp/task_sms.log +echo "TO $RECIPIENT_TEL: $FULLTEXT" /usr/bin/gammu-smsd-inject EMS $RECIPIENT_TEL -text "$FULLTEXT" -unicode diff --git a/taskapp/models.py b/taskapp/models.py index f4db733..37e30f6 100644 --- a/taskapp/models.py +++ b/taskapp/models.py @@ -6,8 +6,7 @@ from django.conf import settings from django.utils import timezone from django.utils.translation import ugettext as _ from abonapp.models import Abon -from .handle import handle as task_handle, TaskException -from mydefs import MultipleException +from .handle import handle as task_handle TASK_PRIORITIES = ( @@ -121,17 +120,10 @@ def task_handler(sender, instance, **kwargs): act_type='e', who=instance.author ) - errors = [] - for recipient in instance.recipients.all(): - try: - task_handle( - instance, instance.author, - recipient, group - ) - except TaskException as e: - errors.append(e) - if len(errors) > 0: - raise MultipleException(errors) + task_handle( + instance, instance.author, + instance.recipients.all(), group + ) #def task_delete(sender, instance, **kwargs): diff --git a/taskapp/views.py b/taskapp/views.py index c4e1966..d8ec471 100644 --- a/taskapp/views.py +++ b/taskapp/views.py @@ -6,6 +6,8 @@ from django.contrib import messages from abonapp.models import Abon from django.utils.translation import ugettext as _ from datetime import date + +from .handle import TaskException from .models import Task from mydefs import pag_mn, only_admins, safe_int, MultipleException, RuTimedelta from .forms import TaskFrm @@ -152,6 +154,8 @@ def task_add_edit(request, task_id=0): except MultipleException as errs: for err in errs.err_list: messages.add_message(request, messages.constants.ERROR, err) + except TaskException as e: + messages.error(request, e) return render(request, 'taskapp/add_edit_task.html', { 'form': frm, @@ -169,6 +173,8 @@ def task_finish(request, task_id): except MultipleException as errs: for err in errs.err_list: messages.add_message(request, messages.constants.ERROR, err) + except TaskException as e: + messages.error(request, e) return redirect('taskapp:home') @@ -189,4 +195,6 @@ def remind(request, task_id): except MultipleException as errs: for err in errs.err_list: messages.add_message(request, messages.constants.ERROR, err) + except TaskException as e: + messages.error(request, e) return redirect('taskapp:home')