Browse Source

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

devel
bashmak 9 years ago
parent
commit
882419410c
  1. 10
      abonapp/locale/ru/LC_MESSAGES/django.po
  2. 7
      abonapp/migrations/0001_initial.py
  3. 21
      abonapp/migrations/0019_abon_ip_address.py
  4. 13
      abonapp/models.py
  5. 4
      abonapp/templates/abonapp/charts.html
  6. 2
      abonapp/templates/abonapp/editAbon.html
  7. 3
      abonapp/templates/abonapp/modal_abonamount.html
  8. 20
      abonapp/views.py
  9. 6
      clientsideapp/templates/clientsideapp/ext.html
  10. 19
      dhcp_lever.py
  11. 1
      djing/settings_example.py
  12. 1
      djing/urls.py
  13. 1
      ip_pool/__init__.py
  14. 6
      ip_pool/admin.py
  15. 6
      ip_pool/apps.py
  16. 22
      ip_pool/forms.py
  17. 23
      ip_pool/migrations/0001_initial.py
  18. 0
      ip_pool/migrations/__init__.py
  19. 59
      ip_pool/models.py
  20. 48
      ip_pool/templates/ip_pool/add_pool.html
  21. 73
      ip_pool/templates/ip_pool/index.html
  22. 59
      ip_pool/templates/ip_pool/ips.html
  23. 15
      ip_pool/urls.py
  24. 81
      ip_pool/views.py
  25. 3
      mydefs.py
  26. 9
      searchapp/views.py
  27. 7
      templates/base.html
  28. 4
      templates/message_block.html

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

@ -619,14 +619,8 @@ msgstr "Абонент успешно изменён"
#: abonapp/views.py:258
#, python-format
msgid "Ip address already exist. %s"
msgstr ""
"Проверте введённые вами значения, скорее всего такой ip уже у кого-то есть. "
"А вообще: %s"
#: abonapp/views.py:266
msgid "Ip address not found"
msgstr "Указанный вами ip отсутствует в ip pool"
msgid "Ip address already exist"
msgstr "Такой ip уже у кого-то есть"
#: abonapp/views.py:268
msgid "User has not have password, and cannot login"

7
abonapp/migrations/0001_initial.py

@ -13,7 +13,6 @@ class Migration(migrations.Migration):
dependencies = [
('accounts_app', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('ip_pool', '0001_initial'),
('tariff_app', '0001_initial'),
]
@ -102,12 +101,6 @@ class Migration(migrations.Migration):
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='abonapp.AbonGroup'),
),
migrations.AddField(
model_name='abon',
name='ip_address',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='ip_pool.IpPoolItem'),
),
migrations.AlterUniqueTogether(
name='abontariff',
unique_together={('abon', 'tariff', 'tariff_priority')},

21
abonapp/migrations/0019_abon_ip_address.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2017-05-10 23:17
from __future__ import unicode_literals
from django.db import migrations
import mydefs
class Migration(migrations.Migration):
dependencies = [
('abonapp', '0018_auto_20170418_1236'),
]
operations = [
migrations.AddField(
model_name='abon',
name='ip_address',
field=mydefs.MyGenericIPAddressField(blank=True, max_length=8, null=True, protocol='ipv4'),
),
]

13
abonapp/models.py

@ -6,10 +6,10 @@ from django.db import models
from django.core import validators
from django.utils.translation import ugettext as _
from agent import Transmitter, AbonStruct, TariffStruct, NasFailedResult, NasNetworkError
from ip_pool.models import IpPoolItem
from tariff_app.models import Tariff
from accounts_app.models import UserProfile
from .fields import MACAddressField
from mydefs import MyGenericIPAddressField, ip2int
class LogicError(Exception):
@ -207,7 +207,7 @@ class Abon(UserProfile):
current_tariffs = models.ManyToManyField(Tariff, through=AbonTariff)
group = models.ForeignKey(AbonGroup, models.SET_NULL, blank=True, null=True)
ballance = models.FloatField(default=0.0)
ip_address = models.OneToOneField(IpPoolItem, on_delete=models.SET_NULL, null=True, blank=True)
ip_address = MyGenericIPAddressField(blank=True, null=True)
description = models.TextField(null=True, blank=True)
street = models.ForeignKey(AbonStreet, on_delete=models.SET_NULL, null=True, blank=True)
house = models.CharField(max_length=12, null=True, blank=True)
@ -321,7 +321,7 @@ class Abon(UserProfile):
# создаём абонента из структуры агента
def build_agent_struct(self):
if self.ip_address:
user_ip = self.ip_address.int_ip()
user_ip = ip2int(self.ip_address)
else:
return
inst_tariff = self.active_tariff()
@ -331,6 +331,13 @@ class Abon(UserProfile):
agent_trf = TariffStruct()
return AbonStruct(self.pk, user_ip, agent_trf, bool(self.is_active))
def save(self, *args, **kwargs):
# проверяем не-ли у кого такого-же ip
if Abon.objects.filter(ip_address=self.ip_address).exclude(pk=self.pk).count() > 0:
self.is_bad_ip = True
raise LogicError(_('Ip address already exist'))
super(Abon, self).save(*args, **kwargs)
class AbonDevice(models.Model):
abon = models.ForeignKey(Abon)

4
abonapp/templates/abonapp/charts.html

@ -9,6 +9,7 @@
<h3 class="panel-title">График использования</h3>
</div>
<div class="panel-body">
{% if charts_data %}
<canvas id="netChart" width="300" height="100"></canvas>
<script type="text/javascript">
var myChart = new Chart('netChart', {
@ -43,6 +44,9 @@
}
});
</script>
{% else %}
<h2>Данные не переданы</h2>
{% endif %}
</div>
</div>
</div>

