Browse Source

initial

devel
bashmak 8 years ago
parent
commit
5b2f56f08c
  1. 103
      abonapp/migrations/0002_ip_address_change.py
  2. 7
      abonapp/models.py
  3. 9
      abonapp/templates/abonapp/addAbon.html
  4. 7
      abonapp/templates/abonapp/addInvoice.html
  5. 14
      abonapp/templates/abonapp/debtors.html
  6. 2
      abonapp/templates/abonapp/editAbon.html
  7. 21
      abonapp/templates/abonapp/ext.htm
  8. 12
      abonapp/templates/abonapp/fin_report.html
  9. 11
      abonapp/templates/abonapp/group_list.html
  10. 10
      abonapp/templates/abonapp/group_tariffs.html
  11. 12
      abonapp/templates/abonapp/invoiceForPayment.html
  12. 12
      abonapp/templates/abonapp/log.html
  13. 9
      abonapp/templates/abonapp/peoples.html
  14. 17
      abonapp/views.py
  15. 3
      accounts_app/locale/ru/LC_MESSAGES/django.po
  16. 3
      accounts_app/models.py
  17. 12
      accounts_app/templates/accounts/acc_list.html
  18. 7
      accounts_app/templates/accounts/create_acc.html
  19. 9
      accounts_app/templates/accounts/ext.htm
  20. 11
      accounts_app/templates/accounts/perms/objects_of_type.html
  21. 9
      accounts_app/templates/accounts/perms/objects_types.html
  22. 9
      accounts_app/templates/accounts/perms/perms_edit.html
  23. 10
      accounts_app/templates/accounts/settings/ext.htm
  24. 2
      clientsideapp/templates/clientsideapp/index.html
  25. 44
      devapp/migrations/0005_device_ip_address_change.py
  26. 8
      devapp/models.py
  27. 15
      devapp/templates/devapp/add_dev.html
  28. 14
      devapp/templates/devapp/devices.html
  29. 12
      devapp/templates/devapp/devices_null_group.html
  30. 44
      devapp/templates/devapp/ext.htm
  31. 128
      devapp/templates/devapp/fix_dev_group.html
  32. 9
      devapp/templates/devapp/group_list.html
  33. 22
      devapp/templates/devapp/manage_ports/add_ports.html
  34. 13
      devapp/templates/devapp/manage_ports/fix_abon_device.html
  35. 11
      devapp/views.py
  36. 15
      dialing_app/templates/ext.html
  37. 4
      djing/global_base_views.py
  38. 6
      djing/settings.py
  39. 13
      djing/templatetags/globaltags.py
  40. 10
      djing/urls.py
  41. 14
      group_app/templates/group_app/ext.html
  42. 11
      group_app/templates/group_app/group_list.html
  43. 0
      ip_pool/__init__.py
  44. 5
      ip_pool/admin.py
  45. 5
      ip_pool/apps.py
  46. 30
      ip_pool/forms.py
  47. 56
      ip_pool/migrations/0001_initial.py
  48. 0
      ip_pool/migrations/__init__.py
  49. 91
      ip_pool/models.py
  50. 39
      ip_pool/templates/ip_pool/employed_ip_list.html
  51. 30
      ip_pool/templates/ip_pool/ext.html
  52. 35
      ip_pool/templates/ip_pool/net_add.html
  53. 41
      ip_pool/templates/ip_pool/net_edit.html
  54. 70
      ip_pool/templates/ip_pool/network_list.html
  55. 3
      ip_pool/tests.py
  56. 11
      ip_pool/urls.py
  57. 60
      ip_pool/views.py
  58. 7
      locale/ru/LC_MESSAGES/django.po
  59. 24
      mapapp/templates/maps/add_device.html
  60. 33
      mapapp/templates/maps/dot.html
  61. 11
      mapapp/templates/maps/options.html
  62. 11
      msg_app/templates/msg_app/chat.html
  63. 13
      msg_app/templates/msg_app/conversations.html
  64. 3
      searchapp/locale/ru/LC_MESSAGES/django.po
  65. 11
      searchapp/templates/searchapp/index.html
  66. 7
      tariff_app/templates/tariff_app/editTarif.html
  67. 9
      tariff_app/templates/tariff_app/ext.html
  68. 24
      tariff_app/templates/tariff_app/periodic_pays/add_edit.html
  69. 6
      taskapp/templates/taskapp/add_edit_task.html
  70. 16
      taskapp/templates/taskapp/ext.htm
  71. 16
      taskapp/templates/taskapp/tasklist_all.html
  72. 4
      taskapp/templates/taskapp/tasklist_empty.html
  73. 4
      taskapp/templates/taskapp/tasklist_failed.html
  74. 7
      taskapp/views.py
  75. 45
      templates/base.html

103
abonapp/migrations/0002_ip_address_change.py

@ -0,0 +1,103 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-06-12 12:05
from __future__ import unicode_literals
import os
import re
from json import load
import django.core.validators
from django.db import migrations, models
from django.core import serializers
TMP_FILE = '/tmp/djing_ip_field_abonapp_migrate.json'
def backup_info(apps, _):
Abon = apps.get_model('abonapp', 'Abon')
obs = Abon.objects.all()
with open(TMP_FILE, 'w') as f:
serializers.serialize('json', obs, stream=f)
def restore_info_to_new_scheme(apps, _):
Abon = apps.get_model('abonapp', 'Abon')
with open(TMP_FILE, 'r') as f:
for abon in load(f):
Abon.objects.filter(pk=abon['pk']).update(ip_address=abon['fields']['ip_address'])
if os.path.isfile(TMP_FILE):
os.remove(TMP_FILE)
class Migration(migrations.Migration):
dependencies = [
('abonapp', '0001_initial'),
]
operations = [
migrations.RunPython(backup_info),
migrations.AlterModelOptions(
name='abon',
options={'ordering': ('fio',), 'permissions': (('can_buy_tariff', 'Buy service perm'), ('can_view_passport', 'Can view passport'), ('can_add_ballance', 'fill account'), ('can_ping', 'Can ping')), 'verbose_name': 'Abon', 'verbose_name_plural': 'Abons'},
),
migrations.AlterModelOptions(
name='abonlog',
options={'ordering': ('-date',), 'permissions': (('can_view_abonlog', 'Can view subscriber logs'),)},
),
migrations.AlterModelOptions(
name='abonstreet',
options={'ordering': ('name',), 'verbose_name': 'Street', 'verbose_name_plural': 'Streets'},
),
migrations.AlterModelOptions(
name='abontariff',
options={'ordering': ('time_start',), 'permissions': (('can_complete_service', 'finish service perm'),), 'verbose_name': 'Abon service', 'verbose_name_plural': 'Abon services'},
),
migrations.AlterModelOptions(
name='allpaylog',
options={'ordering': ('-date_action',)},
),
migrations.AlterModelOptions(
name='alltimepaylog',
options={'ordering': ('-date_add',)},
),
migrations.AlterModelOptions(
name='passportinfo',
options={'ordering': ('series',), 'verbose_name': 'Passport Info', 'verbose_name_plural': 'Passport Info'},
),
migrations.AlterModelOptions(
name='periodicpayforid',
options={'ordering': ('last_pay',)},
),
migrations.AlterField(
model_name='abon',
name='ip_address',
field=models.GenericIPAddressField(blank=True, null=True, verbose_name='Ip Address'),
),
migrations.AlterField(
model_name='additionaltelephone',
name='telephone',
field=models.CharField(max_length=16, validators=[django.core.validators.RegexValidator('^(\\+[7,8,9,3]\\d{10,11})?$')], verbose_name='Telephone'),
),
migrations.AlterField(
model_name='passportinfo',
name='abon',
field=models.OneToOneField(blank=True, null=True, on_delete=models.deletion.CASCADE, to='abonapp.Abon'),
),
migrations.AlterField(
model_name='passportinfo',
name='distributor',
field=models.CharField(max_length=64, verbose_name='Distributor'),
),
migrations.AlterField(
model_name='passportinfo',
name='number',
field=models.CharField(max_length=6, validators=[django.core.validators.RegexValidator(re.compile('^-?\\d+\\Z', 32), code='invalid', message='Enter a valid integer.')], verbose_name='Pasport number'),
),
migrations.AlterField(
model_name='passportinfo',
name='series',
field=models.CharField(max_length=4, validators=[django.core.validators.RegexValidator(re.compile('^-?\\d+\\Z', 32), code='invalid', message='Enter a valid integer.')], verbose_name='Pasport serial'),
),
migrations.RunPython(restore_info_to_new_scheme)
]

