Public release from ruodoo-project: 19.0 - 2026-05-10 21:19:01 UTC

This commit is contained in:
CI Publish Bot
2026-05-10 21:19:11 +00:00
commit cbf9e6e6d6
1213 changed files with 183945 additions and 0 deletions

View File

@ -0,0 +1,18 @@
# Custom report values
Adds custom computed fields for reports.
Adds new tab with custom fields in report form, where custom fields can be
created. Here is possible to write python code block for computing
field's values, and this fields with computed values vill be accessible in report
template.
Also adds wizard where custom fields values can be validated before report creation.
If it is required to change some value, it shoud be changed in record where it stored.
Fields in Custom Field creation form:
"name": Name for showing in interface.
"tech_name": by this literal field's value can be accessed in templates.
"required": If value can't be empty, in fact it must be equivalent to True.
"visible": Will this field be showed in validation wizard or not.
"Description": Text field storing info for users.
"Computing field's value" tab: Place for input python code computing field's value.
Help about code writing can be found in neighbour "Help" tab.

View File

@ -0,0 +1,2 @@
from . import models
from . import wizard

View File

@ -0,0 +1,29 @@
{
"name": "Custom report field",
"summary": """Creates custom computed fields for reports""",
"description": """
Adds custom computed fields for reports.
Adds new tab with custom fields in report form, where custom fields can be
created. Here is possible write some python code for computing field's value,
and this field with computed value will be accessible in report template.
Also adds wizard where custom fields values can be validated before report
creation.
""",
"author": "RYDLAB",
"website": "https://rydlab.ru",
"category": "Technical",
"version": "19.0.2025.11.11",
"license": "LGPL-3",
"depends": ["base", "web", "report_monetary_helpers"],
"data": [
"security/ir.model.access.csv",
"views/ir_actions_report_views.xml",
"wizard/custom_report_field_values_wizard_views.xml",
],
"assets": {
"web.assets_backend": [
"custom_report_field/static/src/js/action_manager_report.js",
],
},
}

View File

