diff --git a/src/customer/admin.py b/src/customer/admin.py
index 4b132a7..99ecb6a 100644
--- a/src/customer/admin.py
+++ b/src/customer/admin.py
@@ -10,25 +10,14 @@ class UserProfileAdmin(admin.ModelAdmin):
list_display_links = list_display
form = forms.UserProfileAdminForm
+
class LicenseAdmin(admin.ModelAdmin):
list_display = ('get_company', 'term', 'status', 'order_date', 'date_from', 'date_to')
list_display_links = list_display
- search_fields = ('company__email', )
+ search_fields = ('company__email',)
list_filter = ('status', 'term', 'order_date', 'date_from', 'date_to')
-#TODO прописать fieldsets
-# fieldsets = [
-# (None, {'fields': ['user',]}),
-# (None, {'fields': ['profile_type',]}),
-# (None, {'fields': ['name', 'phone_code', 'phone', 'address', 'inn',]}),
-# (None, {'fields': ['add_glavbuh_sign', 'glavbuh_fio',]}),
-# (None, {'fields': ['v_litce', 'na_osnovanii',]}),
-# (u'ИП', {'fields': ['ip_surname', 'ip_name', 'ip_midname', 'ip_kod_okpo',]}),
-# (u'Организация', {'fields': ['org_boss_name', 'org_kpp',]}),
-# (u'Печать и подписи', {'fields': ['boss_sign', 'glavbuh_sign', 'stamp',]}),
-# ]
-
class BankAccountAdmin(admin.ModelAdmin):
class Media:
@@ -48,15 +37,15 @@ class ClientAdmin(admin.ModelAdmin):
form = forms.ClientAdminForm
fieldsets = [
- (None, {'fields': ['company',]}),
- (None, {'fields': ['name', 'inn', 'address', 'ogrn',]}),
- (u'ИП', {'fields': ['okpo',]}),
- (u'Организация', {'fields': ['kpp',]}),
+ (None, {'fields': ['company']}),
+ (None, {'fields': ['name', 'inn', 'address', 'ogrn']}),
+ (u'ИП', {'fields': ['okpo']}),
+ (u'Организация', {'fields': ['kpp', ]}),
(u'Банковские реквизиты',
- {'fields': ['bank_bik', 'bank_name', 'bank_korr_account', 'bank_account',]}),
+ {'fields': ['bank_bik', 'bank_name', 'bank_korr_account', 'bank_account']}),
(u'Контакты',
- {'fields': ['contact_name', 'contact_email', 'contact_phone', 'contact_skype',
- 'contact_other',]}),
+ {'fields': ['contact_name', 'contact_email',
+ 'contact_phone', 'contact_skype', 'contact_other']}),
]
diff --git a/src/customer/apps.py b/src/customer/apps.py
index e338561..847b86c 100644
--- a/src/customer/apps.py
+++ b/src/customer/apps.py
@@ -5,4 +5,3 @@ from django.apps import AppConfig
class CustomerConfig(AppConfig):
name = 'customer'
verbose_name = 'Клиенты'
-
diff --git a/src/customer/context_processors.py b/src/customer/context_processors.py
index 45ffd37..48490da 100644
--- a/src/customer/context_processors.py
+++ b/src/customer/context_processors.py
@@ -12,7 +12,12 @@ def license_check_soon_ends(request):
cur_license = cache.get('cur_license_%s' % (request.user.username,), None)
if not days_left or not cur_license:
now = datetime.today()
- cur_license = License.objects.filter(company=request.user.profile, date_from__lte=now, date_to__gte=now, status__in=[-1, 1, 2], deleted=False)
+ cur_license = License.objects.filter(
+ company=request.user.profile, date_from__lte=now,
+ date_to__gte=now,
+ status__in=[-1, 1, 2],
+ deleted=False
+ )
if cur_license:
cur_license = cur_license[0]
days_left = (cur_license.date_to - now.date()).days
@@ -22,8 +27,17 @@ def license_check_soon_ends(request):
if not license_cookie:
now = datetime.today()
if license_15days is None:
- licenses_ends = License.objects.filter(company=request.user.profile, date_to__lte=now + timedelta(15), status__in=[-1, 1, 2], deleted=False)
- next_licenses = License.objects.filter(company=request.user.profile, status=1, deleted=False)
+ licenses_ends = License.objects.filter(
+ company=request.user.profile,
+ date_to__lte=now + timedelta(15),
+ status__in=[-1, 1, 2],
+ deleted=False
+ )
+ next_licenses = License.objects.filter(
+ company=request.user.profile,
+ status=1,
+ deleted=False
+ )
if licenses_ends and not next_licenses:
days_to_end = licenses_ends[0].date_to
cache.set('license_15_%s' % (request.user.username,), days_to_end, 3600)
@@ -32,10 +46,10 @@ def license_check_soon_ends(request):
license_15days = ''
return {
- 'license_15days': license_15days,
- 'license_days': days_left,
- 'cur_license': cur_license,
+ 'license_15days': license_15days,
+ 'license_days': days_left,
+ 'cur_license': cur_license,
}
except Exception as e:
# print e
- return { }
+ return {}
diff --git a/src/customer/forms.py b/src/customer/forms.py
index 0e624e2..daddbb1 100644
--- a/src/customer/forms.py
+++ b/src/customer/forms.py
@@ -12,7 +12,8 @@ from django.forms.utils import ErrorList
from django.forms.forms import NON_FIELD_ERRORS
-FILE_UPLOAD_MAX_MEMORY_SIZE = getattr(settings, 'FILE_UPLOAD_MAX_MEMORY_SIZE ', 2621440) # default 2.5Mb
+FILE_UPLOAD_MAX_MEMORY_SIZE = getattr(settings, 'FILE_UPLOAD_MAX_MEMORY_SIZE ',
+ 2621440) # default 2.5Mb
def get_profile_form_class(profile_type):
@@ -33,18 +34,15 @@ def get_profile_filters_form_class(profile_type):
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
+ '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):
"""Общая форма редактирования профиля пользователя.
@@ -77,8 +75,8 @@ class UserProfileForm(MyBaseModelForm):
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)))
+ raise forms.ValidationError(u'Размер изображения превышает %i Мб' % (
+ FILE_UPLOAD_MAX_MEMORY_SIZE / (1024 * 1024)))
return image
def clean_boss_sign(self):
@@ -113,7 +111,8 @@ class IpUserProfileForm(UserProfileForm):
# фио главбуха
'glavbuh_surname', 'glavbuh_name', 'glavbuh_midname',
# контактная информация - адреса, телефон, факс, почта, сайт
- 'address', 'jur_address', 'real_address', 'phone_code', 'phone', 'fax_code', 'fax', 'email', 'site',
+ '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',
@@ -136,7 +135,8 @@ class OrgUserProfileForm(UserProfileForm):
# фио главбуха
'glavbuh_surname', 'glavbuh_name', 'glavbuh_midname',
# контактная информация - адреса, телефон, факс, почта, сайт
- 'address', 'jur_address', 'real_address', 'phone_code', 'phone', 'fax_code', 'fax', 'email', 'site',
+ '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',
@@ -146,7 +146,8 @@ class OrgUserProfileForm(UserProfileForm):
class UserProfileAdminForm(UserProfileForm):
"""Форма редактирования профиля - для админки."""
- # условно-обязательные поля, проверять отдельно - могут быть обязательны в зависимости от типа профиля
+ # условно-обязательные поля, проверять отдельно -
+ # могут быть обязательны в зависимости от типа профиля
unset_required = [
# для ИП
'kpp', 'name'
@@ -161,23 +162,24 @@ class UserProfileAdminForm(UserProfileForm):
# тип профиля - ИП или Организация
profile_type = cleaned_data.get('profile_type')
- if profile_type == consts.IP_PROFILE: # поля, обязательные для ИП
+ if profile_type == consts.IP_PROFILE: # поля, обязательные для ИП
pass
- elif profile_type == consts.ORG_PROFILE: # поля, обязательные для Организаций
+ 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')
+ 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):
"""Форма редактирования расчетных счетов."""
+
class Meta:
model = models.BankAccount
fields = ('bik', 'name', 'short_name', 'korr_account', 'account', 'is_main', 'company')
@@ -198,6 +200,7 @@ class BankAccountForm(forms.ModelForm):
class BankAccountAdminForm(BankAccountForm):
"""Форма редактирования расчетных счетов - для админки."""
+
class Meta(BankAccountForm.Meta):
fields = '__all__'
@@ -211,18 +214,33 @@ class BankAccountListForm(forms.Form):
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', 'name_short_self', 'name_short_dadata', 'inn', 'kpp', 'ogrn', 'okpo', 'address',
- # банковские реквизиты
- 'bank_bik', 'bank_name', 'bank_short_name', 'bank_korr_account', 'bank_account',
- # контакты
- 'contact_name', 'contact_email', 'contact_phone', 'contact_skype', 'contact_other',
+ fields = (
+ 'name',
+ 'name_short_self',
+ 'name_short_dadata',
+ 'inn',
+ 'kpp',
+ 'ogrn',
+ 'okpo',
+ 'address',
+ # банковские реквизиты
+ 'bank_bik',
+ 'bank_name',
+ 'bank_short_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 = {
@@ -259,6 +277,7 @@ class ClientForm(forms.ModelForm):
class ClientAdminForm(ClientForm):
"""Форма редактирования контрагентов - для админки."""
+
class Meta(ClientForm.Meta):
fields = None
exclude = ('bank_address',)
@@ -273,12 +292,11 @@ class ClientsListForm(forms.Form):
super(ClientsListForm, self).__init__(*args, **kwargs)
self.fields['client'].queryset = models.Client.objects.get_all(user.profile)
-# -----------------------------------------------------------------------------
-
class UserProfileFiltersForm(MyBaseModelForm):
"""Общая форма фильтрации реквизитов."""
- _profile_type = None # задать в наследнике!
+ # задать в наследнике!
+ _profile_type = None
_is_admin = False
_user = None
@@ -303,7 +321,8 @@ class UserProfileFiltersForm(MyBaseModelForm):
# 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)
@@ -369,37 +388,60 @@ class UserProfileFiltersForm(MyBaseModelForm):
f = self.fields
# только расчетные счета пользователя
- f_acc = f['bank_account'] # TODO вынести настройку расчетных счетов в mixin?
+ 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_text('%s
%s' % (obj.account, obj.name,))) # исправить метку
+ force_text('%s
%s' % (obj.account, obj.name,)))
- # заблокировать чекбоксы, если: не заполнены определенные поля в профиле или нет расчетных счетов
+ # TODO: refactor
+ # заблокировать чекбоксы, если: не заполнены определенные поля
+ # в профиле или нет расчетных счетов
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 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'
+ 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 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:
@@ -420,24 +462,24 @@ class IpUserProfileFiltersForm(UserProfileFiltersForm):
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_ip_boss_fio',
+ 'show_inn',
+ 'show_ogrn',
+ 'show_okpo',
+ 'show_svid_gos_reg',
+ 'show_ip_reg_date',
'show_glavbuh',
'show_bank_account',
- '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',
+ 'show_address',
+ 'show_jur_address',
+ 'show_real_address',
+ 'show_phone',
+ 'show_fax',
+ 'show_email',
+ 'show_site',
+ 'show_logo',
)
@@ -453,45 +495,44 @@ class OrgUserProfileFiltersForm(UserProfileFiltersForm):
class Meta(UserProfileFiltersForm.Meta):
fields = (
'show_profile_type',
- 'show_name',
- 'show_full_name',
- 'show_inn',
- 'show_kpp',
- 'show_ogrn',
- 'show_okpo',
+ 'show_name',
+ 'show_full_name',
+ 'show_inn',
+ 'show_kpp',
+ 'show_ogrn',
+ 'show_okpo',
'show_org_boss_title_and_fio',
- 'show_na_osnovanii',
+ 'show_na_osnovanii',
'show_glavbuh',
'show_bank_account',
- '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',
+ '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}))
+ 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)
+ widget=forms.RadioSelect, label=u'Срок лицензии',
+ empty_label=None)
payform = forms.ChoiceField(choices=consts.PAYFORMS[1:], widget=forms.RadioSelect,
- label=u'Форма оплаты')
+ label=u'Форма оплаты')
class YaForm(PaymentForm):
diff --git a/src/customer/views/bank_accounts.py b/src/customer/views/bank_accounts.py
index 58c261d..76f3673 100644
--- a/src/customer/views/bank_accounts.py
+++ b/src/customer/views/bank_accounts.py
@@ -7,7 +7,6 @@ from django.contrib.auth.decorators import login_required
from commons.paginator import pagination, save_per_page_value
from .. import models, forms
-from ..decorators import license_required
from ..utils import raise_if_no_profile
@@ -20,7 +19,7 @@ def bank_accounts_list(request, page_num=None):
template_name = 'customer/bank_accounts/list.html'
account_list = models.BankAccount.objects.get_all(request.user.profile)
page, pagination_form = pagination(request, account_list, page_num)
- return render(request, template_name, {'page': page, 'pagination_form': pagination_form,})
+ return render(request, template_name, {'page': page, 'pagination_form': pagination_form})
@login_required
diff --git a/src/docs/autocomplete_light_registry.py b/src/docs/autocomplete_light_registry.py
index 5518bfa..89b5111 100644
--- a/src/docs/autocomplete_light_registry.py
+++ b/src/docs/autocomplete_light_registry.py
@@ -66,7 +66,7 @@ class AutocompleteCountry(autocomplete_light.AutocompleteModelTemplate):
"""
attrs = {
'data-autcomplete-minimum-characters': 0,
- 'placeholder': 'Название страны',
+ 'placeholder': '',
}
search_fields = ('name', 'full_name', '^code')
choice_template = 'autocomplete_light/docs_country_choice.html'
diff --git a/src/docs/forms/faktura.py b/src/docs/forms/faktura.py
index fc3a8ce..b53e539 100644
--- a/src/docs/forms/faktura.py
+++ b/src/docs/forms/faktura.py
@@ -25,12 +25,13 @@ class FakturaForm(BaseModelForm):
)
adjust_client_fields = []
-
class Meta:
model = Faktura
fields = (
'doc_num',
'doc_date',
+ 'plat_doc_num',
+ 'plat_doc_date',
'fix_doc_num',
'fix_doc_date',
'client',
diff --git a/src/docs/views/aktsverki.py b/src/docs/views/aktsverki.py
index afbadc7..64c9e03 100644
--- a/src/docs/views/aktsverki.py
+++ b/src/docs/views/aktsverki.py
@@ -13,12 +13,17 @@ from docs.views.base_views import BaseItemsViews
class AktSverkiViews(BaseItemsViews):
"""Views для актов сверки."""
- MODEL = AktSverki # модель документа
- FORM_CLASS = AktSverkiForm # форма документа
-
- ITEM_MODEL = AktSverkiItem # модель табличной части документа
- ITEM_FORM_CLASS = AktSverkiItemForm # форма табличной части документа
- ITEM_FORM_PREFIX = 'aktsverki_items' # префикс формы табличной части
+ # модель документа
+ MODEL = AktSverki
+ # форма документа
+ FORM_CLASS = AktSverkiForm
+
+ # модель табличной части документа
+ ITEM_MODEL = AktSverkiItem
+ # форма табличной части документа
+ ITEM_FORM_CLASS = AktSverkiItemForm
+ # префикс формы табличной части
+ ITEM_FORM_PREFIX = 'aktsverki_items'
# поля, по которым можно сортировать список документов
ORDER_FIELDS = ('doc_date', 'doc_num', 'client__name',)
@@ -61,7 +66,10 @@ class AktSverkiViews(BaseItemsViews):
}
def update_list_dict(self, dictionary):
- """Здесь можно изменить словарь параметров перед передачей его в шаблон вывода списка документов."""
+ """
+ Здесь можно изменить словарь параметров перед
+ передачей его в шаблон вывода списка документов.
+ """
dictionary['clients_form'] = ClientsListForm(self.request.user)
def update_parent_on_items_save(self, obj, obj_items):
diff --git a/src/docs/views/faktura.py b/src/docs/views/faktura.py
index 129df97..d3d176a 100644
--- a/src/docs/views/faktura.py
+++ b/src/docs/views/faktura.py
@@ -15,14 +15,19 @@ from .mixins import AddByInvoiceMethodMixin
class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
"""Views для накладных торг12."""
- MODEL = Faktura # модель документа
- FORM_CLASS = FakturaForm # форма документа
+ # модель документа
+ MODEL = Faktura
+ # форма документа
+ FORM_CLASS = FakturaForm
- ITEM_MODEL = FakturaItem # модель табличной части документа
- ITEM_FORM_CLASS = FakturaItemForm # форма табличной части документа
- ITEM_FORM_PREFIX = 'faktura_items' # префикс формы табличной части
+ # модель табличной части документа
+ ITEM_MODEL = FakturaItem
+ # форма табличной части документа
+ ITEM_FORM_CLASS = FakturaItemForm
+ # префикс формы табличной части
+ ITEM_FORM_PREFIX = 'faktura_items'
- FILTERSET_CLASS = FakturaFilterSet # фильтры
+ FILTERSET_CLASS = FakturaFilterSet # фильтры
# по какому полю суммировать табличную часть документа при показе списком
LIST_SUM_FIELD = 'faktura_items__total_price'
@@ -42,25 +47,25 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
# для генерации pdf/xls
PDF_TEMPLATE = 'docs/faktura/as_pdf.html'
XLS_TEMPLATE = 'faktura.xls'
- FILENAME = u'Счёт-фактура № %s, %s' # без расширения
+ FILENAME = u'Счёт-фактура № %s, %s' # без расширения
# --- грамматика для вывода наименований в шаблонах
PADEJI = {
- 'imenit': u'счёт-фактура', # кто? что?
- 'rodit': u'счёта-фактуры', # кого? чего?
- 'dateln': u'счёту-фактуре', # кому? чему?
- 'vinit': u'счёт-фактуру', # кого? что?
- 'tvorit': u'счётом-фактурой', # кем? чем?
- 'predlojn': u'счёте-фактуре', # о ком? о чём?
+ 'imenit': u'счёт-фактура', # кто? что?
+ 'rodit': u'счёта-фактуры', # кого? чего?
+ 'dateln': u'счёту-фактуре', # кому? чему?
+ 'vinit': u'счёт-фактуру', # кого? что?
+ 'tvorit': u'счётом-фактурой', # кем? чем?
+ 'predlojn': u'счёте-фактуре', # о ком? о чём?
}
PADEJI_MNOJ = {
- 'imenit': u'счета-фактуры', # кто? что?
- 'rodit': u'счетов-фактур', # кого? чего?
- 'dateln': u'счетам-фактурам', # кому? чему?
- 'vinit': u'счета-фактуры', # кого? что?
- 'tvorit': u'счетами-фактурами', # кем? чем?
- 'predlojn': u'счетах-фактурах', # о ком? о чём?
+ 'imenit': u'счета-фактуры', # кто? что?
+ 'rodit': u'счетов-фактур', # кого? чего?
+ 'dateln': u'счетам-фактурам', # кому? чему?
+ 'vinit': u'счета-фактуры', # кого? что?
+ 'tvorit': u'счетами-фактурами', # кем? чем?
+ 'predlojn': u'счетах-фактурах', # о ком? о чём?
}
def prepare(self, obj, obj_items, export_to=None):
@@ -87,17 +92,20 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
page_rows = 42
# высота в строках + рамки и вертикальные отступы
- doc_header_rows = 20 # TODO: рассчитывать!
+ doc_header_rows = 20 # TODO: рассчитывать!
doc_footer_rows = 26
- tbl_header_rows = 6 + 1 # шапка таблицы
- tbl_page_footer_rows = 1 + 1 # подитог (итого по странице) таблицы
- tbl_footer_rows = 1 + 1 # подвал таблицы
+ # шапка таблицы
+ tbl_header_rows = 6 + 1
+ # подитог (итого по странице) таблицы
+ tbl_page_footer_rows = 1 + 1
+ # подвал таблицы
+ tbl_footer_rows = 1 + 1
curr_rows = doc_header_rows + tbl_header_rows
-# print '(start) curr_rows =', curr_rows
# если шрифт не моноширный, то в строчках умещается разное количество символов!
- chars_per_line = 38 # для наименования
+ # для наименования
+ chars_per_line = 38
last_page_item_idx = 0
@@ -117,20 +125,15 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
just_calc_itogo = False
# сколько строк займет строка
name = wrap(item.name, chars_per_line)
- name_rows = max(1, len(name.split('\n'))) + 1 # + отступ/рамка
-# print 'name_rows =', name_rows,
-# print '(+%s)' % (tbl_page_footer_rows + tbl_footer_rows)
+ name_rows = max(1, len(name.split('\n'))) + 1 # + отступ/рамка
# строка, подитог и итог не помещаются на странице
if (curr_rows + name_rows + tbl_page_footer_rows +
- tbl_footer_rows > page_rows):
+ tbl_footer_rows > page_rows):
if idx == 0:
item.pdf_pagebreak_before = True
prev_item = item
else:
- prev_item = obj_items[idx-1]
-# print '--- new page', \
-# curr_rows + name_rows + tbl_page_footer_rows + tbl_footer_rows, \
-# '>', page_rows
+ prev_item = obj_items[idx - 1]
prev_item.pdf_pagebreak_after = True
prev_item.pdf_page_footer = True
calc_itogo(prev_item, last_page_item_idx, idx)
@@ -140,7 +143,8 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
else:
curr_rows += name_rows
else:
- if len(obj_items): # только если были записи в табличной части
+ # только если были записи в табличной части
+ if len(obj_items):
if not just_calc_itogo:
item.pdf_page_footer = True
calc_itogo(item, last_page_item_idx, idx)
@@ -148,5 +152,3 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
curr_rows += tbl_footer_rows
if curr_rows + doc_footer_rows > page_rows:
item.pdf_pagebreak_after = True
-# print 'curr_rows =', curr_rows
-
diff --git a/src/dokumentor/static/css/style.css b/src/dokumentor/static/css/style.css
index 9ca4e2f..78da151 100644
--- a/src/dokumentor/static/css/style.css
+++ b/src/dokumentor/static/css/style.css
@@ -863,7 +863,8 @@ input[type=number] {
.doc-form select#id_currency {width: 330px;height: 40px;font-size: 25px;margin-left: 0;padding-left: 2px;}
-#fixes, #avance {
+.fixes__wrapper,
+.avance__wrapper {
padding-bottom: 7px;
font-size: 15px;
}
@@ -876,8 +877,7 @@ input[type=number] {
#sender p,
#receiver p {
- margin: 0;
- margin-bottom: 10px;
+ margin: 0 0 10px;
}
#sender p .add-client-link,
#receiver p .add-client-link {
@@ -888,3 +888,40 @@ input[type=number] {
#id_receiver-autocomplete {
width: 570px;
}
+
+#id_plat_doc_num,
+#id_plat_doc_date,
+#id_fix_doc_num,
+#id_fix_doc_date {
+ width: 155px;
+}
+
+#id_fix_doc_num {
+ margin-right: 10px;
+}
+
+.fixes__comment,
+.avance__comment {
+ float: left;
+ display: inline-block;
+ font-size: 10px;
+ width: 250px;
+ padding-top: 28px;
+}
+
+#fixes,
+#avance {
+ cursor: pointer;
+ font-style: normal;
+}
+
+.checkbox__org {
+ font-style: normal;
+ cursor: pointer;
+}
+
+.doc-form #sender .hilight,
+.doc-form #receiver .hilight {
+ font-size: 25px;
+}
+
diff --git a/src/dokumentor/static/js/client.commons.js b/src/dokumentor/static/js/client.commons.js
index 1705981..e43a026 100644
--- a/src/dokumentor/static/js/client.commons.js
+++ b/src/dokumentor/static/js/client.commons.js
@@ -98,7 +98,11 @@ function setup_client_add_link(form, reload_on_success) {
clear_form_errors(form);
clearResultSearchDiv($("#searchBankResult"));
+ form.addClass(link.attr('type'));
+ // console.log('-----',form);
+
form.dialog('open');
+
return false;
});
});
diff --git a/src/dokumentor/static/js/dialogs.js b/src/dokumentor/static/js/dialogs.js
index 827d903..c85a7f8 100644
--- a/src/dokumentor/static/js/dialogs.js
+++ b/src/dokumentor/static/js/dialogs.js
@@ -36,6 +36,7 @@ $(document).ready(function() {
/*beforeSend: function() {
$('.errors-layout', form).html('').hide();
},*/
+
// add client
success: function(data) {
clear_form_errors(form);
@@ -44,18 +45,45 @@ $(document).ready(function() {
// console.log('!!!!!!!!!!!!!!!!!!!');
// console.log(data);
+ // console.log(form);
+
+ console.log('--------',form[0]);
+ console.log('--------sender:',$(form).hasClass( "sender" ));
+ console.log('--------receiver',$(form).hasClass( "receiver" ));
+
+ var clientType = '';
+ if ($(form).hasClass( "sender" )) { clientType = "sender"};
+ if ($(form).hasClass( "receiver" )) { clientType = "receiver"};
+
if (form[0].id == 'client-edit-form') {
+ if (!clientType) {
$('#id_client_text').hide();
$('#id_client-deck').html(
+ '' +
+ '' +
+ ' ' +
+ ' ˣ' +
+ ' ' + data.name + '');
+ $('#id_client').html('');
+ $('#id_client').trigger('change');
+ } else {
+ var idType = '#id_' + clientType;
+ var idText = idType + '_text',
+ idDesk = idType + '-deck';
+
+ $(idText).hide();
+ $(idDesk).html(
'' +
''+
' ' +
' ˣ' +
' ' + data.name + '');
- $('#id_client').html('');
- $('#id_client').trigger('change');
+ $(idType).html('');
+ $(idType).trigger('change');
+ }
}
+
form.dialog('close');
form.clearForm();
@@ -70,13 +98,20 @@ $(document).ready(function() {
}
}
if (data.action){
+ var autocomplete;
// console.log(data.action);
if (data.action == 'client-add'){
$(data.row_html).insertAfter('#clients_header_row');
clients_edit_del_update();
$('table#clients').show();
- var autocomplete = $('#id_client-autocomplete');
- if (autocomplete.is(":visible")){autocomplete.hide()}
+ if (!clientType) {
+ autocomplete = $('#id_client-autocomplete');
+ if (autocomplete.is(":visible")){autocomplete.hide()}
+ } else {
+ autocomplete = $('#id_'+ clientType + '-autocomplete');
+ if (autocomplete.is(":visible")){autocomplete.hide()}
+ }
+
}
if (data.action == 'client-edit'){
diff --git a/src/dokumentor/templates/docs/faktura/form.html b/src/dokumentor/templates/docs/faktura/form.html
index 7f3c9c9..a2bbcd9 100644
--- a/src/dokumentor/templates/docs/faktura/form.html
+++ b/src/dokumentor/templates/docs/faktura/form.html
@@ -6,13 +6,21 @@
{% include 'docs/parts/form_field.html' with field=form.doc_num id="doc_num" classes="left" label="Номер" required="True" no_clear_after="True" %}
{% include 'docs/parts/form_field.html' with field=form.doc_date id="doc_date" classes="left" label="Дата создания" required="True" no_clear_after="True"%}
{% include 'docs/parts/form_field.html' with field=form.bank_account %}
-
{{ label }}
#} -{# {{ label1|default:'Он же' }}#} -{{ label2|default:'Стороннее лицо' }} -{# Не указывать#} + diff --git a/src/dokumentor/templates/docs/parts/form_field_client.html b/src/dokumentor/templates/docs/parts/form_field_client.html index 2295651..ca4b1d1 100644 --- a/src/dokumentor/templates/docs/parts/form_field_client.html +++ b/src/dokumentor/templates/docs/parts/form_field_client.html @@ -13,7 +13,7 @@ no_clear_after - не добавлять очистку float после бло {% endif %}{{ field }} - + Добавить контрагента
diff --git a/src/dokumentor/templates/docs/parts/form_field_receiver.html b/src/dokumentor/templates/docs/parts/form_field_receiver.html index ae1807d..be1c515 100644 --- a/src/dokumentor/templates/docs/parts/form_field_receiver.html +++ b/src/dokumentor/templates/docs/parts/form_field_receiver.html @@ -1,2 +1,2 @@ {% include 'docs/parts/form_client_choices.html' with client_group="receiver_group" id="receiver_choices" classes="field" label2='Грузополучатель - стороннее лицо (не покупатель)' default=receiver_choice %} -{% include 'docs/parts/form_field_client.html' with field=form.receiver id="receiver" classes="field" label=' ' %} +{% include 'docs/parts/form_field_client.html' with field=form.receiver id="receiver" classes="field" label=' ' type="receiver" %} diff --git a/src/dokumentor/templates/docs/parts/form_field_sender.html b/src/dokumentor/templates/docs/parts/form_field_sender.html index d2ebca7..0193300 100644 --- a/src/dokumentor/templates/docs/parts/form_field_sender.html +++ b/src/dokumentor/templates/docs/parts/form_field_sender.html @@ -1,2 +1,2 @@ {% include 'docs/parts/form_client_choices.html' with client_group="sender_group" id="sender_choices" classes="field" label2='Грузоотправитель - стороннее лицо (не моя компания)' default=sender_choice %} -{% include 'docs/parts/form_field_client.html' with field=form.sender id="sender" classes="field" label=" " %} +{% include 'docs/parts/form_field_client.html' with field=form.sender id="sender" classes="field" label=" " type="sender" %} diff --git a/src/dokumentor/templates/docs/stub_js.html b/src/dokumentor/templates/docs/stub_js.html index 2d0b52c..5919d09 100644 --- a/src/dokumentor/templates/docs/stub_js.html +++ b/src/dokumentor/templates/docs/stub_js.html @@ -2,6 +2,8 @@