Browse Source

Merge branch 'devel' of https://github.com/nerosketch/djing into map

devel
Dmitry 8 years ago
parent
commit
1479c314de
  1. 2
      abonapp/locale/ru/LC_MESSAGES/django.po
  2. 21
      abonapp/templates/abonapp/editAbon.html
  3. 2
      abonapp/templates/abonapp/ext.htm
  4. 4
      abonapp/templates/abonapp/group_list.html
  5. 32
      abonapp/templates/abonapp/peoples.html
  6. 4
      abonapp/views.py
  7. 2
      accounts_app/locale/ru/LC_MESSAGES/django.po
  8. 18
      accounts_app/templates/accounts/acc_list.html
  9. 15
      accounts_app/templates/accounts/login.html
  10. 4
      agent/commands/dhcp.py
  11. 22
      agent/mod_mikrotik.py
  12. 2
      clientsideapp/templates/clientsideapp/ext.html
  13. 2
      devapp/models.py
  14. 2
      devapp/templates/devapp/custom_dev_page/onu.html
  15. 25
      devapp/templates/devapp/devices.html
  16. 2
      devapp/templates/devapp/ext.htm
  17. 4
      devapp/templates/devapp/group_list.html
  18. 44
      dhcp_lever.py
  19. 6
      djing/urls.py
  20. 5
      msg_app/admin.py
  21. 2
      msg_app/locale/ru/LC_MESSAGES/django.po
  22. 9
      mydefs.py
  23. 71
      queue_mngr.py
  24. 8
      static/css/custom.css
  25. 2
      systemd_units/djing_telebot.service
  26. 2
      taskapp/locale/ru/LC_MESSAGES/django.po
  27. 2
      taskapp/templates/taskapp/ext.htm
  28. 23
      taskapp/templates/taskapp/footer_btns.html
  29. 8
      taskapp/templates/taskapp/tasklist.html
  30. 8
      taskapp/templates/taskapp/tasklist_all.html
  31. 10
      taskapp/templates/taskapp/tasklist_failed.html
  32. 11
      taskapp/templates/taskapp/tasklist_finish.html
  33. 8
      taskapp/templates/taskapp/tasklist_own.html
  34. 2
      telebot.py
  35. 2
      templates/all_base.html
  36. 4
      templates/base.html

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

@ -877,7 +877,7 @@ msgstr "Графики"
#: abonapp/templates/abonapp/ext.html:26
msgid "Sub information"
msgstr "Информация абонента"
msgstr "Инфо."
msgid "Streets"
msgstr "Улицы"

21
abonapp/templates/abonapp/editAbon.html

@ -4,13 +4,13 @@
{% block content %}
<div class="row">
<div class="col-sm-6">
<div class="col-sm-12 col-xs-12 col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Change subscriber' %}</h3>
</div>
<div class="panel-body">
<form role="form" class="form-horizontal" action="{% url 'abonapp:abon_home' abon_group.pk abon.pk %}" method="post">{% csrf_token %}
<form role="form" autocomplete="off" class="form-horizontal" action="{% url 'abonapp:abon_home' abon_group.pk abon.pk %}" method="post">{% csrf_token %}
<div class="form-group-sm">
<label for="id_username" class="col-sm-4 control-label">{% trans 'login' %}</label>
@ -111,7 +111,7 @@
</button>
{% if perms.taskapp.add_task %}
<a href="{% url 'taskapp:add' %}?uid={{ abon.username }}" class="btn btn-sm btn-success" title="{% trans 'Add new task' %}">
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add new task' %}
<span class="glyphicon glyphicon-plus"></span> <span class="hidden-xs">{% trans 'Add new task' %}</span>
</a>
{% endif %}
</div>
@ -131,7 +131,7 @@
</div>
</div>
</div>
<div class="col-sm-6">
<div class="col-sm-12 col-xs-12 col-md-6">
{% if perms.abonapp.change_abon %}
<div class="panel panel-default">
<div class="panel-heading">
@ -145,11 +145,11 @@
<label for="id_method" class="col-sm-2 control-label">{% trans 'Device' %}</label>
<div class="col-sm-10 btn-group btn-group-sm">
{% if device %}
<a href="{% url 'devapp:view' abon_group.pk device.pk %}" target="_blank" class="btn btn-sm btn-default" title="{% trans 'Mac Address' %} {{ device.mac_addr }}">
<a href="{% url 'devapp:view' abon_group.pk device.pk %}" target="_blank" class="btn btn-sm btn-default" title="{% trans 'Mac Address' %}: {{ device.mac_addr|default:_('Not assigned') }}">
<span class="glyphicon glyphicon-hdd"></span> {{ device.comment|truncatechars:11 }} {{ device.ip_address }}
</a>
<a href="{% url 'abonapp:clear_dev' abon_group.pk abon.pk %}" class="btn btn-sm btn-danger">
<span class="glyphicon glyphicon-remove-circle"></span> {% trans 'Remove clutch' %}
<span class="glyphicon glyphicon-remove-circle"></span> <span class="hidden-xs hidden-md hidden-sm">{% trans 'Remove clutch' %}</span>
</a>
{% else %}
<a href="{% url 'abonapp:dev' abon_group.pk abon.pk %}" class="btn btn-success btn-sm btn-modal">
@ -185,14 +185,11 @@
</div>
</div>
<div class="form-group-sm">
<div class="col-sm-offset-2 col-sm-10 btn-group btn-group-sm">
<div class="col-sm-10 col-sm-offset-2">
<button type="submit" class="btn btn-primary btn-sm">
<span class="glyphicon glyphicon-floppy-disk"></span> {% trans 'Save' %}
</button>
<button class="btn btn-default" type="reset" title="Reset">
<span class="glyphicon glyphicon-repeat"></span>
</button>
</div>
</button>
</div>
</div>
{% endif %}
</form>