2
abonapp/templates/abonapp/editAbon.html

@ -32,7 +32,7 @@
</div>
</div>
<div class="form-group-sm">
<div class="form-group-sm{% if is_bad_ip %} has-error{% endif %}">
<label for="id_ip" class="col-sm-4 control-label">{% trans 'Ip Address' %}</label>
<div class="col-sm-8">
<input type="text" value="{{ ip|default:'' }}" class="form-control" name="ip" placeholder="{% trans 'Not assigned' %}" pattern="^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"{% if abon.opt82 %} disabled{% endif %}/>

3
abonapp/templates/abonapp/modal_abonamount.html

@ -12,8 +12,7 @@
<div class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-ruble"></span></span>
<input id="amount" type="text" name="amount" placeholder="0.0" class="form-control" required
pattern="\d+">
<input id="amount" type="text" name="amount" placeholder="0.0" class="form-control" required>
</div>
</div>
<input type="hidden" name="abonid" value="{{ abon.id }}"><br>

20
abonapp/views.py

@ -15,7 +15,6 @@ from tariff_app.models import Tariff
from agent import NasFailedResult, Transmitter, NasNetworkError
from . import forms
from . import models
from ip_pool.models import IpPoolItem
import mydefs
from devapp.models import Device
from datetime import datetime
@ -260,14 +259,7 @@ def abonhome(request, gid, uid):
if abon.opt82 is None:
ip_str = request.POST.get('ip')
if ip_str:
try:
ip = IpPoolItem.objects.get(ip=ip_str)
abon.ip_address = ip
except MultipleObjectsReturned:
ips = models.IpPoolItem.objects.filter(ip=ip_str)
one_ip = ips[0]
models.IpPoolItem.objects.filter(pk__in=[ip.pk for ip in ips if ip != one_ip]).delete()
abon.ip_address = one_ip
abon.ip_address = ip_str
else:
abon.ip_address = None
frm.save()
@ -278,14 +270,13 @@ def abonhome(request, gid, uid):
passw = models.AbonRawPassword.objects.get(account=abon).passw_text
frm = forms.AbonForm(instance=abon, initial={'password': passw})
abon_device = models.AbonDevice.objects.get(abon=abon)
except IntegrityError as e:
messages.error(request, _('Ip address already exist. %s') % e)
except models.LogicError as e:
messages.error(request, e)
passw = models.AbonRawPassword.objects.get(account=abon).passw_text
frm = forms.AbonForm(instance=abon, initial={'password': passw})
except (NasFailedResult, NasNetworkError) as e:
messages.error(request, e)
except IpPoolItem.DoesNotExist:
messages.error(request, _('Ip address not found'))
except models.AbonRawPassword.DoesNotExist:
messages.warning(request, _('User has not have password, and cannot login'))
except models.AbonDevice.DoesNotExist:
@ -300,6 +291,7 @@ def abonhome(request, gid, uid):
'abon': abon,
'abon_group': abon_group,
'ip': abon.ip_address,
'is_bad_ip': getattr(abon, 'is_bad_ip', False),
'tech_form': forms.Opt82Form(instance=abon.opt82),
'device': abon_device.device if abon_device is not None else None
})
@ -745,7 +737,7 @@ def charts(request, gid, uid):
return render(request, 'abonapp/charts.html', {
'abon_group': abongroup,
'abon': abon,
'charts_data': ','.join(charts_data),
'charts_data': ','.join(charts_data) if charts_data is not None else None,
'time_min': int(midnight.timestamp()),
'time_max': int((midnight + timedelta(hours=23, minutes=59, seconds=59)).timestamp())
})

