Browse Source

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

# Conflicts:
#	chatbot/telebot.py
devel
bashmak 8 years ago
parent
commit
027e957614
  1. 8
      abonapp/locale/ru/LC_MESSAGES/django.po
  2. 1
      abonapp/models.py
  3. 11
      abonapp/templates/abonapp/editAbon.html
  4. 2
      abonapp/templates/abonapp/ext.htm
  5. 32
      abonapp/templates/abonapp/modal_phonebook.html
  6. 11
      abonapp/templates/abonapp/peoples.html
  7. 2
      abonapp/urls_abon.py
  8. 39
      abonapp/views.py
  9. 21
      accounts_app/templates/accounts/acc_list.html
  10. 2
      accounts_app/templates/accounts/index.html
  11. 3
      agent/commands/dhcp.py
  12. 3
      chatbot/telebot.py
  13. 3
      clientsideapp/templates/clientsideapp/ext.html
  14. 12
      clientsideapp/templates/clientsideapp/services.html
  15. 12
      clientsideapp/views.py
  16. 8
      devapp/dev_types.py
  17. 3
      devapp/locale/ru/LC_MESSAGES/django.po
  18. 6
      devapp/models.py
  19. 45
      devapp/views.py
  20. 13
      dialing_app/locale/ru/LC_MESSAGES/django.po
  21. 12
      dialing_app/templates/ext.html
  22. 10
      dialing_app/templates/vmail.html
  23. 3
      dialing_app/urls.py
  24. 15
      dialing_app/views.py
  25. 3
      mapapp/templates/maps/ya_index.html
  26. 2
      queue_mngr.py
  27. 19
      static/clientside/custom.css
  28. 2
      taskapp/handle.py
  29. 6
      taskapp/locale/ru/LC_MESSAGES/django.po
  30. 2
      taskapp/models.py
  31. 2
      taskapp/templates/taskapp/tasklist.html

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

@ -1012,3 +1012,11 @@ msgstr "Может видеть дополнительные телефоны"
msgid "IP Conflict! %d/%d results"
msgstr "IP Конфликт! ping %d из %d"
msgid "Phonebook"
msgstr "Телефонная книга"
msgid "Reset ip"
msgstr "Сбросить ip"
msgid "Export to csv"
msgstr "Сохранить в csv"

1
abonapp/models.py

@ -172,6 +172,7 @@ class Abon(UserProfile):
('can_add_ballance', _('fill account')),
('can_ping', _('Can ping'))
)
unique_together = ('device', 'dev_port')
verbose_name = _('Abon')
verbose_name_plural = _('Abons')

11
abonapp/templates/abonapp/editAbon.html

@ -49,7 +49,14 @@
<div class="form-group-sm{% if is_bad_ip %} has-error{% endif %}">
<label for="id_ip" class="col-sm-4 control-label">{% trans 'Ip Address' %}</label>
<div class="col-sm-8">
<input type="text" value="{{ ip|default:'' }}" class="form-control" name="ip" placeholder="{% trans 'Not assigned' %}" pattern="^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"{% if abon.is_dynamic_ip %} disabled{% endif %}/>
<div class="input-group input-group-sm">
<input type="text" value="{{ ip|default:'' }}" class="form-control" name="ip" placeholder="{% trans 'Not assigned' %}" id="ipfield" pattern="^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"{% if abon.is_dynamic_ip %} disabled{% endif %}/>
<span class="input-group-btn">
<a href="{% url 'abonapp:reset_ip' abon_group.pk abon.pk %}" class="btn btn-default btn-cmd" data-toggle="tooltip" title="{% trans 'Reset ip' %}" onclick="$('#ipfield').val('');">
<span class="glyphicon glyphicon-refresh"></span>
</a>
</span>
</div>
</div>
</div>
@ -149,7 +156,7 @@
<span class="glyphicon glyphicon-hdd"></span> <span class="hidden-md">{{ device.comment|truncatechars:11 }} {{ device.ip_address }}</span>
</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> <span class="hidden-xs hidden-md hidden-sm">{% trans 'Remove clutch' %}</span>
<span class="glyphicon glyphicon-remove-circle"></span> <span class="hidden-xs hidden-lg">{% trans 'Remove clutch' %}</span>
</a>
{% else %}
<a href="{% url 'abonapp:dev' abon_group.pk abon.pk %}" class="btn btn-success btn-sm btn-modal">

