parent
3d26a8444f
commit
b0511b2ed5
35 changed files with 1234 additions and 123 deletions
@ -1,4 +1,4 @@ |
||||
# -*- coding: utf-8 -*- |
||||
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 -*- |
||||
|
||||
from __future__ import absolute_import |
||||
|
||||
import os |
||||
|
||||
from celery import Celery |
||||
|
||||
from django.conf import settings |
||||
|
||||
# set the default Django settings module for the 'celery' program. |
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') |
||||
|
||||
import celery |
||||
from celery import Celery |
||||
app = Celery('proj') |
||||
|
||||
# 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