diff --git a/abonapp/forms.py b/abonapp/forms.py index 1c81dba..3751e9a 100644 --- a/abonapp/forms.py +++ b/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'), diff --git a/abonapp/locale/ru/LC_MESSAGES/django.po b/abonapp/locale/ru/LC_MESSAGES/django.po index 44e8fb9..33564f3 100644 --- a/abonapp/locale/ru/LC_MESSAGES/django.po +++ b/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 "Выберите шлюз для абонента" diff --git a/abonapp/models.py b/abonapp/models.py index 3e0dd2b..d2c6ebc 100644 --- a/abonapp/models.py +++ b/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( diff --git a/ip_pool/models.py b/ip_pool/models.py index e5f9a10..b6eef6e 100644 --- a/ip_pool/models.py +++ b/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)