diff --git a/abonapp/forms.py b/abonapp/forms.py index ef22e0e..c4402ec 100644 --- a/abonapp/forms.py +++ b/abonapp/forms.py @@ -3,6 +3,8 @@ from django import forms from django.contrib.auth.hashers import make_password from random import choice from string import digits, ascii_lowercase + +from nas_app.models import NASModel from . import models from django.conf import settings @@ -41,6 +43,8 @@ class AbonForm(forms.ModelForm): abon_group_queryset = None if abon_group_queryset is not None: self.fields['street'].queryset = abon_group_queryset + if not instance: + self.initial['nas'] = NASModel.objects.filter(default=True).first() username = forms.CharField(max_length=127, required=False, initial=_generate_random_username, widget=forms.TextInput(attrs={ @@ -55,7 +59,7 @@ class AbonForm(forms.ModelForm): class Meta: model = models.Abon - fields = ('username', 'telephone', 'fio', 'group', 'description', 'street', 'house', 'is_active') + fields = ('username', 'telephone', 'fio', 'group', 'description', 'street', 'house', 'is_active', 'nas') widgets = { 'fio': forms.TextInput(attrs={ 'placeholder': _('fio'), diff --git a/abonapp/migrations/0003_abon_nas.py b/abonapp/migrations/0003_abon_nas.py new file mode 100644 index 0000000..5d11f1d --- /dev/null +++ b/abonapp/migrations/0003_abon_nas.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-08-16 18:40 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('nas_app', '0001_initial'), + ('abonapp', '0002_auto_20180808_1448'), + ] + + operations = [ + migrations.AddField( + model_name='abon', + name='nas', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='nas_app.NASModel', verbose_name='Network access server'), + ), + ] diff --git a/abonapp/models.py b/abonapp/models.py index f98b455..4e9c247 100644 --- a/abonapp/models.py +++ b/abonapp/models.py @@ -13,7 +13,7 @@ from django.utils import timezone from django.utils.translation import ugettext_lazy as _, gettext from accounts_app.models import UserProfile, MyUserManager, BaseAccount -from agent import Transmitter, AbonStruct, TariffStruct, NasFailedResult, NasNetworkError +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 @@ -33,7 +33,7 @@ class AbonLog(models.Model): permissions = ( ('can_view_abonlog', _('Can view subscriber logs')), ) - ordering = ('-date',) + ordering = '-date', def __str__(self): return self.comment @@ -81,7 +81,7 @@ class AbonStreet(models.Model): db_table = 'abon_street' verbose_name = _('Street') verbose_name_plural = _('Streets') - ordering = ('name',) + ordering = 'name', class AbonManager(MyUserManager): @@ -94,13 +94,13 @@ class Abon(BaseAccount): group = models.ForeignKey(Group, 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(blank=True, null=True, verbose_name=_('Ip Address')) 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) device = models.ForeignKey('devapp.Device', null=True, blank=True, on_delete=models.SET_NULL) dev_port = models.ForeignKey('devapp.Port', null=True, blank=True, on_delete=models.SET_NULL) is_dynamic_ip = models.BooleanField(default=False) + nas = models.ForeignKey('nas_app.NASModel', null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_('Network access server'), default=None) MARKER_FLAGS = ( ('icon_donkey', _('Donkey')), @@ -227,14 +227,51 @@ class Abon(BaseAccount): return AbonStruct(self.pk, abon_addresses, agent_trf, self.is_access()) raise LogicError(_('You have not any active leases')) - def sync_with_nas(self, created: bool) -> Optional[Exception]: + def nas_sync_self(self) -> Optional[Exception]: + """ + Synchronize user with gateway(NAS) + :return: + """ + if self.nas is None: + raise LogicError(_('NAS required')) try: agent_abon = self.build_agent_struct() - tm = Transmitter() - if created: - tm.add_user(agent_abon) - else: - tm.update_user(agent_abon) + mngr = self.nas.get_nas_manager() + mngr.update_user(agent_abon) + except (NasFailedResult, NasNetworkError, ConnectionResetError) as e: + print('ERROR:', e) + return e + except LogicError: + pass + + def nas_add_self(self): + """ + Will add this user to network access server + :return: + """ + if self.nas is None: + raise LogicError(_('NAS required')) + try: + agent_abon = self.build_agent_struct() + mngr = self.nas.get_nas_manager() + mngr.add_user(agent_abon) + except (NasFailedResult, NasNetworkError, ConnectionResetError) as e: + print('ERROR:', e) + return e + except LogicError: + pass + + def nas_remove_self(self): + """ + Will remove this user to network access server + :return: + """ + if self.nas is None: + raise LogicError(_('NAS required')) + try: + agent_abon = self.build_agent_struct() + mngr = self.nas.get_nas_manager() + mngr.remove_user(agent_abon) except (NasFailedResult, NasNetworkError, ConnectionResetError) as e: print('ERROR:', e) return e @@ -422,13 +459,11 @@ class PeriodicPayForId(models.Model): @receiver(post_delete, sender=Abon) def abon_del_signal(sender, **kwargs): - abon = kwargs["instance"] + abon = kwargs.get("instance") + if abon is None: + raise ValueError('Instance does not passed to a signal') try: - ab = abon.build_agent_struct() - if ab is None: - return True - tm = Transmitter() - tm.remove_user(ab) + abon.nas_remove_self() except (NasFailedResult, NasNetworkError, LogicError): return True @@ -445,16 +480,13 @@ def abon_tariff_post_init(sender, **kwargs): @receiver(pre_delete, sender=AbonTariff) def abontariff_pre_delete(sender, **kwargs): - abon_tariff = kwargs["instance"] + abon_tariff = kwargs.get("instance") + if abon_tariff is None: + raise ValueError('Instance does not passed to a signal') try: abon = Abon.objects.get(current_tariff=abon_tariff) - ab = abon.build_agent_struct() - if ab is None: - return True - tm = Transmitter() - tm.remove_user(ab) - except Abon.DoesNotExist: - print('ERROR: Abon.DoesNotExist') - except (NasFailedResult, NasNetworkError, ConnectionResetError) as e: - print('NetErr:', e) + abon.nas_remove_self() + except (NasFailedResult, NasNetworkError, LogicError): return True + except Abon.DoesNotExist: + print('Error: abontariff_pre_delete - user not found') diff --git a/abonapp/templates/abonapp/addAbon.html b/abonapp/templates/abonapp/addAbon.html index b392e90..51beedb 100644 --- a/abonapp/templates/abonapp/addAbon.html +++ b/abonapp/templates/abonapp/addAbon.html @@ -54,6 +54,10 @@ }); + {# Nas server #} + {% bootstrap_icon 'globe' as ic %} + {% bootstrap_field form.nas addon_before=ic %} +