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. 7
      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. 15
      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. 20
      devapp/templates/devapp/ext.htm
  31. 16
      devapp/templates/devapp/fix_dev_group.html
  32. 9
      devapp/templates/devapp/group_list.html
  33. 16
      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. 16
      mapapp/templates/maps/add_device.html
  60. 15
      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. 20
      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 import models, connection, transaction
from django.db.models.signals import post_delete, pre_delete, post_init from django.db.models.signals import post_delete, pre_delete, post_init
from django.dispatch import receiver from django.dispatch import receiver
from django.shortcuts import resolve_url
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext_lazy as _, gettext 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 agent import Transmitter, AbonStruct, TariffStruct, NasFailedResult, NasNetworkError
from group_app.models import Group from group_app.models import Group
from djing.lib import ip2int, LogicError from djing.lib import ip2int, LogicError
from djing.fields import MyGenericIPAddressField
from djing import IP_ADDR_REGEX from djing import IP_ADDR_REGEX
from tariff_app.models import Tariff, PeriodicPay from tariff_app.models import Tariff, PeriodicPay
from bitfield import BitField 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) 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')) group = models.ForeignKey(Group, models.SET_NULL, blank=True, null=True, verbose_name=_('User group'))
ballance = models.FloatField(default=0.0) 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) description = models.TextField(_('Comment'), null=True, blank=True)
street = models.ForeignKey(AbonStreet, on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_('Street')) 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) house = models.CharField(_('House'), max_length=12, null=True, blank=True)
@ -289,6 +289,9 @@ class Abon(BaseAccount):
print('ERROR:', e) print('ERROR:', e)
return e return e
def get_absolute_url(self):
return resolve_url('abonapp:abon_home', self.group.id, self.username)
class PassportInfo(models.Model): class PassportInfo(models.Model):
series = models.CharField(_('Pasport serial'), max_length=4, validators=(validators.integer_validator,)) series = models.CharField(_('Pasport serial'), max_length=4, validators=(validators.integer_validator,))

7
abonapp/templates/abonapp/addAbon.html

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

7
abonapp/templates/abonapp/addInvoice.html

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

14
abonapp/templates/abonapp/debtors.html

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

2
abonapp/templates/abonapp/editAbon.html

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

15
abonapp/templates/abonapp/ext.htm

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

12
abonapp/templates/abonapp/fin_report.html

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

11
abonapp/templates/abonapp/group_list.html

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

10
abonapp/templates/abonapp/group_tariffs.html

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

12
abonapp/templates/abonapp/invoiceForPayment.html

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

12
abonapp/templates/abonapp/log.html

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

9
abonapp/templates/abonapp/peoples.html

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

17
abonapp/views.py

