diff --git a/abonapp/admin.py b/abonapp/admin.py index d0d64c0..bd5771b 100644 --- a/abonapp/admin.py +++ b/abonapp/admin.py @@ -14,3 +14,4 @@ admin.site.register(models.AbonRawPassword) admin.site.register(models.ExtraFieldsModel) admin.site.register(models.AllPayLog) admin.site.register(models.Opt82) +admin.site.register(models.PassportInfo) diff --git a/abonapp/forms.py b/abonapp/forms.py index 4d3e3e0..cb32d01 100644 --- a/abonapp/forms.py +++ b/abonapp/forms.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from datetime import datetime from django.utils.translation import ugettext as _ from django import forms from django.contrib.auth.hashers import make_password @@ -96,3 +97,18 @@ class AbonGroupForm(forms.ModelForm): 'title': forms.TextInput(attrs={'class': 'form-control'}), 'profiles': forms.TextInput(attrs={'class': 'form-control'}) } + + +class PassportForm(forms.ModelForm): + class Meta: + model = models.PassportInfo + exclude = ['abon'] + widgets = { + 'series': forms.TextInput(attrs={'class': 'form-control', 'required': '', 'pattern': '^\d{4}$'}), + 'number': forms.TextInput(attrs={'class': 'form-control', 'required': '', 'pattern': '^\d{6}$'}), + 'distributor': forms.TextInput(attrs={'class': 'form-control', 'required': ''}), + 'date_of_acceptance': forms.DateInput(attrs={'class': 'form-control', 'required': ''}) + } + initials = { + 'date_of_acceptance': datetime(year=2014, month=6, day=1) + } diff --git a/abonapp/locale/ru/LC_MESSAGES/django.po b/abonapp/locale/ru/LC_MESSAGES/django.po index d6bccb8..b8ec190 100644 --- a/abonapp/locale/ru/LC_MESSAGES/django.po +++ b/abonapp/locale/ru/LC_MESSAGES/django.po @@ -717,3 +717,18 @@ msgstr "Ошибка в SNMP на устройстве" msgid "No streets found for that group" msgstr "Не найдены улицы для группы" + +msgid "Date of acceptance" +msgstr "Дата выдачи" + +msgid "Passport information has been saved" +msgstr "Информация о паспорте сохранена" + +msgid "Abon does not exist" +msgstr "Абонент не найден" + +msgid "Passport info for the user does not exist" +msgstr "Для абонента не найдены паспортные данные" + +msgid "currency" +msgstr "руб" diff --git a/abonapp/migrations/0015_auto_20170410_1737.py b/abonapp/migrations/0015_auto_20170410_1737.py deleted file mode 100644 index 66a2f79..0000000 --- a/abonapp/migrations/0015_auto_20170410_1737.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-10 14:37 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('abonapp', '0014_auto_20170330_1452'), - ] - - operations = [ - migrations.AlterField( - model_name='abon', - name='opt82', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='abonapp.Opt82'), - ), - ] diff --git a/abonapp/migrations/0015_passportinfo.py b/abonapp/migrations/0015_passportinfo.py new file mode 100644 index 0000000..5207173 --- /dev/null +++ b/abonapp/migrations/0015_passportinfo.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-04-11 10:43 +from __future__ import unicode_literals + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import re + + +class Migration(migrations.Migration): + + dependencies = [ + ('abonapp', '0014_auto_20170330_1452'), + ] + + operations = [ + migrations.CreateModel( + name='PassportInfo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('series', models.CharField(max_length=4, validators=[django.core.validators.RegexValidator(re.compile('^-?\\d+\\Z', 32), code='invalid', message='Enter a valid integer.')])), + ('number', models.CharField(max_length=6, validators=[django.core.validators.RegexValidator(re.compile('^-?\\d+\\Z', 32), code='invalid', message='Enter a valid integer.')])), + ('distributor', models.CharField(max_length=64)), + ('date_of_acceptance', models.DateField()), + ('abon', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='abonapp.Abon')), + ], + ), + migrations.AlterField( + model_name='abon', + name='opt82', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, + to='abonapp.Opt82'), + ) + ] diff --git a/abonapp/models.py b/abonapp/models.py index 312e87f..011acf2 100644 --- a/abonapp/models.py +++ b/abonapp/models.py @@ -335,6 +335,17 @@ class Abon(UserProfile): return AbonStruct(self.pk, user_ip, agent_trf, bool(self.is_active)) +class PassportInfo(models.Model): + series = models.CharField(max_length=4, validators=[validators.integer_validator]) + number = models.CharField(max_length=6, validators=[validators.integer_validator]) + distributor = models.CharField(max_length=64) + date_of_acceptance = models.DateField() + abon = models.OneToOneField(Abon, on_delete=models.SET_NULL, blank=True, null=True) + + def __unicode__(self): + return "%s %s" % (self.series, self.number) + + class InvoiceForPayment(models.Model): abon = models.ForeignKey(Abon) status = models.BooleanField(default=False) diff --git a/abonapp/templates/abonapp/group_tariffs.html b/abonapp/templates/abonapp/group_tariffs.html index 160415b..c8b4d0d 100644 --- a/abonapp/templates/abonapp/group_tariffs.html +++ b/abonapp/templates/abonapp/group_tariffs.html @@ -21,7 +21,7 @@ {% else %} {% endif %} - {{ tariff.title }} + {{ tariff.title }}, {{ tariff.amount }}{% trans 'currency' %}, {{ tariff.speedOut }}Mbit/s | {{ tariff.speedIn }}Mbit/s {% endfor %} diff --git a/abonapp/templates/abonapp/passport_view.html b/abonapp/templates/abonapp/passport_view.html index 8ae91a8..71bf846 100644 --- a/abonapp/templates/abonapp/passport_view.html +++ b/abonapp/templates/abonapp/passport_view.html @@ -9,31 +9,39 @@

{% trans 'Passport information' %}

-
+ {% csrf_token %}
- +
- + {{ frm.series }}{{ frm.series.errors }}
- +
- + {{ frm.number }}{{ frm.number.errors }}
- +
- + {{ frm.distributor }}{{ frm.distributor.errors }}
- +
- + {{ frm.date_of_acceptance }}{{ frm.date_of_acceptance.errors }}
+ +
diff --git a/abonapp/urls_abon.py b/abonapp/urls_abon.py index 23445e6..99ac453 100644 --- a/abonapp/urls_abon.py +++ b/abonapp/urls_abon.py @@ -5,7 +5,7 @@ from . import views urlpatterns = [ url(r'^$', views.peoples, name='people_list'), url(r'^addabon$', views.addabon, name='add_abon'), - url(r'^groups$', views.chgroup_tariff, name='ch_group_tariff'), + url(r'^services$', views.chgroup_tariff, name='ch_group_tariff'), url(r'^(?P\d+)$', views.abonhome, name='abon_home'), url(r'^(?P\d+)/services$', views.abon_services, name='abon_services'), diff --git a/abonapp/views.py b/abonapp/views.py index 1dad601..1573f7d 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from json import dumps from django.contrib.gis.shortcuts import render_to_text -from django.core.exceptions import PermissionDenied +from django.core.exceptions import PermissionDenied, MultipleObjectsReturned from django.db import IntegrityError from django.db.models import Count from django.shortcuts import render, redirect, get_object_or_404, resolve_url @@ -256,8 +256,13 @@ def abonhome(request, gid, uid): if abon.opt82 is None: ip_str = request.POST.get('ip') if ip_str: - ip = IpPoolItem.objects.get(ip=ip_str) - abon.ip_address = ip + try: + ip = IpPoolItem.objects.get(ip=ip_str) + abon.ip_address = ip + except MultipleObjectsReturned: + ips = models.IpPoolItem.objects.filter(ip=ip_str) + ips[1:].delete() + abon.ip_address = ips[0] else: abon.ip_address = None frm.save() @@ -592,10 +597,31 @@ def task_log(request, gid, uid): @login_required @mydefs.only_admins def passport_view(request, gid, uid): - abon = get_object_or_404(models.Abon, pk=uid) + try: + abon = models.Abon.objects.get(pk=uid) + if request.method == 'POST': + frm = forms.PassportForm(request.POST) + if frm.is_valid(): + passp_instance = frm.save(commit=False) + passp_instance.abon = abon + passp_instance.save() + messages.success(request, _('Passport information has been saved')) + return redirect('abonapp:passport_view', gid=gid, uid=uid) + else: + messages.error(request, _('fix form errors')) + else: + passp_instance = models.PassportInfo.objects.get(abon=abon) + frm = forms.PassportForm(instance=passp_instance) + except models.Abon.DoesNotExist: + messages.error(request, _('Abon does not exist')) + return redirect('abonapp:people_list', gid=gid) + except models.PassportInfo.DoesNotExist: + messages.warning(request, _('Passport info for the user does not exist')) + frm = forms.PassportForm() return render(request, 'abonapp/passport_view.html', { 'abon_group': get_object_or_404(models.AbonGroup, pk=gid), - 'abon': abon + 'abon': abon, + 'frm': frm }) diff --git a/searchapp/views.py b/searchapp/views.py index 5b2cbd7..5c01d63 100644 --- a/searchapp/views.py +++ b/searchapp/views.py @@ -4,7 +4,7 @@ from django.db.models import Q from django.shortcuts import render from django.utils.html import escape -from abonapp.models import Abon +from abonapp.models import Abon, IpPoolItem def replace_without_case(orig, old, new): @@ -15,11 +15,11 @@ def home(request): s = request.GET.get('s') if s: - abons = Abon.objects.filter( - Q(fio__icontains=s) | - Q(username__icontains=s) | - Q(telephone__icontains=s) - ) + ips = IpPoolItem.objects.filter(ip=s) + query = Q(fio__icontains=s) | Q(username__icontains=s) | Q(telephone__icontains=s) + if ips.count() > 0: + query |= Q(ip_address__in=ips) + abons = Abon.objects.filter(query) else: abons = [] diff --git a/taskapp/locale/ru/LC_MESSAGES/django.po b/taskapp/locale/ru/LC_MESSAGES/django.po index b06ca3b..7b929d4 100644 --- a/taskapp/locale/ru/LC_MESSAGES/django.po +++ b/taskapp/locale/ru/LC_MESSAGES/django.po @@ -31,12 +31,8 @@ msgid "locality %s.\n" msgstr "с. %s\n" #: taskapp/handle.py:33 -#, fuzzy, python-format -#| msgid "address %s. telephone %s. " -msgid "" -"address %s %s.\n" -"telephone %s\n" -msgstr "по адресу %s тел. %s. " +msgid "address %s %s.\ntelephone %s\n" +msgstr "по адресу %s %s тел. %s.\n" #: taskapp/handle.py:34 taskapp/models.py:26 msgid "not chosen" @@ -46,7 +42,7 @@ msgstr "не выбрано" #, fuzzy, python-format #| msgid "Task type" msgid "Task type - %s.\n" -msgstr "Тип задачи" +msgstr "Тип задачи - %s.\n" #: taskapp/models.py:14 msgid "Higher"