2
abonapp/templates/abonapp/ext.htm

@ -14,7 +14,7 @@
<div class="page-header">
<h2>{{ abon.fio|default:_("Long name") }}
<small>{% trans 'Ballance' %} <i class="glyphicon glyphicon-ruble"></i>
<b>{{ abon.ballance }}</b>
<b>{{ abon.ballance|floatformat:2 }}</b>
</small>
</h2>
</div>

32
abonapp/templates/abonapp/modal_phonebook.html

@ -0,0 +1,32 @@
{% load i18n %}
<div class="modal-header primary">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title"><span class="glyphicon glyphicon-earphone"></span>{% trans 'Phonebook' %}</h4>
</div>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>{% trans 'Telephone' %}</th>
<th>{% trans 'Telephone owner' %}</th>
</tr>
</thead>
<tbody>
{% for t in tels %}
<tr>
<td><a href="sip:{{ t.0 }}" class="btn btn-link">{{ t.0 }}</a></td>
<td>{{ t.1 }}</td>
</tr>
{% empty %}
<tr>
<td colspan="2">{% trans 'Telephone numbers not found' %}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="modal-footer">
<a href="{% url 'abonapp:phonebook' gid %}?f=csv" class="btn btn-default" target="_blank">
<span class="glyphicon glyphicon-export"></span> {% trans 'Export to csv' %}
</a>
</div>

11
abonapp/templates/abonapp/peoples.html

@ -102,7 +102,7 @@
{% else %}&mdash;&mdash;&mdash;
{% endif %}
</td>
<td class="hidden-xs">{{ human.ballance }}</td>
<td class="hidden-xs">{{ human.ballance|floatformat:2 }}</td>
<td class="hidden-xs">
{% if can_del_trf %}
<a href="{% url 'abonapp:del_abon' %}?id={{ human.pk }}" class="btn btn-danger btn-sm">
@ -125,15 +125,18 @@
</tbody>
<tfoot>
<tr>
<td colspan="11" class="btn-group">
<td colspan="11" class="btn-group btn-group-sm">
{% if perms.abonapp.add_abon %}
<a href="{% url 'abonapp:add_abon' abon_group.pk %}" class="btn btn-sm btn-default" title="{% trans 'Add' %}" data-toggle="tooltip">
<a href="{% url 'abonapp:add_abon' abon_group.pk %}" class="btn btn-default" title="{% trans 'Add' %}" data-toggle="tooltip">
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add abon' %}
</a>
{% endif %}
<a href="{% url 'abonapp:ch_group_tariff' abon_group.pk %}" class="btn btn-sm btn-default" title="{% trans 'User groups' %}" data-toggle="tooltip">
<a href="{% url 'abonapp:ch_group_tariff' abon_group.pk %}" class="btn btn-default" title="{% trans 'User groups' %}" data-toggle="tooltip">
<span class="glyphicon glyphicon-subscript"></span> {% trans 'Tariffs in groups' %}
</a>
<a href="{% url 'abonapp:phonebook' abon_group.pk %}" class="btn btn-default btn-modal">
<span class="glyphicon glyphicon-earphone"></span> {% trans 'Phonebook' %}
</a>
</td>
</tr>
</tfoot>

2
abonapp/urls_abon.py

