Browse Source

Добавил возможность сохранять дополнительные номера телефонов в учётке абонента

devel
bashmak 9 years ago
parent
commit
7cf2ac7e8b
  1. 1
      abonapp/admin.py
  2. 21
      abonapp/forms.py
  3. 42
      abonapp/locale/ru/LC_MESSAGES/django.po
  4. 32
      abonapp/models.py
  5. 8
      abonapp/templates/abonapp/editAbon.html
  6. 37
      abonapp/templates/abonapp/modal_additional_telephones.html
  7. 6
      abonapp/urls_abon.py
  8. 47
      abonapp/views.py

1
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)

21
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':''})
}

42
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 "Телефон не найден"

32
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:

8
abonapp/templates/abonapp/editAbon.html

@ -31,9 +31,15 @@
<div class="input-group input-group-sm">
{{ form.telephone }}{{ form.telephone.errors }}
<span class="input-group-btn">
<a href="sip:{{ form.telephone.value }}" class="btn btn-default" title="{% trans 'Call to' %}">
<a href="sip:{{ form.telephone.value }}" class="btn btn-default" data-toggle="tooltip" title="{% trans 'Call to' %}">
<span class="glyphicon glyphicon-earphone"></span>
</a>
<a href="{% url 'abonapp:telephones' abon_group.pk abon.pk %}" class="btn btn-default btn-modal" data-toggle="tooltip" title="{% trans 'Additional telephones' %}">
<span class="glyphicon glyphicon-list"></span>
</a>
<a href="{% url 'abonapp:telephone_new' abon_group.pk abon.pk %}" class="btn btn-default btn-modal" data-toggle="tooltip" title="{% trans 'Add telephone' %}">
<span class="glyphicon glyphicon-plus"></span>
</a>
</span>
</div>
</div>

37
abonapp/templates/abonapp/modal_additional_telephones.html

@ -0,0 +1,37 @@
{% load i18n %}
<div class="modal-header primary">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title"><span class="glyphicon glyphicon-earphone"></span>{% trans 'Additional telephones' %}</h4>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th>{% trans 'Telephone owner' %}</th>
<th>{% trans 'Telephone' %}</th>
<th></th>
</tr>
</thead>
<tbody>
{% for t in telephones %}
<tr>
<td>{{ t.owner_name }}</td>
<td><a href="sip:{{ t.telephone }}" class="btn btn-link">{{ t.telephone }}</a></td>
<td>
<a href="{% url 'abonapp:telephone_del' gid uid %}?tid={{ t.pk }}" class="btn btn-default btn-sm" title="{% trans 'Delete' %}">
<span class="glyphicon glyphicon-remove-circle"></span>
</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="3">{% trans 'Additional telephones not found' %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>

6
abonapp/urls_abon.py

@ -33,5 +33,9 @@ urlpatterns = [
url(r'^(?P<uid>\d+)/clear_dev/$', views.clear_dev, name='clear_dev'),
url(r'^(?P<uid>\d+)/task_log$', views.task_log, name='task_log'),
url(r'^(?P<uid>\d+)/user_dev$', views.save_user_dev_port, name='save_user_dev_port')
url(r'^(?P<uid>\d+)/user_dev$', views.save_user_dev_port, name='save_user_dev_port'),
url(r'^(?P<uid>\d+)/tel$', views.tels, name='telephones'),
url(r'^(?P<uid>\d+)/tel/add$', views.tel_add, name='telephone_new'),
url(r'^(?P<uid>\d+)/tel/del$', views.tel_del, name='telephone_del')
]

47
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

Loading…
Cancel
Save