7
abonapp/models.py

@ -8,6 +8,7 @@ from django.core.validators import RegexValidator
from django.db import models, connection, transaction
from django.db.models.signals import post_delete, pre_delete, post_init
from django.dispatch import receiver
from django.shortcuts import resolve_url
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _, gettext
@ -15,7 +16,6 @@ from accounts_app.models import UserProfile, MyUserManager, BaseAccount
from agent import Transmitter, AbonStruct, TariffStruct, NasFailedResult, NasNetworkError
from group_app.models import Group
from djing.lib import ip2int, LogicError
from djing.fields import MyGenericIPAddressField
from djing import IP_ADDR_REGEX
from tariff_app.models import Tariff, PeriodicPay
from bitfield import BitField
@ -135,7 +135,7 @@ class Abon(BaseAccount):
current_tariff = models.ForeignKey(AbonTariff, null=True, blank=True, on_delete=models.SET_NULL)
group = models.ForeignKey(Group, models.SET_NULL, blank=True, null=True, verbose_name=_('User group'))
ballance = models.FloatField(default=0.0)
ip_address = MyGenericIPAddressField(blank=True, null=True, verbose_name=_('Ip Address'))
ip_address = models.GenericIPAddressField(blank=True, null=True, verbose_name=_('Ip Address'))
description = models.TextField(_('Comment'), null=True, blank=True)
street = models.ForeignKey(AbonStreet, on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_('Street'))
house = models.CharField(_('House'), max_length=12, null=True, blank=True)
@ -289,6 +289,9 @@ class Abon(BaseAccount):
print('ERROR:', e)
return e
def get_absolute_url(self):
return resolve_url('abonapp:abon_home', self.group.id, self.username)
class PassportInfo(models.Model):
series = models.CharField(_('Pasport serial'), max_length=4, validators=(validators.integer_validator,))

9
abonapp/templates/abonapp/addAbon.html

