Browse Source

fix free ip addr search

devel
Dmitry Novikov 7 years ago
parent
commit
86caf1d8ff
  1. 29
      abonapp/forms.py
  2. 3
      abonapp/locale/ru/LC_MESSAGES/django.po
  3. 11
      abonapp/models.py
  4. 2
      ip_pool/models.py

29
abonapp/forms.py

@ -223,22 +223,21 @@ class AddIpForm(forms.ModelForm):
self.fields['networks'].queryset = NetworkModel.objects.filter(
groups=instance.group
)
if not self.initial['ip_address']:
if instance:
net = NetworkModel.objects.filter(
groups=instance.group
).first()
if net is not None:
ips = (ip.ip_address for ip in
models.Abon.objects.filter(
group__in=net.groups.all(),
nas=instance.nas
).order_by('ip_address').only(
'ip_address').iterator())
free_ip = net.get_free_ip(ips)
self.initial['ip_address'] = free_ip
else:
if not self.initial.get('ip_address'):
if not instance:
raise LogicError(_('Subnet has not attached to current group'))
if not instance.nas:
raise LogicError(_('Please pick NAS for consumer'))
for net in NetworkModel.objects.filter(groups=instance.group).iterator():
ips = (ip.ip_address for ip in models.Abon.objects.filter_ip_address(
group_ids=tuple(n.pk for n in net.groups.iterator()),
nas_id=int(instance.nas_id)
).iterator())
free_ip = net.get_free_ip(ips)
if free_ip is None:
continue
self.initial['ip_address'] = str(free_ip)
break
networks = forms.ModelChoiceField(
label=_('Networks'),

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

@ -1167,3 +1167,6 @@ msgstr "Дата создания"
msgid "Update ip address"
msgstr "Обновить ip адрес"
msgid "Please pick NAS for consumer"
msgstr "Выберите шлюз для абонента"

11
abonapp/models.py

@ -85,6 +85,17 @@ class AbonManager(MyUserManager):
def get_queryset(self):
return super(MyUserManager, self).get_queryset().filter(is_admin=False)
def filter_ip_address(self, group_ids: tuple, nas_id: int):
nas_id = int(nas_id)
if not isinstance(group_ids, tuple):
group_ids = tuple(group_ids)
return self.raw(
'SELECT baseaccount_ptr_id, ip_address FROM abonent '
'WHERE group_id IN %s AND nas_id=%s AND ip_address IS NOT NULL '
'ORDER BY inet_aton(ip_address) ASC',
params=(group_ids, str(nas_id))
)
class Abon(BaseAccount):
current_tariff = models.OneToOneField(

2
ip_pool/models.py

@ -131,7 +131,7 @@ class NetworkModel(models.Model):
Find free ip in network.
:param employed_ips: Sorted from less to more
ip addresses from current network.
:return: single finded ip
:return: single found ip
"""
network = self.get_network()
work_range_start_ip = ip_address(self.ip_start)

Loading…
Cancel
Save