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 #: abonapp/templates/abonapp/ext.html:26
msgid "Sub information" msgid "Sub information"
msgstr "Информация абонента"
msgstr "Инфо."
msgid "Streets" msgid "Streets"
msgstr "Улицы" msgstr "Улицы"

21
abonapp/templates/abonapp/editAbon.html

@ -4,13 +4,13 @@
{% block content %} {% block content %}
<div class="row"> <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 panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{% trans 'Change subscriber' %}</h3> <h3 class="panel-title">{% trans 'Change subscriber' %}</h3>
</div> </div>
<div class="panel-body"> <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"> <div class="form-group-sm">
<label for="id_username" class="col-sm-4 control-label">{% trans 'login' %}</label> <label for="id_username" class="col-sm-4 control-label">{% trans 'login' %}</label>
@ -111,7 +111,7 @@
</button> </button>
{% if perms.taskapp.add_task %} {% if perms.taskapp.add_task %}
<a href="{% url 'taskapp:add' %}?uid={{ abon.username }}" class="btn btn-sm btn-success" title="{% trans 'Add new 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> </a>
{% endif %} {% endif %}
</div> </div>
@ -131,7 +131,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-sm-6">
<div class="col-sm-12 col-xs-12 col-md-6">
{% if perms.abonapp.change_abon %} {% if perms.abonapp.change_abon %}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
@ -145,11 +145,11 @@
<label for="id_method" class="col-sm-2 control-label">{% trans 'Device' %}</label> <label for="id_method" class="col-sm-2 control-label">{% trans 'Device' %}</label>
<div class="col-sm-10 btn-group btn-group-sm"> <div class="col-sm-10 btn-group btn-group-sm">
{% if device %} {% 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 }} <span class="glyphicon glyphicon-hdd"></span> {{ device.comment|truncatechars:11 }} {{ device.ip_address }}
</a> </a>
<a href="{% url 'abonapp:clear_dev' abon_group.pk abon.pk %}" class="btn btn-sm btn-danger"> <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> </a>
{% else %} {% else %}
<a href="{% url 'abonapp:dev' abon_group.pk abon.pk %}" class="btn btn-success btn-sm btn-modal"> <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> </div>
<div class="form-group-sm"> <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"> <button type="submit" class="btn btn-primary btn-sm">
<span class="glyphicon glyphicon-floppy-disk"></span> {% trans 'Save' %} <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> </div>
{% endif %} {% endif %}
</form> </form>

2
abonapp/templates/abonapp/ext.htm

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

4
abonapp/templates/abonapp/group_list.html

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

32
abonapp/templates/abonapp/peoples.html

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

4
abonapp/views.py

@ -286,7 +286,9 @@ def abonhome(request, gid, uid):
raise PermissionDenied raise PermissionDenied
frm = forms.AbonForm(request.POST, instance=abon) frm = forms.AbonForm(request.POST, instance=abon)
if frm.is_valid(): if frm.is_valid():
abon.ip_address = request.POST.get('ip')
newip = request.POST.get('ip')
if newip:
abon.ip_address = newip
frm.save() frm.save()
messages.success(request, _('edit abon success msg')) messages.success(request, _('edit abon success msg'))
else: 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.html:7
#: accounts_app/templates/accounts/group_list.html:7 #: accounts_app/templates/accounts/group_list.html:7
msgid "Administrators" msgid "Administrators"
msgstr "Администраторы"
msgstr "Сотрудники"
#: accounts_app/templates/accounts/group.html:8 #: accounts_app/templates/accounts/group.html:8
#: accounts_app/templates/accounts/group_list.html:8 #: accounts_app/templates/accounts/group_list.html:8

18
accounts_app/templates/accounts/acc_list.html