@ -0,0 +1,297 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * custom_report_field
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-12-29 08:05+0000\n"
"PO-Revision-Date: 2022-12-29 08:05+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>UserError</code>, <code>Warning</code>: Warning Exceptions to use with"
" <code>raise</code>"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "<code>env</code>: Odoo Environment on which the action is triggered"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>format_number</code>: Method for formatting number representation in "
"report."
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>log(message, level='info')</code>: logging function to record debug "
"information in <code>ir.logging</code> table"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>model</code>: Odoo Model of the record on which the action is "
"triggered; is a void recordset"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>record</code>: record on which the action is triggered; may be be void"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>records</code>: recordset of all records on which the action is "
"triggered in multi mode; may be void"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>time</code>, <code>datetime</code>, <code>dateutil</code>, "
"<code>timezone</code>: useful Python libraries"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__default_value
msgid "Code"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "Computing field's value"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__create_uid
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__create_uid
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__create_uid
msgid "Created by"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__create_date
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__create_date
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__create_date
msgid "Created on"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "Custom fields"
msgstr ""
#. module: custom_report_field
#: model:ir.model,name:custom_report_field.model_custom_report_field
msgid "Custom report field"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__field_values_ids
msgid "Custom report field values"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_ir_actions_report__custom_report_field_ids
msgid "Custom report fields"
msgstr ""
#. module: custom_report_field
#: model:ir.model,name:custom_report_field.model_custom_report_field_values_wizard
#: model:ir.model,name:custom_report_field.model_custom_report_field_values_wizard_line
msgid "Custom report values field verify wizard"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__description
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__description
msgid "Description"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,help:custom_report_field.field_custom_report_field__description
msgid ""
"Description for this field to be showed in fields list in verify wizard."
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__display_name
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__display_name
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__display_name
msgid "Display Name"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"Example of Python code:<br/>\n"
" <code style=\"white-space: pre-wrap;\">\n"
" partner_rec = env['res.partner'].search([('name', '=' record.name)])<br/>\n"
" value = partner_rec.parent_id.vat if partner_rec else \"\"<br/>\n"
" </code>"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.custom_report_values_wizard_view_form
msgid "Get report"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "Help"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "Help with Python code"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__id
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__id
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__id
msgid "ID"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,help:custom_report_field.field_custom_report_field__required
msgid ""
"If checked, it will not be possible to generate a document without a default"
" value."
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"It's signature: <code>format_number(number, r_acc, dec_sep, div_by_3)</code><br/>\n"
" Param <code>number</code> - <code>int</code> or <code>float</code> to represent,<br/>\n"
" Param <code>r_acc</code> - <code>int</code> is round accuracy, default value is <code>2</code><br/>\n"
" Param <code>dec_sep</code> - <code>str</code> is decimal separator, default value is <code>,</code><br/>\n"
" Param <code>div_by_3</code> - <code>bool</code> is flag for add whitespase separators after each 3 digits id integer part. Default value is <code>True</code><br/>\n"
" Returns number as <code>str</code>.<br/>"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field____last_update
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard____last_update
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line____last_update
msgid "Last Modified on"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__write_uid
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__write_uid
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__write_uid
msgid "Last Updated by"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__write_date
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__write_date
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__write_date
msgid "Last Updated on"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__name
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__name
msgid "Name"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,help:custom_report_field.field_custom_report_field__technical_name
msgid "Name for using in templates"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__ir_actions_report_id
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__ir_actions_report_id
msgid "Report"
msgstr ""
#. module: custom_report_field
#: model:ir.model,name:custom_report_field.model_ir_actions_report
msgid "Report Action"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.custom_report_values_wizard_view_form
msgid "Report values"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__required
msgid "Required"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__sequence
msgid "Sequence"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__visible
msgid "Show in wizard"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__technical_name
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__technical_name
msgid "Technical Name"
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "The following variables can be used:"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,help:custom_report_field.field_custom_report_field__default_value
msgid ""
"This field contains a Python code which can use the same variables as the "
"'code' field in the server action, except moment that the computation result"
" should be assigned into the 'value' variable.Also available method "
"'format_number' for formatting numbers representation in report. Returns "
"number as string."
msgstr ""
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "To return a value, assign: <code>value = ...</code>"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,help:custom_report_field.field_custom_report_field__visible
msgid "To show this field in fields list in verification wizard."
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_ir_actions_report__validate_custom_report_field
msgid "Validate Custom Report Field"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__value
msgid "Value"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__wizard_id
msgid "Wizard"
msgstr ""

View File

