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.
Files changed (510) hide show
  1. {trytond-8.2.0 → trytond-8.2.2}/PKG-INFO +1 -1
  2. {trytond-8.2.0 → trytond-8.2.2}/trytond/__init__.py +1 -1
  3. {trytond-8.2.0 → trytond-8.2.2}/trytond/application.py +4 -1
  4. {trytond-8.2.0 → trytond-8.2.2}/trytond/cache.py +3 -1
  5. {trytond-8.2.0 → trytond-8.2.2}/trytond/config.py +1 -1
  6. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/cron.py +1 -1
  7. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/model.py +9 -6
  8. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/resource.py +1 -1
  9. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/modelstorage.py +8 -0
  10. {trytond-8.2.0 → trytond-8.2.2}/trytond/pool.py +1 -1
  11. {trytond-8.2.0 → trytond-8.2.2}/trytond/report/report.py +9 -9
  12. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/resource.py +3 -3
  13. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_tools.py +57 -0
  14. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_wizard.py +73 -0
  15. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/wizard.py +5 -0
  16. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/wizard.xml +6 -0
  17. {trytond-8.2.0 → trytond-8.2.2}/trytond/wizard/wizard.py +20 -4
  18. {trytond-8.2.0 → trytond-8.2.2}/.hgignore +0 -0
  19. {trytond-8.2.0 → trytond-8.2.2}/COPYRIGHT +0 -0
  20. {trytond-8.2.0 → trytond-8.2.2}/LICENSE +0 -0
  21. {trytond-8.2.0 → trytond-8.2.2}/hatch_build.py +0 -0
  22. {trytond-8.2.0 → trytond-8.2.2}/pyproject.toml +0 -0
  23. {trytond-8.2.0 → trytond-8.2.2}/trytond/_safe_genshi.py +0 -0
  24. {trytond-8.2.0 → trytond-8.2.2}/trytond/admin.py +0 -0
  25. {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/__init__.py +0 -0
  26. {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/database.py +0 -0
  27. {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/postgresql/__init__.py +0 -0
  28. {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/postgresql/database.py +0 -0
  29. {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/postgresql/init.sql +0 -0
  30. {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/postgresql/table.py +0 -0
  31. {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/sqlite/__init__.py +0 -0
  32. {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/sqlite/database.py +0 -0
  33. {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/sqlite/init.sql +0 -0
  34. {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/sqlite/table.py +0 -0
  35. {trytond-8.2.0 → trytond-8.2.2}/trytond/backend/table.py +0 -0
  36. {trytond-8.2.0 → trytond-8.2.2}/trytond/bus.py +0 -0
  37. {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/__init__.py +0 -0
  38. {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/__main__.py +0 -0
  39. {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/admin.py +0 -0
  40. {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/console.py +0 -0
  41. {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/cron.py +0 -0
  42. {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/stat.py +0 -0
  43. {trytond-8.2.0 → trytond-8.2.2}/trytond/cli/worker.py +0 -0
  44. {trytond-8.2.0 → trytond-8.2.2}/trytond/commandline.py +0 -0
  45. {trytond-8.2.0 → trytond-8.2.2}/trytond/console.py +0 -0
  46. {trytond-8.2.0 → trytond-8.2.2}/trytond/const.py +0 -0
  47. {trytond-8.2.0 → trytond-8.2.2}/trytond/convert.py +0 -0
  48. {trytond-8.2.0 → trytond-8.2.2}/trytond/cron.py +0 -0
  49. {trytond-8.2.0 → trytond-8.2.2}/trytond/exceptions.py +0 -0
  50. {trytond-8.2.0 → trytond-8.2.2}/trytond/filestore.py +0 -0
  51. {trytond-8.2.0 → trytond-8.2.2}/trytond/i18n.py +0 -0
  52. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/__init__.py +0 -0
  53. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/action.py +0 -0
  54. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/action.xml +0 -0
  55. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/attachment.py +0 -0
  56. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/attachment.xml +0 -0
  57. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/avatar.py +0 -0
  58. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/cache.py +0 -0
  59. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/calendar_.py +0 -0
  60. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/calendar_.xml +0 -0
  61. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/chat.py +0 -0
  62. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/chat.xml +0 -0
  63. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/configuration.py +0 -0
  64. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/cron.xml +0 -0
  65. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/date.py +0 -0
  66. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/email.xml +0 -0
  67. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/email_.py +0 -0
  68. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/error.py +0 -0
  69. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/error.xml +0 -0
  70. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/exceptions.py +0 -0
  71. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/export.py +0 -0
  72. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/export.xml +0 -0
  73. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/filestore.py +0 -0
  74. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/filestore.xml +0 -0
  75. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/fonts/LICENSE +0 -0
  76. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/fonts/karla.ttf +0 -0
  77. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/lang.py +0 -0
  78. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/lang.xml +0 -0
  79. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/bg.po +0 -0
  80. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/ca.po +0 -0
  81. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/cs.po +0 -0
  82. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/de.po +0 -0
  83. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/es.po +0 -0
  84. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/es_419.po +0 -0
  85. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/et.po +0 -0
  86. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/fa.po +0 -0
  87. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/fi.po +0 -0
  88. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/fr.po +0 -0
  89. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/hu.po +0 -0
  90. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/id.po +0 -0
  91. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/it.po +0 -0
  92. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/lo.po +0 -0
  93. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/lt.po +0 -0
  94. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/nl.po +0 -0
  95. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/pl.po +0 -0
  96. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/pt.po +0 -0
  97. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/ro.po +0 -0
  98. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/ru.po +0 -0
  99. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/sl.po +0 -0
  100. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/tr.po +0 -0
  101. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/uk.po +0 -0
  102. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/locale/zh_CN.po +0 -0
  103. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/message.py +0 -0
  104. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/message.xml +0 -0
  105. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/model.xml +0 -0
  106. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/module.py +0 -0
  107. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/module.xml +0 -0
  108. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/note.py +0 -0
  109. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/note.xml +0 -0
  110. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/queue.xml +0 -0
  111. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/queue_.py +0 -0
  112. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/routes.py +0 -0
  113. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/rule.py +0 -0
  114. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/rule.xml +0 -0
  115. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/sequence.py +0 -0
  116. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/sequence.xml +0 -0
  117. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/session.py +0 -0
  118. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/translation.py +0 -0
  119. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/translation.xml +0 -0
  120. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/trigger.py +0 -0
  121. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/trigger.xml +0 -0
  122. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/tryton.cfg +0 -0
  123. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/__init__.py +0 -0
  124. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/board.rnc +0 -0
  125. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/calendar.rnc +0 -0
  126. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/form.rnc +0 -0
  127. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/graph.rnc +0 -0
  128. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icon.py +0 -0
  129. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icon.xml +0 -0
  130. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/LICENSE +0 -0
  131. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-board.svg +0 -0
  132. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-calendar.svg +0 -0
  133. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-folder.svg +0 -0
  134. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-form.svg +0 -0
  135. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-graph.svg +0 -0
  136. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-list-form.svg +0 -0
  137. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-list.svg +0 -0
  138. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-settings.svg +0 -0
  139. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/icons/tryton-tree.svg +0 -0
  140. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/menu.py +0 -0
  141. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/menu.xml +0 -0
  142. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/tree.rnc +0 -0
  143. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/ui.xml +0 -0
  144. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/view.py +0 -0
  145. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/ui/view.xml +0 -0
  146. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_domain_form.xml +0 -0
  147. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_domain_list.xml +0 -0
  148. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_domain_list2.xml +0 -0
  149. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_form.xml +0 -0
  150. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_list.xml +0 -0
  151. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_view_form.xml +0 -0
  152. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_view_list.xml +0 -0
  153. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_act_window_view_list2.xml +0 -0
  154. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_form.xml +0 -0
  155. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_keyword_form.xml +0 -0
  156. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_keyword_list.xml +0 -0
  157. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_list.xml +0 -0
  158. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_report_form.xml +0 -0
  159. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_report_list.xml +0 -0
  160. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_url_form.xml +0 -0
  161. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_url_list.xml +0 -0
  162. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_wizard_form.xml +0 -0
  163. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/action_wizard_list.xml +0 -0
  164. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/attachment_form.xml +0 -0
  165. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/attachment_form_preview.xml +0 -0
  166. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/attachment_list.xml +0 -0
  167. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_channel_form.xml +0 -0
  168. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_channel_list.xml +0 -0
  169. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_follower_form.xml +0 -0
  170. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_follower_list.xml +0 -0
  171. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_message_form.xml +0 -0
  172. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/chat_message_list.xml +0 -0
  173. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/cron_form.xml +0 -0
  174. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/cron_list.xml +0 -0
  175. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/cron_log_form.xml +0 -0
  176. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/cron_log_graph.xml +0 -0
  177. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/cron_log_list.xml +0 -0
  178. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/email_form.xml +0 -0
  179. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/email_list.xml +0 -0
  180. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/email_template_form.xml +0 -0
  181. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/email_template_list.xml +0 -0
  182. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/error_form.xml +0 -0
  183. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/error_list.xml +0 -0
  184. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/export_form.xml +0 -0
  185. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/export_line_form.xml +0 -0
  186. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/export_line_list.xml +0 -0
  187. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/export_list.xml +0 -0
  188. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/icon_view_form.xml +0 -0
  189. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/icon_view_list.xml +0 -0
  190. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/lang_config_start_form.xml +0 -0
  191. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/lang_form.xml +0 -0
  192. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/lang_list.xml +0 -0
  193. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/message_form.xml +0 -0
  194. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/message_list.xml +0 -0
  195. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_access_form.xml +0 -0
  196. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_access_list.xml +0 -0
  197. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_click_form.xml +0 -0
  198. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_click_list.xml +0 -0
  199. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_form.xml +0 -0
  200. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_list.xml +0 -0
  201. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_rule_form.xml +0 -0
  202. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_button_rule_list.xml +0 -0
  203. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_field_access_form.xml +0 -0
  204. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_field_access_list.xml +0 -0
  205. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_field_form.xml +0 -0
  206. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_field_list.xml +0 -0
  207. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_form.xml +0 -0
  208. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_list.xml +0 -0
  209. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_log_form.xml +0 -0
  210. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_log_list.xml +0 -0
  211. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/model_print_model_graph_start_form.xml +0 -0
  212. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_activate_upgrade_done_form.xml +0 -0
  213. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_activate_upgrade_start_form.xml +0 -0
  214. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_config_start_form.xml +0 -0
  215. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_config_wizard_done_form.xml +0 -0
  216. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_config_wizard_first_form.xml +0 -0
  217. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_config_wizard_item_list.xml +0 -0
  218. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_config_wizard_other_form.xml +0 -0
  219. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_dependency_form.xml +0 -0
  220. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_dependency_list.xml +0 -0
  221. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_form.xml +0 -0
  222. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/module_list.xml +0 -0
  223. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/note_form.xml +0 -0
  224. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/note_list.xml +0 -0
  225. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/rule_form.xml +0 -0
  226. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/rule_group_form.xml +0 -0
  227. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/rule_group_list.xml +0 -0
  228. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/rule_list.xml +0 -0
  229. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/sequence_form.xml +0 -0
  230. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/sequence_list.xml +0 -0
  231. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/sequence_type_form.xml +0 -0
  232. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/sequence_type_list.xml +0 -0
  233. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_clean_start_form.xml +0 -0
  234. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_clean_succeed_form.xml +0 -0
  235. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_export_result_form.xml +0 -0
  236. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_export_start_form.xml +0 -0
  237. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_form.xml +0 -0
  238. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_list.xml +0 -0
  239. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_set_start_form.xml +0 -0
  240. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_set_succeed_form.xml +0 -0
  241. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/translation_update_start_form.xml +0 -0
  242. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/trigger_form.xml +0 -0
  243. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/trigger_list.xml +0 -0
  244. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_menu_form.xml +0 -0
  245. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_menu_list.xml +0 -0
  246. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_menu_tree.xml +0 -0
  247. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_form.xml +0 -0
  248. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_list.xml +0 -0
  249. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_list_extension.xml +0 -0
  250. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_search_form.xml +0 -0
  251. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_search_list.xml +0 -0
  252. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_optional_form.xml +0 -0
  253. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_optional_list.xml +0 -0
  254. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_state_form.xml +0 -0
  255. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_state_list.xml +0 -0
  256. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_width_form.xml +0 -0
  257. {trytond-8.2.0 → trytond-8.2.2}/trytond/ir/view/ui_view_tree_width_list.xml +0 -0
  258. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/__init__.py +0 -0
  259. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/active.py +0 -0
  260. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/avatar.py +0 -0
  261. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/chat.py +0 -0
  262. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/descriptors.py +0 -0
  263. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/dictschema.py +0 -0
  264. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/digits.py +0 -0
  265. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/exceptions.py +0 -0
  266. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/__init__.py +0 -0
  267. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/binary.py +0 -0
  268. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/boolean.py +0 -0
  269. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/char.py +0 -0
  270. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/date.py +0 -0
  271. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/dict.py +0 -0
  272. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/field.py +0 -0
  273. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/float.py +0 -0
  274. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/fmany2one.py +0 -0
  275. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/function.py +0 -0
  276. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/integer.py +0 -0
  277. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/many2many.py +0 -0
  278. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/many2one.py +0 -0
  279. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/multiselection.py +0 -0
  280. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/numeric.py +0 -0
  281. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/one2many.py +0 -0
  282. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/one2one.py +0 -0
  283. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/reference.py +0 -0
  284. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/selection.py +0 -0
  285. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/fields/text.py +0 -0
  286. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/match.py +0 -0
  287. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/model.py +0 -0
  288. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/modelsingleton.py +0 -0
  289. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/modelsql.py +0 -0
  290. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/modelview.py +0 -0
  291. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/multivalue.py +0 -0
  292. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/order.py +0 -0
  293. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/symbol.py +0 -0
  294. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/tree.py +0 -0
  295. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/union.py +0 -0
  296. {trytond-8.2.0 → trytond-8.2.2}/trytond/model/workflow.py +0 -0
  297. {trytond-8.2.0 → trytond-8.2.2}/trytond/modules/__init__.py +0 -0
  298. {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/__init__.py +0 -0
  299. {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/dispatcher.py +0 -0
  300. {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/jsonrpc.py +0 -0
  301. {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/rest.py +0 -0
  302. {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/wrappers.py +0 -0
  303. {trytond-8.2.0 → trytond-8.2.2}/trytond/protocols/xmlrpc.py +0 -0
  304. {trytond-8.2.0 → trytond-8.2.2}/trytond/pyson.py +0 -0
  305. {trytond-8.2.0 → trytond-8.2.2}/trytond/report/__init__.py +0 -0
  306. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/__init__.py +0 -0
  307. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/email_reset_password.html +0 -0
  308. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/exceptions.py +0 -0
  309. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/group.py +0 -0
  310. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/group.xml +0 -0
  311. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/ir.py +0 -0
  312. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/bg.po +0 -0
  313. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/ca.po +0 -0
  314. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/cs.po +0 -0
  315. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/de.po +0 -0
  316. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/es.po +0 -0
  317. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/es_419.po +0 -0
  318. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/et.po +0 -0
  319. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/fa.po +0 -0
  320. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/fi.po +0 -0
  321. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/fr.po +0 -0
  322. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/hu.po +0 -0
  323. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/id.po +0 -0
  324. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/it.po +0 -0
  325. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/lo.po +0 -0
  326. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/lt.po +0 -0
  327. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/nl.po +0 -0
  328. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/pl.po +0 -0
  329. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/pt.po +0 -0
  330. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/ro.po +0 -0
  331. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/ru.po +0 -0
  332. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/sl.po +0 -0
  333. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/tr.po +0 -0
  334. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/uk.po +0 -0
  335. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/locale/zh_CN.po +0 -0
  336. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/message.xml +0 -0
  337. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/notification.py +0 -0
  338. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/notification.xml +0 -0
  339. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/res.xml +0 -0
  340. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/routes.py +0 -0
  341. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/tryton.cfg +0 -0
  342. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/user.py +0 -0
  343. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/user.xml +0 -0
  344. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/group_form.xml +0 -0
  345. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/group_list.xml +0 -0
  346. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/notification_form.xml +0 -0
  347. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/notification_form_admin.xml +0 -0
  348. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/notification_list.xml +0 -0
  349. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_application_form.xml +0 -0
  350. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_application_list.xml +0 -0
  351. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_config_start_form.xml +0 -0
  352. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_form.xml +0 -0
  353. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_form_preferences.xml +0 -0
  354. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_list.xml +0 -0
  355. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_warning_form.xml +0 -0
  356. {trytond-8.2.0 → trytond-8.2.2}/trytond/res/view/user_warning_tree.xml +0 -0
  357. {trytond-8.2.0 → trytond-8.2.2}/trytond/routing.py +0 -0
  358. {trytond-8.2.0 → trytond-8.2.2}/trytond/rpc.py +0 -0
  359. {trytond-8.2.0 → trytond-8.2.2}/trytond/security.py +0 -0
  360. {trytond-8.2.0 → trytond-8.2.2}/trytond/sendmail.py +0 -0
  361. {trytond-8.2.0 → trytond-8.2.2}/trytond/sql/__init__.py +0 -0
  362. {trytond-8.2.0 → trytond-8.2.2}/trytond/sql/functions.py +0 -0
  363. {trytond-8.2.0 → trytond-8.2.2}/trytond/sql/operators.py +0 -0
  364. {trytond-8.2.0 → trytond-8.2.2}/trytond/status.py +0 -0
  365. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/__init__.py +0 -0
  366. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/access.py +0 -0
  367. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/chat.py +0 -0
  368. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/copy_.py +0 -0
  369. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/export_data.py +0 -0
  370. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_binary.py +0 -0
  371. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_boolean.py +0 -0
  372. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_char.py +0 -0
  373. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_context.py +0 -0
  374. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_date.py +0 -0
  375. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_datetime.py +0 -0
  376. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_dict.py +0 -0
  377. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_float.py +0 -0
  378. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_fmany2one.py +0 -0
  379. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_function.py +0 -0
  380. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_function.xml +0 -0
  381. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_integer.py +0 -0
  382. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_many2many.py +0 -0
  383. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_many2one.py +0 -0
  384. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_multiselection.py +0 -0
  385. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_numeric.py +0 -0
  386. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_one2many.py +0 -0
  387. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_one2one.py +0 -0
  388. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_reference.py +0 -0
  389. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_selection.py +0 -0
  390. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_text.py +0 -0
  391. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_time.py +0 -0
  392. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/field_timedelta.py +0 -0
  393. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/forbidden.txt +0 -0
  394. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/history.py +0 -0
  395. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/import_data.py +0 -0
  396. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/message.xml +0 -0
  397. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/mixin.py +0 -0
  398. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/model.py +0 -0
  399. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/model_log.py +0 -0
  400. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/modelsql.py +0 -0
  401. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/modelstorage.py +0 -0
  402. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/modelview.py +0 -0
  403. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/modelview.xml +0 -0
  404. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/mptt.py +0 -0
  405. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/multivalue.py +0 -0
  406. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/path.py +0 -0
  407. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/report.mjml +0 -0
  408. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/report.py +0 -0
  409. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/report.txt +0 -0
  410. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/report.xml +0 -0
  411. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/routing.py +0 -0
  412. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/rule.py +0 -0
  413. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/sequence.xml +0 -0
  414. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_access.py +0 -0
  415. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_backend.py +0 -0
  416. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_bus.py +0 -0
  417. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_cache.py +0 -0
  418. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_chat.py +0 -0
  419. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_copy.py +0 -0
  420. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_descriptors.py +0 -0
  421. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_exportdata.py +0 -0
  422. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_binary.py +0 -0
  423. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_boolean.py +0 -0
  424. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_char.py +0 -0
  425. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_context.py +0 -0
  426. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_date.py +0 -0
  427. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_datetime.py +0 -0
  428. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_depends.py +0 -0
  429. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_dict.py +0 -0
  430. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_float.py +0 -0
  431. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_fmany2one.py +0 -0
  432. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_function.py +0 -0
  433. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_integer.py +0 -0
  434. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_many2many.py +0 -0
  435. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_many2one.py +0 -0
  436. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_multiselection.py +0 -0
  437. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_numeric.py +0 -0
  438. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_one2many.py +0 -0
  439. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_one2one.py +0 -0
  440. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_reference.py +0 -0
  441. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_selection.py +0 -0
  442. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_text.py +0 -0
  443. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_time.py +0 -0
  444. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_field_timedelta.py +0 -0
  445. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_filestore.py +0 -0
  446. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_genshi.py +0 -0
  447. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_history.py +0 -0
  448. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_i18n.py +0 -0
  449. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_importdata.py +0 -0
  450. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_ir.py +0 -0
  451. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_mixins.py +0 -0
  452. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_model.py +0 -0
  453. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_model_index.py +0 -0
  454. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_model_log.py +0 -0
  455. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_model_match.py +0 -0
  456. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_modelsingleton.py +0 -0
  457. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_modelsql.py +0 -0
  458. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_modelstorage.py +0 -0
  459. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_modelview.py +0 -0
  460. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_module_register.py +0 -0
  461. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_mptt.py +0 -0
  462. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_multivalue.py +0 -0
  463. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_order.py +0 -0
  464. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_path.py +0 -0
  465. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_protocols.py +0 -0
  466. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_pyson.py +0 -0
  467. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_report.py +0 -0
  468. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_res.py +0 -0
  469. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_resource.py +0 -0
  470. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_rest.py +0 -0
  471. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_routing.py +0 -0
  472. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_rpc.py +0 -0
  473. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_rule.py +0 -0
  474. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_security.py +0 -0
  475. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_sendmail.py +0 -0
  476. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_sequence.py +0 -0
  477. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_transaction.py +0 -0
  478. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_tree.py +0 -0
  479. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_trigger.py +0 -0
  480. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_tryton.py +0 -0
  481. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_union.py +0 -0
  482. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_user.py +0 -0
  483. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_workflow.py +0 -0
  484. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/test_wsgi.py +0 -0
  485. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/tools.py +0 -0
  486. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/tree.py +0 -0
  487. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/trigger.py +0 -0
  488. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/tryton.cfg +0 -0
  489. {trytond-8.2.0 → trytond-8.2.2}/trytond/tests/workflow.py +0 -0
  490. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/__init__.py +0 -0
  491. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/barcode.py +0 -0
  492. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/chart.py +0 -0
  493. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/decimal_.py +0 -0
  494. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/domain_inversion.py +0 -0
  495. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/email_.py +0 -0
  496. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/gevent.py +0 -0
  497. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/immutabledict.py +0 -0
  498. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/logging.py +0 -0
  499. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/misc.py +0 -0
  500. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/multiprocessing.py +0 -0
  501. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/qrcode.py +0 -0
  502. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/singleton.py +0 -0
  503. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/string_.py +0 -0
  504. {trytond-8.2.0 → trytond-8.2.2}/trytond/tools/timezone.py +0 -0
  505. {trytond-8.2.0 → trytond-8.2.2}/trytond/transaction.py +0 -0
  506. {trytond-8.2.0 → trytond-8.2.2}/trytond/tryton.rnc +0 -0
  507. {trytond-8.2.0 → trytond-8.2.2}/trytond/url.py +0 -0
  508. {trytond-8.2.0 → trytond-8.2.2}/trytond/wizard/__init__.py +0 -0
  509. {trytond-8.2.0 → trytond-8.2.2}/trytond/worker.py +0 -0
  510. {trytond-8.2.0 → trytond-8.2.2}/trytond/wsgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: trytond
3
- Version: 8.2.0
3
+ Version: 8.2.2
4
4
  Summary: Tryton server
5
5
  Project-URL: homepage, https://www.tryton.org/
6
6
  Project-URL: documentation, https://docs.tryton.org/server/
@@ -14,7 +14,7 @@ from lxml import etree, objectify
14
14
 
15
15
  from ._safe_genshi import genshi_patch
16
16
 
17
- __version__ = "8.2.0"
17
+ __version__ = "8.2.2"
18
18
  __series__ = '.'.join(__version__.split('.')[:2])
19
19
 
20
20
  if not os.environ.get('TRYTOND_APPNAME'):
@@ -46,4 +46,7 @@ if db_names:
46
46
  for thread in threads:
47
47
  thread.join()
48
48
 
49
- assert len(threads := threading.enumerate()) == 1, f"len({threads}) != 1"
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', '5')
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), classes))
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)
@@ -129,7 +129,7 @@ class Pool(object):
129
129
  :return: database list
130
130
  '''
131
131
  with cls._lock:
132
- return list(cls._pools.keys())
132
+ return [n for n, p in cls._pools.items() if p]
133
133
 
134
134
  def init(self, update=None, lang=None, activatedeps=False, indexes=None):
135
135
  '''
@@ -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
- '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))
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 model and models and model not in models:
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
- Session = Pool().get('ir.session.wizard')
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([Session(session_id)])
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
- self._session_id = session_id
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