@ -14,11 +14,11 @@
<thead> <thead>
<tr> <tr>
<th class="col-sm-1">Фото</th> <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> </tr>
</thead> </thead>
<tbody> <tbody>
@ -30,11 +30,11 @@
</a></td> </a></td>
<td><a href="{% url 'acc_app:other_profile' usr.id %}">{{ usr.username }}</a></td> <td><a href="{% url 'acc_app:other_profile' usr.id %}">{{ usr.username }}</a></td>
<td>{{ usr.get_full_name }}</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> Нету{% 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> Нету{% endif %}</a></td>
<td class="btn-group">
<td class="btn-group hidden-xs">
<a href="#" class="btn btn-sm btn-default disabled" <a href="#" class="btn btn-sm btn-default disabled"
title="Дать задание"> title="Дать задание">
<span class="glyphicon glyphicon-tasks"></span> <span class="glyphicon glyphicon-tasks"></span>
@ -78,4 +78,4 @@
{% include 'toolbar_page.html' with pag=users %} {% include 'toolbar_page.html' with pag=users %}
{% endblock %}
{% endblock %}

15
accounts_app/templates/accounts/login.html

@ -15,6 +15,10 @@
margin: 10% auto; margin: 10% auto;
position: relative; position: relative;
} }
footer{
position: absolute;
bottom: 0;
}
</style> </style>
</head> </head>
<body> <body>
@ -60,5 +64,14 @@
</div> </div>
</div> </div>
<footer class="footer">
<div class="container">
<p class="text-muted">
Напишите нам <i>is-ttk@ya.ru</i>.
</p>
</div>
</footer>
</div>
</body> </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')) print('D:', _('User settings is not dynamic'))
return return
if not abon.is_access(): 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 return
abon.ip_address = client_ip abon.ip_address = client_ip
abon.is_dhcp = True abon.is_dhcp = True
abon.save(update_fields=['ip_address']) 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: except Abon.DoesNotExist:
print('N:', _("User with device '%s' does not exist") % dev) print('N:', _("User with device '%s' does not exist") % dev)
except Device.DoesNotExist: except Device.DoesNotExist:

22
agent/mod_mikrotik.py

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

2
clientsideapp/templates/clientsideapp/ext.html

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

2
devapp/models.py

@ -130,6 +130,8 @@ def dev_post_save_signal(sender, instance, **kwargs):
code = 'uy' code = 'uy'
elif grp == 79 or grp == 91: elif grp == 79 or grp == 91:
code = 'zrk' code = 'zrk'
elif grp == 95:
code = 'yst'
newmac = str(instance.mac_addr) newmac = str(instance.mac_addr)
run(["%s/devapp/onu_register.sh" % settings.BASE_DIR, newmac, code]) 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"> <ul class="list-group">
<li class="list-group-item">{% trans 'Ip address' %}: {{ dev.ip_address }}</li> <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 '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 %} {% for da in dev_accs %}
<li class="list-group-item">{% trans 'Attached user' %}: <li class="list-group-item">{% trans 'Attached user' %}:
{% if da.group %} {% if da.group %}

25
devapp/templates/devapp/devices.html

