trytond 8.2.0__tar.gz → 8.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {trytond-8.2.0 → trytond-8.2.2}/PKG-INFO +1 -1
- {trytond-8.2.0 → trytond-8.2.2}/trytond/__init__.py +1 -1
- {trytond-8.2.0 → trytond-8.2.2}/trytond/application.py +4 -1
- {trytond-8.2.0 → trytond-8.2.2}/trytond/cache.py +3 -1
- {trytond-8.2.0 → trytond-8.2.2}/trytond/config.py +1 -1
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/cron.py +1 -1
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/model.py +9 -6
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/resource.py +1 -1
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/modelstorage.py +8 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/pool.py +1 -1
- {trytond-8.2.0 → trytond-8.2.2}/trytond/report/report.py +9 -9
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/resource.py +3 -3
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_tools.py +57 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_wizard.py +73 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/wizard.py +5 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/wizard.xml +6 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/wizard/wizard.py +20 -4
- {trytond-8.2.0 → trytond-8.2.2}/.hgignore +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/COPYRIGHT +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/LICENSE +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/hatch_build.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/pyproject.toml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/_safe_genshi.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/admin.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/database.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/postgresql/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/postgresql/database.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/postgresql/init.sql +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/postgresql/table.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/sqlite/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/sqlite/database.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/sqlite/init.sql +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/sqlite/table.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/table.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/bus.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/__main__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/admin.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/console.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/cron.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/stat.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/worker.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/commandline.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/console.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/const.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/convert.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/cron.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/exceptions.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/filestore.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/i18n.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/action.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/action.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/attachment.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/attachment.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/avatar.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/cache.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/calendar_.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/calendar_.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/chat.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/chat.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/configuration.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/cron.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/date.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/email.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/email_.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/error.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/error.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/exceptions.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/export.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/export.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/filestore.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/filestore.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/fonts/LICENSE +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/fonts/karla.ttf +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/lang.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/lang.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/bg.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/ca.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/cs.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/de.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/es.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/es_419.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/et.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/fa.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/fi.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/fr.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/hu.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/id.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/it.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/lo.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/lt.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/nl.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/pl.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/pt.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/ro.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/ru.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/sl.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/tr.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/uk.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/zh_CN.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/message.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/message.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/model.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/module.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/module.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/note.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/note.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/queue.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/queue_.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/routes.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/rule.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/rule.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/sequence.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/sequence.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/session.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/translation.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/translation.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/trigger.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/trigger.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/tryton.cfg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/board.rnc +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/calendar.rnc +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/form.rnc +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/graph.rnc +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icon.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icon.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/LICENSE +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-board.svg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-calendar.svg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-folder.svg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-form.svg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-graph.svg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-list-form.svg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-list.svg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-settings.svg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-tree.svg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/menu.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/menu.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/tree.rnc +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/ui.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/view.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/view.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_domain_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_domain_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_domain_list2.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_view_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_view_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_view_list2.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_keyword_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_keyword_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_report_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_report_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_url_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_url_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_wizard_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_wizard_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/attachment_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/attachment_form_preview.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/attachment_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_channel_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_channel_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_follower_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_follower_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_message_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_message_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/cron_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/cron_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/cron_log_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/cron_log_graph.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/cron_log_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/email_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/email_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/email_template_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/email_template_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/error_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/error_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/export_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/export_line_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/export_line_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/export_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/icon_view_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/icon_view_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/lang_config_start_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/lang_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/lang_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/message_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/message_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_access_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_access_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_click_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_click_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_rule_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_rule_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_field_access_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_field_access_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_field_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_field_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_log_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_log_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_print_model_graph_start_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_activate_upgrade_done_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_activate_upgrade_start_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_config_start_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_config_wizard_done_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_config_wizard_first_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_config_wizard_item_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_config_wizard_other_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_dependency_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_dependency_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/note_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/note_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/rule_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/rule_group_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/rule_group_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/rule_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/sequence_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/sequence_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/sequence_type_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/sequence_type_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_clean_start_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_clean_succeed_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_export_result_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_export_start_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_set_start_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_set_succeed_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_update_start_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/trigger_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/trigger_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_menu_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_menu_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_menu_tree.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_list_extension.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_search_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_search_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_optional_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_optional_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_state_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_state_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_width_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_width_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/active.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/avatar.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/chat.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/descriptors.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/dictschema.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/digits.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/exceptions.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/binary.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/boolean.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/char.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/date.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/dict.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/field.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/float.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/fmany2one.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/function.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/integer.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/many2many.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/many2one.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/multiselection.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/numeric.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/one2many.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/one2one.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/reference.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/selection.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/text.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/match.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/model.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/modelsingleton.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/modelsql.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/modelview.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/multivalue.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/order.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/symbol.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/tree.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/union.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/model/workflow.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/modules/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/dispatcher.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/jsonrpc.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/rest.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/wrappers.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/xmlrpc.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/pyson.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/report/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/email_reset_password.html +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/exceptions.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/group.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/group.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/ir.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/bg.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/ca.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/cs.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/de.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/es.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/es_419.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/et.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/fa.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/fi.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/fr.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/hu.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/id.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/it.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/lo.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/lt.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/nl.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/pl.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/pt.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/ro.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/ru.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/sl.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/tr.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/uk.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/zh_CN.po +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/message.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/notification.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/notification.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/res.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/routes.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/tryton.cfg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/user.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/user.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/group_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/group_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/notification_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/notification_form_admin.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/notification_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_application_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_application_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_config_start_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_form_preferences.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_list.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_warning_form.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_warning_tree.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/routing.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/rpc.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/security.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/sendmail.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/sql/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/sql/functions.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/sql/operators.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/status.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/access.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/chat.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/copy_.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/export_data.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_binary.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_boolean.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_char.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_context.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_date.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_datetime.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_dict.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_float.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_fmany2one.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_function.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_function.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_integer.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_many2many.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_many2one.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_multiselection.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_numeric.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_one2many.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_one2one.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_reference.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_selection.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_text.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_time.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_timedelta.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/forbidden.txt +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/history.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/import_data.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/message.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/mixin.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/model.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/model_log.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/modelsql.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/modelstorage.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/modelview.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/modelview.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/mptt.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/multivalue.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/path.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/report.mjml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/report.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/report.txt +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/report.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/routing.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/rule.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/sequence.xml +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_access.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_backend.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_bus.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_cache.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_chat.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_copy.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_descriptors.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_exportdata.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_binary.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_boolean.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_char.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_context.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_date.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_datetime.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_depends.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_dict.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_float.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_fmany2one.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_function.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_integer.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_many2many.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_many2one.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_multiselection.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_numeric.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_one2many.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_one2one.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_reference.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_selection.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_text.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_time.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_timedelta.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_filestore.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_genshi.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_history.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_i18n.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_importdata.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_ir.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_mixins.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_model.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_model_index.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_model_log.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_model_match.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_modelsingleton.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_modelsql.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_modelstorage.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_modelview.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_module_register.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_mptt.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_multivalue.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_order.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_path.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_protocols.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_pyson.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_report.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_res.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_resource.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_rest.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_routing.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_rpc.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_rule.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_security.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_sendmail.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_sequence.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_transaction.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_tree.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_trigger.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_tryton.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_union.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_user.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_workflow.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_wsgi.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/tools.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/tree.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/trigger.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/tryton.cfg +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/workflow.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/barcode.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/chart.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/decimal_.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/domain_inversion.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/email_.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/gevent.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/immutabledict.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/logging.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/misc.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/multiprocessing.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/qrcode.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/singleton.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/string_.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/timezone.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/transaction.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/tryton.rnc +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/url.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/wizard/__init__.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/worker.py +0 -0
- {trytond-8.2.0 → trytond-8.2.2}/trytond/wsgi.py +0 -0
|
@@ -46,4 +46,7 @@ if db_names:
|
|
|
46
46
|
for thread in threads:
|
|
47
47
|
thread.join()
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
if len(threads := threading.enumerate()) != 1:
|
|
50
|
+
raise RuntimeError(
|
|
51
|
+
f"There are {len(threads)} threads running after initializing"
|
|
52
|
+
" the Pool")
|
|
@@ -256,6 +256,8 @@ class MemoryCache(BaseCache):
|
|
|
256
256
|
|
|
257
257
|
@classmethod
|
|
258
258
|
def sync(cls, transaction):
|
|
259
|
+
if not Pool().ready:
|
|
260
|
+
return
|
|
259
261
|
if cls._clean_last is None:
|
|
260
262
|
cls._clean_last = dt.datetime.now()
|
|
261
263
|
return
|
|
@@ -298,7 +300,7 @@ class MemoryCache(BaseCache):
|
|
|
298
300
|
cls._clean_last = dt.datetime.now()
|
|
299
301
|
|
|
300
302
|
def sync_since(self, value):
|
|
301
|
-
return self._clean_last > value
|
|
303
|
+
return self._clean_last is not None and self._clean_last > value
|
|
302
304
|
|
|
303
305
|
@classmethod
|
|
304
306
|
def commit(cls, transaction):
|
|
@@ -104,7 +104,7 @@ class TrytonConfigParser(configparser.ConfigParser):
|
|
|
104
104
|
self.add_section('bus')
|
|
105
105
|
self.set('bus', 'allow_subscribe', 'False')
|
|
106
106
|
self.set('bus', 'long_polling_timeout', str(5 * 60))
|
|
107
|
-
self.set('bus', 'cache_timeout',
|
|
107
|
+
self.set('bus', 'cache_timeout', str(5 * 60))
|
|
108
108
|
self.set('bus', 'select_timeout', '5')
|
|
109
109
|
self.add_section('report')
|
|
110
110
|
self.add_section('html')
|
|
@@ -36,7 +36,7 @@ def str2bigint(s):
|
|
|
36
36
|
class Cron(DeactivableMixin, ModelSQL, ModelView):
|
|
37
37
|
__name__ = "ir.cron"
|
|
38
38
|
_states = {
|
|
39
|
-
'editable': Eval('running', False),
|
|
39
|
+
'editable': ~Eval('running', False),
|
|
40
40
|
}
|
|
41
41
|
interval_number = fields.Integer(
|
|
42
42
|
"Interval Number", required=True, states=_states)
|
|
@@ -166,15 +166,18 @@ class Model(
|
|
|
166
166
|
and model._on_change_notify_depends}
|
|
167
167
|
|
|
168
168
|
@classmethod
|
|
169
|
-
def get_name_items(cls, classes=None):
|
|
169
|
+
def get_name_items(cls, classes=None, *other_classes):
|
|
170
170
|
"Return a list of couple mapping models to names"
|
|
171
171
|
pool = Pool()
|
|
172
|
-
key = 'items', str(classes)
|
|
172
|
+
key = 'items', str(classes), str(other_classes)
|
|
173
173
|
items = cls._get_names_cache.get(key)
|
|
174
174
|
if items is None:
|
|
175
175
|
models = cls.search([])
|
|
176
176
|
items = ((m.name, m.string) for m in models)
|
|
177
|
+
all_classes = list(other_classes)
|
|
177
178
|
if classes:
|
|
179
|
+
all_classes.append(classes)
|
|
180
|
+
if all_classes:
|
|
178
181
|
def pool_get(model):
|
|
179
182
|
# During update existing model may not yet be in the pool
|
|
180
183
|
try:
|
|
@@ -183,17 +186,17 @@ class Model(
|
|
|
183
186
|
return object
|
|
184
187
|
items = (
|
|
185
188
|
(m, n) for m, n in items
|
|
186
|
-
if issubclass(pool_get(m),
|
|
189
|
+
if all(issubclass(pool_get(m), k) for k in all_classes))
|
|
187
190
|
items = cls._get_names_cache.set(key, list(items))
|
|
188
191
|
return list(items)
|
|
189
192
|
|
|
190
193
|
@classmethod
|
|
191
|
-
def get_names(cls, classes=None):
|
|
194
|
+
def get_names(cls, classes=None, *other_classes):
|
|
192
195
|
"Return a dictionary mapping models to names"
|
|
193
|
-
key = 'dict', str(classes)
|
|
196
|
+
key = 'dict', str(classes), str(other_classes)
|
|
194
197
|
dict_ = cls._get_names_cache.get(key)
|
|
195
198
|
if dict_ is None:
|
|
196
|
-
dict_ = dict(cls.get_name_items(classes=classes))
|
|
199
|
+
dict_ = dict(cls.get_name_items(classes=classes, *other_classes))
|
|
197
200
|
dict_ = cls._get_names_cache.set(key, dict_)
|
|
198
201
|
return dict_
|
|
199
202
|
|
|
@@ -49,7 +49,7 @@ class ResourceAccessMixin(ModelStorage):
|
|
|
49
49
|
pool = Pool()
|
|
50
50
|
Model = pool.get('ir.model')
|
|
51
51
|
ModelAccess = pool.get('ir.model.access')
|
|
52
|
-
models = Model.get_name_items((ModelStorage, ModelView))
|
|
52
|
+
models = Model.get_name_items((ModelStorage,), (ModelView,))
|
|
53
53
|
if Transaction().check_access:
|
|
54
54
|
access = ModelAccess.get_access([m for m, _ in models])
|
|
55
55
|
models = [(m, n) for m, n in models if access[m]['read']]
|
|
@@ -736,6 +736,14 @@ class ModelStorage(Model):
|
|
|
736
736
|
values = {
|
|
737
737
|
d['id']: d for d in cls.read(ids, fields_names=fields_names)}
|
|
738
738
|
default_values = cls.default_get(fields_names, with_rec_name=False)
|
|
739
|
+
|
|
740
|
+
if Transaction().check_access:
|
|
741
|
+
# force default value to skip access rights
|
|
742
|
+
for field_name, field in fields_.items():
|
|
743
|
+
if field.readonly:
|
|
744
|
+
default.setdefault(
|
|
745
|
+
field_name, default_values.get(field_name))
|
|
746
|
+
|
|
739
747
|
to_create = []
|
|
740
748
|
for id_ in ids:
|
|
741
749
|
data = convert_data(fields_, values[id_], default_values)
|
|
@@ -452,15 +452,15 @@ class Report(URLMixin, PoolBase):
|
|
|
452
452
|
'--convert-to "%(output_extension)s" '
|
|
453
453
|
'--outdir "%(directory)s" '
|
|
454
454
|
'"%(input_path)s"')
|
|
455
|
-
args = map(lambda s: s % {
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
455
|
+
args = list(map(lambda s: s % {
|
|
456
|
+
'directory': directory,
|
|
457
|
+
'input_format': input_format,
|
|
458
|
+
'input_extension': input_extension,
|
|
459
|
+
'input_path': input_path,
|
|
460
|
+
'output_format': output_format,
|
|
461
|
+
'output_extension': output_extension,
|
|
462
|
+
'output_path': output_path,
|
|
463
|
+
}, shlex.split(cmd)))
|
|
464
464
|
for count in range(retry, -1, -1):
|
|
465
465
|
if count != retry:
|
|
466
466
|
time.sleep(0.02 * (retry - count))
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
2
2
|
# this repository contains the full copyright notices and license terms.
|
|
3
3
|
from trytond.ir.note import NoteCopyMixin
|
|
4
|
-
from trytond.model import ModelSQL
|
|
4
|
+
from trytond.model import ModelSQL, ModelView
|
|
5
5
|
from trytond.pool import Pool
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class TestResource(ModelSQL, NoteCopyMixin):
|
|
8
|
+
class TestResource(ModelSQL, ModelView, NoteCopyMixin):
|
|
9
9
|
__name__ = 'test.resource'
|
|
10
10
|
|
|
11
11
|
@classmethod
|
|
@@ -13,7 +13,7 @@ class TestResource(ModelSQL, NoteCopyMixin):
|
|
|
13
13
|
return {'test.resource.other'}
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
class TestResourceOther(ModelSQL):
|
|
16
|
+
class TestResourceOther(ModelSQL, ModelView):
|
|
17
17
|
__name__ = 'test.resource.other'
|
|
18
18
|
|
|
19
19
|
|
|
@@ -919,6 +919,63 @@ class DomainInversionTestCase(TestCase):
|
|
|
919
919
|
unique_value(domain, single_value=False), (False, None, None))
|
|
920
920
|
|
|
921
921
|
def test_evaldomain(self):
|
|
922
|
+
|
|
923
|
+
domain = [['x', '=', 42]]
|
|
924
|
+
self.assertTrue(eval_domain(domain, {'x': 42}))
|
|
925
|
+
self.assertTrue(eval_domain(domain, {'x': Decimal('42')}))
|
|
926
|
+
self.assertFalse(eval_domain(domain, {'x': 0}))
|
|
927
|
+
self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
|
|
928
|
+
self.assertFalse(eval_domain(domain, {'x': None}))
|
|
929
|
+
|
|
930
|
+
domain = [['x', '=', Decimal('42')]]
|
|
931
|
+
self.assertTrue(eval_domain(domain, {'x': 42}))
|
|
932
|
+
self.assertTrue(eval_domain(domain, {'x': Decimal('42')}))
|
|
933
|
+
self.assertFalse(eval_domain(domain, {'x': 0}))
|
|
934
|
+
self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
|
|
935
|
+
self.assertFalse(eval_domain(domain, {'x': None}))
|
|
936
|
+
|
|
937
|
+
domain = [['x', '=', 0]]
|
|
938
|
+
self.assertTrue(eval_domain(domain, {'x': 0}))
|
|
939
|
+
self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
|
|
940
|
+
self.assertFalse(eval_domain(domain, {'x': None}))
|
|
941
|
+
|
|
942
|
+
domain = [['x', '=', Decimal('0')]]
|
|
943
|
+
self.assertTrue(eval_domain(domain, {'x': 0}))
|
|
944
|
+
self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
|
|
945
|
+
self.assertFalse(eval_domain(domain, {'x': None}))
|
|
946
|
+
|
|
947
|
+
domain = [['x', '=', None]]
|
|
948
|
+
self.assertFalse(eval_domain(domain, {'x': 0}))
|
|
949
|
+
self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
|
|
950
|
+
self.assertTrue(eval_domain(domain, {'x': None}))
|
|
951
|
+
|
|
952
|
+
domain = [['x', '!=', 42]]
|
|
953
|
+
self.assertFalse(eval_domain(domain, {'x': 42}))
|
|
954
|
+
self.assertFalse(eval_domain(domain, {'x': Decimal('42')}))
|
|
955
|
+
self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
|
|
956
|
+
self.assertTrue(eval_domain(domain, {'x': None}))
|
|
957
|
+
|
|
958
|
+
domain = [['x', '!=', Decimal('42')]]
|
|
959
|
+
self.assertFalse(eval_domain(domain, {'x': 42}))
|
|
960
|
+
self.assertFalse(eval_domain(domain, {'x': Decimal('42')}))
|
|
961
|
+
self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
|
|
962
|
+
self.assertTrue(eval_domain(domain, {'x': None}))
|
|
963
|
+
|
|
964
|
+
domain = [['x', '!=', 0]]
|
|
965
|
+
self.assertFalse(eval_domain(domain, {'x': 0}))
|
|
966
|
+
self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
|
|
967
|
+
self.assertTrue(eval_domain(domain, {'x': None}))
|
|
968
|
+
|
|
969
|
+
domain = [['x', '!=', Decimal('0')]]
|
|
970
|
+
self.assertFalse(eval_domain(domain, {'x': 0}))
|
|
971
|
+
self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
|
|
972
|
+
self.assertTrue(eval_domain(domain, {'x': None}))
|
|
973
|
+
|
|
974
|
+
domain = [['x', '!=', None]]
|
|
975
|
+
self.assertTrue(eval_domain(domain, {'x': 0}))
|
|
976
|
+
self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
|
|
977
|
+
self.assertFalse(eval_domain(domain, {'x': None}))
|
|
978
|
+
|
|
922
979
|
domain = [['x', '>', 5]]
|
|
923
980
|
self.assertTrue(eval_domain(domain, {'x': 6}))
|
|
924
981
|
self.assertFalse(eval_domain(domain, {'x': 4}))
|
|
@@ -30,6 +30,22 @@ class WizardTestCase(DBTestCase):
|
|
|
30
30
|
session_id, _, _ = Wizard.create()
|
|
31
31
|
Wizard.delete(session_id)
|
|
32
32
|
|
|
33
|
+
@with_transaction()
|
|
34
|
+
def test_delete_different_user(self):
|
|
35
|
+
"Delete session from a different user"
|
|
36
|
+
pool = Pool()
|
|
37
|
+
Wizard = pool.get('test.test_wizard', type='wizard')
|
|
38
|
+
User = pool.get('res.user')
|
|
39
|
+
|
|
40
|
+
user = User(login='foo')
|
|
41
|
+
user.save()
|
|
42
|
+
|
|
43
|
+
session_id, _, _ = Wizard.create()
|
|
44
|
+
|
|
45
|
+
with Transaction().set_user(user.id):
|
|
46
|
+
with self.assertRaises(AccessError):
|
|
47
|
+
Wizard.delete(session_id)
|
|
48
|
+
|
|
33
49
|
@with_transaction()
|
|
34
50
|
def test_session(self):
|
|
35
51
|
'Session Wizard'
|
|
@@ -89,6 +105,22 @@ class WizardTestCase(DBTestCase):
|
|
|
89
105
|
with self.assertRaises(AccessError):
|
|
90
106
|
session_id, start_state, end_state = Wizard.create()
|
|
91
107
|
|
|
108
|
+
@with_transaction()
|
|
109
|
+
def test_session_different_user(self):
|
|
110
|
+
"Use session from a different user"
|
|
111
|
+
pool = Pool()
|
|
112
|
+
Wizard = pool.get('test.test_wizard', type='wizard')
|
|
113
|
+
User = pool.get('res.user')
|
|
114
|
+
|
|
115
|
+
user = User(login='foo')
|
|
116
|
+
user.save()
|
|
117
|
+
|
|
118
|
+
session_id, _, _ = Wizard.create()
|
|
119
|
+
|
|
120
|
+
with Transaction().set_user(user.id):
|
|
121
|
+
with self.assertRaises(AccessError):
|
|
122
|
+
Wizard(session_id)
|
|
123
|
+
|
|
92
124
|
@with_transaction()
|
|
93
125
|
def test_execute(self):
|
|
94
126
|
'Execute Wizard'
|
|
@@ -204,3 +236,44 @@ class WizardTestCase(DBTestCase):
|
|
|
204
236
|
with Transaction().set_context(
|
|
205
237
|
active_model='test.test_wizard.start'):
|
|
206
238
|
Wizard.execute(session_id, {}, start_state)
|
|
239
|
+
|
|
240
|
+
@with_transaction(context={'_check_access': True})
|
|
241
|
+
def test_execute_without_model(self):
|
|
242
|
+
"Execute wizard without model"
|
|
243
|
+
pool = Pool()
|
|
244
|
+
Wizard = pool.get('test.test_wizard_no_model', type='wizard')
|
|
245
|
+
User = pool.get('res.user')
|
|
246
|
+
|
|
247
|
+
user = User(login='foo')
|
|
248
|
+
user.save()
|
|
249
|
+
session_id, start_state, end_state = Wizard.create()
|
|
250
|
+
|
|
251
|
+
with Transaction().set_user(user.id):
|
|
252
|
+
with self.assertRaises(AccessError):
|
|
253
|
+
Wizard.execute(session_id, {}, start_state)
|
|
254
|
+
|
|
255
|
+
@with_transaction(context={'_check_access': True})
|
|
256
|
+
def test_execute_without_model_with_group(self):
|
|
257
|
+
"Execute wizard without model and groups"
|
|
258
|
+
pool = Pool()
|
|
259
|
+
Wizard = pool.get('test.test_wizard_no_model', type='wizard')
|
|
260
|
+
User = pool.get('res.user')
|
|
261
|
+
Group = pool.get('res.group')
|
|
262
|
+
|
|
263
|
+
user = User(login='foo', groups=[Group(name="Group")])
|
|
264
|
+
user.save()
|
|
265
|
+
session_id, start_state, end_state = Wizard.create()
|
|
266
|
+
|
|
267
|
+
with Transaction().set_user(user.id):
|
|
268
|
+
with self.assertRaises(AccessError):
|
|
269
|
+
Wizard.execute(session_id, {}, start_state)
|
|
270
|
+
|
|
271
|
+
@with_transaction(context={'_check_access': True})
|
|
272
|
+
def test_execute_without_model_with_admin(self):
|
|
273
|
+
"Execute wizard without model"
|
|
274
|
+
pool = Pool()
|
|
275
|
+
Wizard = pool.get('test.test_wizard_no_model', type='wizard')
|
|
276
|
+
|
|
277
|
+
session_id, start_state, end_state = Wizard.create()
|
|
278
|
+
|
|
279
|
+
Wizard.execute(session_id, {}, start_state)
|
|
@@ -47,10 +47,15 @@ class TestWizard(Wizard):
|
|
|
47
47
|
return 'end'
|
|
48
48
|
|
|
49
49
|
|
|
50
|
+
class TestWizardNoModel(TestWizard):
|
|
51
|
+
__name__ = 'test.test_wizard_no_model'
|
|
52
|
+
|
|
53
|
+
|
|
50
54
|
def register(module):
|
|
51
55
|
Pool.register(
|
|
52
56
|
TestWizardStart,
|
|
53
57
|
module=module, type_='model')
|
|
54
58
|
Pool.register(
|
|
55
59
|
TestWizard,
|
|
60
|
+
TestWizardNoModel,
|
|
56
61
|
module=module, type_='wizard')
|
|
@@ -21,5 +21,11 @@ this repository contains the full copyright notices and license terms. -->
|
|
|
21
21
|
<field name="wiz_name">test.test_wizard</field>
|
|
22
22
|
<field name="model">test.access</field>
|
|
23
23
|
</record>
|
|
24
|
+
|
|
25
|
+
<record model="ir.action.wizard" id="test_wizard_no_model">
|
|
26
|
+
<field name="name">Test Wizard</field>
|
|
27
|
+
<field name="wiz_name">test.test_wizard_no_model</field>
|
|
28
|
+
<field name="model" eval="None"/>
|
|
29
|
+
</record>
|
|
24
30
|
</data>
|
|
25
31
|
</tryton>
|
|
@@ -264,7 +264,7 @@ class Wizard(URLMixin, PoolBase):
|
|
|
264
264
|
ModelAccess.check(model, 'read')
|
|
265
265
|
models = ActionWizard.get_models(
|
|
266
266
|
cls.__name__, action_id=context.get('action_id'))
|
|
267
|
-
if
|
|
267
|
+
if models and (not model or model not in models):
|
|
268
268
|
groups = Group.browse(User.get_groups())
|
|
269
269
|
raise AccessError(
|
|
270
270
|
gettext(
|
|
@@ -294,6 +294,12 @@ class Wizard(URLMixin, PoolBase):
|
|
|
294
294
|
):
|
|
295
295
|
ModelAccess.check(model, 'write')
|
|
296
296
|
|
|
297
|
+
if not models and not wizard_groups:
|
|
298
|
+
raise AccessError(
|
|
299
|
+
gettext(
|
|
300
|
+
'ir.msg_access_wizard_error',
|
|
301
|
+
wizard=cls.__name__))
|
|
302
|
+
|
|
297
303
|
if model:
|
|
298
304
|
ids = context.get('active_ids') or []
|
|
299
305
|
id_ = context.get('active_id')
|
|
@@ -312,14 +318,20 @@ class Wizard(URLMixin, PoolBase):
|
|
|
312
318
|
@classmethod
|
|
313
319
|
def delete(cls, session_id):
|
|
314
320
|
"Delete the session"
|
|
315
|
-
|
|
321
|
+
pool = Pool()
|
|
322
|
+
Session = pool.get('ir.session.wizard')
|
|
323
|
+
transaction = Transaction()
|
|
324
|
+
session = Session(session_id)
|
|
325
|
+
if session.create_uid.id != transaction.user:
|
|
326
|
+
raise AccessError(
|
|
327
|
+
gettext('ir.msg_access_wizard_error', wizard=cls.__name__))
|
|
316
328
|
end = getattr(cls, cls.end_state, None)
|
|
317
329
|
if end:
|
|
318
330
|
wizard = cls(session_id)
|
|
319
331
|
action = end(wizard)
|
|
320
332
|
else:
|
|
321
333
|
action = None
|
|
322
|
-
Session.delete([
|
|
334
|
+
Session.delete([session])
|
|
323
335
|
return action
|
|
324
336
|
|
|
325
337
|
@classmethod
|
|
@@ -401,8 +413,12 @@ class Wizard(URLMixin, PoolBase):
|
|
|
401
413
|
def __init__(self, session_id):
|
|
402
414
|
pool = Pool()
|
|
403
415
|
Session = pool.get('ir.session.wizard')
|
|
404
|
-
|
|
416
|
+
transaction = Transaction()
|
|
405
417
|
session = Session(session_id)
|
|
418
|
+
if session.create_uid.id != transaction.user:
|
|
419
|
+
raise AccessError(
|
|
420
|
+
gettext('ir.msg_access_wizard_error', wizard=self.__name__))
|
|
421
|
+
self._session_id = session.id
|
|
406
422
|
data = defaultdict(dict)
|
|
407
423
|
data.update(json.loads(session.data, object_hook=JSONDecoder()))
|
|
408
424
|
for state_name, state in self.states.items():
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|