2
abonapp/templates/abonapp/ext.htm

@ -19,7 +19,7 @@
</h2>
</div>
<ul class="nav nav-tabs">
<ul class="nav nav-tabs nav-justified">
{% url 'abonapp:abon_home' abon_group.pk abon.pk as abon_home %}
<li{% if abon_home == request.path %} class="active"{% endif %}>

4
abonapp/templates/abonapp/group_list.html

@ -23,7 +23,7 @@
</a>
{% if order_by == 'title' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th width="100">
<th width="100" class="hidden-xs">
{% trans 'Number of subscribers' %}
</th>
<th width="100">#</th>
@ -34,7 +34,7 @@
<tr>
<td>{{ gr.pk }}</td>
<td><a href="{% url 'abonapp:people_list' gr.pk %}">{{ gr.title }}</a></td>
<td>{{ gr.usercount }}</td>
<td class="hidden-xs">{{ gr.usercount }}</td>
<td class="btn-group">
{% if perms.abonapp.delete_abongroup %}
{% if gr.usercount == 0 %}

32
abonapp/templates/abonapp/peoples.html

@ -14,52 +14,52 @@
<h3>{% trans 'The people in the selected group' %}</h3>
<div class="row">
<div class="col-lg-10">
<div class="col-lg-10 col-md-8">
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>#</th>
<th>
<th class="col-xs-1">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=username dir=dir|default:"down" %}">
{% trans 'Sub' %}
</a>
{% if order_by == 'username' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th>{% trans 'Last traffic' %}</th>
<th>
<th class="hidden-xs">{% trans 'Last traffic' %}</th>
<th class="col-xs-1 hidden-md">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=ip_address dir=dir|default:"down" %}">
{% trans 'Ip address' %}
</a>
{% if order_by == 'ip_address' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th>
<th class="col-xs-2">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=fio dir=dir|default:"down" %}">
{% trans 'fio' %}
</a>
{% if order_by == 'fio' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th>
<th class="col-xs-2">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=street dir=dir|default:"down" %}">
{% trans 'Street' %}
</a>
{% if order_by == 'street' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th width="100">
<th class="col-xs-1">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=house dir=dir|default:"down" %}">
{% trans 'Apartment' %}
</a>
{% if order_by == 'house' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th width="150">{% trans 'Telephone' %}</th>
<th width="150">{% trans 'Service' %}</th>
<th width="50">
<th class="col-xs-2">{% trans 'Telephone' %}</th>
<th class="col-xs-2">{% trans 'Service' %}</th>
<th class="hidden-xs col-sm-1">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=ballance dir=dir|default:"down" %}">
{% trans 'Ballance' %}
</a>
{% if order_by == 'ballance' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th width="10">#</th>
<th class="hidden-xs">#</th>
</tr>
</thead>
<tbody>
@ -78,7 +78,7 @@
<td>
<a href="{% url 'abonapp:abon_home' human.group.pk human.pk %}">{{ human.username }}</a>
</td>
<td>
<td class="hidden-xs">
{% if human.stat_cache %}
{% if human.stat_cache.is_today %}
{{ human.stat_cache.last_time|date:"H:i" }}
@ -87,7 +87,7 @@
{% endif %}
{% endif %}
</td>
<td>{{ human.ip_address|default:_('Not assigned') }}</td>
<td class="hidden-md">{{ human.ip_address|default:_('Not assigned') }}</td>
<td>{{ human.fio }}</td>
<td>{{ human.street|default:_('Not assigned') }}</td>
<td>{{ human.house|default:'-' }}</td>
@ -102,8 +102,8 @@
{% else %}&mdash;&mdash;&mdash;
{% endif %}
</td>
<td>{{ human.ballance }}</td>
<td>
<td class="hidden-xs">{{ human.ballance }}</td>
<td class="hidden-xs">
{% if can_del_trf %}
<a href="{% url 'abonapp:del_abon' %}?id={{ human.pk }}" class="btn btn-danger btn-sm">
<span class="glyphicon glyphicon-remove"></span>
@ -140,7 +140,7 @@
</table>
</div>
</div>
<div class="col-lg-2 sidebar-offcanvas">
<div class="col-lg-2 col-md-4">
<div class="panel panel-default">
<div class="panel-heading">{% trans 'Streets' %}</div>
<div class="list-group">

4
abonapp/views.py

@ -286,7 +286,9 @@ def abonhome(request, gid, uid):
raise PermissionDenied
frm = forms.AbonForm(request.POST, instance=abon)
if frm.is_valid():
abon.ip_address = request.POST.get('ip')
newip = request.POST.get('ip')
if newip:
abon.ip_address = newip
frm.save()
messages.success(request, _('edit abon success msg'))
else:

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

@ -26,7 +26,7 @@ msgstr "У пользователей должен быть номер теле
#: accounts_app/templates/accounts/group.html:7
#: accounts_app/templates/accounts/group_list.html:7
msgid "Administrators"
msgstr "Администраторы"
msgstr "Сотрудники"
#: accounts_app/templates/accounts/group.html:8
#: accounts_app/templates/accounts/group_list.html:8

18
accounts_app/templates/accounts/acc_list.html

@ -14,11 +14,11 @@
<thead>
<tr>
<th class="col-sm-1">Фото</th>
<th>Ник</th>
<th>ФИО (или ник если нет)</th>
<th class="col-sm-2">Телефон</th>
<th class="col-sm-2">Email</th>
<th width="150">&mdash;</th>
<th class="col-sm-2">Ник</th>
<th class="col-sm-4">ФИО (или ник если нет)</th>
<th class="col-sm-2 hidden-xs">Телефон</th>
<th class="col-sm-2 hidden-xs">Email</th>
<th class="col-sm-1 hidden-xs">&mdash;</th>
</tr>
</thead>
<tbody>
@ -30,11 +30,11 @@
</a></td>
<td><a href="{% url 'acc_app:other_profile' usr.id %}">{{ usr.username }}</a></td>
<td>{{ usr.get_full_name }}</td>
<td>{% if usr.telephone %}<a href="tel:{{ usr.telephone }}">{{ usr.telephone }}</a>{% else %}
<td class="hidden-xs">{% if usr.telephone %}<a href="tel:{{ usr.telephone }}">{{ usr.telephone }}</a>{% else %}
Нету{% endif %}</td>
<td>{% if usr.email %}<a href="mailto:{{ usr.email }}">{{ usr.email }}{% else %}
<td class="hidden-xs">{% if usr.email %}<a href="mailto:{{ usr.email }}">{{ usr.email }}{% else %}
Нету{% endif %}</a></td>
<td class="btn-group">
<td class="btn-group hidden-xs">
<a href="#" class="btn btn-sm btn-default disabled"
title="Дать задание">
<span class="glyphicon glyphicon-tasks"></span>
@ -78,4 +78,4 @@
{% include 'toolbar_page.html' with pag=users %}
{% endblock %}
{% endblock %}

15
accounts_app/templates/accounts/login.html

@ -15,6 +15,10 @@
margin: 10% auto;
position: relative;
}
footer{
position: absolute;
bottom: 0;
}
</style>
</head>
<body>
@ -60,5 +64,14 @@
</div>
</div>
<footer class="footer">
<div class="container">
<p class="text-muted">
Напишите нам <i>is-ttk@ya.ru</i>.
</p>
</div>
</footer>
</div>
</body>
</html>
</html>

