diff --git a/abonapp/admin.py b/abonapp/admin.py index c3e76ef..082d3d8 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.PassportInfo) +admin.site.register(models.AdditionalTelephone) diff --git a/abonapp/forms.py b/abonapp/forms.py index b9e11d4..36fa6b5 100644 --- a/abonapp/forms.py +++ b/abonapp/forms.py @@ -6,6 +6,10 @@ from django.contrib.auth.hashers import make_password from random import choice from string import digits, ascii_lowercase from . import models +from django.conf import settings + + +TELEPHONE_REGEXP = getattr(settings, 'TELEPHONE_REGEXP', r'^\+[7,8,9,3]\d{10,11}$') def generate_random_username(length=6, chars=digits, split=2, delimiter=''): @@ -57,7 +61,7 @@ class AbonForm(forms.ModelForm): }), 'telephone': forms.TextInput(attrs={ 'placeholder': _('telephone placeholder'), - 'pattern': r'^\+[7,8,9,3]\d{10,11}$', + 'pattern': TELEPHONE_REGEXP, 'required': '', 'class': 'form-control' }), @@ -131,3 +135,18 @@ class AbonStreetForm(forms.ModelForm): 'name': forms.TextInput(attrs={'class': 'form-control', 'required':'', 'autofocus':''}), 'group': forms.Select(attrs={'class': 'form-control'}) } + + +class AdditionalTelephoneForm(forms.ModelForm): + class Meta: + model = models.AdditionalTelephone + exclude = ['abon'] + widgets = { + 'telephone': forms.TextInput(attrs={ + 'placeholder': _('telephone placeholder'), + 'pattern': TELEPHONE_REGEXP, + 'required': '', + 'class': 'form-control' + }), + 'owner_name': forms.TextInput(attrs={'class': 'form-control', 'required':''}) + } diff --git a/abonapp/locale/ru/LC_MESSAGES/django.po b/abonapp/locale/ru/LC_MESSAGES/django.po index 7e81d54..35afe9e 100644 --- a/abonapp/locale/ru/LC_MESSAGES/django.po +++ b/abonapp/locale/ru/LC_MESSAGES/django.po @@ -951,3 +951,45 @@ msgstr "Пользователь, который не является перс msgid "Ip not passed" msgstr "Ip адрес не передан" + +msgid "Additional telephone" +msgstr "Дополнительный телефон" + +msgid "Additional telephones" +msgstr "Дополнительные телефоны" + +msgid "Abon group" +msgstr "Группа абонентов" + +msgid "Abon groups" +msgstr "Группы абонентов" + +msgid "Abon service" +msgstr "Услуга абонента" + +msgid "Abon services" +msgstr "Услуги абонентов" + +msgid "Abon" +msgstr "Абонент" + +msgid "Abons" +msgstr "Абоненты" + +msgid "New telephone has been saved" +msgstr "Новый телефон сохранен" + +msgid "Add telephone" +msgstr "Добавить номер телефона" + +msgid "Telephone owner" +msgstr "Владелец телефона" + +msgid "Additional telephones not found" +msgstr "Дополнительные телефоны не найдены" + +msgid "Additional telephone successfully deleted" +msgstr "Номер телефона успешно удалён" + +msgid "Telephone not found" +msgstr "Телефон не найден" diff --git a/abonapp/models.py b/abonapp/models.py index ec59e76..d492f82 100644 --- a/abonapp/models.py +++ b/abonapp/models.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from django.core.exceptions import ValidationError +from django.core.validators import RegexValidator from django.utils import timezone from django.db import models from django.core import validators @@ -11,6 +12,9 @@ from mydefs import MyGenericIPAddressField, ip2int, LogicError, ip_addr_regex from django.conf import settings +TELEPHONE_REGEXP = getattr(settings, 'TELEPHONE_REGEXP', r'^\+[7,8,9,3]\d{10,11}$') + + class AbonGroup(models.Model): title = models.CharField(max_length=127, unique=True) profiles = models.ManyToManyField(UserProfile, blank=True, related_name='abon_groups') @@ -21,6 +25,8 @@ class AbonGroup(models.Model): permissions = ( ('can_add_ballance', _('fill account')), ) + verbose_name = _('Abon group') + verbose_name_plural = _('Abon groups') def __str__(self): return self.title @@ -68,6 +74,8 @@ class AbonTariff(models.Model): permissions = ( ('can_complete_service', _('finish service perm')), ) + verbose_name = _('Abon service') + verbose_name_plural = _('Abon services') class AbonStreet(models.Model): @@ -79,6 +87,8 @@ class AbonStreet(models.Model): class Meta: db_table = 'abon_street' + verbose_name = _('Street') + verbose_name_plural = _('Streets') class ExtraFieldsModel(models.Model): @@ -146,6 +156,8 @@ class Abon(UserProfile): ('can_buy_tariff', _('Buy service perm')), ('can_view_passport', _('Can view passport')) ) + verbose_name = _('Abon') + verbose_name_plural = _('Abons') # Платим за что-то def make_pay(self, curuser, how_match_to_pay=0.0): @@ -317,6 +329,26 @@ class AbonRawPassword(models.Model): db_table = 'abon_raw_password' +class AdditionalTelephone(models.Model): + abon = models.ForeignKey(Abon, related_name='additional_telephones') + telephone = models.CharField( + max_length=16, + verbose_name=_('Telephone'), + # unique=True, + validators=[RegexValidator(TELEPHONE_REGEXP)] + ) + owner_name = models.CharField(max_length=127) + + def __str__(self): + return "%s - (%s)" % (self.owner_name, self.telephone) + + class Meta: + db_table = 'additional_telephones' + ordering = ('owner_name',) + verbose_name = _('Additional telephone') + verbose_name_plural = _('Additional telephones') + + def abon_post_save(sender, instance, **kwargs): timeout = None if hasattr(instance, 'is_dhcp') and instance.is_dhcp: diff --git a/abonapp/templates/abonapp/editAbon.html b/abonapp/templates/abonapp/editAbon.html index e5883ae..4cf8744 100644 --- a/abonapp/templates/abonapp/editAbon.html +++ b/abonapp/templates/abonapp/editAbon.html @@ -31,9 +31,15 @@
{{ form.telephone }}{{ form.telephone.errors }} - + + + + + + +
diff --git a/abonapp/templates/abonapp/modal_additional_telephones.html b/abonapp/templates/abonapp/modal_additional_telephones.html new file mode 100644 index 0000000..5782e6b --- /dev/null +++ b/abonapp/templates/abonapp/modal_additional_telephones.html @@ -0,0 +1,37 @@ +{% load i18n %} + + + + diff --git a/abonapp/urls_abon.py b/abonapp/urls_abon.py index 2922a6b..9267cb1 100644 --- a/abonapp/urls_abon.py +++ b/abonapp/urls_abon.py @@ -33,5 +33,9 @@ urlpatterns = [ url(r'^(?P\d+)/clear_dev/$', views.clear_dev, name='clear_dev'), url(r'^(?P\d+)/task_log$', views.task_log, name='task_log'), - url(r'^(?P\d+)/user_dev$', views.save_user_dev_port, name='save_user_dev_port') + url(r'^(?P\d+)/user_dev$', views.save_user_dev_port, name='save_user_dev_port'), + + url(r'^(?P\d+)/tel$', views.tels, name='telephones'), + url(r'^(?P\d+)/tel/add$', views.tel_add, name='telephone_new'), + url(r'^(?P\d+)/tel/del$', views.tel_del, name='telephone_del') ] diff --git a/abonapp/views.py b/abonapp/views.py index b47f23d..92a62fc 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -871,6 +871,53 @@ def street_del(request, gid, sid): return redirect('abonapp:people_list', gid) +@login_required +@mydefs.only_admins +def tels(request, gid, uid): + abon = get_object_or_404(models.Abon, pk=uid) + telephones = abon.additional_telephones.all() + return render_to_text('abonapp/modal_additional_telephones.html', { + 'telephones': telephones, + 'gid': gid, + 'uid': uid + }, request=request) + + +@login_required +@permission_required('abnapp.add_additionaltelephone') +def tel_add(request, gid, uid): + if request.method == 'POST': + frm = forms.AdditionalTelephoneForm(request.POST) + if frm.is_valid(): + new_tel = frm.save(commit=False) + abon = get_object_or_404(models.Abon, pk=uid) + new_tel.abon = abon + new_tel.save() + messages.success(request, _('New telephone has been saved')) + return redirect('abonapp:abon_home', gid, uid) + else: + messages.error(request, _('fix form errors')) + else: + frm = forms.AdditionalTelephoneForm() + return render_to_text('abonapp/modal_add_phone.html', { + 'form': frm, + 'gid': gid, + 'uid': uid + }, request=request) + + +@login_required +@permission_required('abnapp.delete_additionaltelephone') +def tel_del(request, gid, uid): + try: + tid = mydefs.safe_int(request.GET.get('tid')) + tel = models.AdditionalTelephone.objects.get(pk=tid) + tel.delete() + messages.success(request, _('Additional telephone successfully deleted')) + except models.AdditionalTelephone.DoesNotExist: + messages.error(request, _('Telephone not found')) + return redirect('abonapp:abon_home', gid, uid) + # API's