6
clientsideapp/templates/clientsideapp/ext.html

@ -11,9 +11,7 @@
<script src="/static/js/bootstrap.min.js"></script>
<script src="/static/clientside/my_clientside.js"></script>
<link rel="shortcut icon" href="/static/img/favicon_m.ico">
<meta name="author" content="Дмитрий Новиков">
<meta name="feedback" content="https://vk.com/nerosketch">
</head>
/head>
<body>
<!-- Modal -->
<div class="modal fade" id="modFrm" tabindex="-1" role="dialog" aria-hidden="true">
@ -103,4 +101,4 @@
</body>
</html>
</html>

19
dhcp_lever.py

@ -8,7 +8,6 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup()
from agent import NasFailedResult, NasNetworkError
from abonapp.models import Abon, Opt82
from ip_pool.models import IpPoolItem
def die(text):
@ -27,17 +26,6 @@ def get_82_opts(switch_mac, switch_port):
return opt82
def get_or_create_pool_item(ip):
try:
ip_item = IpPoolItem.objects.get(ip=ip)
except IpPoolItem.DoesNotExist:
ip_item = IpPoolItem.objects.create(ip=ip)
except MultipleObjectsReturned:
IpPoolItem.objects.filter(ip=ip)[1:].delete()
return get_or_create_pool_item(ip)
return ip_item
def dhcp_commit(client_ip, client_mac, switch_mac, switch_port):
opt82 = get_82_opts(switch_mac, switch_port)
if opt82 is None:
@ -45,7 +33,7 @@ def dhcp_commit(client_ip, client_mac, switch_mac, switch_port):
return
try:
abon = Abon.objects.get(opt82=opt82)
abon.ip_address = get_or_create_pool_item(client_ip)
abon.ip_address = client_ip
abon.is_dhcp = True
abon.save(update_fields=['ip_address'])
print(_('Ip address update for %s successfull') % abon.get_short_name())
@ -55,13 +43,10 @@ def dhcp_commit(client_ip, client_mac, switch_mac, switch_port):
def dhcp_expiry(client_ip):
try:
ip_item = IpPoolItem.objects.get(ip=client_ip)
abon = Abon.objects.get(ip_address=ip_item)
abon = Abon.objects.get(ip_address=client_ip)
abon.ip_address = None
abon.is_dhcp = True
abon.save(update_fields=['ip_address'])
except IpPoolItem.DoesNotExist:
pass
except Abon.DoesNotExist:
pass

1
djing/settings_example.py

@ -30,7 +30,6 @@ INSTALLED_APPS = [
'photo_app',
'abonapp',
'tariff_app',
'ip_pool',
'searchapp',
'devapp',
'mapapp',

1
djing/urls.py

@ -10,7 +10,6 @@ urlpatterns = [
url(r'^accounts/', include('accounts_app.urls', namespace='acc_app')),
url(r'^abons/', include('abonapp.urls', namespace='abonapp')),
url(r'^tarifs/', include('tariff_app.urls', namespace='tarifs')),
url(r'^ip_pool/', include('ip_pool.urls', namespace='ip_pool')),
url(r'^search/', include('searchapp.urls', namespace='searchapp')),
url(r'^dev/', include('devapp.urls', namespace='devapp')),
url(r'^map/', include('mapapp.urls', namespace='mapapp')),

1
ip_pool/__init__.py

@ -1 +0,0 @@
default_app_config = 'ip_pool.apps.IpPoolConfig'

6
ip_pool/admin.py

@ -1,6 +0,0 @@
from django.contrib import admin
from . import models
admin.site.register(models.IpPoolItem)

6
ip_pool/apps.py

@ -1,6 +0,0 @@
from django.apps import AppConfig
class IpPoolConfig(AppConfig):
name = 'ip_pool'
verbose_name = "Ip pool"

22
ip_pool/forms.py

@ -1,22 +0,0 @@
# -*- coding: utf-8 -*-
from django import forms
from mydefs import ip_addr_regex
class PoolForm(forms.Form):
start_ip = forms.GenericIPAddressField(protocol='ipv4', widget=forms.TextInput(attrs={
'pattern': ip_addr_regex,
'placeholder': '127.0.0.1',
'id': 'start_ip',
'class': 'form-control',
'required': ''
}), required=True)
end_ip = forms.GenericIPAddressField(protocol='ipv4', widget=forms.TextInput(attrs={
'pattern': ip_addr_regex,
'placeholder': '127.0.0.1',
'id': 'end_ip',
'class': 'form-control',
'required': ''
}), required=True)

23
ip_pool/migrations/0001_initial.py

@ -1,23 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-06-28 23:51
from django.db import migrations, models
import mydefs
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='IpPoolItem',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('ip', mydefs.MyGenericIPAddressField(max_length=8, protocol='ipv4')),
],
),
]