@ -6,6 +6,7 @@ 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'^phonebook$', views.phonebook, name='phonebook'),
url(r'^street/add$', views.street_add, name='street_add'),
url(r'^street/edit', views.street_edit, name='street_edit'),
url(r'^street/(?P<sid>\d+)/delete$', views.street_del, name='street_del'),
@ -21,6 +22,7 @@ urlpatterns = [
url(r'^(?P<uid>\d+)/passport_view$', views.passport_view, name='passport_view'),
url(r'^(?P<uid>\d+)/chart$', views.charts, name='charts'),
url(r'^(?P<uid>\d+)/dials$', views.dials, name='dials'),
url(r'^(?P<uid>\d+)/reset_ip$', views.reset_ip, name='reset_ip'),
url(r'^(?P<uid>\d+)/extra_field$', views.make_extra_field, name='extra_field'),
url(r'^(?P<uid>\d+)/extra_field/(?P<fid>\d+)/delete$', views.extra_field_delete, name='extra_field_delete'),
url(r'^(?P<uid>\d+)/extra_field/edit$', views.extra_field_change, name='extra_field_edit'),

39
abonapp/views.py

@ -3,7 +3,7 @@ from json import dumps
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.models import Count, Q, signals
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
@ -870,6 +870,43 @@ def tel_del(request, gid, uid):
return redirect('abonapp:abon_home', gid, uid)
@login_required
@permission_required('abonapp.can_view_abongroup', (models.AbonGroup, 'pk', 'gid'))
def phonebook(request, gid):
res_format = request.GET.get('f')
t1 = models.Abon.objects.filter(group__id=int(gid)).only('telephone', 'fio').values_list('telephone', 'fio')
t2 = models.AdditionalTelephone.objects.filter(abon__group__id=gid).only('telephone', 'owner_name').values_list('telephone', 'owner_name')
tels = list(t1) + list(t2)
if res_format == 'csv':
import csv
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="phones.csv"'
writer = csv.writer(response, quoting=csv.QUOTE_NONNUMERIC)
for row in tels:
writer.writerow(row)
return response
return render_to_text('abonapp/modal_phonebook.html', {
'tels': tels,
'gid': gid
}, request=request)
@login_required
@permission_required('abonapp.change_abon')
@permission_required('abonapp.can_view_abongroup', (models.AbonGroup, 'pk', 'gid'))
def reset_ip(request, gid, uid):
abon = get_object_or_404(models.Abon, pk=uid)
signals.post_save.disconnect(models.abon_post_save, sender=models.Abon)
abon.ip_address = None
abon.save(update_fields=['ip_address'])
signals.post_save.connect(models.abon_post_save, sender=models.Abon)
return HttpResponse(dumps({
'status': 0,
'dat': "<span class='glyphicon glyphicon-refresh'></span>"
}))
# API's
def abons(request):

21
accounts_app/templates/accounts/acc_list.html

@ -34,27 +34,20 @@
Нету{% endif %}</td>
<td class="hidden-xs">{% if usr.email %}<a href="mailto:{{ usr.email }}">{{ usr.email }}{% else %}
Нету{% endif %}</a></td>
<td class="btn-group hidden-xs">
<a href="#" class="btn btn-sm btn-default disabled"
title="Дать задание">
<span class="glyphicon glyphicon-tasks"></span>
</a>
<a href="{ % url 'django_messages:messages_compose' % }?a={{ usr.id }}" class="btn btn-sm btn-info"
title="Отправить сообщение">
<span class="glyphicon glyphicon-envelope"></span>
</a>
{% if usr.id == request.user.id or perms.acc_app.delete_userprofile %}
{% if usr.id == request.user.id or perms.acc_app.delete_userprofile %}
<td class="btn-group hidden-xs">
<a href="{% url 'acc_app:delete_profile' usr.id %}" class="btn btn-sm btn-danger">
<span class="glyphicon glyphicon-remove"></span>
</a>
{% else %}
</td>
{% else %}
<td class="btn-group hidden-xs">
<a href="#" class="btn btn-sm btn-danger disabled" title="Не прав на удаление">
<span class="glyphicon glyphicon-remove"></span>
</a>
{% endif %}
</td>
{% endif %}
</td>
</tr>
{% empty %}
<tr>

2
accounts_app/templates/accounts/index.html

@ -3,7 +3,7 @@
{% block content %}
<div class="table">
<table class="table table-striped table-bordered">
<table class="table-striped table-bordered">
<tbody>
<tr>
<td class="col-sm-4">{% trans 'Telephone' %}</td>

3
agent/commands/dhcp.py

@ -10,7 +10,6 @@ def dhcp_commit(client_ip, client_mac, switch_mac, switch_port):
dev = Device.objects.get(mac_addr=switch_mac)
mngr_class = dev.get_manager_klass()
#port = _('<never mind>')
if mngr_class.is_use_device_port():
port = Port.objects.get(device=dev, num=switch_port)
abon = Abon.objects.get(dev_port=port, device=dev)
@ -33,7 +32,7 @@ def dhcp_commit(client_ip, client_mac, switch_mac, switch_port):
except Port.DoesNotExist:
print('N:', _('Port %d on device with mac %s does not exist') % (int(switch_port), switch_mac))
except MultipleObjectsReturned as e:
print('E:', 'MultipleObjectsReturned:', type(e), e)
print('E:', 'MultipleObjectsReturned:', type(e), e, port, dev)
def dhcp_expiry(client_ip):

3
chatbot/telebot.py

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
from telepot import helper, glance, Bot
from telepot.exception import TelegramError
import os
import socket
import collections
@ -143,3 +144,5 @@ def send_notify(msg_text, account, tag='none'):
raise ChatException(_("Recipient '%s' does not subscribed on notifications") % account.get_full_name())
except ProtocolError as e:
raise ChatException(e)
except TelegramError as e:
raise ChatException("%s - %s" % (e, tb.user.get_full_name()))

3
clientsideapp/templates/clientsideapp/ext.html

@ -49,6 +49,7 @@
<a href="{{ client_side_services }}">Услуги</a>
</li>
<!--<li>
<a href="#">
Сообщения из администрации
@ -70,7 +71,7 @@
</ul>
</li>
</ul>
<span class="navbar-text">Ваш балланс <b>{{ subscriber.ballance }}</b> руб.</span>
<span class="navbar-text">Ваш балланс <b>{{ subscriber.ballance|floatformat:2 }}</b> руб.</span>
</div><!--/.nav-collapse -->
</div>
</div>

12
clientsideapp/templates/clientsideapp/services.html

@ -6,7 +6,7 @@
<div class="container">
<div class="row">
<div class="col-lg-5">
<div class="col-lg-7">
{% if current_service %}
<div class="panel panel-default">
<div class="panel-heading">
@ -27,6 +27,8 @@
<p>{{ current_service.tariff.descr }}</p>
</div>
</div>
{% else %}
<div class="alert alert-warning" role="alert">
<span class="glyphicon glyphicon-exclamation-sign"></span>
@ -34,7 +36,7 @@
</div>
{% endif %}
</div>
<div class="col-lg-7">
<div class="col-lg-5">
<div class="panel panel-default">
<div class="panel-heading">
Доступные для заказа услуги
@ -66,12 +68,15 @@
</div>
</div>
</div>
</div>
</div>
{% include 'clientsideapp/services_ext.txt' %}
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="panel panel-info">
@ -89,5 +94,4 @@
</div>
</div>
</div>
{% endblock %}

12
clientsideapp/views.py

@ -28,12 +28,16 @@ def pays(request):
@login_required
def services(request):
abon = Abon.objects.get(pk=request.user.pk)
all_tarifs = abon.group.tariffs.filter(is_admin=False)
try:
abon = Abon.objects.get(pk=request.user.pk)
all_tarifs = abon.group.tariffs.filter(is_admin=False)
current_service = abon.active_tariff()
except:
all_tarifs = None
current_service = None
return render(request, 'clientsideapp/services.html', {
'tarifs': all_tarifs,
'current_service': abon.active_tariff()
'current_service': current_service
})

8
devapp/dev_types.py

@ -237,10 +237,10 @@ class EltexSwitch(DLinkDevice):
def get_ports(self):
#nams = self.get_list('.1.3.6.1.4.1.171.10.134.2.1.1.100.2.1.3')
stats = self.get_list('.1.3.6.1.2.1.2.2.1.7')
oper_stats = self.get_list('.1.3.6.1.2.1.2.2.1.8')
stats = list(self.get_list('.1.3.6.1.2.1.2.2.1.7'))
oper_stats = list(self.get_list('.1.3.6.1.2.1.2.2.1.8'))
#macs = self.get_list('.1.3.6.1.2.1.2.2.1.6')
speeds = self.get_list('.1.3.6.1.2.1.31.1.1.1.15')
speeds = list(self.get_list('.1.3.6.1.2.1.31.1.1.1.15'))
res = []
for n in range(28):
res.append(EltexPort(self,
@ -262,7 +262,7 @@ class EltexSwitch(DLinkDevice):
@staticmethod
def has_attachable_to_subscriber():
return False
return True
@staticmethod
def is_use_device_port():

3
devapp/locale/ru/LC_MESSAGES/django.po

@ -334,3 +334,6 @@ msgstr "Исправлено, обновите страницу"
msgid "Fix it"
msgstr "Исправить"
msgid "Duplicate user and port: %s"
msgstr "Пользователь с таким портом и устройством уже есть: %s"

6
devapp/models.py

@ -95,9 +95,9 @@ class Device(models.Model):
return "%s: (%s) %s %s" % (self.comment, self.get_devtype_display(), self.ip_address, self.mac_addr or '')
def update_dhcp(self):
if self.devtype != 'On':
if self.devtype not in ('On','Dl'):
return
grp = self.user_group.pk
grp = self.user_group.id
code = ''
if grp == 87:
code = 'chk'
@ -125,6 +125,8 @@ class Device(models.Model):
code = 'yst'
elif grp == 96:
code = 'lzk'
elif grp == 51:
code = 'sad'
newmac = str(self.mac_addr)
run(["%s/devapp/onu_register.sh" % settings.BASE_DIR, newmac, code])

45
devapp/views.py

@ -2,6 +2,7 @@
from django.contrib.auth.decorators import login_required
from django.contrib.gis.shortcuts import render_to_text
from django.core.exceptions import PermissionDenied
from django.db import IntegrityError
from django.db.models import Q
from django.http import HttpResponse
from django.shortcuts import render, redirect, get_object_or_404, resolve_url
@ -95,24 +96,30 @@ def dev(request, grp, devid=0):
else:
if not request.user.has_perm('devapp.change_device'):
raise PermissionDenied
frm = DeviceForm(request.POST, instance=devinst)
if frm.is_valid():
ndev = frm.save()
ndev.update_dhcp()
messages.success(request, _('Device info has been saved'))
return redirect('devapp:edit', ndev.user_group.pk, ndev.pk)
else:
try:
already_dev = Device.objects.get(mac_addr=request.POST.get('mac_addr'))
if already_dev.user_group:
messages.warning(request, _('You have redirected to existing device'))
return redirect('devapp:view', already_dev.user_group.pk, already_dev.pk)
else:
messages.warning(request, _('Please attach user group for device'))
return redirect('devapp:fix_device_group', already_dev.pk)
except Device.DoesNotExist:
pass
messages.error(request, _('Form is invalid, check fields and try again'))
try:
frm = DeviceForm(request.POST, instance=devinst)
if frm.is_valid():
ndev = frm.save()
ndev.update_dhcp()
messages.success(request, _('Device info has been saved'))
return redirect('devapp:edit', ndev.user_group.pk, ndev.pk)
else:
try:
already_dev = Device.objects.get(mac_addr=request.POST.get('mac_addr'))
if already_dev.user_group:
messages.warning(request, _('You have redirected to existing device'))
return redirect('devapp:view', already_dev.user_group.pk, already_dev.pk)
else:
messages.warning(request, _('Please attach user group for device'))
return redirect('devapp:fix_device_group', already_dev.pk)
except Device.DoesNotExist:
pass
messages.error(request, _('Form is invalid, check fields and try again'))
except IntegrityError as e:
if 'unique constraint' in e.message:
messages.error(request, _('Duplicate user and port: %s') % e)
else:
messages.error(request, e)
else:
if devinst is None:
frm = DeviceForm(initial={
@ -357,7 +364,7 @@ def toggle_port(request, did, portid, status=0):
try:
if ping(dev.ip_address):
if dev.man_passw:
manager = dev.get_manager_klass()(dev.ip_address, dev.man_passw)
manager = dev.get_manager_object()
ports = manager.get_ports()
if status:
ports[portid - 1].enable()

13
dialing_app/locale/ru/LC_MESSAGES/django.po

@ -95,14 +95,9 @@ msgstr "Несколько абонентов с указанным номеро
msgid "User with the telephone number not found"
msgstr "Абонент с таким номером телефона не найден"
msgid "Voice mail"
msgstr "Оставленные сообщения"
msgid "Voice mail request"
msgstr "Заявки на подключение"
msgid "Type"
msgstr "Тип"
msgid "Voice mail report"
msgstr "Заявки на поломки"
msgid "Request"
msgstr "Заявка"
msgid "Report"
msgstr "Поломка"

12
dialing_app/templates/ext.html

@ -22,13 +22,21 @@
</a>
</li>
{% url 'dialapp:vmail' as dialmail %}
{% url 'dialapp:vmail_request' as dialmail %}
<li{% if dialmail == request.path %} class="active"{% endif %}>
<a href="{{ dialmail }}">
{% trans 'Voice mail' %}
{% trans 'Voice mail request' %}
</a>
</li>
{% url 'dialapp:vmail_report' as dialmail %}
<li{% if dialmail == request.path %} class="active"{% endif %}>
<a href="{{ dialmail }}">
{% trans 'Voice mail report' %}
</a>
</li>
</ul>
<div class="tab-content">

10
dialing_app/templates/vmail.html

@ -10,7 +10,6 @@
<th>{% trans 'Play' %}</th>
<th>{% trans 'calldate' %}</th>
<th>{% trans 'src' %}</th>
<th>{% trans 'Type' %}</th>
<th>{% trans 'duration' %}</th>
<th>{% trans 'start' %}</th>
<th>{% trans 'answer' %}</th>
@ -21,7 +20,7 @@
<tbody>
{% for vmail in vmessages %}
<tr>
<td class="btn-group btn-group-sm">
<td class="btn-group btn-group-xs">
<button class="btn btn-default player-btn disabled">
<span class="glyphicon glyphicon-play"></span>
<audio preload="metadata" src="{{ vmail.path_to_media }}/{{ vmail.calldate|date:"YmdHi" }}-{{ vmail.src }}-{{ vmail.dst }}.wav"></audio>
@ -32,11 +31,6 @@
</td>
<td>{{ vmail.calldate|date:'d E Y, H:i:s' }}</td>
<td>{{ vmail.src|abon_if_telephone|safe }}</td>
<td>
{% if vmail.userfield == 'request' %}{% trans 'Request' %}
{% elif vmail.userfield == 'report' %}{% trans 'Report' %}
{% else %}{{ vmail.userfield }}{% endif %}
</td>
<td>{{ vmail.duration }}</td>
<td>{{ vmail.start|date:'d E Y, H:i:s' }}</td>
<td>{{ vmail.answer|date:'d E Y, H:i:s' }}</td>
@ -45,7 +39,7 @@
</tr>
{% empty %}
<tr>
<td colspan="9">{% trans 'Calls was not found' %}</td>
<td colspan="8">{% trans 'Calls was not found' %}</td>
</tr>
{% endfor %}
</tbody>

3
dialing_app/urls.py

@ -6,5 +6,6 @@ urlpatterns = [
url(r'^$', views.home, name='home'),
url(r'^filter$', views.vfilter, name='vfilter'),
url(r'^to_abon(?P<tel>\+?\d+)$', views.to_abon, name='to_abon'),
url(r'^voicemail$', views.vmail, name='vmail')
url(r'^requests$', views.vmail_request, name='vmail_request'),
url(r'^reports$', views.vmail_report, name='vmail_report')
]

15
dialing_app/views.py

@ -42,8 +42,8 @@ def to_abon(request, tel):
@login_required
@only_admins
def vmail(request):
title = _('Voice mail')
def vmail_request(request):
title = _('Voice mail request')
cdr = AsteriskCDR.objects.filter(userfield='request').order_by('-calldate')
cdr = pag_mn(request, cdr)
return render(request, 'vmail.html', {
@ -51,6 +51,17 @@ def vmail(request):
'vmessages': cdr
})
@login_required
@only_admins
def vmail_report(request):
title = _('Voice mail report')
cdr = AsteriskCDR.objects.filter(userfield='report').order_by('-calldate')
cdr = pag_mn(request, cdr)
return render(request, 'vmail.html', {
'title': title,
'vmessages': cdr
})
@login_required
@only_admins

3
mapapp/templates/maps/ya_index.html

@ -128,6 +128,7 @@
padding: 0;
position: fixed;
height: 95vh;
width: 100%;
}
#yapanel{
position: absolute;
@ -155,4 +156,4 @@
</div>
</div>
{% endblock %}
{% endblock %}

2
queue_mngr.py

@ -18,7 +18,6 @@ obj = {
def on_new_data(client_sock, ip):
from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release
data = client_sock.recv(16384)
data = loads(data)
action = data['cmd']
@ -51,5 +50,6 @@ def serve(addr='127.0.0.1', port=5436):
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup()
from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release
serve()

19
static/clientside/custom.css

@ -12,8 +12,27 @@ body > .container {
.table thead {
background-color: #ddd;
}
/* White background in tables */
.table tr:nth-of-type(2n) {
background-color: white;
}
.modal-header{border-radius: 4px 4px 0 0;}
.modal-header.warning {background-color: #d2322d;}
.modal-header.success {background-color: #6ad245;}
.modal-header.primary {background-color: #789cbb;}
html{height: 100%;}
body{
padding: 88px 15px 0;
background-image: url(../img/Transparent_snowman_PNG.png);
background-repeat: no-repeat;
background-position: bottom left;
background-attachment: fixed;
}

2
taskapp/handle.py

@ -35,8 +35,6 @@ def handle(task, author, recipients, abon_group):
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:

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

@ -378,3 +378,9 @@ msgstr "Задачи, которые необходимо выполнить"
msgid "locality %s. Task type - %s. "
msgstr "с. %s. Тип задачи - %s. "
msgid "ip conflict"
msgstr "Ip конфликт"
msgid "Internet crash"
msgstr "Нет интернета"

2
taskapp/models.py

@ -23,6 +23,7 @@ TASK_STATES = (
TASK_TYPES = (
('na', _('not chosen')),
('ic', _('ip conflict')),
('yt', _('yellow triangle')),
('rc', _('red cross')),
('ls', _('weak speed')),
@ -32,6 +33,7 @@ TASK_TYPES = (
('cr', _('router setup')),
('co', _('configure onu')),
('fc', _('crimp cable')),
('ni', _('Internet crash')),
('ot', _('other'))
)

2
taskapp/templates/taskapp/tasklist.html

@ -37,7 +37,7 @@
{% 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>{{ task.abon.group.title }}, {{ task.abon.street|default:_('Not assigned') }} {{ task.abon.house|default:_('Not assigned') }}</td>
<td>{{ task.abon.group.title }}, {{ task.abon.street|default:'' }} {{ task.abon.house|default:'' }}</td>
{% else %}
<td>{% trans 'User does not exist' %}</td>
<td>---</td>

Loading…
Cancel
Save