@ -0,0 +1,331 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * custom_report_field
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-12-29 08:06+0000\n"
"PO-Revision-Date: 2022-12-29 08:06+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>UserError</code>, <code>Warning</code>: Warning Exceptions to use with"
" <code>raise</code>"
msgstr ""
"<code>UserError</code>, <code>Warning</code>: Исключение для использования с"
" <code>raise</code>"
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "<code>env</code>: Odoo Environment on which the action is triggered"
msgstr "<code>env</code>: Окружение Odoo, на котором вызывается action."
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>format_number</code>: Method for formatting number representation in "
"report."
msgstr ""
"<code>format_number</code>: Метод для форматирования числовых представлений в "
"отчете."
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>log(message, level='info')</code>: logging function to record debug "
"information in <code>ir.logging</code> table"
msgstr ""
"<code>log(message, level='info')</code>: Метод логирования для записи "
"отладочной информации<code>ir.logging</code> table"
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>model</code>: Odoo Model of the record on which the action is "
"triggered; is a void recordset"
msgstr ""
"<code>model</code>: Модель записи Odoo, на которой вызван action; Является "
"пустым множеством записей."
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>record</code>: record on which the action is triggered; may be be void"
msgstr ""
"<code>record</code>: Запись, на которой вызван action; Может быть пустой."
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>records</code>: recordset of all records on which the action is "
"triggered in multi mode; may be void"
msgstr ""
"<code>records</code>: Множество записей, на которых вызван action в режиме "
"нескольких записей; Может быть пустым."
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"<code>time</code>, <code>datetime</code>, <code>dateutil</code>, "
"<code>timezone</code>: useful Python libraries"
msgstr ""
"<code>time</code>, <code>datetime</code>, <code>dateutil</code>, "
"<code>timezone</code>: полезные библиотеки Python"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__default_value
msgid "Code"
msgstr "Код"
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "Computing field's value"
msgstr "Вычисление значения поля"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__create_uid
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__create_uid
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__create_uid
msgid "Created by"
msgstr "Создал"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__create_date
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__create_date
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__create_date
msgid "Created on"
msgstr "Создан"
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "Custom fields"
msgstr "Пользовательские поля"
#. module: custom_report_field
#: model:ir.model,name:custom_report_field.model_custom_report_field
msgid "Custom report field"
msgstr "Пользовательское поле отчета"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__field_values_ids
msgid "Custom report field values"
msgstr "Значения пользовательских полей отчета"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_ir_actions_report__custom_report_field_ids
msgid "Custom report fields"
msgstr "Пользовательские поля отчета"
#. module: custom_report_field
#: model:ir.model,name:custom_report_field.model_custom_report_field_values_wizard
#: model:ir.model,name:custom_report_field.model_custom_report_field_values_wizard_line
msgid "Custom report values field verify wizard"
msgstr "Мастер проверки значений пользовательских полей отчета"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__description
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__description
msgid "Description"
msgstr "Описание"
#. module: custom_report_field
#: model:ir.model.fields,help:custom_report_field.field_custom_report_field__description
msgid ""
"Description for this field to be showed in fields list in verify wizard."
msgstr ""
"Описание для поля, которое будет отображаться в списке полей мастера "
"проверки."
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__display_name
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__display_name
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__display_name
msgid "Display Name"
msgstr "Отображаемое имя"
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"Example of Python code:<br/>\n"
" <code style=\"white-space: pre-wrap;\">\n"
" partner_rec = env['res.partner'].search([('name', '=' record.name)])<br/>\n"
" value = partner_rec.parent_id.vat if partner_rec else \"\"<br/>\n"
" </code>"
msgstr ""
"Пример кода Python:<br/>\n"
" <code style=\"white-space: pre-wrap;\">\n"
" partner_rec = env['res.partner'].search([('name', '=' record.name)])<br/>\n"
" value = partner_rec.parent_id.vat if partner_rec else \"\"<br/> \n"
" </code>"
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.custom_report_values_wizard_view_form
msgid "Get report"
msgstr "Получить отчет"
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "Help"
msgstr "Помощь"
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "Help with Python code"
msgstr "Помощь с кодом Python"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__id
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__id
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__id
msgid "ID"
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,help:custom_report_field.field_custom_report_field__required
msgid ""
"If checked, it will not be possible to generate a document without a default"
" value."
msgstr ""
"Если отмечено, то невозможно будет сгенерировать документ без значения для "
"этого поля."
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid ""
"It's signature: <code>format_number(number, r_acc, dec_sep, div_by_3)</code><br/>\n"
" Param <code>number</code> - <code>int</code> or <code>float</code> to represent,<br/>\n"
" Param <code>r_acc</code> - <code>int</code> is round accuracy, default value is <code>2</code><br/>\n"
" Param <code>dec_sep</code> - <code>str</code> is decimal separator, default value is <code>,</code><br/>\n"
" Param <code>div_by_3</code> - <code>bool</code> is flag for add whitespase separators after each 3 digits id integer part. Default value is <code>True</code><br/>\n"
" Returns number as <code>str</code>.<br/>"
msgstr ""
"Сигнатура: <code>format_number(number, r_acc, dec_sep, div_by_3)</code><br/>\n"
" Param <code>number</code> - <code>int</code> или <code>float</code> число для отображения,<br/>\n"
" Param <code>r_acc</code> - <code>int</code> точность округления, по умолчанию <code>2</code> знака,<br/>\n"
" Param <code>dec_sep</code> - <code>str</code> разделитель для десятичной части, по умолчанию <code>,</code>,<br/>\n"
" Param <code>div_by_3</code> - <code>bool</code> флаг для добавления пробелов между каждыми тремя цифрами числа в целой части. По умолчанию <code>True</code>,<br/>\n"
" Возвращает число как <code>str</code>.<br/>"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field____last_update
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard____last_update
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line____last_update
msgid "Last Modified on"
msgstr "Последнее изменение"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__write_uid
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__write_uid
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__write_uid
msgid "Last Updated by"
msgstr "Последний раз обновил"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__write_date
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__write_date
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__write_date
msgid "Last Updated on"
msgstr "Последнее обновление"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__name
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__name
msgid "Name"
msgstr "Имя"
#. module: custom_report_field
#: model:ir.model.fields,help:custom_report_field.field_custom_report_field__technical_name
msgid "Name for using in templates"
msgstr "Имя для использования в шаблонах"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__ir_actions_report_id
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard__ir_actions_report_id
msgid "Report"
msgstr "Отчет"
#. module: custom_report_field
#: model:ir.model,name:custom_report_field.model_ir_actions_report
msgid "Report Action"
msgstr "Отчет о действияx "
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.custom_report_values_wizard_view_form
msgid "Report values"
msgstr "Значения отчета"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__required
msgid "Required"
msgstr "Обязательно"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__sequence
msgid "Sequence"
msgstr "Последовательность"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__visible
msgid "Show in wizard"
msgstr "Видимость"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field__technical_name
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__technical_name
msgid "Technical Name"
msgstr "Техническое имя"
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "The following variables can be used:"
msgstr "Могут быть использованы следующие переменные:"
#. module: custom_report_field
#: model:ir.model.fields,help:custom_report_field.field_custom_report_field__default_value
msgid ""
"This field contains a Python code which can use the same variables as the "
"'code' field in the server action, except moment that the computation result"
" should be assigned into the 'value' variable.Also available method "
"'format_number' for formatting numbers representation in report. Returns "
"number as string."
msgstr ""
"Это поле - выражение на Python, которое может использовать те же переменные,"
" что и поле 'code' в серверных действиях, кроме момента, что результат "
"вычисления должен присваиваться в переменную 'value'. Так же, доступен метод"
" 'format_number' для форматирования представлений чисел в отчете. Возвращает"
" число как строку."
#. module: custom_report_field
#: model_terms:ir.ui.view,arch_db:custom_report_field.act_report_xml_inherit_view_form
msgid "To return a value, assign: <code>value = ...</code>"
msgstr ""
"Для возвращения значения выполните присвоение: <code>value = ...</code>"
#. module: custom_report_field
#: model:ir.model.fields,help:custom_report_field.field_custom_report_field__visible
msgid "To show this field in fields list in verification wizard."
msgstr ""
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_ir_actions_report__validate_custom_report_field
msgid "Validate Custom Report Field"
msgstr "Проверка пользовательского поля отчета"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__value
msgid "Value"
msgstr "Значение"
#. module: custom_report_field
#: model:ir.model.fields,field_description:custom_report_field.field_custom_report_field_values_wizard_line__wizard_id
msgid "Wizard"
msgstr "Мастер"

