diff --git a/abonapp/locale/ru/LC_MESSAGES/django.po b/abonapp/locale/ru/LC_MESSAGES/django.po index 4762a45..7431907 100644 --- a/abonapp/locale/ru/LC_MESSAGES/django.po +++ b/abonapp/locale/ru/LC_MESSAGES/django.po @@ -116,8 +116,8 @@ msgid "User group" msgstr "Группа" #: models.py:96 templates/abonapp/editAbon.html:180 -msgid "Ip addresses" -msgstr "IP Адреса" +msgid "Ip address" +msgstr "IP Адрес" #: models.py:103 msgid "Network access server" @@ -202,11 +202,6 @@ msgstr "Не хватает денег на счету" msgid "Buy service default log" msgstr "Покупка тарифного плана через админку" -#: models.py:228 -#, python-format -msgid "Account \"%(username)s\" not have any active leases" -msgstr "Учётная запись \"%(username)s\" не имеет ни одной активной сессии" - #: models.py:238 models.py:255 models.py:272 views.py:684 views.py:1132 #: views.py:1175 msgid "NAS required" @@ -515,10 +510,6 @@ msgstr "Выделен из:" msgid "From" msgstr "От" -#: templates/abonapp/editAbon.html:218 -msgid "Leases does not found" -msgstr "Аренды ip не найдены" - #: templates/abonapp/editAbon.html:230 #: templates/abonapp/modal_add_lease.html:16 #: templates/abonapp/modal_add_phone.html:27 @@ -529,8 +520,8 @@ msgid "Add" msgstr "Добавить" #: templates/abonapp/editAbon.html:234 -msgid "Active networks" -msgstr "Активные подсети" +msgid "Networks" +msgstr "Подсети" #: templates/abonapp/editAbon.html:242 msgid "User flags" @@ -1159,3 +1150,6 @@ msgstr "Автопродление услуги." msgid "No author attached" msgstr "Автор не назначен" + +msgid "User not have ip" +msgstr "У пользователя нет ip" diff --git a/abonapp/migrations/0006_change_ip.py b/abonapp/migrations/0006_change_ip.py new file mode 100644 index 0000000..ce2d75e --- /dev/null +++ b/abonapp/migrations/0006_change_ip.py @@ -0,0 +1,51 @@ +# Generated by Django 2.1 on 2018-10-10 16:11 +# from json import dump + +from django.db import migrations, models + +TMP_FILE = '/tmp/migrate_ip.json' + +DUMP = [] + + +def backup_info(apps, _): + Abon = apps.get_model('abonapp', 'Abon') + abons = Abon.objects.annotate( + addr_count=models.Count('ip_addresses') + ).filter(addr_count__gt=0).only('ip_addresses').iterator() + global DUMP + for abon in abons: + ip_addr = abon.ip_addresses.first() + DUMP.append({ + 'pk': abon.pk, + 'addr': ip_addr.ip + }) + # with open(TMP_FILE, 'w') as f: + # dump(r, f, indent=2) + + +def restore_ips(apps, _): + Abon = apps.get_model('abonapp', 'Abon') + for abon in DUMP: + Abon.objects.filter(pk=abon.get('pk')).update(ip_address=abon.get('addr')) + + +class Migration(migrations.Migration): + + dependencies = [ + ('abonapp', '0005_current_tariff'), + ] + + operations = [ + migrations.RunPython(backup_info), + migrations.RemoveField( + model_name='abon', + name='ip_addresses', + ), + migrations.AddField( + model_name='abon', + name='ip_address', + field=models.GenericIPAddressField(blank=True, null=True, unique=True, verbose_name='Ip address'), + ), + migrations.RunPython(restore_ips) + ] diff --git a/abonapp/models.py b/abonapp/models.py index 9ec4319..c362370 100644 --- a/abonapp/models.py +++ b/abonapp/models.py @@ -16,7 +16,7 @@ from accounts_app.models import UserProfile, MyUserManager, BaseAccount from nas_app.nas_managers import AbonStruct, TariffStruct, NasFailedResult, NasNetworkError from group_app.models import Group from djing.lib import LogicError -from ip_pool.models import IpLeaseModel, NetworkModel +from ip_pool.models import NetworkModel from tariff_app.models import Tariff, PeriodicPay from bitfield import BitField @@ -90,7 +90,7 @@ class Abon(BaseAccount): current_tariff = models.OneToOneField(AbonTariff, null=True, blank=True, on_delete=models.SET_NULL, default=None) group = models.ForeignKey(Group, on_delete=models.SET_NULL, blank=True, null=True, verbose_name=_('User group')) ballance = models.FloatField(default=0.0) - ip_addresses = models.ManyToManyField(IpLeaseModel, verbose_name=_('Ip addresses')) + ip_address = models.GenericIPAddressField(verbose_name=_('Ip address'), unique=True, 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')) house = models.CharField(_('House'), max_length=12, null=True, blank=True) @@ -198,6 +198,25 @@ class Abon(BaseAccount): comment=comment or _('Buy service default log') ) + def attach_ip_addr(self, ip, strict=False): + """ + Attach ip address to account + :param ip: Instance of str or ip_address + :param strict: If strict is True then ip not replaced quietly + :return: None + """ + if strict and self.ip_address: + raise LogicError('Ip address already exists') + self.ip_address = ip + self.save(update_fields=('ip_address',)) + + def free_ip_addr(self) -> bool: + if self.ip_address: + self.ip_address = None + self.save(update_fields=('ip_address',)) + return True + return False + # is subscriber have access to service, view in tariff_app.custom_tariffs..manage_access() def is_access(self) -> bool: if not self.is_active: @@ -210,22 +229,17 @@ class Abon(BaseAccount): return ct.manage_access(self) # make subscriber from agent structure - def build_agent_struct(self, raise_errs=True): - abon_addresses = tuple(ip_address(i.ip) for i in self.ip_addresses.filter(is_active=True)) - # if not abon_addresses: - # return + def build_agent_struct(self): + if not self.ip_address: + return + abon_address = ip_address(self.ip_address) abon_tariff = self.active_tariff() if abon_tariff is None: agent_trf = None else: trf = abon_tariff.tariff agent_trf = TariffStruct(trf.id, trf.speedIn, trf.speedOut) - if len(abon_addresses) > 0: - return AbonStruct(self.pk, abon_addresses, agent_trf, self.is_access()) - if raise_errs: - raise LogicError(_('Account "%(username)s" not have any active leases') % { - 'username': self.username - }) + return AbonStruct(self.pk, abon_address, agent_trf, self.is_access()) def nas_sync_self(self) -> Optional[Exception]: """ @@ -281,14 +295,6 @@ class Abon(BaseAccount): def get_absolute_url(self): return resolve_url('abonapp:abon_home', self.group.id, self.username) - def add_lease(self, ip: str, network: Optional[NetworkModel], mac_addr=None): - existed_client_ips = tuple(l.ip for l in self.ip_addresses.all()) - if ip not in existed_client_ips: - lease = IpLeaseModel.objects.create_from_ip(ip=ip, net=network, mac=mac_addr) - if lease is None: - return 'Error while creating a ip lease' - self.ip_addresses.add(lease) - def enable_service(self, tariff: Tariff, deadline=None, time_start=None): """ Makes a services for current user diff --git a/abonapp/templates/abonapp/editAbon.html b/abonapp/templates/abonapp/editAbon.html index bdfe305..2ee9f5e 100644 --- a/abonapp/templates/abonapp/editAbon.html +++ b/abonapp/templates/abonapp/editAbon.html @@ -46,9 +46,6 @@