0
ip_pool/migrations/__init__.py

59
ip_pool/models.py

@ -1,59 +0,0 @@
from django.db import models, connection
from mydefs import ip2int, MyGenericIPAddressField
class IpPoolItemManager(models.Manager):
def get_pools(self):
ips = self.raw(r'SELECT id, ip FROM ip_pool_ippoolitem ORDER BY id')
ips_len = len(list(ips))
if ips_len < 1:
return
last_dg = ip2int(ips[0].ip)
start_pool = last_dg
res = list()
cnt = 0
for ip in ips:
ipnt = ip2int(ip.ip)
if ipnt > last_dg + 1 or ipnt < last_dg - 1:
res.append((start_pool, last_dg, cnt))
start_pool = ipnt
cnt = 0
last_dg = ipnt
cnt += 1
res.append((start_pool, last_dg, cnt))
return res
def add_pool(self, start_ip, end_ip):
start_ip = ip2int(start_ip)
end_ip = ip2int(end_ip)
if (end_ip - start_ip) > 5000:
raise Exception('Not add over 5000 ip\'s')
sql_strs = [r"(%d)" % tip for tip in range(start_ip, end_ip + 1)]
sql = r'INSERT INTO ip_pool_ippoolitem (ip) VALUES %s' % r",".join(sql_strs)
cursor = connection.cursor()
cursor.execute(sql)
def get_free_ip(self):
sql = r'SELECT ip_pool_ippoolitem.id as id, ip_pool_ippoolitem.ip as ip FROM ip_pool_ippoolitem ' \
r'LEFT JOIN abonent ON abonent.ip_address_id = ip_pool_ippoolitem.id WHERE ' \
r'abonent.ip_address_id IS NULL LIMIT 1'
rs = self.raw(sql)
rs_len = len(list(rs))
return None if rs_len is 0 else rs[0]
class IpPoolItem(models.Model):
ip = MyGenericIPAddressField()
objects = IpPoolItemManager()
def int_ip(self):
return ip2int(self.ip)
def __str__(self):
return self.ip

48
ip_pool/templates/ip_pool/add_pool.html

