From f1ca23ce6e8e1455f9f1d02d9d3487fbbc6ae6c4 Mon Sep 17 00:00:00 2001 From: Dmitriy Shesterkin Date: Fri, 23 Jun 2017 19:36:33 +0300 Subject: [PATCH] mekup doc faktura, some pep8 --- src/customer/admin.py | 29 +-- src/customer/apps.py | 1 - src/customer/context_processors.py | 28 ++- src/customer/forms.py | 215 +++++++++++------- src/customer/views/bank_accounts.py | 3 +- src/docs/autocomplete_light_registry.py | 2 +- src/docs/forms/faktura.py | 3 +- src/docs/views/aktsverki.py | 22 +- src/docs/views/faktura.py | 74 +++--- src/dokumentor/static/css/style.css | 43 +++- src/dokumentor/static/js/client.commons.js | 4 + src/dokumentor/static/js/dialogs.js | 43 +++- .../templates/docs/faktura/form.html | 22 +- .../docs/parts/form_client_choices.html | 5 +- .../docs/parts/form_field_client.html | 2 +- .../docs/parts/form_field_receiver.html | 2 +- .../docs/parts/form_field_sender.html | 2 +- src/dokumentor/templates/docs/stub_js.html | 45 +++- 18 files changed, 355 insertions(+), 190 deletions(-) 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 %} -
Исправления
-
+
+
{% include 'docs/parts/form_field.html' with field=form.fix_doc_num id="fix_doc_num" classes="left" label="Номер исправления" required="True" no_clear_after="True" %} - {% include 'docs/parts/form_field.html' with field=form.fix_doc_date id="fix_doc_date" classes="left" label="Дата исправления" required="True" %} + {% include 'docs/parts/form_field.html' with field=form.fix_doc_date id="fix_doc_date" classes="left" label="Дата исправления" required="True" no_clear_after="True" %} +
Номера исправлений должны начинаться с 1 для каждой счет-фактуры в отдельности.
+
-
Аванс
- {% include 'docs/parts/form_field.html' with field=form.currency id="currency" classes="field" label="Валюта документа " %} +
+
+ {% include 'docs/parts/form_field.html' with field=form.plat_doc_num id="plat_doc_num" classes="left" label="К плат. док-ту №" required="True" no_clear_after="True" %} + {% include 'docs/parts/form_field.html' with field=form.plat_doc_date id="plat_doc_date" classes="left" label="Дата документа" required="True" no_clear_after="True" %} +
Платежное поручение, кассовый чек, приходный ордер и т.п.Заполняется только при наличии аванса.
+
+
+ {% include 'docs/parts/form_field.html' with field=form.currency id="currency" classes="field" label="Валюта документа" %}
@@ -20,8 +28,8 @@ {% include 'docs/parts/form_field_client.html' with field=form.client required="True" is_ajax="True" label="Покупатель" %} {% include 'docs/parts/form_field.html' with field=form.invoice id="invoice" classes="field hidden" label="Создать счёт-фактуру по счёту" %} - {% include 'docs/parts/form_field_sender.html' with field=form.sender id="sender" %} - {% include 'docs/parts/form_field_receiver.html' with field=form.receiver id="receiver" %} + {% include 'docs/parts/form_field_sender.html' with field=form.sender id="sender" type="sender" %} + {% include 'docs/parts/form_field_receiver.html' with field=form.receiver id="receiver" type="receiver" %}
diff --git a/src/dokumentor/templates/docs/parts/form_client_choices.html b/src/dokumentor/templates/docs/parts/form_client_choices.html index 8cedcd9..182bd4d 100644 --- a/src/dokumentor/templates/docs/parts/form_client_choices.html +++ b/src/dokumentor/templates/docs/parts/form_client_choices.html @@ -1,4 +1 @@ -{#

{{ 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 @@