View File

@ -0,0 +1,2 @@
from . import custom_report_field
from . import ir_actions_report

View File

@ -0,0 +1,106 @@
# import logging
from odoo import api, exceptions, fields, models
from odoo.exceptions import ValidationError
from odoo.tools.safe_eval import safe_eval, test_python_expr
from odoo.addons.report_monetary_helpers.utils.format_number import format_number
# _logger = logging.getLogger(__name__)
class CustomReportField(models.Model):
_name = "custom.report.field"
_description = "Custom report field"
_order = "sequence"
ir_actions_report_id = fields.Many2one(
"ir.actions.report",
string="Report",
)
sequence = fields.Integer(
string="Sequence",
)
name = fields.Char(
string="Name",
required=True,
translate=True,
)
technical_name = fields.Char(
string="Technical Name",
help="Name for using in templates",
required=True,
)
default_value = fields.Text(
string="Code",
help="This field contains a Python code which can use the same variables as"
" the 'code' field in the server action, except moment that the computation"
" result should be assigned into the 'value' variable."
"Also available method 'format_number' for formatting numbers representation in report. Returns number as string.",
required=True,
default="# Write a code for computing value for this field\n# and assign it into 'value' variable.",
)
description = fields.Char(
string="Description",
help="Description for this field to be showed in fields list in verify wizard.",
translate=True,
default="",
)
required = fields.Boolean(
string="Required",
help="If checked, it will not be possible to generate a document without a default value.",
default=False,
)
visible = fields.Boolean(
string="Show in wizard",
help="To show this field in fields list in verification wizard.",
default=True,
)
@api.constrains("default_value")
def _check_default_value(self):
for rec in self.filtered("default_value"):
msg = test_python_expr(expr=rec.default_value.strip(), mode="exec")
if msg:
raise ValidationError(msg)
def _get_eval_context(self, action=None):
eval_context = self.env["ir.actions.actions"]._get_eval_context(action=action)
eval_context.update(self.env.context)
model_name = action.model_id.sudo().model
model = self.env[model_name]
record = None
records = None
if self._context.get("active_model") == model_name and self._context.get(
"active_id"
):
record = model.browse(self._context["active_id"])
if self._context.get("active_model") == model_name and self._context.get(
"active_ids"
):
records = model.browse(self._context["active_ids"])
eval_context.update(
{
# orm
"env": self.env,
"model": model,
# Exceptions
"Warning": exceptions.Warning,
"UserError": exceptions.UserError,
# record
"record": record,
"records": records,
# utils
"format_number": format_number,
}
)
return eval_context
def compute_value(self, report_rec):
_eval_context = self._get_eval_context(report_rec)
safe_eval(self.default_value.strip(), _eval_context, mode="exec", nocopy=True)
return (
_eval_context["value"]
if _eval_context.get("value", "key absent") != "key absent"
else ""
)