@ -1,48 +0,0 @@
{% extends 'base.html' %}
{% block main %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'ip_pool:home' %}">IP Пул</a></li>
<li class="active">Добавить</li>
</ol>
{% include 'message_block.html' %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Добавить IP пул</h3>
</div>
<div class="panel-body">
<form role="form" action="{% url 'ip_pool:add' %}" method="post">{% csrf_token %}
<div class="form-group">
<label for="start_ip">Начальный ip</label>
<div class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-cutlery"></span></span>
{{ form.start_ip }}{{ form.start_ip.errors }}
</div>
</div>
<div class="form-group">
<label for="">Конечный ip</label>
<div class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-gbp"></span></span>
{{ form.end_ip }}{{ form.end_ip.errors }}
</div>
</div>
<div class="btn-group">
<button type="submit" class="btn btn-sm btn-primary">
<span class="glyphicon glyphicon-save"></span> Сохранить
</button>
<button type="reset" class="btn btn-sm btn-default">
<span class="glyphicon glyphicon-remove-circle"></span> Сбросить
</button>
</div>
</form>
</div>
</div>
{% endblock %}

73
ip_pool/templates/ip_pool/index.html

@ -1,73 +0,0 @@
{% extends 'base.html' %}
{% block main %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li class="active">IP Пул</li>
</ol>
{% include 'message_block.html' %}
<h3>Пулы ip адресов</h3>
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>Начальный IP</th>
<th>Конечный IP</th>
<th>Количество</th>
<th width="50">Ред.</th>
<th width="50">Уд.</th>
</tr>
</thead>
<tbody>
{% for pl in pools %}
<tr>
<td>{{ pl.0 }}</td>
<td>{{ pl.1 }}</td>
<td>{{ pl.2 }}</td>
<td colspan="2" class="btn-group btn-group-sm btn-group-justified">
<a href="{% url 'ip_pool:ips' %}?ips={{ pl.0 }}&ipe={{ pl.1 }}"
class="btn btn-primary">
<span class="glyphicon glyphicon-edit"></span>
</a>
{% if perms.ip_pool.delete_ippoolitem %}
<a href="{% url 'ip_pool:ips_del' %}?ips={{ pl.0 }}&ipe={{ pl.1 }}" class="btn btn-danger">
<span class="glyphicon glyphicon-remove-circle"></span>
</a>
{% endif %}
</td>
</tr>
{% empty %}
<tr>
<td colspan="5">Нет ни одного пула зарезервированных ip адресов.
{% if perms.ip_pool.add_ippoolitem %}
<a href="{% url 'ip_pool:add' %}">Создать</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
{% if perms.ip_pool.add_ippoolitem %}
<tfoot>
<tr>
<td colspan="5">
<a href="{% url 'ip_pool:add' %}" class="btn btn-sm btn-success">
<span class="glyphicon glyphicon-plus"></span>
</a>
</td>
</tr>
</tfoot>
{% endif %}
</table>
</div>
{% include 'toolbar_page.html' with pag=pools %}
{% endblock %}

59
ip_pool/templates/ip_pool/ips.html

@ -1,59 +0,0 @@
{% extends 'base.html' %}
{% block main %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'ip_pool:home' %}">IP Пул</a></li>
<li class="active">Редактировать/Просмотреть</li>
</ol>
<h3>История абонента</h3>
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
<tr>
<th width="30">Id</th>
<th>Ip</th>
<th>Клиент</th>
<th width="50">Уд.</th>
</tr>
</thead>
<tbody>
{% for pi in pool_ips %}
<tr>
<td>{{ pi.id }}</td>
<td>{{ pi.ip }}</td>
<td>{% if pi.abon %}
<a href="{% url 'abonapp:abon_home' pi.abon.group.id pi.abon.id %}">{{ pi.abon.username }}</a>
{% else %}---{% endif %}
</td>
<td>
{% if pi.abon %}
<button class="btn btn-sm btn-danger disabled">
<span class="glyphicon glyphicon-remove-circle"></span>
</button>
{% elif perms.ip_pool.delete_ippoolitem %}
<a href="{% url 'ip_pool:del_ip' %}?id={{ pi.id }}" class="btn btn-sm btn-danger">
<span class="glyphicon glyphicon-remove-circle"></span>
</a>
{% endif %}
</td>
</tr>
{% empty %}
<tr>
<td colspan="4">Нет ни одного пула зарезервированных ip адресов.
{% if perms.ip_pool.add_ippoolitem %}
<a href="{% url 'ip_pool:add' %}">Создать</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% include 'toolbar_page.html' with pag=pool_ips %}
{% endblock %}

15
ip_pool/urls.py

@ -1,15 +0,0 @@
# -*- coding:utf-8 -*-
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.home, name='home'),
url(r'^range$', views.ips, name='ips'),
url(r'^del$', views.del_pool, name='ips_del'),
url(r'^add$', views.add_pool, name='add'),
url(r'^delip$', views.delip, name='del_ip')
]

81
ip_pool/views.py