4
agent/commands/dhcp.py

@ -20,12 +20,12 @@ def dhcp_commit(client_ip, client_mac, switch_mac, switch_port):
print('D:', _('User settings is not dynamic'))
return
if not abon.is_access():
print('D:', _('User is not access to service'))
print('D:', 'User %s is not access to service' % abon.username)
return
abon.ip_address = client_ip
abon.is_dhcp = True
abon.save(update_fields=['ip_address'])
print('S:', _("Ip address:'%s' update for '%s' successfull, on port: %s") % (client_ip, abon.get_short_name(), port))
#print('S:', _("Ip address:'%s' update for '%s' successfull, on port: %s") % (client_ip, abon.get_short_name(), port))
except Abon.DoesNotExist:
print('N:', _("User with device '%s' does not exist") % dev)
except Device.DoesNotExist:

22
agent/mod_mikrotik.py

@ -4,7 +4,7 @@ import binascii
from abc import ABCMeta
from hashlib import md5
from .core import BaseTransmitter, NasFailedResult, NasNetworkError
from mydefs import ping
from mydefs import ping, singleton
from .structs import TariffStruct, AbonStruct, IpStruct
from . import settings as local_settings
from django.conf import settings
@ -17,14 +17,23 @@ LIST_USERS_ALLOWED = 'DjingUsersAllowed'
LIST_USERS_BLOCKED = 'DjingUsersBlocked'
@singleton
class ApiRos:
"Routeros api"
sk = None
is_login = False
def __init__(self, ip, port):
if self.sk is None:
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.connect((ip, port or getattr(local_settings, 'NAS_PORT', 8728)))
self.sk = sk
def __init__(self, sk):
self.sk = sk
self.currenttag = 0
def login(self, username, pwd):
if self.is_login:
return
chal = None
for repl, attrs in self.talk_iter(["/login"]):
chal = binascii.unhexlify(attrs['=ret'])
@ -34,6 +43,7 @@ class ApiRos:
md.update(chal)
for r in self.talk_iter(["/login", "=name=" + username,
"=response=00" + binascii.hexlify(md.digest()).decode('utf-8')]): pass
self.is_login = True
def talk_iter(self, words):
if self.writeSentence(words) == 0: return
@ -143,6 +153,7 @@ class ApiRos:
class TransmitterManager(BaseTransmitter, metaclass=ABCMeta):
def __init__(self, login=None, password=None, ip=None, port=None):
ip = ip or getattr(local_settings, 'NAS_IP')
if ip is None:
@ -150,10 +161,7 @@ class TransmitterManager(BaseTransmitter, metaclass=ABCMeta):
if not ping(ip):
raise NasNetworkError('NAS %s не пингуется' % ip)
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port or getattr(local_settings, 'NAS_PORT', 8728)))
self.s = s
self.ar = ApiRos(s)
self.ar = ApiRos(ip, port)
self.ar.login(login or getattr(local_settings, 'NAS_LOGIN'), password or getattr(local_settings, 'NAS_PASSW'))
except ConnectionRefusedError:
raise NasNetworkError('Подключение к %s отклонено (Connection Refused)' % ip)