@ -1,17 +1,17 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% load bootstrap3 %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'abonapp:group_list' %}">{% trans 'User groups' %}</a></li>
<li><a href="{% url 'abonapp:people_list' group.id %}">{{ group.title }}</a></li>
<li class="active">{% trans 'Add abon' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Add abon' %}</h3>
@ -65,5 +65,4 @@
</form>
</div>
</div>
{% endblock %}
{% endblock %}

7
abonapp/templates/abonapp/addInvoice.html

@ -1,7 +1,7 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'abonapp:group_list' %}">{% trans 'User groups' %}</a></li>
@ -9,9 +9,9 @@
<li><a href="{% url 'abonapp:abon_home' group.id abon.username %}">{{ abon.fio }}</a></li>
<li class="active">{% trans 'Add debt' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Add receipt for' %}
@ -52,5 +52,4 @@
</form>
</div>
</div>
{% endblock %}

14
abonapp/templates/abonapp/debtors.html

@ -1,17 +1,20 @@
{% extends 'base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'abonapp:group_list' %}">{% trans 'User groups' %}</a></li>
<li class="active">{% trans 'Debtors' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'People with debts' %}</h3>
{% endblock %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -46,7 +49,4 @@
</tbody>
</table>
</div>
{% include 'pagination.html' %}
{% endblock %}

2
abonapp/templates/abonapp/editAbon.html

@ -146,7 +146,7 @@
<div class="col-sm-8 btn-group btn-group-sm">
{% if device %}
<a href="{% url 'devapp:view' 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> <span class="hidden-md">{{ device.comment|truncatechars:11 }} {{ device.ip_address }}</span>
<span class="glyphicon glyphicon-hdd"></span> <span class="hidden-md">{{ device.comment|truncatechars:11 }} {{ device.ip_address|default:'' }}</span>
</a>
<a href="{% url 'abonapp:clear_dev' group.pk abon.username %}" class="btn btn-sm btn-danger">
<span class="glyphicon glyphicon-remove-circle"></span> <span class="hidden-xs hidden-lg">{% trans 'Remove clutch' %}</span>

21
abonapp/templates/abonapp/ext.htm

@ -1,24 +1,24 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'abonapp:group_list' %}">{% trans 'User groups' %}</a></li>
<li><a href="{% url 'abonapp:people_list' group.pk %}">{{ group.title }}</a></li>
<li class="active">{{ abon.fio }}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
<div class="page-header">
<h2>{{ abon.fio|default:_("Long name") }}
<small>{% trans 'Ballance' %} <i class="glyphicon glyphicon-ruble"></i>
<b>{{ abon.ballance|floatformat:2 }}</b>
</small>
</h2>
</div>
{% block page-header %}
<h3>{{ abon.fio|default:_("Long name") }}
<small>{% trans 'Ballance' %} <i class="glyphicon glyphicon-ruble"></i>
<b>{{ abon.ballance|floatformat:2 }}</b>
</small>
</h3>
{% endblock %}
{% block main %}
<ul class="nav nav-tabs nav-justified">
{% url 'abonapp:abon_home' group.pk abon.username as abon_home %}
@ -65,5 +65,4 @@
{% block content %}{% endblock %}
</div>
</div>
{% endblock %}

12
abonapp/templates/abonapp/fin_report.html

@ -1,15 +1,18 @@
{% extends 'base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Fin report' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'Money by days' %}</h3>
{% endblock %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -43,7 +46,4 @@
</table>
</div>
{# {% include 'toolbar_page.html' with pag=logs %} #}
{% endblock %}

11
abonapp/templates/abonapp/group_list.html

@ -1,16 +1,18 @@
{% extends 'base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'User groups' %}</li>
</ol>
{% endblock %}
{% block page-header %}
<h3>{% trans 'User groups' %}</h3>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -70,7 +72,4 @@
</tfoot>
</table>
</div>
{% include 'pagination.html' %}
{% endblock %}

10
abonapp/templates/abonapp/group_tariffs.html

@ -1,17 +1,20 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'abonapp:group_list' %}">{% trans 'User groups' %}</a></li>
<li><a href="{% url 'abonapp:people_list' group.id %}">{{ group.title }}</a></li>
<li class="active">{% trans 'Belonging services for groups' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'Belonging services for groups' %}</h3>
{% endblock %}
<legend>{% trans 'Belonging services for groups' %}</legend>
{% block main %}
<form action="{% url 'abonapp:ch_group_tariff' group.pk %}" method="post" role="form">{% csrf_token %}
{% for tariff in tariffs %}
<div class="checkbox">
@ -29,5 +32,4 @@
<input type="submit" class="btn btn-primary" value="{% trans 'Save' %}"> <input type="reset" class="btn btn-default" value="{% trans 'Reset' %}">
</div>
</form>
{% endblock %}

12
abonapp/templates/abonapp/invoiceForPayment.html

@ -1,7 +1,7 @@
{% extends 'base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'abonapp:group_list' %}">{% trans 'User groups' %}</a></li>
@ -9,10 +9,13 @@
<li><a href="{% url 'abonapp:abon_phistory' group.pk abon.username %}">{{ abon.fio }}</a></li>
<li class="active">{% trans 'Debts' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'Debtor' %} {{ abon.fio }}</h3>
{% endblock %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -66,7 +69,4 @@
{% endif %}
</table>
</div>
{% include 'pagination.html' %}
{% endblock %}

12
abonapp/templates/abonapp/log.html

@ -1,16 +1,19 @@
{% extends 'base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'abonapp:group_list' %}">{% trans 'User groups' %}</a></li>
<li class="active">{% trans 'Subscribers actions' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'History of subscriber' %}</h3>
{% endblock %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -55,7 +58,4 @@
</table>
</div>
{% include 'pagination.html' %}
{% endblock %}

9
abonapp/templates/abonapp/peoples.html

@ -1,16 +1,16 @@
{% extends 'base.html' %}
{% load i18n %}
{% load dpagination %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'abonapp:group_list' %}">{% trans 'User groups' %}</a></li>
<li class="active">{{ group.title }}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="row">
<div class="col-lg-10 col-md-8">
<div class="panel panel-default">
@ -174,7 +174,4 @@
</div>
</div>
</div>
{% include 'pagination.html' %}
{% endblock %}

17
abonapp/views.py

@ -102,12 +102,10 @@ class AbonCreateView(CreateView):
group = None
abon = None
form_class = forms.AbonForm
model = models.Abon
template_name = 'abonapp/addAbon.html'
context_object_name = 'group'
def get_success_url(self):
return resolve_url('abonapp:abon_home', self.group.id, self.abon.username)
def dispatch(self, request, *args, **kwargs):
group = get_object_or_404(Group, pk=self.kwargs.get('gid'))
if not request.user.has_perm('group_app.can_view_group', group):
@ -349,13 +347,6 @@ class AbonHomeUpdateView(UpdateView):
context.update(kwargs)
return super(AbonHomeUpdateView, self).get_context_data(**context)
def get_success_url(self):
abon = self.object
return resolve_url('abonapp:abon_home',
gid=getattr(abon.group, 'pk', 0),
uname=abon.username
)
@transaction.atomic
def terminal_pay(request):
@ -1091,14 +1082,12 @@ class EditSibscriberMarkers(UpdateView):
http_method_names = ('get', 'post')
template_name = 'abonapp/modal_user_markers.html'
form_class = forms.MarkersForm
model = models.Abon
def get_object(self, queryset=None):
obj = models.Abon.objects.get(username=self.kwargs.get('uname'))
return obj
def get_success_url(self):
return resolve_url('abonapp:abon_home', self.kwargs.get('gid'), self.kwargs.get('uname'))
def get_context_data(self, **kwargs):
context = super(EditSibscriberMarkers, self).get_context_data(**kwargs)
context['gid'] = self.kwargs.get('gid')
@ -1123,7 +1112,7 @@ def abons(request):
ablist = ({
'id': abn.pk,
'tarif_id': abn.active_tariff().tariff.pk if abn.active_tariff() is not None else 0,
'ip': abn.ip_address.int_ip(),
'ip': lib.ip2int(abn.ip_address),
'is_active': abn.is_active
} for abn in models.Abon.objects.all())

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

@ -305,3 +305,6 @@ msgstr "Сотрудник"
msgid "Manage responsibility groups"
msgstr "Ответственность за группы"
msgid "Profile"
msgstr "Учётная запись"

3
accounts_app/models.py

@ -124,5 +124,6 @@ class UserProfile(BaseAccount):
im.save(self.avatar.path)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
r = super().save(*args, **kwargs)
self._thumbnail_avatar()
return r

12
accounts_app/templates/accounts/acc_list.html

@ -1,15 +1,18 @@
{% extends 'base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Administrators' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'Admin accounts list' %}</h3>
{% endblock %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -79,7 +82,4 @@
{% endif %}
</table>
</div>
{% include 'pagination.html' %}
{% endblock %}

7
accounts_app/templates/accounts/create_acc.html

@ -1,16 +1,16 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load globaltags %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'acc_app:accounts_list' %}">{% trans 'Administrators' %}</a></li>
<li class="active">{% trans 'Add' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Create new account' %}</h3>
@ -97,5 +97,4 @@
</div>
</div>
</div>
{% endblock %}

9
accounts_app/templates/accounts/ext.htm

@ -1,15 +1,19 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'acc_app:accounts_list' %}">{% trans 'Administrators' %}</a></li>
<li class="active">{{ userprofile.username }}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'Profile' %}</h3>
{% endblock %}
{% block main %}
<div class="row">
<div class="col-sm-3">
<div class="thumbnail">
@ -74,5 +78,4 @@
</div>
</div>
</div>
{% endblock %}

11
accounts_app/templates/accounts/perms/objects_of_type.html

@ -1,7 +1,7 @@
{% extends 'base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'acc_app:accounts_list' %}">{% trans 'Administrators' %}</a></li>
@ -9,11 +9,15 @@
<li><a href="{% url 'acc_app:perms_klasses' userprofile.pk klass %}">{% trans 'Permission options' %}</a></li>
<li class="active">&lt;{{ klass }}&gt; {{ klass_name }}</li>
</ol>
{% endblock %}
{% block page-header %}
<h3>{% trans 'Pick object for edit permissions' %}</h3>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -28,7 +32,4 @@
</tbody>
</table>
</div>
{% include 'pagination.html' %}
{% endblock %}

9
accounts_app/templates/accounts/perms/objects_types.html

@ -1,19 +1,21 @@
{% extends 'base.html' %}
{% load i18n %}
{% load acc_tags %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'acc_app:accounts_list' %}">{% trans 'Administrators' %}</a></li>
<li><a href="{% url 'acc_app:other_profile' userprofile.pk %}">{{ userprofile.username }}</a></li>
<li class="active">{% trans 'Permission options' %}</li>
</ol>
{% endblock %}
{% block page-header %}
<h3>{% trans 'Pick the type of object' %}</h3>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -32,5 +34,4 @@
</tbody>
</table>
</div>
{% endblock %}

9
accounts_app/templates/accounts/perms/perms_edit.html

@ -1,8 +1,8 @@
{% extends 'base.html' %}
{% load i18n %}
{% load guardian_tags %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'acc_app:accounts_list' %}">{% trans 'Administrators' %}</a></li>
@ -12,11 +12,15 @@
</li>
<li class="active">{{ obj }}</li>
</ol>
{% endblock %}
{% block page-header %}
<h3>{% trans 'Pick object for edit permissions' %}</h3>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
{% if userprofile.is_superuser %}
<div class="alert alert-info alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
@ -67,5 +71,4 @@
</form>
</div>
</div>
{% endblock %}

10
accounts_app/templates/accounts/settings/ext.htm

@ -1,16 +1,20 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'acc_app:accounts_list' %}">{% trans 'Administrators' %}</a></li>
<li><a href="{% url 'acc_app:profile' %}">{{ user.username }}</a></li>
<li class="active">{% trans 'Options' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'Options' %}</h3>
{% endblock %}
{% block main %}
<div class="row">
<div class="col-sm-3">
<form action="{% url 'acc_app:setup_avatar' %}" method="post" class="thumbnail"
@ -42,6 +46,4 @@
</div>
</div>
</div>
{% endblock %}

2
clientsideapp/templates/clientsideapp/index.html

@ -18,7 +18,7 @@
<dd>{{ user.telephone }}</dd>
<dt>{% trans 'Ip Address' %}</dt>
<dd>{{ user.ip_address }}</dd>
<dd>{{ user.ip_address|default:'-' }}</dd>
{% if user.street %}
<dt>{% trans 'Address' %}</dt>

44
devapp/migrations/0005_device_ip_address_change.py

@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-06-12 11:24
from __future__ import unicode_literals
import os
from json import load
from django.db import migrations, models
from django.core import serializers
TMP_FILE = '/tmp/djing_ip_field_devapp_migrate.json'
def device_backup_info(apps, _):
Device = apps.get_model('devapp', 'Device')
obs = Device.objects.all()
with open(TMP_FILE, 'w') as f:
serializers.serialize('json', obs, stream=f)
def device_restore_info_to_new_scheme(apps, _):
Device = apps.get_model('devapp', 'Device')
with open(TMP_FILE, 'r') as f:
for device in load(f):
Device.objects.filter(pk=device['pk']).update(ip_address=device['fields']['ip_address'])
if os.path.isfile(TMP_FILE):
os.remove(TMP_FILE)
class Migration(migrations.Migration):
dependencies = [
('devapp', '0004_device_extra_data'),
]
operations = [
migrations.RunPython(device_backup_info),
migrations.AlterField(
model_name='device',
name='ip_address',
field=models.GenericIPAddressField(blank=True, null=True, protocol='ipv4', verbose_name='Ip address'),
),
migrations.RunPython(device_restore_info_to_new_scheme)
]

8
devapp/models.py

@ -3,10 +3,11 @@ from typing import Optional, AnyStr
from subprocess import run
from django.db import models
from django.conf import settings
from django.shortcuts import resolve_url
from django.utils.translation import gettext_lazy as _
from jsonfield import JSONField
from djing.fields import MACAddressField, MyGenericIPAddressField
from djing.fields import MACAddressField
from djing.lib import MyChoicesAdapter
from group_app.models import Group
from . import dev_types
@ -24,7 +25,7 @@ class DeviceMonitoringException(Exception):
class Device(models.Model):
_cached_manager = None
ip_address = MyGenericIPAddressField(verbose_name=_('Ip address'), null=True, blank=True)
ip_address = models.GenericIPAddressField(verbose_name=_('Ip address'), null=True, blank=True)
mac_addr = MACAddressField(verbose_name=_('Mac address'), null=True, blank=True, unique=True)
comment = models.CharField(_('Comment'), max_length=256)
DEVICE_TYPES = (
@ -121,6 +122,9 @@ class Device(models.Model):
return mng.register_device(self.parent_dev.extra_data)
return mng.register_device(self.extra_data)
def get_absolute_url(self):
return resolve_url('devapp:edit', self.group.pk, self.pk)
class Port(models.Model):
device = models.ForeignKey(Device, models.CASCADE, verbose_name=_('Device'))

15
devapp/templates/devapp/add_dev.html

@ -1,21 +1,21 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% load bootstrap3 %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></li>
<li><a href="{% url 'devapp:devs' group.pk %}">{{ group.title }}</a></li>
<li class="active">{% trans 'Add new device' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
<div class="page-header">
<h2>{{ group.title|default:_('Not assigned') }}</h2>
</div>
{% block page-header %}
<legend>{{ group.title|default:_('Not assigned') }}</legend>
{% endblock %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Device info' %}</h3>
@ -51,7 +51,7 @@
{% if selected_parent_dev %}
<button class="selectajax-btn form-control btn btn-default">
{{ selected_parent_dev.ip_address }}: {{ selected_parent_dev.comment }}
{{ selected_parent_dev.ip_address|default:'-' }}: {{ selected_parent_dev.comment }}
</button>
{% else %}
<button class="selectajax-btn form-control btn btn-default hidden"></button>
@ -79,5 +79,4 @@
</form>
</div>
</div>
{% endblock %}

14
devapp/templates/devapp/devices.html

@ -1,17 +1,20 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% load dpagination %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></li>
<li class="active">{{ group.title }}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<legend>{% trans 'Devices' %}</legend>
{% endblock %}
<h3>{% trans 'Devices' %}</h3>
{% block main %}
<div class="table-responsive">
<table class="table table-bordered">
<thead>
@ -59,7 +62,7 @@
{% endif %}
</a>
</td>
<td><a href="{{ viewurl }}">{{ dev.ip_address }}</a></td>
<td><a href="{{ viewurl }}">{{ dev.ip_address|default:'' }}</a></td>
<td>{{ dev.comment }}</td>
<td>{{ dev.mac_addr|default:_('Not assigned') }}</td>
<td>{{ dev.get_devtype_display }}</td>
@ -96,7 +99,4 @@
</table>
</div>
{% include 'pagination.html' %}
{% endblock %}

12
devapp/templates/devapp/devices_null_group.html

@ -1,16 +1,19 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></li>
<li class="active">{% trans 'Devices' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<legend>{% trans 'Devices without group' %}</legend>
{% endblock %}
<h3>{% trans 'Devices without group' %}</h3>
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -77,7 +80,4 @@
</table>
</div>
{% include 'pagination.html' %}
{% endblock %}

44
devapp/templates/devapp/ext.htm

@ -1,34 +1,34 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></li>
{% if dev.group %}
<li><a href="{% url 'devapp:devs' dev.group.pk %}">{{ dev.group.title }}</a></li>
{% else %}
<li>{% trans 'Not assigned' %}</li>
{% endif %}
<li class="active">{{ dev.comment }}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
<div class="page-header">
{% block page-header %}
<h2>{{ dev.comment|default:_('Not assigned') }}</h2>
{% endblock %}
</div>
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></li>
{% if dev.group %}
<li><a href="{% url 'devapp:devs' dev.group.pk %}">{{ dev.group.title }}</a></li>
{% else %}
<li>{% trans 'Not assigned' %}</li>
{% endif %}
<li class="active">{{ dev.comment }}</li>
</ol>
{% endblock %}
{% block page-header %}
<h3>{{ dev.comment|default:_('Not assigned') }}</h3>
{% endblock %}
{% block main %}
<ul class="nav nav-tabs">
{% url 'devapp:view' dev.group.pk|default:0 dev.pk as devapp_view %}
<li{% if devapp_view == request.path %} class="active"{% endif %}>
<a href="{{ devapp_view }}">
{% trans 'View' %} {{ dev.ip_address }}
{% trans 'View' %} {{ dev.ip_address|default:'' }}
</a>
</li>

128
devapp/templates/devapp/fix_dev_group.html

@ -1,75 +1,73 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% load bootstrap3 %}
{% block main %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></li>
<li class="active">{{ dev.comment }}</li>
</ol>
{% include 'message_block.html' %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Fix device group' %}</h3>
</div>
<div class="panel-body">
<form role="form" action="{% url 'devapp:fix_device_group' dev.pk %}" method="post">{% csrf_token %}
{% bootstrap_icon 'globe' as ic %}
{% bootstrap_field form.ip_address addon_before=ic %}
{% bootstrap_icon 'globe' as ic %}
{% bootstrap_field form.mac_addr addon_before=ic %}
{% bootstrap_icon 'comment' as ic %}
{% bootstrap_field form.comment addon_before=ic %}
{% bootstrap_icon 'hdd' as ic %}
{% bootstrap_field form.devtype addon_before=ic %}
{% bootstrap_icon 'lock' as ic %}
{% bootstrap_field form.man_passw addon_before=ic %}
{% bootstrap_icon 'subscript' as ic %}
{% bootstrap_field form.group addon_before=ic %}
<div class="form-group">
<label for="id_parent_dev">{% trans 'Parent device' %}</label>
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></li>
<li class="active">{{ dev.comment }}</li>
</ol>
{% endblock %}
<div class="input-group selectajax" data-dst="/dev/search_dev">
<span class="input-group-addon"><span class="glyphicon glyphicon-hdd"></span></span>
<input type="hidden" name="parent_dev" class="selectajax-hid" {% if selected_parent_dev %}
value="{{ selected_parent_dev.pk }}" {% endif %}>
{% if selected_parent_dev %}
<button class="selectajax-btn form-control btn btn-default">{{ selected_parent_dev.comment }}</button>
<input type="text" class="form-control dropdown-toggle selectajax-inp hidden" data-toggle="dropdown"
id="id_parent_dev" placeholder="{% trans 'Find the device' %}">
{% else %}
<button class="selectajax-btn form-control btn btn-default hidden"></button>
<input type="text" class="form-control dropdown-toggle selectajax-inp" data-toggle="dropdown"
id="id_parent_dev" placeholder="{% trans 'Find the device' %}">
{% endif %}
<ul class="dropdown-menu selectajax-ul"></ul>
{{ form.parent_dev.errors }}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Fix device group' %}</h3>
</div>
<div class="panel-body">
<form role="form" action="{% url 'devapp:fix_device_group' dev.pk %}" method="post">{% csrf_token %}
{% bootstrap_icon 'globe' as ic %}
{% bootstrap_field form.ip_address addon_before=ic %}
{% bootstrap_icon 'globe' as ic %}
{% bootstrap_field form.mac_addr addon_before=ic %}
{% bootstrap_icon 'comment' as ic %}
{% bootstrap_field form.comment addon_before=ic %}
{% bootstrap_icon 'hdd' as ic %}
{% bootstrap_field form.devtype addon_before=ic %}
{% bootstrap_icon 'lock' as ic %}
{% bootstrap_field form.man_passw addon_before=ic %}
{% bootstrap_icon 'subscript' as ic %}
{% bootstrap_field form.group addon_before=ic %}
<div class="form-group">
<label for="id_parent_dev">{% trans 'Parent device' %}</label>
<div class="input-group selectajax" data-dst="/dev/search_dev">
<span class="input-group-addon"><span class="glyphicon glyphicon-hdd"></span></span>
<input type="hidden" name="parent_dev" class="selectajax-hid" {% if selected_parent_dev %}
value="{{ selected_parent_dev.pk }}" {% endif %}>
{% if selected_parent_dev %}
<button class="selectajax-btn form-control btn btn-default">{{ selected_parent_dev.comment }}</button>
<input type="text" class="form-control dropdown-toggle selectajax-inp hidden" data-toggle="dropdown"
id="id_parent_dev" placeholder="{% trans 'Find the device' %}">
{% else %}
<button class="selectajax-btn form-control btn btn-default hidden"></button>
<input type="text" class="form-control dropdown-toggle selectajax-inp" data-toggle="dropdown"
id="id_parent_dev" placeholder="{% trans 'Find the device' %}">
{% endif %}
<ul class="dropdown-menu selectajax-ul"></ul>
{{ form.parent_dev.errors }}
</div>
</div>
</div>
<div class="btn-group btn-group-sm">
<button type="submit" class="btn btn-primary">
<span class="glyphicon glyphicon-save"></span> {% trans 'Save' %}
</button>
<button type="reset" class="btn btn-default">
<span class="glyphicon glyphicon-remove-circle"></span> {% trans 'Reset' %}
</button>
</div>
<div class="btn-group btn-group-sm">
<button type="submit" class="btn btn-primary">
<span class="glyphicon glyphicon-save"></span> {% trans 'Save' %}
</button>
<button type="reset" class="btn btn-default">
<span class="glyphicon glyphicon-remove-circle"></span> {% trans 'Reset' %}
</button>
</div>
</form>
</form>
</div>
</div>
</div>
{% endblock %}

9
devapp/templates/devapp/group_list.html

@ -1,14 +1,14 @@
{% extends 'base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Groups' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Group title' %}</h3>
@ -39,7 +39,4 @@
</tfoot>
</table>
</div>
{% include 'pagination.html' %}
{% endblock %}

22
devapp/templates/devapp/manage_ports/add_ports.html

@ -1,7 +1,7 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></li>
@ -9,13 +9,13 @@
<li><a href="{% url 'devapp:view' dev.group.pk dev.pk %}">{{ dev.comment }}</a></li>
<li class="active">{% trans 'Add ports' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
<div class="page-header">
<h2>{{ dev.comment|default:_('Not assigned') }}</h2>
</div>
{% block page-header %}
<legend>{{ dev.comment|default:_('Not assigned') }}</legend>
{% endblock %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{{ dev.comment }}</h3>
@ -23,7 +23,6 @@
<div class="panel-body">
<form class="table-responsive" role="form" action="{% url 'devapp:add_ports' dev.group.pk dev.pk %}" method="post">{% csrf_token %}
<table class="table table-striped table-bordered">
<thead>
<tr>
@ -74,18 +73,15 @@
<button type="submit" class="btn btn-primary">
<span class="glyphicon glyphicon-save"></span> {% trans 'Save' %}
</button>
{% else %}
<button type="button" class="btn btn-primary" disabled>
{% else %}
<button type="button" class="btn btn-primary" disabled>
<span class="glyphicon glyphicon-save"></span> {% trans 'Save' %}
</button>
</button>
{% endif %}
</td>
</tr>
</tfoot>
</table>
</form>
</div>
</div>

13
devapp/templates/devapp/manage_ports/fix_abon_device.html

@ -1,7 +1,7 @@
{% extends request.is_ajax|yesno:'nullcont.htm,devapp/ext.htm' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></li>
@ -9,13 +9,13 @@
<li><a href="{% url 'devapp:view' group.pk device.pk %}">{{ device.comment }}</a></li>
<li class="active">{% trans 'Fix subscriber ports conflict' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
<div class="page-header">
<h2>{% trans 'Fix subscriber ports conflict' %}</h2>
</div>
{% block page-header %}
<legend>{% trans 'Fix subscriber ports conflict' %}</legend>
{% endblock %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Subscribers list on port' %}</h3>
@ -32,5 +32,4 @@
{% endfor %}
</div>
</div>
{% endblock %}

11
devapp/views.py

@ -131,9 +131,6 @@ class DeviceUpdate(UpdateView):
messages.success(self.request, _('Device info has been saved'))
return r
def get_success_url(self):
return resolve_url('devapp:edit', self.device_group.pk, self.object.pk)
def dispatch(self, request, *args, **kwargs):
group_id = self.kwargs.get('group_id')
device_group = get_object_or_404(Group, pk=group_id)
@ -188,9 +185,6 @@ class DeviceCreateView(CreateView):
messages.success(self.request, _('Device info has been saved'))
return r
def get_success_url(self):
return resolve_url('devapp:edit', self.device_group.pk, self.object.pk)
def dispatch(self, request, *args, **kwargs):
group_id = self.kwargs.get('group_id')
device_group = get_object_or_404(Group, pk=group_id)
@ -238,11 +232,6 @@ class DeviceUpdateExtra(UpdateView):
messages.success(self.request, _('Device extra data has successfully updated'))
return r
def get_success_url(self):
return resolve_url('devapp:edit',
self.kwargs.get('group_id'),
self.kwargs.get('device_id'))
@login_required
@permission_required('devapp.change_device')

15
dialing_app/templates/ext.html

@ -1,17 +1,21 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Last calls' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
<div class="page-header">
<h3>{{ title }}</h3>
</div>
{% block page-header %}
<legend>{{ title }}</legend>
{% endblock %}
{% block main %}
<ul class="nav nav-tabs">
@ -43,7 +47,6 @@
</a>
</li>
</ul>
<div class="tab-content">

4
djing/global_base_views.py

@ -147,3 +147,7 @@ class BaseListWithFiltering(RedirectWhenErrorMixin, ListView):
'page_number': page_number,
'message': str(e)
})
class BaseOrderedFilteringList(OrderingMixin, BaseListWithFiltering):
paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10)

6
djing/settings.py

@ -33,12 +33,12 @@ AUTHENTICATION_BACKENDS = (
# Application definition
INSTALLED_APPS = [
# 'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ip_pool',
'accounts_app',
'abonapp',
'tariff_app',
@ -58,6 +58,10 @@ INSTALLED_APPS = [
'bootstrap3'
]
if DEBUG:
INSTALLED_APPS.insert(0, 'django.contrib.admin')
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',

13
djing/templatetags/globaltags.py

@ -1,5 +1,8 @@
from urllib.parse import unquote
from django import template
from django.conf import settings
from django.utils.http import is_safe_url
register = template.Library()
@ -7,3 +10,13 @@ register = template.Library()
@register.simple_tag
def global_var(var_name):
return getattr(settings, var_name, '')
@register.simple_tag
def back_url(request):
url = request.META.get('HTTP_REFERER')
if url:
url = unquote(url) # HTTP_REFERER may be encoded.
if not is_safe_url(url=url, allowed_hosts={request.get_host()}, require_https=request.is_secure()):
url = '/'
return url

10
djing/urls.py

@ -1,6 +1,5 @@
from django.conf.urls import url, include
from django.conf import settings
# from django.contrib import admin
from .views import home
@ -18,17 +17,18 @@ urlpatterns = [
url(r'^msg/', include('msg_app.urls', namespace='msg_app')),
url(r'^dialing/', include('dialing_app.urls', namespace='dialapp')),
url(r'^groups/', include('group_app.urls', namespace='group_app')),
url(r'^ip_pool/', include('ip_pool.urls', namespace='ip_pool'))
# Switch language
#url(r'^i18n/', include('django.conf.urls.i18n')),
# url(r'^admin/', admin.site.urls)
]
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.extend(static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT))
urlpatterns.extend(staticfiles_urlpatterns())
urlpatterns.append(url(r'^admin/', admin.site.urls))

14
group_app/templates/group_app/ext.html

@ -1,23 +1,25 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'group_app:group_list' %}">{% trans 'Groups' %}</a></li>
<li class="active">{% block active_text %}{% trans 'Groups' %}{% endblock %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
<div class="page-header">
<h2>{% trans 'Groups' %}</h2>
</div>
{% block page-header %}
<h3>{% trans 'Groups' %}</h3>
{% endblock %}
{% block main %}
<div class="panel panel-default">
<div class="panel-body">
{% block content %}{% endblock %}
</div>
</div>
{% endblock %}

11
group_app/templates/group_app/group_list.html

@ -1,16 +1,20 @@
{% extends 'base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Groups' %}</li>
</ol>
{% endblock %}
{% block page-header %}
<h3>{% trans 'Groups' %}</h3>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -62,7 +66,4 @@
</tfoot>
</table>
</div>
{% include 'pagination.html' %}
{% endblock %}

0
ip_pool/__init__.py

5
ip_pool/admin.py

@ -0,0 +1,5 @@
from django.contrib import admin
from ip_pool import models
admin.site.register(models.NetworkModel)
admin.site.register(models.EmployedIpModel)

5
ip_pool/apps.py

@ -0,0 +1,5 @@
from django.apps import AppConfig
class IpPoolConfig(AppConfig):
name = 'ip_pool'

30
ip_pool/forms.py

@ -0,0 +1,30 @@
from netaddr import IPNetwork, AddrFormatError, IPAddress
from django import forms
from django.core.exceptions import ValidationError
from ip_pool import models
class NetworkForm(forms.ModelForm):
def clean_network(self):
network = self.cleaned_data.get('network')
try:
return IPAddress(network)
except AddrFormatError as e:
raise ValidationError(e, code='invalid')
class Meta:
model = models.NetworkModel
fields = '__all__'
class EmployedIpForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance is None:
self.fields['ip'].initial = '127.0.0.1'
class Meta:
model = models.EmployedIpModel
fields = '__all__'

56
ip_pool/migrations/0001_initial.py

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-06-12 13:24
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='EmployedIpModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('ip', models.GenericIPAddressField(unique=True, verbose_name='Ip address')),
],
options={
'verbose_name': 'Employed ip',
'verbose_name_plural': 'Employed ip addresses',
'db_table': 'ip_pool_employed_ip',
'ordering': ('-id',),
},
),
migrations.CreateModel(
name='NetworkModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('network', models.GenericIPAddressField(help_text='Dot separated ip address. For example: 192.168.1.100', unique=True, verbose_name='IP network')),
('mask', models.PositiveSmallIntegerField(default=24, help_text='For example: 24, if network is 192.168.1.0/24', verbose_name='Mask')),
('work_range_start_ip', models.GenericIPAddressField(default=2, help_text='Ip from 192.168.1.2 may be used', verbose_name='Work range start ip')),
('work_range_end_ip', models.GenericIPAddressField(default=254, help_text='Ip may be used until 192.168.1.254', verbose_name='Work range end ip')),
('description', models.CharField(max_length=64, verbose_name='Description')),
],
options={
'verbose_name': 'Network',
'verbose_name_plural': 'Networks',
'db_table': 'ip_pool_network',
'ordering': ('description',),
},
),
migrations.AddField(
model_name='employedipmodel',
name='network',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ip_pool.NetworkModel', verbose_name='Parent network'),
),
migrations.AlterUniqueTogether(
name='employedipmodel',
unique_together=set([('ip', 'network')]),
),
]

0
ip_pool/migrations/__init__.py

91
ip_pool/models.py

@ -0,0 +1,91 @@
from typing import Optional
from django.shortcuts import resolve_url
from netaddr import IPNetwork, IPAddress
from django.core.exceptions import ValidationError
from django.db import models
from django.utils.translation import gettext_lazy as _
class NetworkModel(models.Model):
_netw_cache = None
network = models.GenericIPAddressField(
verbose_name=_('IP network'),
help_text=_('Dot separated ip address of network. For example: 192.168.1.0'),
unique=True
)
mask = models.PositiveSmallIntegerField(
_('Mask'),
help_text=_('For example: 24, if network is 192.168.1.0/24'),
default=24
)
work_range_start_ip = models.GenericIPAddressField(
verbose_name=_('Work range start ip'),
help_text=_('For example 192.168.1.2, this is first ip that may be used')
)
work_range_end_ip = models.GenericIPAddressField(
verbose_name=_('Work range end ip'),
help_text=_('Ip may be used until 192.168.1.254')
)
description = models.CharField(_('Description'), max_length=64)
def __str__(self):
return "%s: %s/%d" % (self.description, self.network, self.mask)
def get_network(self) -> IPNetwork:
if self._netw_cache is None:
self._netw_cache = IPNetwork("%s/%s" % (self.network, self.mask or 32))
return self._netw_cache
def get_absolute_url(self):
return resolve_url('ip_pool:net_edit', self.pk)
class Meta:
db_table = 'ip_pool_network'
verbose_name = _('Network')
verbose_name_plural = _('Networks')
ordering = ('description',)
class EmployedIpManager(models.Manager):
def get_free_ip(self, network: NetworkModel) -> Optional[IPAddress]:
netw = IPNetwork(network)
employed_ip_queryset = self.filter(network=network)
free_ip = next(IPAddress(net) for ip, net in zip(
employed_ip_queryset, netw
) if ip != net)
return free_ip
class EmployedIpModel(models.Model):
ip = models.GenericIPAddressField(verbose_name=_('Ip address'), unique=True)
network = models.ForeignKey(NetworkModel, on_delete=models.CASCADE, verbose_name=_('Parent network'))
objects = EmployedIpManager()
def __str__(self):
return self.ip
def clean(self):
ip = IPAddress(self.ip)
network = self.network.get_network()
if ip not in network:
raise ValidationError(_('Ip address %(ip)s not in %(net)s network') % {
'ip': ip,
'net': network
}, code='invalid')
start_allowed_ip = IPAddress(self.network.work_range_start_ip)
end_allowed_ip = IPAddress(self.network.work_range_end_ip)
if not start_allowed_ip <= ip <= end_allowed_ip:
raise ValidationError(_('Ip address that you entered is not in work range'), code='invalid')
class Meta:
db_table = 'ip_pool_employed_ip'
verbose_name = _('Employed ip')
verbose_name_plural = _('Employed ip addresses')
ordering = ('-id',)
unique_together = ('ip', 'network')

39
ip_pool/templates/ip_pool/employed_ip_list.html

@ -0,0 +1,39 @@
{% extends 'base.html' %}
{% load i18n %}
{% load bootstrap3 %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'ip_pool:networks' %}">{% trans 'Ip pool' %}</a></li>
<li><a href="{% url 'ip_pool:net_edit' net.id %}">{{ net }}</a></li>
<li class="active">{% trans 'Ip list' %}</li>
</ol>
{% endblock %}
{% block page-header %}{% trans 'Ip list' %}{% endblock %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
<tr>
<th class="col-sm-5">{% trans 'Ip' %}</th>
<th class="col-sm-3">{% trans 'Network' %}</th>
</tr>
</thead>
<tbody>
{% for ip in object_list %}
<tr>
<td>{{ ip.ip }}</td>
<td>{{ ip.network }}</td>
</tr>
{% empty %}
<tr>
<td colspan="2">{% trans 'You have not any available dedicated ips in this network' %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}

30
ip_pool/templates/ip_pool/ext.html

@ -0,0 +1,30 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Ip pool' %}</li>
</ol>
{% endblock %}
{% block main %}
<ul class="nav nav-tabs">
{% url 'taskapp:home' as taskhome %}
<li{% if taskhome == request.path %} class="active"{% endif %}>
<a href="{{ taskhome }}">
{% trans 'New tasks' %}
</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane active">
{% block content %}{% endblock %}
</div>
</div>
{% endblock %}

35
ip_pool/templates/ip_pool/net_add.html

@ -0,0 +1,35 @@
{% extends 'base.html' %}
{% load i18n %}
{% load bootstrap3 %}
{% load globaltags %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'ip_pool:networks' %}">{% trans 'Ip pool' %}</a></li>
<li class="active">{% trans 'Add network' %}</li>
</ol>
{% endblock %}
{% block main %}
<form action="{% url 'ip_pool:net_add' %}" method="post">{% csrf_token %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Add network' %}</h3>
</div>
<div class="panel-body">
{% bootstrap_form form %}
</div>
<div class="panel-footer">
<div class="btn-group">
<button class="btn btn-success">
<span class="glyphicon glyphicon-save"></span> {% trans 'Add' %}
</button>
<a href="{% back_url request %}" class="btn btn-default">
<span class="glyphicon glyphicon-backward"></span> {% trans 'Back' %}
</a>
</div>
</div>
</div>
</form>
{% endblock %}

41
ip_pool/templates/ip_pool/net_edit.html

@ -0,0 +1,41 @@
{% extends 'base.html' %}
{% load i18n %}
{% load bootstrap3 %}
{% load globaltags %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'ip_pool:networks' %}">{% trans 'Ip pool' %}</a></li>
<li class="active">{{ object }}</li>
</ol>
{% endblock %}
{% block page-header %}{{ object }}{% endblock %}
{% block main %}
<form action="{% url 'ip_pool:net_edit' object.pk %}" method="post">{% csrf_token %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Edit network' %}</h3>
</div>
<div class="panel-body">
{% bootstrap_form form %}
</div>
<div class="panel-footer">
<div class="btn-group">
<button class="btn btn-primary">
<span class="glyphicon glyphicon-save"></span> {% trans 'Save' %}
</button>
<a href="{% back_url request %}" class="btn btn-default">
<span class="glyphicon glyphicon-backward"></span> {% trans 'Back' %}
</a>
<a href="{% url 'ip_pool:ip_list' object.pk %}" class="btn btn-default">
<span class="glyphicon glyphicon-eye-open"></span>
<span class="hidden-xs hidden-sm">{% trans 'View employed' %}</span>
</a>
</div>
</div>
</div>
</form>
{% endblock %}

70
ip_pool/templates/ip_pool/network_list.html

@ -0,0 +1,70 @@
{% extends 'base.html' %}
{% load i18n %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Ip pool' %}</li>
</ol>
{% endblock %}
{% block page-header %}
{% trans 'Networks' %}
{% endblock %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
<tr>
<th class="col-sm-5">{% trans 'Network' %}</th>
<th class="col-sm-3">{% trans 'Work range start ip' %}</th>
<th class="col-sm-3">{% trans 'Work range end ip' %}</th>
<th class="col-sm-1"></th>
</tr>
</thead>
<tbody>
{% with can_ch_net=perms.ip_pool.change_networkmodel %}
{% for net in networks %}
<tr>
<td><a href="{% url 'ip_pool:ip_list' net.pk %}">{{ net }}</a></td>
<td>{{ net.work_range_start_ip }}</td>
<td>{{ net.work_range_end_ip }}</td>
<td class="btn-group btn-group-sm btn-group-justified">
{% if can_ch_net %}
<a href="{% url 'ip_pool:net_edit' net.pk %}" class="btn btn-primary">
<span class="glyphicon glyphicon-edit"></span>
<span class="hidden-xs hidden-sm">{% trans 'Edit' %}</span>
</a>
{% else %}
<a href="#" class="btn btn-primary disabled">
<span class="glyphicon glyphicon-edit"></span>
<span class="hidden-xs hidden-sm">{% trans 'Edit' %}</span>
</a>
{% endif %}
<a href="{% url 'ip_pool:ip_list' net.pk %}" class="btn btn-default">
<span class="glyphicon glyphicon-eye-open"></span>
<span class="hidden-xs hidden-sm">{% trans 'View employed' %}</span>
</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="4">{% trans 'You have not any networks available' %}</td>
</tr>
{% endfor %}
{% endwith %}
</tbody>
<tfoot>
<tr>
<td colspan="4">
<a href="{% url 'ip_pool:net_add' %}" class="btn btn-success">
<span class="glyphicon glyphicon-plus"></span>
{% trans 'Add' %}
</a>
</td>
</tr>
</tfoot>
</table>
</div>
{% endblock %}

3
ip_pool/tests.py

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

11
ip_pool/urls.py

@ -0,0 +1,11 @@
from django.conf.urls import url
from ip_pool import views
app_name = 'ip_pool'
urlpatterns = [
url('^$', views.NetworksListView.as_view(), name='networks'),
url('^network_add/$', views.NetworkCreateView.as_view(), name='net_add'),
url('^(?P<net_id>\d{1,6})/$', views.IpEmployedListView.as_view(), name='ip_list'),
url('^(?P<net_id>\d{1,6})/edit$', views.NetworkUpdateView.as_view(), name='net_edit'),
]

60
ip_pool/views.py

@ -0,0 +1,60 @@
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.shortcuts import resolve_url, get_object_or_404
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _
from django.views.generic import UpdateView, CreateView
from guardian.decorators import permission_required_or_403 as permission_required
from djing.global_base_views import BaseOrderedFilteringList
from ip_pool import models, forms
@method_decorator(login_required, name='dispatch')
class NetworksListView(BaseOrderedFilteringList):
template_name = 'ip_pool/network_list.html'
context_object_name = 'networks'
model = models.NetworkModel
@method_decorator(login_required, name='dispatch')
@method_decorator(permission_required('ip_pool.change_networkmodel'), name='dispatch')
class NetworkUpdateView(UpdateView):
model = models.NetworkModel
template_name = 'ip_pool/net_edit.html'
form_class = forms.NetworkForm
pk_url_kwarg = 'net_id'
def form_valid(self, form):
r = super().form_valid(form)
messages.success(self.request, _('Network successfully updated'))
return r
@method_decorator(login_required, name='dispatch')
class IpEmployedListView(BaseOrderedFilteringList):
template_name = 'ip_pool/employed_ip_list.html'
model = models.EmployedIpModel
def get_context_data(self, **kwargs):
net_id = self.kwargs.get('net_id')
context = super().get_context_data(**kwargs)
context['net'] = get_object_or_404(models.NetworkModel, pk=net_id)
return context
def get_queryset(self):
net_id = self.kwargs.get('net_id')
return self.model.objects.filter(network__id=net_id)
@method_decorator(login_required, name='dispatch')
@method_decorator(permission_required('ip_pool.add_networkmodel'), name='dispatch')
class NetworkCreateView(CreateView):
model = models.NetworkModel
template_name = 'ip_pool/net_add.html'
form_class = forms.NetworkForm
def form_valid(self, form):
r = super().form_valid(form)
messages.success(self.request, _('Network has been created'))
return r

7
locale/ru/LC_MESSAGES/django.po

@ -108,5 +108,8 @@ msgstr "Звонки"
msgid "Devices"
msgstr "Устройства"
msgid "Language"
msgstr "Язык"
# msgid "Language"
# msgstr "Язык"
msgid "Ip pool"
msgstr "IP пул"

24
mapapp/templates/maps/add_device.html

@ -1,22 +1,18 @@
{% extends 'base.html' %}
{% load i18n %}
{% load bootstrap3 %}
{% block main %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'mapapp:options' %}">{% trans 'Map settings' %}</a></li>
<li><a href="{% url 'mapapp:edit_dot' dot.pk %}">{{ dot.title }}</a></li>
<li class="active">{% trans 'Add devices' %}</li>
</ol>
{% include 'message_block.html' %}
<script type="text/javascript">
</script>
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'mapapp:options' %}">{% trans 'Map settings' %}</a></li>
<li><a href="{% url 'mapapp:edit_dot' dot.pk %}">{{ dot.title }}</a></li>
<li class="active">{% trans 'Add devices' %}</li>
</ol>
{% endblock %}
{% block main %}
<div class="row">
<div class="col-sm-4">
<div class="panel panel-default">
@ -45,7 +41,6 @@
});
});
</script>
</div>
<div class="col-sm-8">
<form role="form" action="{% url 'mapapp:add_dev' dot.pk %}?grp={{ grp }}" method="post">{% csrf_token %}
@ -66,5 +61,4 @@
</form>
</div>
</div>
{% endblock %}

33
mapapp/templates/maps/dot.html

@ -2,22 +2,29 @@
{% load i18n %}
{% load bootstrap3 %}
{% load globaltags %}
{% block main %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'mapapp:options' %}">{% trans 'Map settings' %}</a></li>
{% if dot.id %}
<li class="active">{{ dot.title }}</li>
{% url 'mapapp:edit_dot' dot.id as form_url %}
{% else %}
<li class="active">{% trans 'Add new point' %}</li>
{% url 'mapapp:add_dot' as form_url %}
{% endif %}
</ol>
{% include 'message_block.html' %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'mapapp:options' %}">{% trans 'Map settings' %}</a></li>
{% if dot.id %}
<li class="active">{{ dot.title }}</li>
{% url 'mapapp:edit_dot' dot.id as form_url %}
{% else %}
<li class="active">{% trans 'Add new point' %}</li>
{% url 'mapapp:add_dot' as form_url %}
{% endif %}
</ol>
{% endblock %}
{% block page-header %}
<h3>{% trans 'Map point' %}</h3>
{% endblock %}
{% block main %}
<div class="row">
<div class="{% if dot.id %}col-sm-6{% else %}col-sm-12{% endif %}">
<form role="form" action="{{ form_url }}" method="post" enctype="multipart/form-data">{% csrf_token %}

11
mapapp/templates/maps/options.html

@ -1,16 +1,19 @@
{% extends 'base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Map settings' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'Map point' %}</h3>
{% endblock %}
{% block main %}
{% with can_change_dot=perms.mapapp.change_dot can_delete_dot=perms.mapapp.delete_dot %}
<h3>{% trans 'Map point' %}</h3>
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -68,6 +71,4 @@
</table>
</div>
{% endwith %}
{% include 'pagination.html' %}
{% endblock %}

11
msg_app/templates/msg_app/chat.html

@ -1,15 +1,22 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'msg_app:home' %}">{% trans 'Private messages' %}</a></li>
<li class="active">{{ conv.title }}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{{ conv.title }}</h3>
{% endblock %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{{ conv.title }}

13
msg_app/templates/msg_app/conversations.html

@ -1,13 +1,20 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Private messages' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page_header %}
<h3>{% trans 'Conversations' %}</h3>
{% endblock %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
@ -58,6 +65,4 @@
</div>
</div>
{% include 'pagination.html' %}
{% endblock %}

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

@ -44,3 +44,6 @@ msgstr "Вы можете изменить строку поиска и попр
#, python-format
msgid "Network state is %(netw_status)s"
msgstr "Сетевой статус: %(netw_status)s"
msgid "Search"
msgstr "Поиск"

11
searchapp/templates/searchapp/index.html

@ -1,7 +1,15 @@
{% extends 'base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Search' %}</li>
</ol>
{% endblock %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
@ -93,5 +101,4 @@
</div>
</div>
</div>
{% endblock %}

7
tariff_app/templates/tariff_app/editTarif.html

@ -1,8 +1,8 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% load bootstrap3 %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'tarifs:home' %}">{% trans 'Tarifs' %}</a></li>
@ -14,9 +14,9 @@
{% endif %}
</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% if tarif_id == 0 %}{% trans 'Create' %}{% else %}{% trans 'Edit' %}{% endif %} {% trans 'tariff' %}</h3>
@ -56,5 +56,4 @@
</form>
</div>
</div>
{% endblock %}

9
tariff_app/templates/tariff_app/ext.html

@ -1,14 +1,18 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Services' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'Services' %}</h3>
{% endblock %}
{% block main %}
<ul class="nav nav-tabs">
{% url 'tarifs:home' as tarhome %}
@ -32,5 +36,4 @@
{% block content %}{% endblock %}
</div>
</div>
{% endblock %}

24
tariff_app/templates/tariff_app/periodic_pays/add_edit.html

@ -1,8 +1,8 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% load bootstrap3 %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'tarifs:periodic_pays' %}">{% trans 'Services' %}</a></li>
@ -12,18 +12,21 @@
<li class="active">{% trans 'Add new periodic pay' %}</li>
{% endif %}
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% if pay_instance %}
<div class="page-header">
<h2>{{ pay_instance.name }}</h2>
</div>
{% url 'tarifs:periodic_pay_edit' pay_instance.id as form_url %}
{% else %}
{% url 'tarifs:periodic_pay_add' as form_url %}
{% endif %}
{% if pay_instance %}
{% block page-header %}
<h3>{{ pay_instance.name }}</h3>
{% endblock %}
{% url 'tarifs:periodic_pay_edit' pay_instance.id as form_url %}
{% else %}
{% url 'tarifs:periodic_pay_add' as form_url %}
{% endif %}
{% block main %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Pay details' %}</h3>
@ -47,5 +50,4 @@
</form>
</div>
</div>
{% endblock %}

6
taskapp/templates/taskapp/add_edit_task.html

@ -2,16 +2,18 @@
{% load i18n %}
{% load bootstrap3 %}
{% load globaltags %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'taskapp:home' %}">{% trans 'Tasks' %}</a></li>
<li class="active">{% if task.id %}{% trans 'Edit' %}{% else %}{% trans 'Create' %}{% endif %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="row">
<div class="{% if task %}col-sm-6{% else %}col-sm-12{% endif %}">
<div class="panel panel-default">

16
taskapp/templates/taskapp/ext.htm

@ -1,20 +1,20 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Tasks' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'Tasks to be performed' %}</h3>
{% endblock %}
<div class="page-header">
<h2>{% block pagetitle %}
{% trans 'Tasks to be performed' %}
{% endblock %}
</h2>
</div>
{% block main %}
<ul class="nav nav-tabs">

16
taskapp/templates/taskapp/tasklist_all.html

@ -1,19 +1,23 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% load tasktags %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'taskapp:home' %}">{% trans 'Tasks' %}</a></li>
<li class="active">{% trans 'All tasks' %}</li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
<div class="page-header">
<h2>{% trans 'Records of all the tasks in the system' %}</h2>
</div>
{% block page-header %}
<h3>{% trans 'Records of all the tasks in the system' %}</h3>
{% endblock %}
{% block main %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
@ -119,6 +123,4 @@
</table>
</div>
{% include 'pagination.html' %}
{% endblock %}

4
taskapp/templates/taskapp/tasklist_empty.html

@ -1,8 +1,8 @@
{% extends request.is_ajax|yesno:'nullcont.htm,taskapp/ext.htm' %}
{% load i18n %}
{% block pagetitle %}
{% trans 'Tasks in which no recipients' %}
{% block page-header %}
<h3>{% trans 'Tasks in which no recipients' %}</h3>
{% endblock %}
{% block content %}

4
taskapp/templates/taskapp/tasklist_failed.html

@ -1,8 +1,8 @@
{% extends request.is_ajax|yesno:'nullcont.htm,taskapp/ext.htm' %}
{% load i18n %}
{% block pagetitle %}
{% trans 'Tasks in which was trouble while at runtime' %}
{% block page-header %}
<h3>{% trans 'Tasks in which was trouble while at runtime' %}</h3>
{% endblock %}
{% block content %}

7
taskapp/views.py

@ -271,11 +271,8 @@ def check_news(request):
@method_decorator(permission_required('taskapp.add_extracomment'), name='dispatch')
class NewCommentView(CreateView):
form_class = ExtraCommentForm
http_method_names = ['get', 'post']
def get_success_url(self):
task_id = self.kwargs.get('task_id')
return resolve_url('taskapp:edit', task_id)
model = ExtraComment
http_method_names = ('get', 'post')
def form_valid(self, form):
self.task = get_object_or_404(Task, pk=self.kwargs.get('task_id'))

45
templates/base.html

@ -33,33 +33,45 @@
<li{% if abon_groups_link in request.path %} class="active"{% endif %}>
<a href="{{ abon_groups_link }}">
<span class="glyphicon glyphicon-user"></span> {% trans 'Subscribers' %}
</a></li>
</a>
</li>
{% url 'taskapp:home' as task_home %}
<li{% if task_home in request.path %} class="active"{% endif %}>
<a href="{{ task_home }}">
<span class="glyphicon glyphicon-tasks"></span> {% trans 'Tasks' %}
{% if tasks_count > 0 %}<span class="badge">{{ tasks_count }}</span>{% endif %}
</a></li>
</a>
</li>
{% url 'group_app:group_list' as group_list_link %}
<li{% if group_list_link in request.path %} class="active"{% endif %}>
<a href="{{ group_list_link }}">
<span class="glyphicon glyphicon-list-alt"></span> {% trans 'Groups' %}
</a></li>
</a>
</li>
{% url 'tarifs:home' as tarifs_home %}
<li{% if tarifs_home in request.path %} class="active"{% endif %}>
<a href="{{ tarifs_home }}">
<span class="glyphicon glyphicon-usd"></span> {% trans 'Services' %}
</a></li>
</a>
</li>
{% url 'ip_pool:networks' as ippool_home %}
<li{% if ippool_home in request.path %} class="active"{% endif %}>
<a href="{{ ippool_home }}">
<span class="glyphicon glyphicon-compressed"></span> {% trans 'Ip pool' %}
</a>
</li>
{% if request.user.is_superuser %}
{% url 'mapapp:options' as mapapp_ops %}
<li{% if mapapp_ops in request.path %} class="active"{% endif %}>
<a href="{{ mapapp_ops }}">
<span class="glyphicon glyphicon-map-marker"></span> {% trans 'Map settings' %}
</a></li>
</a>
</li>
{% endif %}
{% url 'msg_app:home' as privmsg_home %}
@ -69,21 +81,24 @@
{% if new_messages_count > 0 %}
<span class="badge">{{ new_messages_count }}</span>
{% endif %}
</a></li>
</a>
</li>
{% if perms.dialing_app.change_asteriskcdr %}
{% url 'dialapp:home' as dialhome %}
<li{% if dialhome in request.path %} class="active"{% endif %}>
<a href="{{ dialhome }}">
<span class="glyphicon glyphicon-phone-alt"></span> {% trans 'Dialing' %}
</a></li>
</a>
</li>
{% endif %}
{% url 'devapp:group_list' as devapp_groups %}
<li{% if devapp_groups in request.path %} class="active"{% endif %}>
<a href="{{ devapp_groups }}">
<span class="glyphicon glyphicon-hdd"></span> {% trans 'Devices' %}
</a></li>
</a>
</li>
</ul>
@ -96,8 +111,22 @@
<button type="button" data-toggle="offcanvas"></button>
</p>
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
</ol>
{% endblock %}
{% include 'message_block.html' %}
<div class="page-header">
<h3>{% block page-header %}{% endblock %}</h3>
</div>
{% block main %}{% endblock %}
{% include 'pagination.html' %}
</div>
<!-- END Main content -->
{% endblock %}
Loading…
Cancel
Save