@ -102,12 +102,10 @@ class AbonCreateView(CreateView):
group = None group = None
abon = None abon = None
form_class = forms.AbonForm form_class = forms.AbonForm
model = models.Abon
template_name = 'abonapp/addAbon.html' template_name = 'abonapp/addAbon.html'
context_object_name = 'group' 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): def dispatch(self, request, *args, **kwargs):
group = get_object_or_404(Group, pk=self.kwargs.get('gid')) group = get_object_or_404(Group, pk=self.kwargs.get('gid'))
if not request.user.has_perm('group_app.can_view_group', group): if not request.user.has_perm('group_app.can_view_group', group):
@ -349,13 +347,6 @@ class AbonHomeUpdateView(UpdateView):
context.update(kwargs) context.update(kwargs)
return super(AbonHomeUpdateView, self).get_context_data(**context) 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 @transaction.atomic
def terminal_pay(request): def terminal_pay(request):
@ -1091,14 +1082,12 @@ class EditSibscriberMarkers(UpdateView):
http_method_names = ('get', 'post') http_method_names = ('get', 'post')
template_name = 'abonapp/modal_user_markers.html' template_name = 'abonapp/modal_user_markers.html'
form_class = forms.MarkersForm form_class = forms.MarkersForm
model = models.Abon
def get_object(self, queryset=None): def get_object(self, queryset=None):
obj = models.Abon.objects.get(username=self.kwargs.get('uname')) obj = models.Abon.objects.get(username=self.kwargs.get('uname'))
return obj 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): def get_context_data(self, **kwargs):
context = super(EditSibscriberMarkers, self).get_context_data(**kwargs) context = super(EditSibscriberMarkers, self).get_context_data(**kwargs)
context['gid'] = self.kwargs.get('gid') context['gid'] = self.kwargs.get('gid')
@ -1123,7 +1112,7 @@ def abons(request):
ablist = ({ ablist = ({
'id': abn.pk, 'id': abn.pk,
'tarif_id': abn.active_tariff().tariff.pk if abn.active_tariff() is not None else 0, '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 'is_active': abn.is_active
} for abn in models.Abon.objects.all()) } 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" msgid "Manage responsibility groups"
msgstr "Ответственность за группы" msgstr "Ответственность за группы"
msgid "Profile"
msgstr "Учётная запись"

3
accounts_app/models.py

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

12
accounts_app/templates/accounts/acc_list.html

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

7
accounts_app/templates/accounts/create_acc.html

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

9
accounts_app/templates/accounts/ext.htm

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

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

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

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

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

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

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

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

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

2
clientsideapp/templates/clientsideapp/index.html

@ -18,7 +18,7 @@
<dd>{{ user.telephone }}</dd> <dd>{{ user.telephone }}</dd>
<dt>{% trans 'Ip Address' %}</dt> <dt>{% trans 'Ip Address' %}</dt>
<dd>{{ user.ip_address }}</dd>
<dd>{{ user.ip_address|default:'-' }}</dd>
{% if user.street %} {% if user.street %}
<dt>{% trans 'Address' %}</dt> <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 subprocess import run
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from django.shortcuts import resolve_url
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from jsonfield import JSONField from jsonfield import JSONField
from djing.fields import MACAddressField, MyGenericIPAddressField
from djing.fields import MACAddressField
from djing.lib import MyChoicesAdapter from djing.lib import MyChoicesAdapter
from group_app.models import Group from group_app.models import Group
from . import dev_types from . import dev_types
@ -24,7 +25,7 @@ class DeviceMonitoringException(Exception):
class Device(models.Model): class Device(models.Model):
_cached_manager = None _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) mac_addr = MACAddressField(verbose_name=_('Mac address'), null=True, blank=True, unique=True)
comment = models.CharField(_('Comment'), max_length=256) comment = models.CharField(_('Comment'), max_length=256)
DEVICE_TYPES = ( DEVICE_TYPES = (
@ -121,6 +122,9 @@ class Device(models.Model):
return mng.register_device(self.parent_dev.extra_data) return mng.register_device(self.parent_dev.extra_data)
return mng.register_device(self.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): class Port(models.Model):
device = models.ForeignKey(Device, models.CASCADE, verbose_name=_('Device')) 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' %} {% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %} {% load i18n %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li> <li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></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><a href="{% url 'devapp:devs' group.pk %}">{{ group.title }}</a></li>
<li class="active">{% trans 'Add new device' %}</li> <li class="active">{% trans 'Add new device' %}</li>
</ol> </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 panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{% trans 'Device info' %}</h3> <h3 class="panel-title">{% trans 'Device info' %}</h3>
@ -51,7 +51,7 @@
{% if selected_parent_dev %} {% if selected_parent_dev %}
<button class="selectajax-btn form-control btn btn-default"> <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> </button>
{% else %} {% else %}
<button class="selectajax-btn form-control btn btn-default hidden"></button> <button class="selectajax-btn form-control btn btn-default hidden"></button>
@ -79,5 +79,4 @@
</form> </form>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

14
devapp/templates/devapp/devices.html

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

12
devapp/templates/devapp/devices_null_group.html

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

20
devapp/templates/devapp/ext.htm

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

16
devapp/templates/devapp/fix_dev_group.html

@ -1,18 +1,17 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %} {% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %} {% load i18n %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% block main %}
<ol class="breadcrumb">
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li> <li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></li> <li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></li>
<li class="active">{{ dev.comment }}</li> <li class="active">{{ dev.comment }}</li>
</ol>
{% include 'message_block.html' %}
</ol>
{% endblock %}
<div class="panel panel-default">
{% block main %}
<div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{% trans 'Fix device group' %}</h3> <h3 class="panel-title">{% trans 'Fix device group' %}</h3>
</div> </div>
@ -70,6 +69,5 @@
</form> </form>
</div> </div>
</div>
</div>
{% endblock %} {% endblock %}

9
devapp/templates/devapp/group_list.html

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

16
devapp/templates/devapp/manage_ports/add_ports.html

@ -1,7 +1,7 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %} {% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %} {% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li> <li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></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><a href="{% url 'devapp:view' dev.group.pk dev.pk %}">{{ dev.comment }}</a></li>
<li class="active">{% trans 'Add ports' %}</li> <li class="active">{% trans 'Add ports' %}</li>
</ol> </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 panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{{ dev.comment }}</h3> <h3 class="panel-title">{{ dev.comment }}</h3>
@ -23,7 +23,6 @@
<div class="panel-body"> <div class="panel-body">
<form class="table-responsive" role="form" action="{% url 'devapp:add_ports' dev.group.pk dev.pk %}" method="post">{% csrf_token %} <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"> <table class="table table-striped table-bordered">
<thead> <thead>
<tr> <tr>
@ -83,9 +82,6 @@
</tr> </tr>
</tfoot> </tfoot>
</table> </table>
</form> </form>
</div> </div>
</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' %} {% extends request.is_ajax|yesno:'nullcont.htm,devapp/ext.htm' %}
{% load i18n %} {% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li> <li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'devapp:group_list' %}">{% trans 'Groups' %}</a></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><a href="{% url 'devapp:view' group.pk device.pk %}">{{ device.comment }}</a></li>
<li class="active">{% trans 'Fix subscriber ports conflict' %}</li> <li class="active">{% trans 'Fix subscriber ports conflict' %}</li>
</ol> </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 panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{% trans 'Subscribers list on port' %}</h3> <h3 class="panel-title">{% trans 'Subscribers list on port' %}</h3>
@ -32,5 +32,4 @@
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

11
devapp/views.py

@ -131,9 +131,6 @@ class DeviceUpdate(UpdateView):
messages.success(self.request, _('Device info has been saved')) messages.success(self.request, _('Device info has been saved'))
return r 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): def dispatch(self, request, *args, **kwargs):
group_id = self.kwargs.get('group_id') group_id = self.kwargs.get('group_id')
device_group = get_object_or_404(Group, pk=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')) messages.success(self.request, _('Device info has been saved'))
return r 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): def dispatch(self, request, *args, **kwargs):
group_id = self.kwargs.get('group_id') group_id = self.kwargs.get('group_id')
device_group = get_object_or_404(Group, pk=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')) messages.success(self.request, _('Device extra data has successfully updated'))
return r return r
def get_success_url(self):
return resolve_url('devapp:edit',
self.kwargs.get('group_id'),
self.kwargs.get('device_id'))
@login_required @login_required
@permission_required('devapp.change_device') @permission_required('devapp.change_device')

15
dialing_app/templates/ext.html

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

4
djing/global_base_views.py

@ -147,3 +147,7 @@ class BaseListWithFiltering(RedirectWhenErrorMixin, ListView):
'page_number': page_number, 'page_number': page_number,
'message': str(e) '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 # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
# 'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
'django.contrib.contenttypes', 'django.contrib.contenttypes',
'django.contrib.sessions', 'django.contrib.sessions',
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'ip_pool',
'accounts_app', 'accounts_app',
'abonapp', 'abonapp',
'tariff_app', 'tariff_app',
@ -58,6 +58,10 @@ INSTALLED_APPS = [
'bootstrap3' 'bootstrap3'
] ]
if DEBUG:
INSTALLED_APPS.insert(0, 'django.contrib.admin')
MIDDLEWARE = [ MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', 'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', '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 import template
from django.conf import settings from django.conf import settings
from django.utils.http import is_safe_url
register = template.Library() register = template.Library()
@ -7,3 +10,13 @@ register = template.Library()
@register.simple_tag @register.simple_tag
def global_var(var_name): def global_var(var_name):
return getattr(settings, 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.urls import url, include
from django.conf import settings from django.conf import settings
# from django.contrib import admin
from .views import home from .views import home
@ -18,17 +17,18 @@ urlpatterns = [
url(r'^msg/', include('msg_app.urls', namespace='msg_app')), url(r'^msg/', include('msg_app.urls', namespace='msg_app')),
url(r'^dialing/', include('dialing_app.urls', namespace='dialapp')), url(r'^dialing/', include('dialing_app.urls', namespace='dialapp')),
url(r'^groups/', include('group_app.urls', namespace='group_app')), url(r'^groups/', include('group_app.urls', namespace='group_app')),
url(r'^ip_pool/', include('ip_pool.urls', namespace='ip_pool'))
# Switch language # Switch language
#url(r'^i18n/', include('django.conf.urls.i18n')), #url(r'^i18n/', include('django.conf.urls.i18n')),
# url(r'^admin/', admin.site.urls)
] ]
if settings.DEBUG: if settings.DEBUG:
from django.conf.urls.static import static from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib import admin
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += 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' %} {% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %} {% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li> <li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'group_app:group_list' %}">{% trans 'Groups' %}</a></li> <li><a href="{% url 'group_app:group_list' %}">{% trans 'Groups' %}</a></li>
<li class="active">{% block active_text %}{% trans 'Groups' %}{% endblock %}</li> <li class="active">{% block active_text %}{% trans 'Groups' %}{% endblock %}</li>
</ol> </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 panel-default">
<div class="panel-body"> <div class="panel-body">
{% block content %}{% endblock %} {% block content %}{% endblock %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

11
group_app/templates/group_app/group_list.html

@ -1,16 +1,20 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load i18n %} {% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li> <li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Groups' %}</li> <li class="active">{% trans 'Groups' %}</li>
</ol> </ol>
{% endblock %}
{% block page-header %}
<h3>{% trans 'Groups' %}</h3> <h3>{% trans 'Groups' %}</h3>
{% endblock %}
{% include 'message_block.html' %}
{% block main %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-bordered"> <table class="table table-striped table-bordered">
<thead> <thead>
@ -62,7 +66,4 @@
</tfoot> </tfoot>
</table> </table>
</div> </div>
{% include 'pagination.html' %}
{% endblock %} {% 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" msgid "Devices"
msgstr "Устройства" msgstr "Устройства"
msgid "Language"
msgstr "Язык"
# msgid "Language"
# msgstr "Язык"
msgid "Ip pool"
msgstr "IP пул"

16
mapapp/templates/maps/add_device.html

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

15
mapapp/templates/maps/dot.html

@ -2,9 +2,10 @@
{% load i18n %} {% load i18n %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load globaltags %} {% load globaltags %}
{% block main %}
<ol class="breadcrumb">
{% block breadcrumb %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li> <li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'mapapp:options' %}">{% trans 'Map settings' %}</a></li> <li><a href="{% url 'mapapp:options' %}">{% trans 'Map settings' %}</a></li>
{% if dot.id %} {% if dot.id %}
@ -14,10 +15,16 @@
<li class="active">{% trans 'Add new point' %}</li> <li class="active">{% trans 'Add new point' %}</li>
{% url 'mapapp:add_dot' as form_url %} {% url 'mapapp:add_dot' as form_url %}
{% endif %} {% endif %}
</ol>
</ol>
{% endblock %}
{% include 'message_block.html' %}
{% block page-header %}
<h3>{% trans 'Map point' %}</h3>
{% endblock %}
{% block main %}
<div class="row"> <div class="row">
<div class="{% if dot.id %}col-sm-6{% else %}col-sm-12{% endif %}"> <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 %} <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' %} {% extends 'base.html' %}
{% load i18n %} {% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li> <li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Map settings' %}</li> <li class="active">{% trans 'Map settings' %}</li>
</ol> </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 %} {% with can_change_dot=perms.mapapp.change_dot can_delete_dot=perms.mapapp.delete_dot %}
<h3>{% trans 'Map point' %}</h3>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-bordered"> <table class="table table-striped table-bordered">
<thead> <thead>
@ -68,6 +71,4 @@
</table> </table>
</div> </div>
{% endwith %} {% endwith %}
{% include 'pagination.html' %}
{% endblock %} {% endblock %}

11
msg_app/templates/msg_app/chat.html

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

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

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

11
searchapp/templates/searchapp/index.html

@ -1,7 +1,15 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load i18n %} {% 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 panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title"> <h3 class="panel-title">
@ -93,5 +101,4 @@
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

7
tariff_app/templates/tariff_app/editTarif.html

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

9
tariff_app/templates/tariff_app/ext.html

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

20
tariff_app/templates/tariff_app/periodic_pays/add_edit.html

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

6
taskapp/templates/taskapp/add_edit_task.html

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

16
taskapp/templates/taskapp/ext.htm

@ -1,20 +1,20 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %} {% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %} {% load i18n %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li> <li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">{% trans 'Tasks' %}</li> <li class="active">{% trans 'Tasks' %}</li>
</ol> </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"> <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' %} {% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %} {% load i18n %}
{% load tasktags %} {% load tasktags %}
{% block main %}
{% block breadcrumb %}
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li> <li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'taskapp:home' %}">{% trans 'Tasks' %}</a></li> <li><a href="{% url 'taskapp:home' %}">{% trans 'Tasks' %}</a></li>
<li class="active">{% trans 'All tasks' %}</li> <li class="active">{% trans 'All tasks' %}</li>
</ol> </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"> <div class="table-responsive">
<table class="table table-striped table-bordered"> <table class="table table-striped table-bordered">
@ -119,6 +123,4 @@
</table> </table>
</div> </div>
{% include 'pagination.html' %}
{% endblock %} {% endblock %}

4
taskapp/templates/taskapp/tasklist_empty.html

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

4
taskapp/templates/taskapp/tasklist_failed.html

@ -1,8 +1,8 @@
{% extends request.is_ajax|yesno:'nullcont.htm,taskapp/ext.htm' %} {% extends request.is_ajax|yesno:'nullcont.htm,taskapp/ext.htm' %}
{% load i18n %} {% 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 %} {% endblock %}
{% block content %} {% block content %}

7
taskapp/views.py

@ -271,11 +271,8 @@ def check_news(request):
@method_decorator(permission_required('taskapp.add_extracomment'), name='dispatch') @method_decorator(permission_required('taskapp.add_extracomment'), name='dispatch')
class NewCommentView(CreateView): class NewCommentView(CreateView):
form_class = ExtraCommentForm 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): def form_valid(self, form):
self.task = get_object_or_404(Task, pk=self.kwargs.get('task_id')) 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 %}> <li{% if abon_groups_link in request.path %} class="active"{% endif %}>
<a href="{{ abon_groups_link }}"> <a href="{{ abon_groups_link }}">
<span class="glyphicon glyphicon-user"></span> {% trans 'Subscribers' %} <span class="glyphicon glyphicon-user"></span> {% trans 'Subscribers' %}
</a></li>
</a>
</li>
{% url 'taskapp:home' as task_home %} {% url 'taskapp:home' as task_home %}
<li{% if task_home in request.path %} class="active"{% endif %}> <li{% if task_home in request.path %} class="active"{% endif %}>
<a href="{{ task_home }}"> <a href="{{ task_home }}">
<span class="glyphicon glyphicon-tasks"></span> {% trans 'Tasks' %} <span class="glyphicon glyphicon-tasks"></span> {% trans 'Tasks' %}
{% if tasks_count > 0 %}<span class="badge">{{ tasks_count }}</span>{% endif %} {% if tasks_count > 0 %}<span class="badge">{{ tasks_count }}</span>{% endif %}
</a></li>
</a>
</li>
{% url 'group_app:group_list' as group_list_link %} {% url 'group_app:group_list' as group_list_link %}
<li{% if group_list_link in request.path %} class="active"{% endif %}> <li{% if group_list_link in request.path %} class="active"{% endif %}>
<a href="{{ group_list_link }}"> <a href="{{ group_list_link }}">
<span class="glyphicon glyphicon-list-alt"></span> {% trans 'Groups' %} <span class="glyphicon glyphicon-list-alt"></span> {% trans 'Groups' %}
</a></li>
</a>
</li>
{% url 'tarifs:home' as tarifs_home %} {% url 'tarifs:home' as tarifs_home %}
<li{% if tarifs_home in request.path %} class="active"{% endif %}> <li{% if tarifs_home in request.path %} class="active"{% endif %}>
<a href="{{ tarifs_home }}"> <a href="{{ tarifs_home }}">
<span class="glyphicon glyphicon-usd"></span> {% trans 'Services' %} <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 %} {% if request.user.is_superuser %}
{% url 'mapapp:options' as mapapp_ops %} {% url 'mapapp:options' as mapapp_ops %}
<li{% if mapapp_ops in request.path %} class="active"{% endif %}> <li{% if mapapp_ops in request.path %} class="active"{% endif %}>
<a href="{{ mapapp_ops }}"> <a href="{{ mapapp_ops }}">
<span class="glyphicon glyphicon-map-marker"></span> {% trans 'Map settings' %} <span class="glyphicon glyphicon-map-marker"></span> {% trans 'Map settings' %}
</a></li>
</a>
</li>
{% endif %} {% endif %}
{% url 'msg_app:home' as privmsg_home %} {% url 'msg_app:home' as privmsg_home %}
@ -69,21 +81,24 @@
{% if new_messages_count > 0 %} {% if new_messages_count > 0 %}
<span class="badge">{{ new_messages_count }}</span> <span class="badge">{{ new_messages_count }}</span>
{% endif %} {% endif %}
</a></li>
</a>
</li>
{% if perms.dialing_app.change_asteriskcdr %} {% if perms.dialing_app.change_asteriskcdr %}
{% url 'dialapp:home' as dialhome %} {% url 'dialapp:home' as dialhome %}
<li{% if dialhome in request.path %} class="active"{% endif %}> <li{% if dialhome in request.path %} class="active"{% endif %}>
<a href="{{ dialhome }}"> <a href="{{ dialhome }}">
<span class="glyphicon glyphicon-phone-alt"></span> {% trans 'Dialing' %} <span class="glyphicon glyphicon-phone-alt"></span> {% trans 'Dialing' %}
</a></li>
</a>
</li>
{% endif %} {% endif %}
{% url 'devapp:group_list' as devapp_groups %} {% url 'devapp:group_list' as devapp_groups %}
<li{% if devapp_groups in request.path %} class="active"{% endif %}> <li{% if devapp_groups in request.path %} class="active"{% endif %}>
<a href="{{ devapp_groups }}"> <a href="{{ devapp_groups }}">
<span class="glyphicon glyphicon-hdd"></span> {% trans 'Devices' %} <span class="glyphicon glyphicon-hdd"></span> {% trans 'Devices' %}
</a></li>
</a>
</li>
</ul> </ul>
@ -96,8 +111,22 @@
<button type="button" data-toggle="offcanvas"></button> <button type="button" data-toggle="offcanvas"></button>
</p> </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 %} {% block main %}{% endblock %}
{% include 'pagination.html' %}
</div> </div>
<!-- END Main content --> <!-- END Main content -->
{% endblock %} {% endblock %}
Loading…
Cancel
Save