@ -1,81 +0,0 @@
# -*- coding: utf-8 -*-
from django.contrib.auth.decorators import login_required, permission_required
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from .forms import PoolForm
from .models import IpPoolItem
import mydefs
@login_required
@mydefs.only_admins
def home(request):
pools = IpPoolItem.objects.get_pools()
if pools:
pools = [(mydefs.int2ip(ip[0]), mydefs.int2ip(ip[1]), ip[2]) for ip in pools]
pools = mydefs.pag_mn(request, pools)
return render(request, 'ip_pool/index.html', {
'pools': pools
})
@login_required
@mydefs.only_admins
def ips(request):
ip_start = request.GET.get('ips')
ip_end = request.GET.get('ipe')
pool_ips = IpPoolItem.objects.filter(ip__gte=ip_start)
pool_ips = pool_ips.filter(ip__lte=ip_end)
pool_ips = mydefs.pag_mn(request, pool_ips)
return render(request, 'ip_pool/ips.html', {
'pool_ips': pool_ips,
'ips': ip_start,
'ipe': ip_end
})
@login_required
@permission_required('ip_pool.delete_ippoolitem')
def del_pool(request):
ip_start = request.GET.get('ips')
ip_end = request.GET.get('ipe')
pool_ips = IpPoolItem.objects.filter(ip__gte=ip_start)
pool_ips = pool_ips.filter(ip__lte=ip_end)
pool_ips = pool_ips.filter()
pool_ips.delete()
return mydefs.res_success(request, 'ip_pool:home')
@login_required
@permission_required('ip_pool.add_ippoolitem')
def add_pool(request):
if request.method == 'POST':
frm = PoolForm(request.POST)
if frm.is_valid():
cd = frm.cleaned_data
IpPoolItem.objects.add_pool(cd['start_ip'], cd['end_ip'])
return redirect('ip_pool:home')
else:
messages.error(request, 'Исправьте ошибки')
else:
frm = PoolForm()
return render(request, 'ip_pool/add_pool.html', {
'form': frm
})
@login_required
@permission_required('ip_pool.delete_ippoolitem')
def delip(request):
ipid = request.GET.get('id')
get_object_or_404(IpPoolItem, id=ipid).delete()
return mydefs.res_success(request, 'ip_pool:home')

3
mydefs.py

@ -93,6 +93,9 @@ class MyGenericIPAddressField(models.GenericIPAddressField):
def from_db_value(value, expression, connection, context):
return int2ip(value)
def int_ip(self):
return ip2int(self)
# Предназначен для Django CHOICES чтоб можно было передавать классы вместо просто описания поля,
# классы передавать для того чтоб по значению кода из базы понять какой класс нужно взять для нужной функциональности.

9
searchapp/views.py

@ -1,10 +1,8 @@
import re
from django.db.models import Q
from django.shortcuts import render
from django.utils.html import escape
from abonapp.models import Abon, IpPoolItem
from abonapp.models import Abon
def replace_without_case(orig, old, new):
@ -15,10 +13,7 @@ def home(request):
s = request.GET.get('s')
if s:
ips = IpPoolItem.objects.filter(ip=s)
query = Q(fio__icontains=s) | Q(username__icontains=s) | Q(telephone__icontains=s)
if ips.count() > 0:
query |= Q(ip_address__in=ips)
query = Q(fio__icontains=s) | Q(username__icontains=s) | Q(telephone__icontains=s) | Q(ip_address=s)
abons = Abon.objects.filter(query)
else:
abons = []

7
templates/base.html

@ -63,13 +63,6 @@
<span class="glyphicon glyphicon-envelope"></span> внутренняя переписка
</a></li>
{% url 'ip_pool:home' as ip_pool_home %}
<li{% if ip_pool_home in request.path %} class="active"{% endif %}>
<a href="{{ ip_pool_home }}">
<span class="glyphicon glyphicon-compressed"></span> ip пул
</a></li>
{% url 'devapp:group_list' as devapp_groups %}
<li{% if devapp_groups in request.path %} class="active"{% endif %}>
<a href="{{ devapp_groups }}">

4
templates/message_block.html

@ -3,12 +3,16 @@
{% if message.tags == 'error' %}
<div class="alert alert-danger alert-dismissable">
<span class="glyphicon glyphicon-exclamation-sign"></span>
{% elif message.tags == 'warning' %}
<div class="alert alert-warning alert-dismissable">
<span class="glyphicon glyphicon-warning-sign"></span>
{% elif message.tags == 'success' %}
<div class="alert alert-success alert-dismissable">
<span class="glyphicon glyphicon-ok-circle"></span>
{% elif message.tags == 'info' %}
<div class="alert alert-info alert-dismissable">
<span class="glyphicon glyphicon-info-sign"></span>
{% endif %}
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>

Loading…
Cancel
Save