@ -16,27 +16,26 @@
<thead> <thead>
<tr> <tr>
<th>#</th> <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' %} {% trans 'Ip address' %}
</a> </a>
{% if order_by == 'ip_address' %}<span class="glyphicon glyphicon-filter"></span>{% endif %} {% if order_by == 'ip_address' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th> </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' %} {% trans 'Comment' %}
</a> </a>
{% if order_by == 'comment' %}<span class="glyphicon glyphicon-filter"></span>{% endif %} {% if order_by == 'comment' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th> </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' %} {% trans 'Device type' %}
</a> </a>
{% if order_by == 'devtype' %}<span class="glyphicon glyphicon-filter"></span>{% endif %} {% if order_by == 'devtype' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th> </th>
<th width="100">Do</th>
<th class="col-xs-1">Do</th>
</tr> </tr>
</thead> </thead>
@ -56,14 +55,14 @@
<td>{{ dev.mac_addr|default:_('Not assigned') }}</td> <td>{{ dev.mac_addr|default:_('Not assigned') }}</td>
<td>{{ dev.mon.plugin_output }}</td> <td>{{ dev.mon.plugin_output }}</td>
<td>{{ dev.get_devtype_display }}</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 %} {% 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> <span class="glyphicon glyphicon-remove"></span>
</a> </a>
{% endif %} {% endif %}
{% if can_ch_dev %} {% 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> <span class="glyphicon glyphicon-edit"></span>
</a> </a>
{% endif %} {% endif %}
@ -92,4 +91,4 @@
{% include 'toolbar_page.html' with pag=devices %} {% 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> <h2>{{ dev.comment|default:_('Not assigned') }}</h2>
</div> </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 %} {% url 'devapp:view' dev.user_group.pk|default:0 dev.pk as devapp_view %}
<li{% if devapp_view == request.path %} class="active"{% endif %}> <li{% if devapp_view == request.path %} class="active"{% endif %}>

4
devapp/templates/devapp/group_list.html

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

44
dhcp_lever.py

@ -1,25 +1,53 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import sys import sys
from redis import Redis
from rq import Queue
import socket
def die(text): def die(text):
print(text) print(text)
exit(1) 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__": if __name__ == "__main__":
argv = sys.argv argv = sys.argv
if len(argv) < 3: if len(argv) < 3:
die('Too few arguments, exiting...') die('Too few arguments, exiting...')
action = argv[1] action = argv[1]
q = Queue(connection=Redis())
if action == 'commit': if action == 'commit':
if len(argv) < 6: if len(argv) < 6:
die('Too few arguments, exiting...') 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.conf.urls import url, include
from django.contrib import admin
from . import settings from . import settings
from .views import home from .views import home
@ -17,13 +16,14 @@ urlpatterns = [
url(r'^tasks/', include('taskapp.urls', namespace='taskapp')), url(r'^tasks/', include('taskapp.urls', namespace='taskapp')),
url(r'^client/', include('clientsideapp.urls', namespace='client_side')), url(r'^client/', include('clientsideapp.urls', namespace='client_side')),
url(r'^msg/', include('msg_app.urls', namespace='msg_app')), 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: if settings.DEBUG:
from django.conf.urls.static import static from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib import admin
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += staticfiles_urlpatterns() 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 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 #: templates/msg_app/modal_new_conversation.html:19
msgid "for select multiple press ctrl and click on field" msgid "for select multiple press ctrl and click on field"
msgstr "Для выбора нескольких ывриантов зажмите ctrl и кликните вариант"
msgstr "Для выбора нескольких вариантов зажмите ctrl и кликните нужный вариант"
#: templates/msg_app/modal_new_conversation.html:28 #: templates/msg_app/modal_new_conversation.html:28
msgid "Add" msgid "Add"

9
mydefs.py

@ -215,3 +215,12 @@ class MultipleException(Exception):
class LogicError(Exception): class LogicError(Exception):
pass 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 #!/usr/bin/env python3
import os import os
import sys
from rq import Connection, Worker
from pickle import loads
from pid.decorator import pidfile from pid.decorator import pidfile
import socket
import django 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: 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-radius: 13px;
border-style: ridge; 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] [Service]
Type=simple Type=simple
ExecStart=/usr/bin/python3 ./telebot.py > /dev/null ExecStart=/usr/bin/python3 ./telebot.py > /dev/null
PIDFile=/run/telebot.py.pid
PIDFile=/run/djing_telebot.pid
WorkingDirectory=/var/www/djing WorkingDirectory=/var/www/djing
TimeoutSec=9 TimeoutSec=9
Restart=always 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:93
#: taskapp/templates/taskapp/tasklist_all.html:94 #: taskapp/templates/taskapp/tasklist_all.html:94
msgid "Add new task" msgid "Add new task"
msgstr "Добавьте новую задачу"
msgstr "Добавьте задачу"
#: taskapp/templates/taskapp/add_edit_task.html:27 #: taskapp/templates/taskapp/add_edit_task.html:27
#: taskapp/templates/taskapp/tasklist.html:13 #: taskapp/templates/taskapp/tasklist.html:13

2
taskapp/templates/taskapp/ext.htm

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

23
taskapp/templates/taskapp/footer_btns.html

@ -1,11 +1,14 @@
{% load i18n %} {% 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"> <table class="table table-striped table-bordered">
<thead> <thead>
<tr> <tr>
<th>#</th>
<th class="hidden-xs">#</th>
<th class="col-sm-3">{% trans 'Name' %}</th> <th class="col-sm-3">{% trans 'Name' %}</th>
<th class="col-sm-1">{% trans 'Address' %}</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-1">{% trans 'The nature of the damage' %}</th>
<th class="col-sm-4">{% trans 'Description' %}</th> <th class="col-sm-4">{% trans 'Description' %}</th>
<th class="col-sm-1">{% trans 'Task author' %}</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> <th class="col-sm-1">{% trans 'Actions' %}</th>
</tr> </tr>
</thead> </thead>
@ -33,7 +33,7 @@
{% endif %} {% endif %}
{% 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 %} {% 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> <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' %} {% trans 'Author does not exist' %}
{% endif %} {% endif %}
</td> </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"> <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' %}"> <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"> <table class="table table-striped table-bordered">
<thead> <thead>
<tr> <tr>
<th>#</th>
<th class="hidden-xs">#</th>
<th class="col-sm-3">{% trans 'Name' %}</th> <th class="col-sm-3">{% trans 'Name' %}</th>
<th class="col-sm-1">{% trans 'Address' %}</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-1">{% trans 'The nature of the damage' %}</th>
<th class="col-sm-3">{% trans 'Description' %}</th> <th class="col-sm-3">{% trans 'Description' %}</th>
<th class="col-sm-1">{% trans 'Task author' %}</th> <th class="col-sm-1">{% trans 'Task author' %}</th>
<th class="col-sm-1">{% trans 'Condition' %}</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> <th class="col-sm-1">{% trans 'Actions' %}</th>
</tr> </tr>
</thead> </thead>
@ -46,7 +46,7 @@
{% endif %} {% endif %}
{% 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 %} {% 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> <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 %} {% endif %}
</td> </td>
<td>{{ task.get_state_display }}</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"> <td class="btn-group btn-group-sm btn-group-justified">
{% if perms.taskapp.change_task %} {% if perms.taskapp.change_task %}

10
taskapp/templates/taskapp/tasklist_failed.html

@ -6,13 +6,13 @@
<table class="table table-striped table-bordered"> <table class="table table-striped table-bordered">
<thead> <thead>
<tr> <tr>
<th>#</th>
<th class="hidden-xs">#</th>
<th class="col-sm-3">{% trans 'Name' %}</th> <th class="col-sm-3">{% trans 'Name' %}</th>
<th class="col-sm-1">{% trans 'Address' %}</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-1">{% trans 'The nature of the damage' %}</th>
<th class="col-sm-4">{% trans 'Description' %}</th> <th class="col-sm-4">{% trans 'Description' %}</th>
<th class="col-sm-1">{% trans 'Task author' %}</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> <th class="col-sm-1">{% trans 'Actions' %}</th>
</tr> </tr>
</thead> </thead>
@ -33,7 +33,7 @@
{% endif %} {% endif %}
{% 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 %} {% 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> <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>{{ task.descr }}</td>
<td><a href="{% url 'acc_app:other_profile' task.author.pk %}" data-toggle="tooltip" <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> 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"> <a href="{% url 'taskapp:finish' task.pk %}" class="btn btn-success" title="{% trans 'Complete' %}" data-toggle="tooltip">
<span class="glyphicon glyphicon-ok"></span> <span class="glyphicon glyphicon-ok"></span>
</a> </a>

11
taskapp/templates/taskapp/tasklist_finish.html

@ -6,13 +6,13 @@
<table class="table table-striped table-bordered"> <table class="table table-striped table-bordered">
<thead> <thead>
<tr> <tr>
<th>#</th>
<th class="hidden-xs">#</th>
<th class="col-sm-3">{% trans 'Name' %}</th> <th class="col-sm-3">{% trans 'Name' %}</th>
<th class="col-sm-2">{% trans 'Address' %}</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-1">{% trans 'The nature of the damage' %}</th>
<th class="col-sm-4">{% trans 'Description' %}</th> <th class="col-sm-4">{% trans 'Description' %}</th>
<th class="col-sm-1">{% trans 'Task author' %}</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> <th>#</th>
</tr> </tr>
</thead> </thead>
@ -33,7 +33,7 @@
{% endif %} {% endif %}
{% 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 %} {% 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> <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.get_mode_display }}</td>
<td>{{ task.descr }}</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> <td>
{% if perms.taskapp.change_task %} {% if perms.taskapp.change_task %}

8
taskapp/templates/taskapp/tasklist_own.html

@ -6,13 +6,13 @@
<table class="table table-striped table-bordered"> <table class="table table-striped table-bordered">
<thead> <thead>
<tr> <tr>
<th>#</th>
<th class="hidden-xs">#</th>
<th class="col-sm-3">{% trans 'Name' %}</th> <th class="col-sm-3">{% trans 'Name' %}</th>
<th class="col-sm-1">{% trans 'Address' %}</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-1">{% trans 'The nature of the damage' %}</th>
<th class="col-sm-4">{% trans 'Description' %}</th> <th class="col-sm-4">{% trans 'Description' %}</th>
<th class="col-sm-1">{% trans 'Condition' %}</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> <th class="col-sm-1">{% trans 'Actions' %}</th>
</tr> </tr>
</thead> </thead>
@ -33,7 +33,7 @@
{% endif %} {% endif %}
{% 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 %} {% 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> <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.get_mode_display }}</td>
<td>{{ task.descr }}</td> <td>{{ task.descr }}</td>
<td>{{ task.get_state_display }}</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"> <td class="btn-group btn-group-justified">
{% if perms.taskapp.change_task %} {% 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 from telepot.delegate import per_chat_id, create_open, pave_event_space
@pidfile()
@pidfile(pidname='djing_telebot.pid', piddir='/run')
def main(): def main():
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup() django.setup()

2
templates/all_base.html

@ -37,7 +37,7 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </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>
<div class="navbar-collapse collapse"> <div class="navbar-collapse collapse">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">

4
templates/base.html

@ -2,7 +2,7 @@
{% block base_content %} {% block base_content %}
<!-- Left menu --> <!-- 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="row profile_img">
<div class="col-sm-5"> <div class="col-sm-5">
@ -84,7 +84,7 @@
<!-- END Left menu --> <!-- END Left menu -->
<!-- Main content --> <!-- 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"> <p class="pull-left visible-xs">
<button type="button" data-toggle="offcanvas"></button> <button type="button" data-toggle="offcanvas"></button>
</p> </p>

Loading…
Cancel
Save