parent
3d26a8444f
commit
b0511b2ed5
35 changed files with 1234 additions and 123 deletions
@ -1,4 +1,4 @@ |
|||||||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||||||
from __future__ import absolute_import |
from __future__ import absolute_import |
||||||
from .celery import app as celery_app |
#from .celery import app as celery_app |
||||||
|
|
||||||
|
|||||||
@ -1,16 +1,15 @@ |
|||||||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
from __future__ import absolute_import |
from __future__ import absolute_import |
||||||
|
|
||||||
import os |
import os |
||||||
|
|
||||||
from celery import Celery |
|
||||||
|
|
||||||
from django.conf import settings |
from django.conf import settings |
||||||
|
|
||||||
# set the default Django settings module for the 'celery' program. |
# set the default Django settings module for the 'celery' program. |
||||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') |
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') |
||||||
|
|
||||||
|
import celery |
||||||
|
from celery import Celery |
||||||
app = Celery('proj') |
app = Celery('proj') |
||||||
|
|
||||||
# Using a string here means the worker will not have to |
# Using a string here means the worker will not have to |
||||||
@ -1,9 +0,0 @@ |
|||||||
#!/usr/bin/env python |
|
||||||
# -*- coding: utf-8 -*- |
|
||||||
from django.conf import settings |
|
||||||
|
|
||||||
|
|
||||||
def get_dadata_api_key(request): |
|
||||||
return { |
|
||||||
"dadata_api_key": settings.DADATA_API_KEY |
|
||||||
} |
|
||||||
@ -0,0 +1,486 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from django import forms |
||||||
|
from django.utils.encoding import force_unicode |
||||||
|
from django.utils.safestring import mark_safe |
||||||
|
from django.conf import settings |
||||||
|
|
||||||
|
from yandex_money.forms import PaymentForm |
||||||
|
from project.commons.forms import MyBaseModelForm, set_field_error |
||||||
|
|
||||||
|
from . import consts, models |
||||||
|
|
||||||
|
|
||||||
|
FILE_UPLOAD_MAX_MEMORY_SIZE = getattr(settings, 'FILE_UPLOAD_MAX_MEMORY_SIZE ', 2621440) # default 2.5Mb |
||||||
|
|
||||||
|
|
||||||
|
def get_profile_form_class(profile_type): |
||||||
|
"""Возвращает класс формы редактирования профиля пользователя.""" |
||||||
|
if profile_type == consts.IP_PROFILE: |
||||||
|
return IpUserProfileForm |
||||||
|
elif profile_type == consts.ORG_PROFILE: |
||||||
|
return OrgUserProfileForm |
||||||
|
return None |
||||||
|
|
||||||
|
|
||||||
|
def get_profile_filters_form_class(profile_type): |
||||||
|
"""Возвращает класс формы фильтрации профиля пользователя.""" |
||||||
|
if profile_type == consts.IP_PROFILE: |
||||||
|
return IpUserProfileFiltersForm |
||||||
|
elif profile_type == consts.ORG_PROFILE: |
||||||
|
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 |
||||||
|
} |
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------- |
||||||
|
|
||||||
|
|
||||||
|
class UserProfileForm(MyBaseModelForm): |
||||||
|
"""Общая форма редактирования профиля пользователя. |
||||||
|
|
||||||
|
Специализированные формы для редактирования профилей ИП и Организаций - |
||||||
|
ищи ниже в классах IpUserProfileForm и OrgUserProfileForm соответственно. |
||||||
|
|
||||||
|
Форму для админки ищи ниже в классе UserProfileAdminForm. |
||||||
|
""" |
||||||
|
tmb_logo = forms.CharField(required=False, widget=forms.HiddenInput) |
||||||
|
tmb_boss_sign = forms.CharField(required=False, widget=forms.HiddenInput) |
||||||
|
tmb_glavbuh_sign = forms.CharField(required=False, widget=forms.HiddenInput) |
||||||
|
tmb_stamp = forms.CharField(required=False, widget=forms.HiddenInput) |
||||||
|
|
||||||
|
class Meta: |
||||||
|
model = models.UserProfile |
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs): |
||||||
|
super(UserProfileForm, self).__init__(*args, **kwargs) |
||||||
|
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): |
||||||
|
"""Ограничить максимальный размер загружаемого файла.""" |
||||||
|
if image and image.size > FILE_UPLOAD_MAX_MEMORY_SIZE: |
||||||
|
raise forms.ValidationError( |
||||||
|
u'Размер изображения превышает %i Мб' % (FILE_UPLOAD_MAX_MEMORY_SIZE / (1024*1024))) |
||||||
|
return image |
||||||
|
|
||||||
|
def clean_boss_sign(self): |
||||||
|
image = self.cleaned_data.get('boss_sign') |
||||||
|
return self._check_file_size(image) |
||||||
|
|
||||||
|
def clean_glavbuh_sign(self): |
||||||
|
image = self.cleaned_data.get('glavbuh_sign') |
||||||
|
return self._check_file_size(image) |
||||||
|
|
||||||
|
def clean_stamp(self): |
||||||
|
image = self.cleaned_data.get('stamp') |
||||||
|
return self._check_file_size(image) |
||||||
|
|
||||||
|
def clean_logo(self): |
||||||
|
image = self.cleaned_data.get('logo') |
||||||
|
return self._check_file_size(image) |
||||||
|
|
||||||
|
|
||||||
|
class IpUserProfileForm(UserProfileForm): |
||||||
|
"""Форма редактирования профиля - ИП.""" |
||||||
|
change_labels = {'ogrn': u'ОГРНИП'} |
||||||
|
|
||||||
|
class Meta(UserProfileForm.Meta): |
||||||
|
fields = ( |
||||||
|
# фио ип |
||||||
|
'boss_surname', 'boss_name', 'boss_midname', |
||||||
|
# инн, огрнип, окпо |
||||||
|
'inn', 'ogrn', 'okpo', |
||||||
|
# свид-во гос. регистрации и дата |
||||||
|
'svid_gos_reg', 'ip_reg_date', |
||||||
|
# фио главбуха |
||||||
|
'glavbuh_surname', 'glavbuh_name', 'glavbuh_midname', |
||||||
|
# контактная информация - адреса, телефон, факс, почта, сайт |
||||||
|
'address', 'jur_address', 'real_address', 'phone_code', 'phone', 'fax_code', 'fax', 'email', 'site', |
||||||
|
# подписи, печать и логотип |
||||||
|
'boss_sign', 'glavbuh_sign', 'stamp', 'logo', |
||||||
|
'tmb_logo', 'tmb_boss_sign', 'tmb_glavbuh_sign', 'tmb_stamp', |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
class OrgUserProfileForm(UserProfileForm): |
||||||
|
"""Форма редактирования профиля - Организация.""" |
||||||
|
unset_required = {'ogrn': u'ОГРН'} |
||||||
|
change_labels = {'ogrn': u'ОГРН'} |
||||||
|
|
||||||
|
class Meta(UserProfileForm.Meta): |
||||||
|
fields = ( |
||||||
|
# краткое и полное названия организации |
||||||
|
'name', 'full_name', |
||||||
|
# инн, кпп, огрн, окпо |
||||||
|
'inn', 'kpp', 'ogrn', 'okpo', |
||||||
|
# должность руководителя, его фио и на каком основании он действует |
||||||
|
'boss_title', 'boss_surname', 'boss_name', 'boss_midname', 'na_osnovanii', |
||||||
|
# фио главбуха |
||||||
|
'glavbuh_surname', 'glavbuh_name', 'glavbuh_midname', |
||||||
|
# контактная информация - адреса, телефон, факс, почта, сайт |
||||||
|
'address', 'jur_address', 'real_address', 'phone_code', 'phone', 'fax_code', 'fax', 'email', 'site', |
||||||
|
# подписи, печать и логотип |
||||||
|
'boss_sign', 'glavbuh_sign', 'stamp', 'logo', |
||||||
|
'tmb_logo', 'tmb_boss_sign', 'tmb_glavbuh_sign', 'tmb_stamp', |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
class UserProfileAdminForm(UserProfileForm): |
||||||
|
"""Форма редактирования профиля - для админки.""" |
||||||
|
|
||||||
|
# условно-обязательные поля, проверять отдельно - могут быть обязательны в зависимости от типа профиля |
||||||
|
unset_required = [ |
||||||
|
# для ИП |
||||||
|
'kpp', 'name' |
||||||
|
# для Организаций |
||||||
|
] |
||||||
|
|
||||||
|
def clean(self): |
||||||
|
super(UserProfileAdminForm, self).clean() |
||||||
|
|
||||||
|
cleaned_data = self.cleaned_data |
||||||
|
|
||||||
|
# тип профиля - ИП или Организация |
||||||
|
profile_type = cleaned_data.get('profile_type') |
||||||
|
|
||||||
|
if profile_type == consts.IP_PROFILE: # поля, обязательные для ИП |
||||||
|
pass |
||||||
|
|
||||||
|
elif profile_type == consts.ORG_PROFILE: # поля, обязательные для Организаций |
||||||
|
org_boss_name = cleaned_data.get('org_boss_name') |
||||||
|
kpp = cleaned_data.get('kpp') |
||||||
|
|
||||||
|
if not org_boss_name: set_field_error(self, 'org_boss_name') |
||||||
|
if not kpp: set_field_error(self, 'kpp') |
||||||
|
|
||||||
|
return cleaned_data |
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------- |
||||||
|
|
||||||
|
|
||||||
|
class BankAccountForm(forms.ModelForm): |
||||||
|
"""Форма редактирования расчетных счетов.""" |
||||||
|
# search_bank = forms.CharField(label=u'Поиск банка', required=False, initial='') |
||||||
|
class Meta: |
||||||
|
model = models.BankAccount |
||||||
|
# fields = ('search_bank', 'bik', 'name', 'short_name', 'korr_account', 'account', 'is_main', 'company') |
||||||
|
fields = ('bik', 'name', 'short_name', 'korr_account', 'account', 'is_main', 'company') |
||||||
|
_textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) |
||||||
|
widgets = { |
||||||
|
'bik': forms.HiddenInput(), |
||||||
|
'name': forms.HiddenInput(), |
||||||
|
'short_name': forms.HiddenInput(), |
||||||
|
'korr_account': forms.HiddenInput(), |
||||||
|
'company': forms.HiddenInput(), |
||||||
|
} |
||||||
|
|
||||||
|
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'])) |
||||||
|
# self.fields['search_bank'].widget.attrs['class'] = 'search-bank' |
||||||
|
|
||||||
|
|
||||||
|
class BankAccountAdminForm(BankAccountForm): |
||||||
|
"""Форма редактирования расчетных счетов - для админки.""" |
||||||
|
class Meta(BankAccountForm.Meta): |
||||||
|
fields = None |
||||||
|
exclude = ('address',) |
||||||
|
|
||||||
|
|
||||||
|
class BankAccountListForm(forms.Form): |
||||||
|
"""Форма со списком всех расчетных счетов пользователя.""" |
||||||
|
bank_account = forms.ModelChoiceField(queryset=models.BankAccount.objects.get_all(None), |
||||||
|
empty_label=u'все контрагенты', required=False) |
||||||
|
|
||||||
|
def __init__(self, user, *args, **kwargs): |
||||||
|
super(BankAccountListForm, self).__init__(*args, **kwargs) |
||||||
|
self.fields['bank_account'].queryset = models.BankAccount.objects.get_all(user.profile) |
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------- |
||||||
|
|
||||||
|
|
||||||
|
class ClientForm(forms.ModelForm): |
||||||
|
"""Форма редактирования контрагентов.""" |
||||||
|
class Meta: |
||||||
|
model = models.Client |
||||||
|
fields = ('name', 'inn', 'kpp', 'ogrn', 'okpo', 'address', |
||||||
|
# банковские реквизиты |
||||||
|
'bank_bik', 'bank_name', 'bank_korr_account', 'bank_account', |
||||||
|
# контакты |
||||||
|
'contact_name', 'contact_email', 'contact_phone', 'contact_skype', 'contact_other', |
||||||
|
) |
||||||
|
_textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) |
||||||
|
widgets = { |
||||||
|
'bank_bik': forms.HiddenInput(), |
||||||
|
'bank_name': forms.HiddenInput(), |
||||||
|
'short_name': forms.HiddenInput(), |
||||||
|
'bank_korr_account': forms.HiddenInput(), |
||||||
|
} |
||||||
|
|
||||||
|
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['ogrn'].widget.attrs.update(_numeric(self.fields['ogrn'])) |
||||||
|
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): |
||||||
|
"""Форма редактирования контрагентов - для админки.""" |
||||||
|
class Meta(ClientForm.Meta): |
||||||
|
fields = None |
||||||
|
exclude = ('bank_address',) |
||||||
|
|
||||||
|
|
||||||
|
class ClientsListForm(forms.Form): |
||||||
|
"""Форма со списком всех контрагентов пользователя.""" |
||||||
|
client = forms.ModelChoiceField(queryset=models.Client.objects.get_all(None), empty_label=u'все контрагенты', |
||||||
|
required=False) |
||||||
|
|
||||||
|
def __init__(self, user, *args, **kwargs): |
||||||
|
super(ClientsListForm, self).__init__(*args, **kwargs) |
||||||
|
self.fields['client'].queryset = models.Client.objects.get_all(user.profile) |
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------- |
||||||
|
|
||||||
|
|
||||||
|
class UserProfileFiltersForm(MyBaseModelForm): |
||||||
|
"""Общая форма фильтрации реквизитов.""" |
||||||
|
_profile_type = None # задать в наследнике! |
||||||
|
|
||||||
|
_is_admin = False |
||||||
|
_user = None |
||||||
|
|
||||||
|
class Meta: |
||||||
|
model = models.UserProfileFilters |
||||||
|
widgets = { |
||||||
|
'bank_account': forms.RadioSelect(), |
||||||
|
} |
||||||
|
|
||||||
|
def __init__(self, profile=None, accounts=None, *args, **kwargs): |
||||||
|
instance = kwargs.get('instance') |
||||||
|
initial = kwargs.get('initial') |
||||||
|
|
||||||
|
new_initial = { |
||||||
|
# всегда включены |
||||||
|
'show_ip_boss_fio': True, |
||||||
|
'show_name': True, |
||||||
|
} |
||||||
|
|
||||||
|
# TODO 1. переписать проверки в стиле new_initial['show_inn'] = bool(profile.inn) |
||||||
|
# TODO 2. загнать условия в словарь вида {'show_inn': 'inn'}. потом в цикле обработать |
||||||
|
if profile: |
||||||
|
# сбросить чекбоксы, если не заполнены определенные поля в профиле или нет расчетных счетов |
||||||
|
if instance: |
||||||
|
new_initial['show_inn'] = bool(profile.inn) |
||||||
|
new_initial['show_ogrn'] = bool(profile.ogrn) |
||||||
|
new_initial['show_okpo'] = bool(profile.okpo) |
||||||
|
new_initial['show_glavbuh'] = bool(profile.get_glavbuh_fio()) |
||||||
|
new_initial['show_address'] = bool(profile.address) |
||||||
|
new_initial['show_jur_address'] = bool(profile.jur_address) |
||||||
|
new_initial['show_real_address'] = bool(profile.real_address) |
||||||
|
new_initial['show_phone'] = bool(profile.get_full_phone()) |
||||||
|
new_initial['show_fax'] = bool(profile.get_full_fax()) |
||||||
|
new_initial['show_email'] = bool(profile.email) |
||||||
|
new_initial['show_site'] = bool(profile.site) |
||||||
|
new_initial['show_bank_account'] = bool(accounts) |
||||||
|
new_initial['show_logo'] = bool(profile.logo) |
||||||
|
|
||||||
|
if self._profile_type == consts.IP_PROFILE: |
||||||
|
new_initial['show_svid_gos_reg'] = bool(profile.svid_gos_reg) |
||||||
|
new_initial['show_ip_reg_date'] = bool(profile.ip_reg_date) |
||||||
|
elif self._profile_type == consts.ORG_PROFILE: |
||||||
|
new_initial['show_full_name'] = bool(profile.full_name) |
||||||
|
new_initial['show_kpp'] = bool(profile.kpp) |
||||||
|
new_initial['show_na_osnovanii'] = bool(profile.na_osnovanii) |
||||||
|
else: |
||||||
|
new_initial['show_inn'] = bool(profile.inn) |
||||||
|
new_initial['show_ogrn'] = bool(profile.ogrn) |
||||||
|
new_initial['show_okpo'] = bool(profile.okpo) |
||||||
|
new_initial['show_glavbuh'] = bool(profile.get_glavbuh_fio()) |
||||||
|
new_initial['show_address'] = bool(profile.address) |
||||||
|
new_initial['show_jur_address'] = bool(profile.jur_address) |
||||||
|
new_initial['show_real_address'] = bool(profile.real_address) |
||||||
|
new_initial['show_phone'] = bool(profile.get_full_phone()) |
||||||
|
new_initial['show_fax'] = bool(profile.get_full_fax()) |
||||||
|
new_initial['show_email'] = bool(profile.email) |
||||||
|
new_initial['show_site'] = bool(profile.site) |
||||||
|
new_initial['show_bank_account'] = bool(accounts) |
||||||
|
new_initial['show_logo'] = bool(profile.logo) |
||||||
|
|
||||||
|
if self._profile_type == consts.IP_PROFILE: |
||||||
|
new_initial['show_svid_gos_reg'] = bool(profile.svid_gos_reg) |
||||||
|
new_initial['show_ip_reg_date'] = bool(profile.ip_reg_date) |
||||||
|
elif self._profile_type == consts.ORG_PROFILE: |
||||||
|
new_initial['show_full_name'] = bool(profile.full_name) |
||||||
|
new_initial['show_kpp'] = bool(profile.kpp) |
||||||
|
new_initial['show_na_osnovanii'] = bool(profile.na_osnovanii) |
||||||
|
|
||||||
|
if initial: |
||||||
|
initial.update(new_initial) |
||||||
|
else: |
||||||
|
kwargs['initial'] = new_initial |
||||||
|
|
||||||
|
super(UserProfileFiltersForm, self).__init__(*args, **kwargs) |
||||||
|
|
||||||
|
# для админки |
||||||
|
if self._is_admin: |
||||||
|
# попробовать взять user из kwargs['instance'], а потом из self.data |
||||||
|
try: |
||||||
|
self._user = getattr(kwargs.get('instance'), 'user') |
||||||
|
except AttributeError: |
||||||
|
self._user = self.data.get('user') |
||||||
|
if not accounts: |
||||||
|
accounts = models.BankAccount.objects.get_all(self._user.profile) |
||||||
|
|
||||||
|
f = self.fields |
||||||
|
|
||||||
|
# только расчетные счета пользователя |
||||||
|
f_acc = f['bank_account'] # TODO вынести настройку расчетных счетов в mixin? |
||||||
|
f_acc.queryset = accounts |
||||||
|
f_acc.empty_label = None |
||||||
|
f_acc.label_from_instance = lambda obj: mark_safe( |
||||||
|
force_unicode('%s<br /><span class="name">%s</span>' % (obj.account, obj.name,))) # исправить метку |
||||||
|
|
||||||
|
# заблокировать чекбоксы, если: не заполнены определенные поля в профиле или нет расчетных счетов |
||||||
|
if profile: |
||||||
|
if not profile.inn: f['show_inn'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.ogrn: f['show_ogrn'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.okpo: f['show_okpo'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.get_glavbuh_fio(): f['show_glavbuh'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.address: f['show_address'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.jur_address: f['show_jur_address'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.real_address: f['show_real_address'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.get_full_phone(): f['show_phone'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.get_full_fax(): f['show_fax'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.email: f['show_email'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.site: f['show_site'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.logo: f['show_logo'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not accounts: f['show_bank_account'].widget.attrs['disabled'] = 'disabled' |
||||||
|
|
||||||
|
if self._profile_type == consts.IP_PROFILE: |
||||||
|
if not profile.svid_gos_reg: f['show_svid_gos_reg'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.ip_reg_date: f['show_ip_reg_date'].widget.attrs['disabled'] = 'disabled' |
||||||
|
elif self._profile_type == consts.ORG_PROFILE: |
||||||
|
if not profile.name: f['show_name'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.full_name: f['show_full_name'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.kpp: f['show_kpp'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.boss_title: f['show_org_boss_title_and_fio'].widget.attrs['disabled'] = 'disabled' |
||||||
|
if not profile.na_osnovanii: f['show_na_osnovanii'].widget.attrs['disabled'] = 'disabled' |
||||||
|
|
||||||
|
# блокировать чекбоксы, т.к.эти реквизиты юзеру выключать нельзя |
||||||
|
if self._profile_type == consts.IP_PROFILE: |
||||||
|
f['show_ip_boss_fio'].widget.attrs['disabled'] = 'disabled' |
||||||
|
elif self._profile_type == consts.ORG_PROFILE: |
||||||
|
f['show_name'].widget.attrs['disabled'] = 'disabled' |
||||||
|
|
||||||
|
|
||||||
|
class IpUserProfileFiltersForm(UserProfileFiltersForm): |
||||||
|
"""Форма фильтрации реквизитов - для ИП.""" |
||||||
|
_profile_type = consts.IP_PROFILE |
||||||
|
|
||||||
|
change_labels = { |
||||||
|
'show_profile_type': dict(consts.PROFILE_TYPES)[_profile_type], |
||||||
|
'show_ogrn': u'ОГРНИП', |
||||||
|
} |
||||||
|
|
||||||
|
class Meta(UserProfileFiltersForm.Meta): |
||||||
|
fields = ( |
||||||
|
'show_profile_type', |
||||||
|
'show_ip_boss_fio', |
||||||
|
'show_inn', |
||||||
|
'show_ogrn', |
||||||
|
'show_okpo', |
||||||
|
'show_svid_gos_reg', |
||||||
|
'show_ip_reg_date', |
||||||
|
'show_glavbuh', |
||||||
|
'show_bank_account', |
||||||
|
'bank_account', |
||||||
|
'show_contact_info', |
||||||
|
'show_address', |
||||||
|
'show_jur_address', |
||||||
|
'show_real_address', |
||||||
|
'show_phone', |
||||||
|
'show_fax', |
||||||
|
'show_email', |
||||||
|
'show_site', |
||||||
|
'show_logo', |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
class OrgUserProfileFiltersForm(UserProfileFiltersForm): |
||||||
|
"""Форма фильтрации реквизитов - для Организаций.""" |
||||||
|
_profile_type = consts.ORG_PROFILE |
||||||
|
|
||||||
|
change_labels = { |
||||||
|
'show_profile_type': dict(consts.PROFILE_TYPES)[_profile_type], |
||||||
|
'show_ogrn': u'ОГРН', |
||||||
|
} |
||||||
|
|
||||||
|
class Meta(UserProfileFiltersForm.Meta): |
||||||
|
fields = ( |
||||||
|
'show_profile_type', |
||||||
|
'show_name', |
||||||
|
'show_full_name', |
||||||
|
'show_inn', |
||||||
|
'show_kpp', |
||||||
|
'show_ogrn', |
||||||
|
'show_okpo', |
||||||
|
'show_org_boss_title_and_fio', |
||||||
|
'show_na_osnovanii', |
||||||
|
'show_glavbuh', |
||||||
|
'show_bank_account', |
||||||
|
'bank_account', |
||||||
|
'show_contact_info', |
||||||
|
'show_address', |
||||||
|
'show_jur_address', |
||||||
|
'show_real_address', |
||||||
|
'show_phone', |
||||||
|
'show_fax', |
||||||
|
'show_email', |
||||||
|
'show_site', |
||||||
|
'show_logo', |
||||||
|
) |
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------- |
||||||
|
|
||||||
|
|
||||||
|
class EmailProfileForm(forms.Form): |
||||||
|
"""Форма отправки реквизитов пользователя по email.""" |
||||||
|
to = forms.EmailField(label=u'E-mail получателя') |
||||||
|
body = forms.CharField(label=u'Текст сообщения', max_length=1000, required=False, |
||||||
|
widget=forms.Textarea(attrs={'cols': 80, 'rows': 3})) |
||||||
|
|
||||||
|
|
||||||
|
class LicenseForm(forms.Form): |
||||||
|
"""Форма продления лицензии |
||||||
|
""" |
||||||
|
term = forms.ModelChoiceField(queryset=models.LicensePrice.objects.all(), |
||||||
|
widget=forms.RadioSelect, label=u'Срок лицензии', empty_label = None) |
||||||
|
payform = forms.ChoiceField(choices=consts.PAYFORMS[1:], widget=forms.RadioSelect, |
||||||
|
label=u'Форма оплаты') |
||||||
|
|
||||||
|
|
||||||
|
class YaForm(PaymentForm): |
||||||
|
def get_display_field_names(self): |
||||||
|
return () |
||||||
@ -0,0 +1,159 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from south.utils import datetime_utils as datetime |
||||||
|
from south.db import db |
||||||
|
from south.v2 import SchemaMigration |
||||||
|
from django.db import models |
||||||
|
|
||||||
|
|
||||||
|
class Migration(SchemaMigration): |
||||||
|
|
||||||
|
def forwards(self, orm): |
||||||
|
# Adding field 'Client.name_short_self' |
||||||
|
db.add_column(u'customer_client', 'name_short_self', |
||||||
|
self.gf('django.db.models.fields.CharField')(max_length=256, null=True, blank=True), |
||||||
|
keep_default=False) |
||||||
|
|
||||||
|
# Adding field 'Client.name_short_dadata' |
||||||
|
db.add_column(u'customer_client', 'name_short_dadata', |
||||||
|
self.gf('django.db.models.fields.CharField')(max_length=256, null=True, blank=True), |
||||||
|
keep_default=False) |
||||||
|
|
||||||
|
|
||||||
|
def backwards(self, orm): |
||||||
|
# Deleting field 'Client.name_short_self' |
||||||
|
db.delete_column(u'customer_client', 'name_short_self') |
||||||
|
|
||||||
|
# Deleting field 'Client.name_short_dadata' |
||||||
|
db.delete_column(u'customer_client', 'name_short_dadata') |
||||||
|
|
||||||
|
|
||||||
|
models = { |
||||||
|
u'customer.bankaccount': { |
||||||
|
'Meta': {'ordering': "['-created_at']", 'object_name': 'BankAccount'}, |
||||||
|
'account': ('django.db.models.fields.CharField', [], {'max_length': '20'}), |
||||||
|
'address': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), |
||||||
|
'bik': ('django.db.models.fields.CharField', [], {'max_length': '10'}), |
||||||
|
'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'bank_accounts'", 'to': u"orm['customer.UserProfile']"}), |
||||||
|
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'is_main': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'korr_account': ('django.db.models.fields.CharField', [], {'max_length': '20'}), |
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '256'}), |
||||||
|
'short_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), |
||||||
|
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'customer.client': { |
||||||
|
'Meta': {'ordering': "['name', '-created_at']", 'object_name': 'Client'}, |
||||||
|
'address': ('django.db.models.fields.CharField', [], {'max_length': '256'}), |
||||||
|
'bank_account': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20', 'blank': 'True'}), |
||||||
|
'bank_address': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), |
||||||
|
'bank_bik': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '10', 'blank': 'True'}), |
||||||
|
'bank_korr_account': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20', 'blank': 'True'}), |
||||||
|
'bank_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), |
||||||
|
'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'clients'", 'to': u"orm['customer.UserProfile']"}), |
||||||
|
'contact_email': ('django.db.models.fields.EmailField', [], {'default': "''", 'max_length': '50', 'blank': 'True'}), |
||||||
|
'contact_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '50', 'blank': 'True'}), |
||||||
|
'contact_other': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), |
||||||
|
'contact_phone': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '50', 'blank': 'True'}), |
||||||
|
'contact_skype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20', 'blank': 'True'}), |
||||||
|
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'inn': ('django.db.models.fields.CharField', [], {'max_length': '12'}), |
||||||
|
'kpp': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '9', 'blank': 'True'}), |
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'db_index': 'True'}), |
||||||
|
'name_short_dadata': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'}), |
||||||
|
'name_short_self': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'}), |
||||||
|
'ogrn': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '15'}), |
||||||
|
'okpo': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '10', 'blank': 'True'}), |
||||||
|
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'customer.license': { |
||||||
|
'Meta': {'object_name': 'License'}, |
||||||
|
'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'licenses'", 'to': u"orm['customer.UserProfile']"}), |
||||||
|
'date_from': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'date_to': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'order_date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'paid_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'pay_sum': ('django.db.models.fields.IntegerField', [], {}), |
||||||
|
'payform': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
||||||
|
'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
||||||
|
'term': ('django.db.models.fields.IntegerField', [], {}) |
||||||
|
}, |
||||||
|
u'customer.licenseprice': { |
||||||
|
'Meta': {'object_name': 'LicensePrice'}, |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'price': ('django.db.models.fields.IntegerField', [], {}), |
||||||
|
'term': ('django.db.models.fields.IntegerField', [], {}) |
||||||
|
}, |
||||||
|
u'customer.userprofile': { |
||||||
|
'Meta': {'object_name': 'UserProfile'}, |
||||||
|
'active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'address': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256'}), |
||||||
|
'boss_midname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30'}), |
||||||
|
'boss_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30'}), |
||||||
|
'boss_sign': ('django.db.models.fields.files.ImageField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), |
||||||
|
'boss_surname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30'}), |
||||||
|
'boss_title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), |
||||||
|
'confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'email': ('django.db.models.fields.EmailField', [], {'default': "''", 'max_length': '75', 'blank': 'True'}), |
||||||
|
'fax': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20', 'blank': 'True'}), |
||||||
|
'fax_code': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '10', 'blank': 'True'}), |
||||||
|
'full_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), |
||||||
|
'glavbuh_midname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30', 'blank': 'True'}), |
||||||
|
'glavbuh_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30', 'blank': 'True'}), |
||||||
|
'glavbuh_sign': ('django.db.models.fields.files.ImageField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), |
||||||
|
'glavbuh_surname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'inn': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '12'}), |
||||||
|
'ip_reg_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'jur_address': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), |
||||||
|
'kpp': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '9'}), |
||||||
|
'logo': ('django.db.models.fields.files.ImageField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), |
||||||
|
'na_osnovanii': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), |
||||||
|
'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256'}), |
||||||
|
'ogrn': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '15'}), |
||||||
|
'okpo': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '10', 'blank': 'True'}), |
||||||
|
'phone': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20', 'blank': 'True'}), |
||||||
|
'phone_code': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '10', 'blank': 'True'}), |
||||||
|
'profile_type': ('django.db.models.fields.PositiveSmallIntegerField', [], {}), |
||||||
|
'real_address': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), |
||||||
|
'site': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), |
||||||
|
'stamp': ('django.db.models.fields.files.ImageField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), |
||||||
|
'svid_gos_reg': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), |
||||||
|
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'user_session_key': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'customer.userprofilefilters': { |
||||||
|
'Meta': {'object_name': 'UserProfileFilters'}, |
||||||
|
'bank_account': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'+'", 'null': 'True', 'blank': 'True', 'to': u"orm['customer.BankAccount']"}), |
||||||
|
'company': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'profile_filters'", 'unique': 'True', 'primary_key': 'True', 'to': u"orm['customer.UserProfile']"}), |
||||||
|
'show_address': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_bank_account': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_contact_info': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_email': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_fax': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_full_name': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_glavbuh': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_inn': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_ip_boss_fio': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_ip_reg_date': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_jur_address': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_kpp': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_logo': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_na_osnovanii': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_name': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_ogrn': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_okpo': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_org_boss_title_and_fio': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_phone': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_profile_type': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_real_address': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_site': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'show_svid_gos_reg': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
complete_apps = ['customer'] |
||||||
@ -0,0 +1,237 @@ |
|||||||
|
{% load my_tags %} |
||||||
|
|
||||||
|
<div class="client-form"> |
||||||
|
{% if not is_ajax %} |
||||||
|
{% if form.non_field_errors %}<p class="error">{{ form.non_field_errors }}</p>{% endif %} |
||||||
|
{% endif %} |
||||||
|
|
||||||
|
<form id="client-edit-form" class="client-form{% if is_ajax %} ajax-form{% endif %}" action="" method="post"{% if is_ajax %} title="Добавить / редактировать контрагента"{% endif %}> |
||||||
|
{% csrf_token %} |
||||||
|
<div class="search__container"> |
||||||
|
<div class="field"> |
||||||
|
<div class="left label search__label"> |
||||||
|
Поиск реквизитов: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
<input id="searchClientInput" class="search__input search__input_long" maxlength="256" autocomplete="off" name="searchClientInput" type="text" placeholder="Введите название в свободной форме, адрес, ИНН или ОГРН"> |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{% for hidden in form.hidden_fields %} |
||||||
|
{{ hidden }} |
||||||
|
{% endfor %} |
||||||
|
|
||||||
|
{% if is_ajax %}<div class="errors-layout"></div>{% endif %} |
||||||
|
|
||||||
|
<div class="col1"> |
||||||
|
|
||||||
|
<div id="name" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
Наименование{% if form.name.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.name }} |
||||||
|
{% if not is_ajax %}{{ form.name.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="inn" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
ИНН{% if form.inn.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.inn }} |
||||||
|
{% if not is_ajax %}{{ form.inn.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="kpp" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
КПП{% if form.kpp.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.kpp }} |
||||||
|
{% if not is_ajax %}{{ form.kpp.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="ogrn" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
ОГРН{% if form.ogrn.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.ogrn }} |
||||||
|
{% if not is_ajax %}{{ form.ogrn.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="okpo" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
ОКПО{% if form.okpo.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.okpo }} |
||||||
|
{% if not is_ajax %}{{ form.okpo.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="address" class="field" style="width: 700px;margin-bottom: 5px;"> |
||||||
|
<div class="left label"> |
||||||
|
Юр. адрес{% if form.address.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field "> |
||||||
|
{{ form.address }} |
||||||
|
{% if not is_ajax %}{{ form.address.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="search-bank" style="width: 803px;"> |
||||||
|
<div class="search__container"> |
||||||
|
<div class="left label search__label"> |
||||||
|
Поиск банка: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
<input class="search__input search__input_long" id="searchClientBankInput" placeholder="Введите название, БИК или SWIFT" type="text"> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div id="searchBankResult"></div> |
||||||
|
</div> |
||||||
|
{% if not form.bank_bik.is_hidden %} |
||||||
|
<div id="bank_bik" class="field"> |
||||||
|
|
||||||
|
<div class="left label"> |
||||||
|
БИК{% if form.bank_bik.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.bank_bik }} |
||||||
|
{% if not is_ajax %}{{ form.bank_bik.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
{% if not form.bank_name.is_hidden %} |
||||||
|
<div id="bank_name" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
Наименование банка{% if form.bank_name.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.bank_name }} |
||||||
|
{% if not is_ajax %}{{ form.bank_name.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
{% comment %} |
||||||
|
<div id="bank_address" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
Местонахождение{% if form.bank_address.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.bank_address }} |
||||||
|
{% if not is_ajax %}{{ form.bank_address.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
{% endcomment %} |
||||||
|
{% if not form.bank_korr_account.is_hidden %} |
||||||
|
<div id="bank_korr_account" class="field"> |
||||||
|
|
||||||
|
<div class="left label"> |
||||||
|
К/сч.{% if form.bank_korr_account.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="form-field"> |
||||||
|
{{ form.bank_korr_account }} |
||||||
|
{% if not is_ajax %}{{ form.bank_korr_account.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
<div id="bank_account" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
Р/сч.{% if form.bank_account.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.bank_account }} |
||||||
|
{% if not is_ajax %}{{ form.bank_account.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col2"> |
||||||
|
<div id="contact_name" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
Имя{% if form.contact_name.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.contact_name }} |
||||||
|
{% if not is_ajax %}{{ form.contact_name.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="contact_email" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
E-mail{% if form.contact_email.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.contact_email }} |
||||||
|
{% if not is_ajax %}{{ form.contact_email.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="contact_phone" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
Телефон{% if form.contact_phone.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.contact_phone }} |
||||||
|
{% if not is_ajax %}{{ form.contact_phone.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="contact_skype" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
Skype{% if form.contact_skype.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.contact_skype }} |
||||||
|
{% if not is_ajax %}{{ form.contact_skype.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="contact_other" class="field"> |
||||||
|
<div class="left label"> |
||||||
|
Другое{% if form.contact_other.field.required %}<span class="required">*</span>{% endif %}: |
||||||
|
</div> |
||||||
|
<div class="form-field"> |
||||||
|
{{ form.contact_other }} |
||||||
|
{% if not is_ajax %}{{ form.contact_other.errors }}{% endif %} |
||||||
|
</div> |
||||||
|
<div class="clear"></div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="clear"></div> |
||||||
|
|
||||||
|
<div class="buttons"> |
||||||
|
{% if not is_ajax %} |
||||||
|
<input type="submit" name="submit" value="Сохранить" /> |
||||||
|
<input type="submit" name="_cancel" value="Отмена" /> |
||||||
|
{% endif %} |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
|
||||||
|
</div> |
||||||
@ -0,0 +1,133 @@ |
|||||||
|
{# заглушка js #} |
||||||
|
<script type="text/javascript"> |
||||||
|
$(document).ready(function() { |
||||||
|
$('tr.plat_form').formset({ |
||||||
|
prefix: '{{ pformset.prefix }}', |
||||||
|
formCssClass: 'plat_dynamic-form', |
||||||
|
}); |
||||||
|
$('tr.row_tbl_items').formset({ |
||||||
|
prefix: '{{ formset.prefix }}', |
||||||
|
formCssClass: 'dynamic-form', |
||||||
|
}); |
||||||
|
|
||||||
|
// units |
||||||
|
$('body').on('selectChoice change', '.units input', function(e, choice, autocomplete) { |
||||||
|
var name_input = $(this); |
||||||
|
var code_input = name_input.closest('.row_tbl_items').find('.units_kod input'); |
||||||
|
|
||||||
|
if (choice) { |
||||||
|
//console.log(choice.data()); |
||||||
|
name_input.val(choice.data('name')); // short name |
||||||
|
code_input.val(choice.data('code')); |
||||||
|
name_input.css('color', 'black') |
||||||
|
} |
||||||
|
else { |
||||||
|
//console.log(choice, 'No choice!'); |
||||||
|
code_input.val('-'); |
||||||
|
name_input.css('color', 'red') |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
// country |
||||||
|
$('body').on('selectChoice change', '.country_name input', function(e, choice, autocomplete) { |
||||||
|
var name_input = $(this); |
||||||
|
var code_input = name_input.closest('.row_tbl_items').find('.country_code input'); |
||||||
|
|
||||||
|
if (choice) { |
||||||
|
//console.log(choice.data()); |
||||||
|
code_input.val(choice.data('code')); |
||||||
|
name_input.css('color', 'black') |
||||||
|
} |
||||||
|
else { |
||||||
|
//console.log(choice, 'No choice!'); |
||||||
|
code_input.val('-'); |
||||||
|
name_input.css('color', 'red') |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
$('#id_client').on('change', function() { |
||||||
|
var client_id = $(this).val(); |
||||||
|
$.get('/my/docs/ajax_get_invoices/' + client_id, function(data) { |
||||||
|
var select = $('#id_invoice'); |
||||||
|
if(select.prop) { |
||||||
|
var options = select.prop('options'); |
||||||
|
} |
||||||
|
else { |
||||||
|
var options = select.attr('options'); |
||||||
|
} |
||||||
|
$('option', select).remove(); |
||||||
|
options[options.length] = new Option('-------', ''); |
||||||
|
|
||||||
|
$.each(data, function(val, text) { |
||||||
|
options[options.length] = new Option(text, val); |
||||||
|
}); |
||||||
|
select.prop('selectedIndex', 0); |
||||||
|
}) |
||||||
|
}); |
||||||
|
|
||||||
|
$('#id_invoice').on('change', function() { |
||||||
|
var invoice_id = $(this).val(); |
||||||
|
$.each($('.row_tbl_items'), function(index, item){ |
||||||
|
$(item).find('a.delete-row').trigger('click'); |
||||||
|
}); |
||||||
|
$.get('/my/docs/ajax_get_client_by_invoice/' + invoice_id, function(data) { |
||||||
|
var client = data[0]; |
||||||
|
$('#id_client_text').hide(); |
||||||
|
$('#id_client-deck').html('<span class="div hilight" data-value='+ data[0] +'><span class="remove div" style="display: inline;">X</span>' + data[1] + '</span>'); |
||||||
|
|
||||||
|
$('#id_client').html('<option selected="selected" value="'+ data[0] +'"></option>'); |
||||||
|
//$('#id_client').trigger('change'); |
||||||
|
}) |
||||||
|
|
||||||
|
$.get('/my/docs/ajax_get_tbl_items/' + invoice_id, function(data) { |
||||||
|
var items = JSON.parse(data); |
||||||
|
$.each(items, function(index, item){ |
||||||
|
var name = item['fields']['name']; |
||||||
|
var units = item['fields']['units']; |
||||||
|
var qty = item['fields']['qty']; |
||||||
|
var price = item['fields']['price']; |
||||||
|
var total_price = item['fields']['total_price']; |
||||||
|
$('#tbl_items a.add-row').trigger('click'); |
||||||
|
var $last_row = $('.row_tbl_items:visible').last(); |
||||||
|
$last_row.find('.name input').val(name); |
||||||
|
$last_row.find('.units input').val(units); |
||||||
|
$last_row.find('.qty input').val(qty); |
||||||
|
$last_row.find('.price input').val(price); |
||||||
|
$last_row.find('.total_price input').val(total_price); |
||||||
|
$.get('/my/docs/ajax_get_pair/Measure/name/code/' + units + '/', function(data){ |
||||||
|
if (data['val']) { |
||||||
|
$last_row.find('.units_kod input').val(data['val']); |
||||||
|
} |
||||||
|
}); |
||||||
|
}) |
||||||
|
}) |
||||||
|
}) |
||||||
|
//var sender_val = $('input:radio[name=sender_group]:checked', '#doc-form').val(); |
||||||
|
var toggle_sender = function(client_type) { |
||||||
|
var sender_val = $('input:radio[name=' + client_type + '_group]:checked', '#doc-form').val(); |
||||||
|
if (sender_val == 'another') { |
||||||
|
$('#' + client_type).show() |
||||||
|
} else { |
||||||
|
$('#' + client_type).hide() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$.each(['sender', 'receiver'], function(i, client_type){ |
||||||
|
toggle_sender(client_type); |
||||||
|
$('input:radio[name=' + client_type + '_group]').change(function(){ |
||||||
|
toggle_sender(client_type); |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
if ($('#id_fixes').is(':checked')){ |
||||||
|
$('#fix_block').show(); |
||||||
|
} else { |
||||||
|
$('#fix_block').hide(); |
||||||
|
} |
||||||
|
$('#id_fixes').change(function(){ |
||||||
|
$('#fix_block').toggle(); |
||||||
|
$('#id_fix_doc_num').val('11'); |
||||||
|
$('#id_fix_doc_date').val(''); |
||||||
|
}) |
||||||
|
}); |
||||||
|
</script> |
||||||
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB |
Loading…
Reference in new issue