diff --git a/project/commons/utils.py b/project/commons/utils.py index a923684..f6b24d1 100644 --- a/project/commons/utils.py +++ b/project/commons/utils.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- import datetime @@ -12,3 +12,8 @@ def safe_int(value, default=None): return int(value) except: return default + + +def only_numerics(value): + """Убирает из переданной строки все не цифровые символы.""" + return u''.join(c for c in value if c.isdigit()) diff --git a/project/customer/forms.py b/project/customer/forms.py index 8b6849e..c7e19c9 100644 --- a/project/customer/forms.py +++ b/project/customer/forms.py @@ -29,6 +29,17 @@ def get_profile_filters_form_class(profile_type): return OrgUserProfileFiltersForm return None + +### + +def _numeric(field): + real_maxlength = field.widget.attrs['maxlength'] + return { + 'maxlength': int(real_maxlength)*3, # set fake maxlength. otherwise browser would cut pasted values too early + 'data-type': 'number', # used by jquery selector + 'data-maxlength': real_maxlength, # save real maxlength + } + # ----------------------------------------------------------------------------- @@ -50,9 +61,14 @@ class UserProfileForm(MyBaseModelForm): def __init__(self, *args, **kwargs): super(UserProfileForm, self).__init__(*args, **kwargs) - f = self.fields - if 'ip_reg_date' in f: - f['ip_reg_date'].widget.attrs['class'] = 'has-datepicker' + if 'ip_reg_date' in self.fields: + self.fields['ip_reg_date'].widget.attrs['class'] = 'has-datepicker' + # + self.fields['inn'].widget.attrs.update(_numeric(self.fields['inn'])) + self.fields['ogrn'].widget.attrs.update(_numeric(self.fields['ogrn'])) + self.fields['okpo'].widget.attrs.update(_numeric(self.fields['okpo'])) + if 'kpp' in self.fields: + self.fields['kpp'].widget.attrs.update(_numeric(self.fields['kpp'])) def _check_file_size(self, image): """Ограничить максимальный размер загружаемого файла.""" @@ -165,6 +181,12 @@ class BankAccountForm(forms.ModelForm): widgets = {'name': _textarea, 'address': _textarea, 'company': forms.HiddenInput()} #widgets = {'name': _textarea, 'address': _textarea,} + def __init__(self, *args, **kwargs): + super(BankAccountForm, self).__init__(*args, **kwargs) + self.fields['bik'].widget.attrs.update(_numeric(self.fields['bik'])) + self.fields['korr_account'].widget.attrs.update(_numeric(self.fields['korr_account'])) + self.fields['account'].widget.attrs.update(_numeric(self.fields['account'])) + class BankAccountAdminForm(BankAccountForm): """Форма редактирования расчетных счетов - для админки.""" @@ -203,6 +225,15 @@ class ClientForm(forms.ModelForm): #'contact_other': _textarea, } + def __init__(self, *args, **kwargs): + super(ClientForm, self).__init__(*args, **kwargs) + self.fields['inn'].widget.attrs.update(_numeric(self.fields['inn'])) + self.fields['kpp'].widget.attrs.update(_numeric(self.fields['kpp'])) + self.fields['okpo'].widget.attrs.update(_numeric(self.fields['okpo'])) + self.fields['bank_bik'].widget.attrs.update(_numeric(self.fields['bank_bik'])) + self.fields['bank_korr_account'].widget.attrs.update(_numeric(self.fields['bank_korr_account'])) + self.fields['bank_account'].widget.attrs.update(_numeric(self.fields['bank_account'])) + class ClientAdminForm(ClientForm): """Форма редактирования контрагентов - для админки.""" diff --git a/project/customer/models.py b/project/customer/models.py index 1778593..df12ac9 100644 --- a/project/customer/models.py +++ b/project/customer/models.py @@ -13,6 +13,7 @@ from django.core.urlresolvers import reverse from . import consts, managers, utils from project.myauth.models import DokUser +from project.commons.utils import only_numerics PROFILE_IMAGES_UPLOAD_DIR = 'customer/profile/' # куда сохранять загруженные изображения @@ -123,6 +124,11 @@ class UserProfile(models.Model): return u'%s, ИНН %s' % (self.get_company_name()[0:30], self.inn or u'не указан') def save(self, *args, **kwargs): + self.inn = only_numerics(self.inn) + self.ogrn = only_numerics(self.ogrn) + self.okpo = only_numerics(self.okpo) + self.kpp = only_numerics(self.kpp) + def process_img(orig_img, size): w = orig_img.width h = orig_img.height @@ -273,8 +279,12 @@ class BankAccount(models.Model): return (u'%s, %s' % (self.account, self.name[0:30],)).strip() def save(self, *args, **kwargs): + self.bik = only_numerics(self.bik) + self.korr_account = only_numerics(self.korr_account) + self.account = only_numerics(self.account) + super(BankAccount, self).save(*args, **kwargs) - company = self.company + if self.is_main: # если задано, что это будет основной счет, то сбросить у остальных счетов пользователя этот признак BankAccount.objects.filter(company=self.company, is_main=True).exclude(pk=self.pk).update(is_main=False) @@ -326,6 +336,15 @@ class Client(models.Model): def __unicode__(self): return (u'%s, ИНН %s' % (self.name[0:30], self.inn or u'не указан',)).strip() + def save(self, *args, **kwargs): + self.inn = only_numerics(self.inn) + self.kpp = only_numerics(self.kpp) + self.okpo = only_numerics(self.okpo) + self.bank_bik = only_numerics(self.bank_bik) + self.bank_korr_account = only_numerics(self.bank_korr_account) + self.bank_account = only_numerics(self.bank_account) + super(Client, self).save(*args, **kwargs) + def get_inn_and_kpp(self): """Возвращает пару ИНН/КПП или только ИНН, если КПП не заполнен.""" kpp = self.kpp.strip() diff --git a/project/static/js/commons.js b/project/static/js/commons.js index 4840d41..9a19b96 100644 --- a/project/static/js/commons.js +++ b/project/static/js/commons.js @@ -103,6 +103,21 @@ $(document).ready(function() { $form.find('img.captcha').attr('src', json.image_url); }); }); + + $('input[data-type="number"]').on('input propertychange', function (e) { + var el = $(this); + var maxlength = el.data('maxlength'); + setTimeout(function () { + var text = el.val(); + var new_text = text.replace(/\D/g,''); + if (new_text.length > maxlength) { + new_text = new_text.substring(0, maxlength); + } + if (text != new_text) { + el.val(new_text); + } + }, 200); + }); }); function fetch_data(url, async) {