2
clientsideapp/templates/clientsideapp/ext.html

@ -94,7 +94,7 @@
<div id="footer">
<div class="container">
<p class="text-muted">
Напишите разработчику <i>djing-developer@yandex.ru</i>.
Напишите разработчику <i>is-ttk@ya.ru</i>.
</p>
</div>
</div>

2
devapp/models.py

@ -130,6 +130,8 @@ def dev_post_save_signal(sender, instance, **kwargs):
code = 'uy'
elif grp == 79 or grp == 91:
code = 'zrk'
elif grp == 95:
code = 'yst'
newmac = str(instance.mac_addr)
run(["%s/devapp/onu_register.sh" % settings.BASE_DIR, newmac, code])

2
devapp/templates/devapp/custom_dev_page/onu.html

@ -16,7 +16,7 @@
<ul class="list-group">
<li class="list-group-item">{% trans 'Ip address' %}: {{ dev.ip_address }}</li>
<li class="list-group-item">{% trans 'Mac' %}: {{ dev.mac_addr }}</li>
<li class="list-group-item">{% trans 'Description' %} {{ dev.comment }}</li>
<li class="list-group-item">{% trans 'Description' %}: {{ dev.comment }}</li>
{% for da in dev_accs %}
<li class="list-group-item">{% trans 'Attached user' %}:
{% if da.group %}

25
devapp/templates/devapp/devices.html

