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( self.fields['networks'].queryset = NetworkModel.objects.filter(
groups=instance.group 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')) 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( networks = forms.ModelChoiceField(
label=_('Networks'), label=_('Networks'),

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

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

11
abonapp/models.py

@ -85,6 +85,17 @@ class AbonManager(MyUserManager):
def get_queryset(self): def get_queryset(self):
return super(MyUserManager, self).get_queryset().filter(is_admin=False) 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): class Abon(BaseAccount):
current_tariff = models.OneToOneField( current_tariff = models.OneToOneField(

2
ip_pool/models.py

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

Loading…
Cancel
Save