View File

@ -0,0 +1,59 @@
from odoo import api, fields, models
from odoo.exceptions import UserError
class IrActionsReport(models.Model):
_inherit = "ir.actions.report"
custom_report_field_ids = fields.One2many(
comodel_name="custom.report.field",
inverse_name="ir_actions_report_id",
string="Custom report fields",
)
validate_custom_report_field = fields.Boolean(
compute="_compute_validate_custom_report_field"
)
@api.depends("custom_report_field_ids")
def _compute_validate_custom_report_field(self):
self.validate_custom_report_field = bool(
self.custom_report_field_ids.filtered("visible")
)
def _get_readable_fields(self):
return super()._get_readable_fields() | {
"validate_custom_report_field",
}
def get_custom_report_field_values(self):
"""
Returns: dict with computed custom fields values.
"""
# Bunch reports creation not supported for a while.
self.ensure_one()
report_custom_field_ids = self.env["custom.report.field"].search(
[("ir_actions_report_id", "=", self.id)]
)
custom_report_field_values = {}
for field_rec in report_custom_field_ids:
field_value = field_rec.compute_value(self)
if field_rec.required and not field_value:
raise UserError(
"""Required custom field %s of the report is not filled. It's value: %s.
Fill it or remove "required" attribute if this value is ok."""
% (field_rec.name, field_value)
)
custom_report_field_values[field_rec.technical_name] = field_value
return custom_report_field_values
@api.model
def _get_rendering_context(self, report, docids, data):
"""
Redefined here to add custom report fields in context.
:param docids: source documents IDs list
:param data: dict containing current context
:return: dict, updated context.
"""
data = super()._get_rendering_context(report, docids, data)
data.update(report.get_custom_report_field_values())
return data

View File

