diff --git a/abonapp/forms.py b/abonapp/forms.py index 5951ac1..cf31d19 100644 --- a/abonapp/forms.py +++ b/abonapp/forms.py @@ -124,3 +124,15 @@ class PassportForm(forms.ModelForm): initials = { 'date_of_acceptance': datetime(year=2014, month=6, day=1) } + + +class ExtraFieldForm(forms.ModelForm): + + class Meta: + model = models.ExtraFieldsModel + fields = '__all__' + widgets = { + 'title': forms.TextInput(attrs={'class': 'form-control'}), + 'field_type': forms.Select(attrs={'class': 'form-control'}), + 'data': forms.TextInput(attrs={'class': 'form-control'}) + } diff --git a/abonapp/locale/ru/LC_MESSAGES/django.po b/abonapp/locale/ru/LC_MESSAGES/django.po index af39eea..40513ea 100644 --- a/abonapp/locale/ru/LC_MESSAGES/django.po +++ b/abonapp/locale/ru/LC_MESSAGES/django.po @@ -619,14 +619,8 @@ msgstr "Абонент успешно изменён" #: abonapp/views.py:258 #, python-format -msgid "Ip address already exist. %s" -msgstr "" -"Проверте введённые вами значения, скорее всего такой ip уже у кого-то есть. " -"А вообще: %s" - -#: abonapp/views.py:266 -msgid "Ip address not found" -msgstr "Указанный вами ip отсутствует в ip pool" +msgid "Ip address already exist" +msgstr "Такой ip уже у кого-то есть" #: abonapp/views.py:268 msgid "User has not have password, and cannot login" @@ -721,6 +715,12 @@ msgstr "Для абонента не найдены паспортные дан msgid "currency" msgstr "руб" +msgid "Charts" +msgstr "Графики" + +msgid "Group what you want doesn't exist" +msgstr "Указанная вами группа не найдена" + msgid "User device was not found" msgstr "Пользовательское устройство не найдено" @@ -747,3 +747,51 @@ msgstr "Действует до" msgid "Do" msgstr "Действия" + +msgid "Last traffic" +msgstr "Последний траффик" + +msgid "Extra field successfully created" +msgstr "Динамичесое поле добавлено успешно" + +msgid "Extra field successfully deleted" +msgstr "Динамическое поле успешно удалено" + +msgid "Extra field does not exist" +msgstr "Поле не найдено" + +msgid "Extra fields" +msgstr "Динамические записи" + +msgid "Add extra field" +msgstr "Добавить новое динамическое поле" + +msgid "Add" +msgstr "Добавить" + +msgid "Field title" +msgstr "Название поля" + +msgid "Field type" +msgstr "Тип динамического поля" + +msgid "Field content" +msgstr "Содержимое динамического поля" + +msgid "Extra fields has been saved" +msgstr "Динамические поля сохранены" + +msgid "One or more extra fields has not been saved" +msgstr "Поле или одно из полей не найдено" + +msgid "ok ping, %d/%d loses" +msgstr "пингуется, %d/%d" + +msgid "no ping, %d/%d loses" +msgstr "не пингуется, %d/%d" + +msgid "no ping" +msgstr "не пингуется" + +msgid "ping ok" +msgstr "пингуется" diff --git a/abonapp/migrations/0001_initial.py b/abonapp/migrations/0001_initial.py index 1e95fb1..7b1368f 100644 --- a/abonapp/migrations/0001_initial.py +++ b/abonapp/migrations/0001_initial.py @@ -13,7 +13,6 @@ class Migration(migrations.Migration): dependencies = [ ('accounts_app', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('ip_pool', '0001_initial'), ('tariff_app', '0001_initial'), ] @@ -102,12 +101,6 @@ class Migration(migrations.Migration): field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='abonapp.AbonGroup'), ), - migrations.AddField( - model_name='abon', - name='ip_address', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, - to='ip_pool.IpPoolItem'), - ), migrations.AlterUniqueTogether( name='abontariff', unique_together={('abon', 'tariff', 'tariff_priority')}, diff --git a/abonapp/migrations/0019_abon_ip_address.py b/abonapp/migrations/0019_abon_ip_address.py new file mode 100644 index 0000000..96c2613 --- /dev/null +++ b/abonapp/migrations/0019_abon_ip_address.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-05-10 23:17 +from __future__ import unicode_literals + +from django.db import migrations +import mydefs + + +class Migration(migrations.Migration): + + dependencies = [ + ('abonapp', '0018_auto_20170418_1236'), + ] + + operations = [ + migrations.AddField( + model_name='abon', + name='ip_address', + field=mydefs.MyGenericIPAddressField(blank=True, max_length=8, null=True, protocol='ipv4'), + ), + ] diff --git a/abonapp/migrations/0020_auto_20170517_1655.py b/abonapp/migrations/0020_auto_20170517_1655.py new file mode 100644 index 0000000..edcf585 --- /dev/null +++ b/abonapp/migrations/0020_auto_20170517_1655.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-05-17 13:55 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('abonapp', '0019_abon_ip_address'), + ] + + operations = [ + migrations.AddField( + model_name='extrafieldsmodel', + name='title', + field=models.CharField(default='no title', max_length=16), + ), + migrations.AlterField( + model_name='extrafieldsmodel', + name='field_type', + field=models.CharField(choices=[('int', 'Цифровое поле'), ('str', 'Текстовое поле'), ('dbl', 'Дробное с плавающей точкой'), ('ipa', 'IP Адрес')], default='str', max_length=3), + ), + ] diff --git a/abonapp/models.py b/abonapp/models.py index 16bdd3e..0ac2a8e 100644 --- a/abonapp/models.py +++ b/abonapp/models.py @@ -6,14 +6,10 @@ from django.db import models from django.core import validators from django.utils.translation import ugettext as _ from agent import Transmitter, AbonStruct, TariffStruct, NasFailedResult, NasNetworkError -from ip_pool.models import IpPoolItem from tariff_app.models import Tariff from accounts_app.models import UserProfile from .fields import MACAddressField - - -class LogicError(Exception): - pass +from mydefs import MyGenericIPAddressField, ip2int, LogicError, ip_addr_regex class AbonGroup(models.Model): @@ -165,12 +161,24 @@ class ExtraFieldsModel(models.Model): DYNAMIC_FIELD_TYPES = ( ('int', _('Digital field')), ('str', _('Text field')), - ('dbl', _('Floating field')) + ('dbl', _('Floating field')), + ('ipa', _('Ip Address')) ) - field_type = models.CharField(max_length=3, choices=DYNAMIC_FIELD_TYPES) + title = models.CharField(max_length=16, default='no title') + field_type = models.CharField(max_length=3, choices=DYNAMIC_FIELD_TYPES, default='str') data = models.CharField(max_length=64, null=True, blank=True) + def get_regexp(self): + if self.field_type == 'int': + return r'^[+-]?\d+$' + elif self.field_type == 'dbl': + return r'^[-+]?\d+[,.]\d+$' + elif self.field_type == 'str': + return r'^[a-zA-ZА-Яа-я0-9]+$' + elif self.field_type == 'ipa': + return ip_addr_regex + def clean(self): d = self.data if self.field_type == 'int': @@ -207,7 +215,7 @@ class Abon(UserProfile): current_tariffs = models.ManyToManyField(Tariff, through=AbonTariff) group = models.ForeignKey(AbonGroup, models.SET_NULL, blank=True, null=True) ballance = models.FloatField(default=0.0) - ip_address = models.OneToOneField(IpPoolItem, on_delete=models.SET_NULL, null=True, blank=True) + ip_address = MyGenericIPAddressField(blank=True, null=True) description = models.TextField(null=True, blank=True) street = models.ForeignKey(AbonStreet, on_delete=models.SET_NULL, null=True, blank=True) house = models.CharField(max_length=12, null=True, blank=True) @@ -321,7 +329,7 @@ class Abon(UserProfile): # создаём абонента из структуры агента def build_agent_struct(self): if self.ip_address: - user_ip = self.ip_address.int_ip() + user_ip = ip2int(self.ip_address) else: return inst_tariff = self.active_tariff() @@ -331,6 +339,13 @@ class Abon(UserProfile): agent_trf = TariffStruct() return AbonStruct(self.pk, user_ip, agent_trf, bool(self.is_active)) + def save(self, *args, **kwargs): + # проверяем не-ли у кого такого-же ip + if Abon.objects.filter(ip_address=self.ip_address).exclude(pk=self.pk).count() > 0: + self.is_bad_ip = True + raise LogicError(_('Ip address already exist')) + super(Abon, self).save(*args, **kwargs) + class AbonDevice(models.Model): abon = models.ForeignKey(Abon) diff --git a/abonapp/templates/abonapp/buy_tariff.html b/abonapp/templates/abonapp/buy_tariff.html index 938068a..ab4aad9 100644 --- a/abonapp/templates/abonapp/buy_tariff.html +++ b/abonapp/templates/abonapp/buy_tariff.html @@ -38,7 +38,6 @@