@ -16,27 +16,26 @@
<thead>
<tr>
<th>#</th>
<th>
<a href="{% url 'devapp:devs' group.pk %}?order_by=ip_address&dir={{ dir|default:'down' }}">
<th class="col-xs-3">
<a href="{% url 'devapp:devs' group.pk %}?order_by=ip_address&dir={{ dir|default:"down" }}">
{% trans 'Ip address' %}
</a>
{% if order_by == 'ip_address' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th>
<a href="{% url 'devapp:devs' group.pk %}?order_by=comment&dir={{ dir|default:'down' }}">
<th class="col-xs-4">
<a href="{% url 'devapp:devs' group.pk %}?order_by=comment&dir={{ dir|default:"down" }}">
{% trans 'Comment' %}
</a>
{% if order_by == 'comment' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th>{% trans 'Mac address' %}</th>
<th>{% trans 'Monitoring output' %}</th>
<th>
<a href="{% url 'devapp:devs' group.pk %}?order_by=devtype&dir={{ dir|default:'down' }}">
<th class="col-xs-2">{% trans 'Mac address' %}</th>
<th class="col-xs-2">
<a href="{% url 'devapp:devs' group.pk %}?order_by=devtype&dir={{ dir|default:"down" }}">
{% trans 'Device type' %}
</a>
{% if order_by == 'devtype' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th width="100">Do</th>
<th class="col-xs-1">Do</th>
</tr>
</thead>
@ -56,14 +55,14 @@
<td>{{ dev.mac_addr|default:_('Not assigned') }}</td>
<td>{{ dev.mon.plugin_output }}</td>
<td>{{ dev.get_devtype_display }}</td>
<td class="btn-group btn-group-sm">
<td class="btn-group btn-group-xs btn-group-justified">
{% if can_del_dev %}
<a href="{% url 'devapp:del' dev.user_group.pk dev.pk %}" class="btn btn-default btn-sm">
<a href="{% url 'devapp:del' dev.user_group.pk dev.pk %}" class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span>
</a>
{% endif %}
{% if can_ch_dev %}
<a href="{% url 'devapp:edit' dev.user_group.pk dev.id %}" class="btn btn-default btn-sm">
<a href="{% url 'devapp:edit' dev.user_group.pk dev.id %}" class="btn btn-default">
<span class="glyphicon glyphicon-edit"></span>
</a>
{% endif %}
@ -92,4 +91,4 @@
{% include 'toolbar_page.html' with pag=devices %}
{% endblock %}
{% endblock %}

2
devapp/templates/devapp/ext.htm

@ -19,7 +19,7 @@
<h2>{{ dev.comment|default:_('Not assigned') }}</h2>
</div>
<ul class="nav nav-tabs">
<ul class="nav nav-tabs nav-justified">
{% url 'devapp:view' dev.user_group.pk|default:0 dev.pk as devapp_view %}
<li{% if devapp_view == request.path %} class="active"{% endif %}>

4
devapp/templates/devapp/group_list.html

@ -34,7 +34,7 @@
<td class="btn-group">
{% if perms.abonapp.add_abongroup %}
<a href="{% url 'abonapp:add_group' %}" class="btn btn-success btn-sm">
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add group' %}
<span class="glyphicon glyphicon-plus"></span> <span class="hidden-xs">{% trans 'Add group' %}</span>
</a>
{% endif %}
<a href="{% url 'devapp:devices_null_group' %}" class="btn btn-primary btn-sm">
@ -48,4 +48,4 @@
{% include 'toolbar_page.html' with pag=groups %}
{% endblock %}
{% endblock %}

44
dhcp_lever.py

@ -1,25 +1,53 @@
#!/usr/bin/env python3
import sys
from redis import Redis
from rq import Queue
import socket
def die(text):
print(text)
exit(1)
'''
obj = {
'client_ip': ip2int('127.0.0.1'),
'client_mac': 'aa:bb:cc:dd:ee:ff',
'switch_mac': 'aa:bb:cc:dd:ee:ff',
'switch_port': 3,
'cmd': 'commit'
}
'''
def send_to(data, addr='127.0.0.1', port=5436):
from pickle import dumps
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((addr, port))
data = dumps(data)
s.send(data)
except ConnectionRefusedError:
print('ERROR: connection refused')
if __name__ == "__main__":
argv = sys.argv
if len(argv) < 3:
die('Too few arguments, exiting...')
action = argv[1]
q = Queue(connection=Redis())
if action == 'commit':
if len(argv) < 6:
die('Too few arguments, exiting...')
q.enqueue('agent.commands.dhcp.dhcp_commit', argv[2], argv[3], argv[4], int(argv[5]))
elif action == 'expiry':
q.enqueue('agent.commands.dhcp.dhcp_expiry', argv[2])
elif action == 'release':
q.enqueue('agent.commands.dhcp.dhcp_release', argv[2])
dat = {
'client_ip': argv[2],
'client_mac': argv[3],
'switch_mac': argv[4],
'switch_port': int(argv[5]),
'cmd': 'commit'
}
send_to(dat)
elif action == 'expiry' or action == 'release':
dat = {
'client_ip': argv[2],
'cmd': action
}
send_to(dat)

6
djing/urls.py

@ -1,5 +1,4 @@
from django.conf.urls import url, include
from django.contrib import admin
from . import settings
from .views import home
@ -17,13 +16,14 @@ urlpatterns = [
url(r'^tasks/', include('taskapp.urls', namespace='taskapp')),
url(r'^client/', include('clientsideapp.urls', namespace='client_side')),
url(r'^msg/', include('msg_app.urls', namespace='msg_app')),
url(r'^dialing/', include('dialing_app.urls', namespace='dialapp')),
url(r'^admin/', admin.site.urls)
url(r'^dialing/', include('dialing_app.urls', namespace='dialapp'))
]
if settings.DEBUG:
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib import admin
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += staticfiles_urlpatterns()
urlpatterns += [url(r'^admin/', admin.site.urls)]

5
msg_app/admin.py

@ -1,3 +1,6 @@
from django.contrib import admin
from . import models
admin.site.register(models.Message)
admin.site.register(models.Conversation)
# Register your models here.

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

@ -146,7 +146,7 @@ msgstr "Создать беседу"
#: templates/msg_app/modal_new_conversation.html:19
msgid "for select multiple press ctrl and click on field"
msgstr "Для выбора нескольких ывриантов зажмите ctrl и кликните вариант"
msgstr "Для выбора нескольких вариантов зажмите ctrl и кликните нужный вариант"
#: templates/msg_app/modal_new_conversation.html:28
msgid "Add"

9
mydefs.py

@ -215,3 +215,12 @@ class MultipleException(Exception):
class LogicError(Exception):
pass
def singleton(class_):
instances = {}
def getinstance(*args, **kwargs):
if class_ not in instances:
instances[class_] = class_(*args, **kwargs)
return instances[class_]
return getinstance

71
queue_mngr.py

@ -1,30 +1,55 @@
#!/usr/bin/env python3
import os
import sys
from rq import Connection, Worker
from pickle import loads
from pid.decorator import pidfile
import socket
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
from agent import NasFailedResult, NasNetworkError
from django.core.exceptions import ValidationError
"""
Заустить этот скрипт как демон, он соединяет redis и django
"""
@pidfile()
def main():
'''
obj = {
'client_ip': ip2int('127.0.0.1'),
'client_mac': 'aa:bb:cc:dd:ee:ff',
'switch_mac': 'aa:bb:cc:dd:ee:ff',
'switch_port': 3,
'cmd': 'commit'
}
'''
def on_new_data(client_sock, ip):
from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release
data = client_sock.recv(16384)
data = loads(data)
action = data['cmd']
if action == 'commit':
dhcp_commit(
data['client_ip'], data['client_mac'],
data['switch_mac'], data['switch_port']
)
elif action == 'expiry':
dhcp_expiry(data['client_ip'])
elif action == 'release':
dhcp_release(data['client_ip'])
client_sock.close()
@pidfile(pidname='queue_mngr.py.pid', piddir='/run')
def serve(addr='127.0.0.1', port=5436):
try:
django.setup()
with Connection():
qs = sys.argv[1:] or ['default']
w = Worker(qs)
w.work()
except (NasNetworkError, NasFailedResult) as e:
print('NAS:', e)
except (ValidationError, ValueError) as e:
print('ERROR:', e)
if __name__ == "__main__":
main()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((addr, port))
s.listen(3)
print('ready')
while True:
conn, client_addr = s.accept()
on_new_data(conn, client_addr)
except ConnectionRefusedError:
print('ERROR: connection refused')
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup()
serve()

8
static/css/custom.css

@ -266,3 +266,11 @@ div#loading>div.gif {
border-radius: 13px;
border-style: ridge;
}
@media (max-width: 767px) {
.nav-tabs.nav-justified > li {
float: left;
width: 50%;
}
}

2
systemd_units/djing_telebot.service

@ -4,7 +4,7 @@ Description=Djing telegram bot
[Service]
Type=simple
ExecStart=/usr/bin/python3 ./telebot.py > /dev/null
PIDFile=/run/telebot.py.pid
PIDFile=/run/djing_telebot.pid
WorkingDirectory=/var/www/djing
TimeoutSec=9
Restart=always

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

@ -163,7 +163,7 @@ msgstr "Создать"
#: taskapp/templates/taskapp/tasklist_all.html:93
#: taskapp/templates/taskapp/tasklist_all.html:94
msgid "Add new task"
msgstr "Добавьте новую задачу"
msgstr "Добавьте задачу"
#: taskapp/templates/taskapp/add_edit_task.html:27
#: taskapp/templates/taskapp/tasklist.html:13

2
taskapp/templates/taskapp/ext.htm

@ -14,7 +14,7 @@
<h2>{% trans 'Tasks to be performed' %}</h2>
</div>
<ul class="nav nav-tabs">
<ul class="nav nav-tabs nav-justified">
{% url 'taskapp:home' as taskhome %}
<li{% if taskhome == request.path %} class="active"{% endif %}>

23
taskapp/templates/taskapp/footer_btns.html

@ -1,11 +1,14 @@
{% load i18n %}
{% if perms.taskapp.add_task %}
<a href="{% url 'taskapp:add' %}" class="btn btn-sm btn-success">
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add new task' %}
</a>
{% endif %}
{% if perms.taskapp.can_viewall %}
<a href="{% url 'taskapp:all_tasks' %}" class="btn btn-sm btn-info">
<span class="glyphicon glyphicon-baby-formula"></span> {% trans 'View all tasks' %}
</a>
{% endif %}
<div class="btn-group btn-group-sm">
{% if perms.taskapp.add_task %}
<a href="{% url 'taskapp:add' %}" class="btn btn-sm btn-success">
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add new task' %}
</a>
{% endif %}
{% if perms.taskapp.can_viewall %}
<a href="{% url 'taskapp:all_tasks' %}" class="btn btn-sm btn-info">
<span class="glyphicon glyphicon-baby-formula"></span> {% trans 'View all tasks' %}
</a>
{% endif %}
</div>

8
taskapp/templates/taskapp/tasklist.html

@ -6,13 +6,13 @@
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>#</th>
<th class="hidden-xs">#</th>
<th class="col-sm-3">{% trans 'Name' %}</th>
<th class="col-sm-1">{% trans 'Address' %}</th>
<th class="col-sm-1">{% trans 'The nature of the damage' %}</th>
<th class="col-sm-4">{% trans 'Description' %}</th>
<th class="col-sm-1">{% trans 'Task author' %}</th>
<th class="col-sm-1">{% trans 'Date of create' %}</th>
<th class="col-sm-1 hidden-xs">{% trans 'Date of create' %}</th>
<th class="col-sm-1">{% trans 'Actions' %}</th>
</tr>
</thead>
@ -33,7 +33,7 @@
{% endif %}
{% endif %}
<td><a href="{% url 'taskapp:view' task.pk %}" target="_blank">{{ task.pk }}</a></td>
<td class="hidden-xs"><a href="{% url 'taskapp:view' task.pk %}" target="_blank">{{ task.pk }}</a></td>
{% if task.abon and task.abon.group %}
<td><a href="{% url 'abonapp:abon_home' task.abon.group.pk task.abon.pk %}" target="_blank" title="{{ task.abon.description|default:'' }}" data-toggle="tooltip">{{ task.abon.get_full_name }}</a></td>
@ -52,7 +52,7 @@
{% trans 'Author does not exist' %}
{% endif %}
</td>
<td>{{ task.time_of_create|date:'d E H:i' }}</td>
<td class="hidden-xs">{{ task.time_of_create|date:'d E H:i' }}</td>
<td class="btn-group btn-group-xs btn-group-justified">
<a href="{% url 'taskapp:finish' task.pk %}" class="btn btn-success" data-toggle="tooltip" title="{% trans 'Complete' %}">

8
taskapp/templates/taskapp/tasklist_all.html

@ -18,14 +18,14 @@
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>#</th>
<th class="hidden-xs">#</th>
<th class="col-sm-3">{% trans 'Name' %}</th>
<th class="col-sm-1">{% trans 'Address' %}</th>
<th class="col-sm-1">{% trans 'The nature of the damage' %}</th>
<th class="col-sm-3">{% trans 'Description' %}</th>
<th class="col-sm-1">{% trans 'Task author' %}</th>
<th class="col-sm-1">{% trans 'Condition' %}</th>
<th class="col-sm-1">{% trans 'Date of create' %}</th>
<th class="col-sm-1 hidden-xs">{% trans 'Date of create' %}</th>
<th class="col-sm-1">{% trans 'Actions' %}</th>
</tr>
</thead>
@ -46,7 +46,7 @@
{% endif %}
{% endif %}
<td><a href="{% url 'taskapp:view' task.pk %}" target="_blank">{{ task.pk }}</a></td>
<td class="hidden-xs"><a href="{% url 'taskapp:view' task.pk %}" target="_blank">{{ task.pk }}</a></td>
{% if task.abon and task.abon.group %}
<td><a href="{% url 'abonapp:abon_home' task.abon.group.pk task.abon.pk %}" target="_blank">{{ task.abon.get_full_name }}</a></td>
@ -67,7 +67,7 @@
{% endif %}
</td>
<td>{{ task.get_state_display }}</td>
<td>{{ task.time_of_create|date:'d E H:i' }}</td>
<td class="hidden-xs">{{ task.time_of_create|date:'d E H:i' }}</td>
<td class="btn-group btn-group-sm btn-group-justified">
{% if perms.taskapp.change_task %}

10
taskapp/templates/taskapp/tasklist_failed.html

@ -6,13 +6,13 @@
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>#</th>
<th class="hidden-xs">#</th>
<th class="col-sm-3">{% trans 'Name' %}</th>
<th class="col-sm-1">{% trans 'Address' %}</th>
<th class="col-sm-1">{% trans 'The nature of the damage' %}</th>
<th class="col-sm-4">{% trans 'Description' %}</th>
<th class="col-sm-1">{% trans 'Task author' %}</th>
<th class="col-sm-1">{% trans 'Date of create' %}</th>
<th class="col-sm-1 hidden-xs">{% trans 'Date of create' %}</th>
<th class="col-sm-1">{% trans 'Actions' %}</th>
</tr>
</thead>
@ -33,7 +33,7 @@
{% endif %}
{% endif %}
<td><a href="{% url 'taskapp:view' task.pk %}" target="_blank">{{ task.pk }}</a></td>
<td class="hidden-xs"><a href="{% url 'taskapp:view' task.pk %}" target="_blank">{{ task.pk }}</a></td>
{% if task.abon and task.abon.group %}
<td><a href="{% url 'abonapp:abon_home' task.abon.group.pk task.abon.pk %}" target="_blank">{{ task.abon.get_full_name }}</a></td>
@ -47,9 +47,9 @@
<td>{{ task.descr }}</td>
<td><a href="{% url 'acc_app:other_profile' task.author.pk %}" data-toggle="tooltip"
title="{{ task.author.get_full_name }}">{{ task.author.username }}</a></td>
<td>{{ task.time_of_create|date:'d E H:i' }}</td>
<td class="hidden-xs">{{ task.time_of_create|date:'d E H:i' }}</td>
<td class="btn-group btn-group-sm">
<td class="btn-group btn-group-sm btn-group-justified">
<a href="{% url 'taskapp:finish' task.pk %}" class="btn btn-success" title="{% trans 'Complete' %}" data-toggle="tooltip">
<span class="glyphicon glyphicon-ok"></span>
</a>

11
taskapp/templates/taskapp/tasklist_finish.html

@ -6,13 +6,13 @@
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>#</th>
<th class="hidden-xs">#</th>
<th class="col-sm-3">{% trans 'Name' %}</th>
<th class="col-sm-2">{% trans 'Address' %}</th>
<th class="col-sm-1">{% trans 'The nature of the damage' %}</th>
<th class="col-sm-4">{% trans 'Description' %}</th>
<th class="col-sm-1">{% trans 'Task author' %}</th>
<th class="col-sm-1">{% trans 'Date of create' %}</th>
<th class="col-sm-1 hidden-xs">{% trans 'Date of create' %}</th>
<th>#</th>
</tr>
</thead>
@ -33,7 +33,7 @@
{% endif %}
{% endif %}
<td><a href="{% url 'taskapp:view' task.pk %}" target="_blank">{{ task.pk }}</a></td>
<td class="hidden-xs"><a href="{% url 'taskapp:view' task.pk %}" target="_blank">{{ task.pk }}</a></td>
{% if task.abon and task.abon.group %}
<td><a href="{% url 'abonapp:abon_home' task.abon.group.pk task.abon.pk %}" target="_blank">{{ task.abon.get_full_name }}</a></td>
@ -45,9 +45,8 @@
<td>{{ task.get_mode_display }}</td>
<td>{{ task.descr }}</td>
<td><a href="{% url 'acc_app:other_profile' task.author.pk %}" data-toggle="tooltip"
title="{{ task.author.get_full_name }}">{{ task.author.username }}</a></td>
<td>{{ task.time_of_create|date:'d E H:i' }}</td>
<td><a href="{% url 'acc_app:other_profile' task.author.pk %}" data-toggle="tooltip" title="{{ task.author.get_full_name }}">{{ task.author.username }}</a></td>
<td class="hidden-xs">{{ task.time_of_create|date:'d E H:i' }}</td>
<td>
{% if perms.taskapp.change_task %}

8
taskapp/templates/taskapp/tasklist_own.html

@ -6,13 +6,13 @@
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>#</th>
<th class="hidden-xs">#</th>
<th class="col-sm-3">{% trans 'Name' %}</th>
<th class="col-sm-1">{% trans 'Address' %}</th>
<th class="col-sm-1">{% trans 'The nature of the damage' %}</th>
<th class="col-sm-4">{% trans 'Description' %}</th>
<th class="col-sm-1">{% trans 'Condition' %}</th>
<th class="col-sm-1">{% trans 'Date of create' %}</th>
<th class="col-sm-1 hidden-xs">{% trans 'Date of create' %}</th>
<th class="col-sm-1">{% trans 'Actions' %}</th>
</tr>
</thead>
@ -33,7 +33,7 @@
{% endif %}
{% endif %}
<td><a href="{% url 'taskapp:view' task.id %}" target="_blank">{{ task.id }}</a></td>
<td class="hidden-xs"><a href="{% url 'taskapp:view' task.id %}" target="_blank">{{ task.id }}</a></td>
{% if task.abon and task.abon.group %}
<td><a href="{% url 'abonapp:abon_home' task.abon.group.pk task.abon.pk %}" target="_blank">{{ task.abon.get_full_name }}</a></td>
@ -46,7 +46,7 @@
<td>{{ task.get_mode_display }}</td>
<td>{{ task.descr }}</td>
<td>{{ task.get_state_display }}</td>
<td>{{ task.time_of_create|date:'d E H:i' }}</td>
<td class="hidden-xs">{{ task.time_of_create|date:'d E H:i' }}</td>
<td class="btn-group btn-group-justified">
{% if perms.taskapp.change_task %}

2
telebot.py

@ -7,7 +7,7 @@ from telepot import DelegatorBot
from telepot.delegate import per_chat_id, create_open, pave_event_space
@pidfile()
@pidfile(pidname='djing_telebot.pid', piddir='/run')
def main():
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup()

2
templates/all_base.html

@ -37,7 +37,7 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{% url 'acc_app:other_profile' request.user.id %}">InternetService</a>
<a class="navbar-brand hidden-xs" href="{% url 'acc_app:other_profile' request.user.id %}">InternetService</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">

4
templates/base.html

@ -2,7 +2,7 @@
{% block base_content %}
<!-- Left menu -->
<div class="col-sm-2 sidebar sidebar-offcanvas" role="navigation">
<div class="col-sm-3 col-md-2 sidebar sidebar-offcanvas" role="navigation">
<div class="row profile_img">
<div class="col-sm-5">
@ -84,7 +84,7 @@
<!-- END Left menu -->
<!-- Main content -->
<div class="col-sm-10 col-sm-offset-2 main">
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<p class="pull-left visible-xs">
<button type="button" data-toggle="offcanvas"></button>
</p>

Loading…
Cancel
Save