@ -0,0 +1,4 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_custom_report_field","custom_report_field user","model_custom_report_field","base.group_user",1,1,1,1
"access_custom_report_field_values_wizard","custom_report_field_values_wizard user","model_custom_report_field_values_wizard",,1,1,1,1
"access_custom_report_field_values_wizard_line","custom_report_field_values_wizard_line user","model_custom_report_field_values_wizard_line",,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_custom_report_field custom_report_field user model_custom_report_field base.group_user 1 1 1 1
3 access_custom_report_field_values_wizard custom_report_field_values_wizard user model_custom_report_field_values_wizard 1 1 1 1
4 access_custom_report_field_values_wizard_line custom_report_field_values_wizard_line user model_custom_report_field_values_wizard_line 1 1 1 1

View File

@ -0,0 +1,40 @@
/** @odoo-module **/
import { registry } from "@web/core/registry";
/**
* Adds new handler for showing wizard with custom fields values for report.
*
* @returns {Promise<*>}
*/
async function customReportFieldWizardHandler(action, options, env) {
if (action.type === "ir.actions.report"
&& action.validate_custom_report_field
&& !action.context.report_values_validated) {
await env.services.action.doAction({
type: "ir.actions.act_window",
view_mode: "form",
views: [[false, "form"]],
res_model: "custom.report.field.values.wizard",
target: "new",
context: Object.assign(
{ "default_ir_actions_report_id": action.id },
action.context
),
});
return Promise.resolve(true);
}
else if (action.type === "ir.actions.report"
&& action.validate_custom_report_field
&& action.context.report_values_validated) {
return env.services.action.doAction({"type": "ir.actions.act_window_close"});
}
return Promise.resolve(false);
}
registry.category("ir.actions.report handlers").add(
"custom_report_field_wizard_handler",
customReportFieldWizardHandler,
{sequence: 10},
);

View File

@ -0,0 +1,78 @@
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<record id="act_report_xml_inherit_view_form" model="ir.ui.view">
<field name="name">ir.actions.report.inherit.view.form</field>
<field name="model">ir.actions.report</field>
<field name="inherit_id" ref="base.act_report_xml_view"/>
<field name="arch" type="xml">
<xpath expr="//page[@name='advanced']" position="after">
<page name="custom_report_field" string="Custom fields">
<field name="custom_report_field_ids">
<list>
<field name="ir_actions_report_id" invisible="1"/>
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="technical_name"/>
<field name="required" widget="boolean_toggle"/>
<field name="visible" widget="boolean_toggle"/>
</list>
<form>
<group>
<group>
<field name="name"/>
<field name="technical_name"/>
<field name="required" widget="boolean_toggle"/>
</group>
<group>
<field name="visible" widget="boolean_toggle"/>
<field name="description" widget="text"/>
</group>
</group>
<notebook>
<page string="Computing field's value">
<field name="default_value" widget="ace" options="{'mode': 'python'}"/>
</page>
<page string="Help">
<div style="margin-top: 4px;">
<h3>Help with Python code</h3>
<p>The following variables can be used:</p>
<ul>
<li><code>env</code>: Odoo Environment on which the action is triggered</li>
<li><code>model</code>: Odoo Model of the record on which the action is triggered; is a void recordset</li>
<li><code>record</code>: record on which the action is triggered; may be be void</li>
<li><code>records</code>: recordset of all records on which the action is triggered in multi mode; may be void</li>
<li><code>time</code>, <code>datetime</code>, <code>dateutil</code>, <code>timezone</code>: useful Python libraries</li>
<li><code>log(message, level='info')</code>: logging function to record debug information in <code>ir.logging</code> table</li>
<li><code>UserError</code>, <code>Warning</code>: Warning Exceptions to use with <code>raise</code></li>
<li><code>format_number</code>: Method for formatting number representation in report.
<div style="padding-left: 10px;">
It's signature: <code>format_number(number, r_acc, dec_sep, div_by_3)</code><br/>
Param <code>number</code> - <code>int</code> or <code>float</code> to represent,<br/>
Param <code>r_acc</code> - <code>int</code> is round accuracy, default value is <code>2</code><br/>
Param <code>dec_sep</code> - <code>str</code> is decimal separator, default value is <code>,</code><br/>
Param <code>div_by_3</code> - <code>bool</code> is flag for add whitespase separators after each 3 digits id integer part. Default value is <code>True</code><br/>
Returns number as <code>str</code>.<br/>
</div>
</li>
<li>To return a value, assign: <code>value = ...</code></li>
</ul>
<div>
Example of Python code:<br/>
<code style="white-space: pre-wrap;">
partner_rec = env['res.partner'].search([('name', '=' record.name)])<br/>
value = partner_rec.parent_id.vat if partner_rec else ""<br/>
</code>
</div>
</div>
</page>
</notebook>
</form>
</field>
</page>
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1 @@
from . import custom_report_field_values_wizard

View File

@ -0,0 +1,95 @@
from odoo import api, fields, models
from odoo.addons.web.controllers.utils import clean_action
from odoo.exceptions import ValidationError
class CustomReportFieldValuesWizard(models.TransientModel):
_name = "custom.report.field.values.wizard"
_description = "Custom report values field verify wizard"
ir_actions_report_id = fields.Many2one(
"ir.actions.report",
string="Report",
)
field_values_ids = fields.One2many(
comodel_name="custom.report.field.values.wizard.line",
inverse_name="wizard_id",
string="Custom report field values",
)
def _check_records_amount(self):
"""
Checks source records for report generation. If more than one - raise error.
"""
active_model = self._context.get("active_model")
if active_model:
record_id = self.env[active_model].browse(self._context.get("active_id"))
record_ids = self.env[active_model].browse(self._context.get("active_ids"))
records_for_report = record_id | record_ids
if len(records_for_report) > 1:
raise ValidationError(
"Reports with custom fields do not supports bunch report generation.\nPrint them one at a time."
)
@api.onchange("ir_actions_report_id")
def _onchange_ir_actions_report_id(self):
self._check_records_amount()
custom_values_for_report = self.env["custom.report.field"].search(
[
("ir_actions_report_id", "=", self.ir_actions_report_id.id),
("visible", "=", True),
]
)
self.field_values_ids = [
(
6,
False,
self.env["custom.report.field.values.wizard.line"]
.create(
[
{
"name": field_rec.name,
"value": field_rec.compute_value(self.ir_actions_report_id),
"technical_name": field_rec.technical_name,
"description": field_rec.description,
}
for field_rec in custom_values_for_report
]
)
.ids,
)
]
def get_report(self):
self.ensure_one()
cleaned_report = False
action_id = self.ir_actions_report_id.id
ctx = dict(self._context)
ctx.update({"report_values_validated": True})
report = self.env["ir.actions.report"].sudo().browse([action_id]).read()
if report:
cleaned_report = clean_action(report[0], env=self.env)
cleaned_report["context"] = ctx
return cleaned_report
class CustomReportFieldValuesWizardLine(models.TransientModel):
_name = "custom.report.field.values.wizard.line"
_description = "Custom report values field verify wizard"
wizard_id = fields.Many2one(
"custom.report.field.values.wizard",
)
name = fields.Char(
string="Name",
)
value = fields.Char(
string="Value",
)
technical_name = fields.Char(
string="Technical Name",
)
description = fields.Char(
string="Description",
)

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="custom_report_values_wizard_view_form" model="ir.ui.view">
<field name="name">Verify report values</field>
<field name="model">custom.report.field.values.wizard</field>
<field name="arch" type="xml">
<form create="0" delete="0">
<group string="Report values">
<field name="ir_actions_report_id" invisible="1"/>
<field name="field_values_ids" nolabel="1" colspan="4" readonly="1" view_mode="list">
<list>
<field name="name"/>
<field name="value"/>
<field name="description"/>
<field name="technical_name" invisible="1"/>
</list>
</field>
</group>
<footer>
<button name="get_report" type="object" string="Get report"/>
</footer>
</form>
</field>
</record>
</odoo>