tryton 7.0.9__tar.gz → 7.0.28__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 (289) hide show
  1. {tryton-7.0.9 → tryton-7.0.28}/CHANGELOG +95 -0
  2. {tryton-7.0.9 → tryton-7.0.28}/COPYRIGHT +3 -3
  3. {tryton-7.0.9 → tryton-7.0.28}/PKG-INFO +17 -2
  4. {tryton-7.0.9 → tryton-7.0.28}/bin/tryton +2 -1
  5. {tryton-7.0.9 → tryton-7.0.28}/doc/usage.rst +2 -3
  6. tryton-7.0.28/make-darwin-installer.sh +25 -0
  7. {tryton-7.0.9 → tryton-7.0.28}/make-win32-installer.sh +3 -0
  8. {tryton-7.0.9 → tryton-7.0.28}/setup-freeze.py +1 -2
  9. {tryton-7.0.9 → tryton-7.0.28}/tryton/__init__.py +1 -1
  10. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/common.py +11 -2
  11. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/datetime_.py +3 -1
  12. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/domain_inversion.py +2 -1
  13. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/domain_parser.py +25 -13
  14. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/bg/LC_MESSAGES/tryton.mo +0 -0
  15. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/ca/LC_MESSAGES/tryton.mo +0 -0
  16. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/cs/LC_MESSAGES/tryton.mo +0 -0
  17. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/de/LC_MESSAGES/tryton.mo +0 -0
  18. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/es/LC_MESSAGES/tryton.mo +0 -0
  19. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/es_419/LC_MESSAGES/tryton.mo +0 -0
  20. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/et/LC_MESSAGES/tryton.mo +0 -0
  21. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/fa/LC_MESSAGES/tryton.mo +0 -0
  22. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/fi/LC_MESSAGES/tryton.mo +0 -0
  23. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/fr/LC_MESSAGES/tryton.mo +0 -0
  24. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/hu/LC_MESSAGES/tryton.mo +0 -0
  25. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/id/LC_MESSAGES/tryton.mo +0 -0
  26. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/it/LC_MESSAGES/tryton.mo +0 -0
  27. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/ja_JP/LC_MESSAGES/tryton.mo +0 -0
  28. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/lo/LC_MESSAGES/tryton.mo +0 -0
  29. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/lt/LC_MESSAGES/tryton.mo +0 -0
  30. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/nl/LC_MESSAGES/tryton.mo +0 -0
  31. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/pl/LC_MESSAGES/tryton.mo +0 -0
  32. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/pt/LC_MESSAGES/tryton.mo +0 -0
  33. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/ro/LC_MESSAGES/tryton.mo +0 -0
  34. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/ru/LC_MESSAGES/tryton.mo +0 -0
  35. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/sl/LC_MESSAGES/tryton.mo +0 -0
  36. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/tr/LC_MESSAGES/tryton.mo +0 -0
  37. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/uk/LC_MESSAGES/tryton.mo +0 -0
  38. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/zh_CN/LC_MESSAGES/tryton.mo +0 -0
  39. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/about.py +1 -1
  40. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/form.py +16 -10
  41. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/model/field.py +69 -31
  42. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/model/record.py +13 -10
  43. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/screen/screen.py +89 -48
  44. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py +12 -7
  45. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form.py +3 -1
  46. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/binary.py +3 -3
  47. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/char.py +5 -6
  48. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/dictionary.py +11 -8
  49. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/document.py +9 -10
  50. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/list.py +30 -6
  51. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/list_gtk/editabletree.py +2 -1
  52. tryton-7.0.28/tryton/gui/window/view_form/view/list_gtk/generictreemodel.py +426 -0
  53. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/list_gtk/widget.py +29 -8
  54. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/screen_container.py +3 -5
  55. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/win_form.py +8 -6
  56. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/win_import.py +9 -4
  57. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/wizard.py +2 -0
  58. {tryton-7.0.9 → tryton-7.0.28}/tryton/jsonrpc.py +5 -1
  59. {tryton-7.0.9 → tryton-7.0.28}/tryton/plugins/__init__.py +5 -3
  60. {tryton-7.0.9 → tryton-7.0.28}/tryton/tests/test_common_domain_parser.py +8 -0
  61. {tryton-7.0.9 → tryton-7.0.28}/tryton.egg-info/PKG-INFO +17 -2
  62. {tryton-7.0.9 → tryton-7.0.28}/tryton.egg-info/SOURCES.txt +2 -5
  63. tryton-7.0.9/darwin/gtk-3.0/gdk-pixbuf.loaders +0 -107
  64. tryton-7.0.9/darwin/gtk-3.0/gtk.immodules +0 -40
  65. tryton-7.0.9/make-darwin-installer.sh +0 -15
  66. tryton-7.0.9/win32/gtk-3.0/gdk-pixbuf.loaders +0 -114
  67. tryton-7.0.9/win32/gtk-3.0/gtk.immodules +0 -0
  68. {tryton-7.0.9 → tryton-7.0.28}/LICENSE +0 -0
  69. {tryton-7.0.9 → tryton-7.0.28}/MANIFEST.in +0 -0
  70. {tryton-7.0.9 → tryton-7.0.28}/README.rst +0 -0
  71. {tryton-7.0.9 → tryton-7.0.28}/catalan.nsh +0 -0
  72. {tryton-7.0.9 → tryton-7.0.28}/doc/conf.py +0 -0
  73. {tryton-7.0.9 → tryton-7.0.28}/doc/glossary.rst +0 -0
  74. {tryton-7.0.9 → tryton-7.0.28}/doc/index.rst +0 -0
  75. {tryton-7.0.9 → tryton-7.0.28}/doc/installation.rst +0 -0
  76. {tryton-7.0.9 → tryton-7.0.28}/doc/releases.rst +0 -0
  77. {tryton-7.0.9 → tryton-7.0.28}/doc/requirements-doc.txt +0 -0
  78. {tryton-7.0.9 → tryton-7.0.28}/english.nsh +0 -0
  79. {tryton-7.0.9 → tryton-7.0.28}/farsi.nsh +0 -0
  80. {tryton-7.0.9 → tryton-7.0.28}/french.nsh +0 -0
  81. {tryton-7.0.9 → tryton-7.0.28}/german.nsh +0 -0
  82. {tryton-7.0.9 → tryton-7.0.28}/portuguese.nsh +0 -0
  83. {tryton-7.0.9 → tryton-7.0.28}/setup.cfg +0 -0
  84. {tryton-7.0.9 → tryton-7.0.28}/setup.nsi +0 -0
  85. {tryton-7.0.9 → tryton-7.0.28}/setup.py +0 -0
  86. {tryton-7.0.9 → tryton-7.0.28}/slovenian.nsh +0 -0
  87. {tryton-7.0.9 → tryton-7.0.28}/spanish.nsh +0 -0
  88. {tryton-7.0.9 → tryton-7.0.28}/tox.ini +0 -0
  89. {tryton-7.0.9 → tryton-7.0.28}/tryton/action/__init__.py +0 -0
  90. {tryton-7.0.9 → tryton-7.0.28}/tryton/action/main.py +0 -0
  91. {tryton-7.0.9 → tryton-7.0.28}/tryton/bus.py +0 -0
  92. {tryton-7.0.9 → tryton-7.0.28}/tryton/client.py +0 -0
  93. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/__init__.py +0 -0
  94. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/button.py +0 -0
  95. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/cellrendererbinary.py +0 -0
  96. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/cellrendererbutton.py +0 -0
  97. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/cellrendererclickablepixbuf.py +0 -0
  98. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/cellrenderercombo.py +0 -0
  99. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/cellrendererfloat.py +0 -0
  100. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/cellrendererinteger.py +0 -0
  101. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/cellrenderertext.py +0 -0
  102. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/cellrenderertoggle.py +0 -0
  103. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/completion.py +0 -0
  104. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/entry_position.py +0 -0
  105. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/environment.py +0 -0
  106. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/focus.py +0 -0
  107. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/htmltextbuffer.py +0 -0
  108. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/number_entry.py +0 -0
  109. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/popup_menu.py +0 -0
  110. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/richtext.py +0 -0
  111. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/selection.py +0 -0
  112. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/timedelta.py +0 -0
  113. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/underline.py +0 -0
  114. {tryton-7.0.9 → tryton-7.0.28}/tryton/common/widget_style.py +0 -0
  115. {tryton-7.0.9 → tryton-7.0.28}/tryton/config.py +0 -0
  116. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/bg/LC_MESSAGES/tryton.po +0 -0
  117. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/ca/LC_MESSAGES/tryton.po +0 -0
  118. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/cs/LC_MESSAGES/tryton.po +0 -0
  119. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/de/LC_MESSAGES/tryton.po +0 -0
  120. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/es/LC_MESSAGES/tryton.po +0 -0
  121. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/es_419/LC_MESSAGES/tryton.po +0 -0
  122. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/et/LC_MESSAGES/tryton.po +0 -0
  123. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/fa/LC_MESSAGES/tryton.po +0 -0
  124. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/fi/LC_MESSAGES/tryton.po +0 -0
  125. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/fr/LC_MESSAGES/tryton.po +0 -0
  126. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/hu/LC_MESSAGES/tryton.po +0 -0
  127. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/id/LC_MESSAGES/tryton.po +0 -0
  128. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/it/LC_MESSAGES/tryton.po +0 -0
  129. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/ja_JP/LC_MESSAGES/tryton.po +0 -0
  130. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/lo/LC_MESSAGES/tryton.po +0 -0
  131. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/lt/LC_MESSAGES/tryton.po +0 -0
  132. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/nl/LC_MESSAGES/tryton.po +0 -0
  133. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/pl/LC_MESSAGES/tryton.po +0 -0
  134. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/pt/LC_MESSAGES/tryton.po +0 -0
  135. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/ro/LC_MESSAGES/tryton.po +0 -0
  136. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/ru/LC_MESSAGES/tryton.po +0 -0
  137. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/sl/LC_MESSAGES/tryton.po +0 -0
  138. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/tr/LC_MESSAGES/tryton.po +0 -0
  139. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/tryton.pot +0 -0
  140. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/uk/LC_MESSAGES/tryton.po +0 -0
  141. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/locale/zh_CN/LC_MESSAGES/tryton.po +0 -0
  142. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/LICENSE +0 -0
  143. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-add.svg +0 -0
  144. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-archive.svg +0 -0
  145. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-arrow-down.svg +0 -0
  146. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-arrow-left.svg +0 -0
  147. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-arrow-right.svg +0 -0
  148. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-arrow-up.svg +0 -0
  149. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-attach.svg +0 -0
  150. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-back.svg +0 -0
  151. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-barcode-scanner.svg +0 -0
  152. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-bookmark-border.svg +0 -0
  153. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-bookmark.svg +0 -0
  154. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-bookmarks.svg +0 -0
  155. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-cancel.svg +0 -0
  156. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-clear.svg +0 -0
  157. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-close.svg +0 -0
  158. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-copy.svg +0 -0
  159. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-create.svg +0 -0
  160. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-date.svg +0 -0
  161. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-delete.svg +0 -0
  162. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-download.svg +0 -0
  163. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-drag.svg +0 -0
  164. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-email.svg +0 -0
  165. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-error.svg +0 -0
  166. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-exit.svg +0 -0
  167. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-export.svg +0 -0
  168. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-filter.svg +0 -0
  169. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-format-align-center.svg +0 -0
  170. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-format-align-justify.svg +0 -0
  171. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-format-align-left.svg +0 -0
  172. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-format-align-right.svg +0 -0
  173. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-format-bold.svg +0 -0
  174. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-format-color-text.svg +0 -0
  175. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-format-italic.svg +0 -0
  176. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-format-underline.svg +0 -0
  177. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-forward.svg +0 -0
  178. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-history.svg +0 -0
  179. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-icon.png +0 -0
  180. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-icon.svg +0 -0
  181. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-import.svg +0 -0
  182. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-info.svg +0 -0
  183. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-launch.svg +0 -0
  184. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-link.svg +0 -0
  185. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-log.svg +0 -0
  186. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-menu.svg +0 -0
  187. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-note.svg +0 -0
  188. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-ok.svg +0 -0
  189. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-open.svg +0 -0
  190. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-print.svg +0 -0
  191. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-public.svg +0 -0
  192. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-question.svg +0 -0
  193. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-refresh.svg +0 -0
  194. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-remove.svg +0 -0
  195. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-save.svg +0 -0
  196. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-search.svg +0 -0
  197. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-send.svg +0 -0
  198. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-sound-off.svg +0 -0
  199. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-sound-on.svg +0 -0
  200. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-star-border.svg +0 -0
  201. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-star.svg +0 -0
  202. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-switch.svg +0 -0
  203. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-translate.svg +0 -0
  204. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-unarchive.svg +0 -0
  205. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-undo.svg +0 -0
  206. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton-warning.svg +0 -0
  207. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton.icns +0 -0
  208. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton.ico +0 -0
  209. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/pixmaps/tryton/tryton.svg +0 -0
  210. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/sounds/LICENSE +0 -0
  211. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/sounds/danger.wav +0 -0
  212. {tryton-7.0.9 → tryton-7.0.28}/tryton/data/sounds/success.wav +0 -0
  213. {tryton-7.0.9 → tryton-7.0.28}/tryton/device_cookie.py +0 -0
  214. {tryton-7.0.9 → tryton-7.0.28}/tryton/exceptions.py +0 -0
  215. {tryton-7.0.9 → tryton-7.0.28}/tryton/fingerprints.py +0 -0
  216. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/__init__.py +0 -0
  217. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/main.py +0 -0
  218. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/__init__.py +0 -0
  219. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/attachment.py +0 -0
  220. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/board.py +0 -0
  221. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/code_scanner.py +0 -0
  222. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/dblogin.py +0 -0
  223. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/email_.py +0 -0
  224. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/infobar.py +0 -0
  225. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/limit.py +0 -0
  226. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/log.py +0 -0
  227. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/nomodal.py +0 -0
  228. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/note.py +0 -0
  229. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/preference.py +0 -0
  230. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/revision.py +0 -0
  231. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/tabcontent.py +0 -0
  232. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_board/__init__.py +0 -0
  233. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_board/action.py +0 -0
  234. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_board/view_board.py +0 -0
  235. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/__init__.py +0 -0
  236. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/model/__init__.py +0 -0
  237. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/model/group.py +0 -0
  238. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/screen/__init__.py +0 -0
  239. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/__init__.py +0 -0
  240. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/calendar_.py +0 -0
  241. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/calendar_gtk/__init__.py +0 -0
  242. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/calendar_gtk/dates_period.py +0 -0
  243. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/calendar_gtk/toolbar.py +0 -0
  244. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/__init__.py +0 -0
  245. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/calendar_.py +0 -0
  246. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/checkbox.py +0 -0
  247. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/float.py +0 -0
  248. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/image.py +0 -0
  249. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/integer.py +0 -0
  250. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/many2many.py +0 -0
  251. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/many2one.py +0 -0
  252. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/multiselection.py +0 -0
  253. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/one2many.py +0 -0
  254. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/one2one.py +0 -0
  255. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/progressbar.py +0 -0
  256. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/pyson.py +0 -0
  257. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/reference.py +0 -0
  258. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/richtextbox.py +0 -0
  259. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/selection.py +0 -0
  260. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/state_widget.py +0 -0
  261. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/textbox.py +0 -0
  262. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/timedelta.py +0 -0
  263. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/url.py +0 -0
  264. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/form_gtk/widget.py +0 -0
  265. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/graph.py +0 -0
  266. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/graph_gtk/__init__.py +0 -0
  267. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/graph_gtk/bar.py +0 -0
  268. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/graph_gtk/graph.py +0 -0
  269. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/graph_gtk/line.py +0 -0
  270. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/graph_gtk/pie.py +0 -0
  271. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/list_form.py +0 -0
  272. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/view_form/view/list_gtk/__init__.py +0 -0
  273. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/win_csv.py +0 -0
  274. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/win_export.py +0 -0
  275. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/win_search.py +0 -0
  276. {tryton-7.0.9 → tryton-7.0.28}/tryton/gui/window/window.py +0 -0
  277. {tryton-7.0.9 → tryton-7.0.28}/tryton/plugins/translation/__init__.py +0 -0
  278. {tryton-7.0.9 → tryton-7.0.28}/tryton/pyson.py +0 -0
  279. {tryton-7.0.9 → tryton-7.0.28}/tryton/rpc.py +0 -0
  280. {tryton-7.0.9 → tryton-7.0.28}/tryton/tests/__init__.py +0 -0
  281. {tryton-7.0.9 → tryton-7.0.28}/tryton/tests/test_common.py +0 -0
  282. {tryton-7.0.9 → tryton-7.0.28}/tryton/tests/test_common_selection.py +0 -0
  283. {tryton-7.0.9 → tryton-7.0.28}/tryton/tests/test_common_timedelta.py +0 -0
  284. {tryton-7.0.9 → tryton-7.0.28}/tryton/translate.py +0 -0
  285. {tryton-7.0.9 → tryton-7.0.28}/tryton.desktop +0 -0
  286. {tryton-7.0.9 → tryton-7.0.28}/tryton.egg-info/dependency_links.txt +0 -0
  287. {tryton-7.0.9 → tryton-7.0.28}/tryton.egg-info/not-zip-safe +0 -0
  288. {tryton-7.0.9 → tryton-7.0.28}/tryton.egg-info/requires.txt +0 -0
  289. {tryton-7.0.9 → tryton-7.0.28}/tryton.egg-info/top_level.txt +0 -0
@@ -1,4 +1,99 @@
1
1
 
2
+ Version 7.0.28 - 2025-11-02
3
+ ---------------------------
4
+ * Bug fixes (see mercurial logs for details)
5
+
6
+
7
+ Version 7.0.27 - 2025-06-04
8
+ ---------------------------
9
+ * Bug fixes (see mercurial logs for details)
10
+
11
+
12
+ Version 7.0.26 - 2025-05-15
13
+ ---------------------------
14
+ * Bug fixes (see mercurial logs for details)
15
+
16
+
17
+ Version 7.0.25 - 2025-05-02
18
+ ---------------------------
19
+ * Bug fixes (see mercurial logs for details)
20
+
21
+
22
+ Version 7.0.24 - 2025-04-26
23
+ ---------------------------
24
+ * Bug fixes (see mercurial logs for details)
25
+
26
+
27
+ Version 7.0.23 - 2025-04-02
28
+ ---------------------------
29
+ * Bug fixes (see mercurial logs for details)
30
+
31
+
32
+ Version 7.0.22 - 2025-03-04
33
+ ---------------------------
34
+ * Bug fixes (see mercurial logs for details)
35
+
36
+
37
+ Version 7.0.21 - 2025-02-16
38
+ ---------------------------
39
+ * Bug fixes (see mercurial logs for details)
40
+
41
+
42
+ Version 7.0.20 - 2025-01-01
43
+ ---------------------------
44
+ * Bug fixes (see mercurial logs for details)
45
+
46
+
47
+ Version 7.0.19 - 2024-12-16
48
+ ---------------------------
49
+ * Bug fixes (see mercurial logs for details)
50
+
51
+
52
+ Version 7.0.18 - 2024-12-01
53
+ ---------------------------
54
+ * Bug fixes (see mercurial logs for details)
55
+
56
+
57
+ Version 7.0.17 - 2024-11-06
58
+ ---------------------------
59
+ * Bug fixes (see mercurial logs for details)
60
+
61
+
62
+ Version 7.0.16 - 2024-10-18
63
+ ---------------------------
64
+ * Bug fixes (see mercurial logs for details)
65
+
66
+
67
+ Version 7.0.15 - 2024-10-05
68
+ ---------------------------
69
+ * Bug fixes (see mercurial logs for details)
70
+
71
+
72
+ Version 7.0.14 - 2024-09-16
73
+ ---------------------------
74
+ * Bug fixes (see mercurial logs for details)
75
+
76
+
77
+ Version 7.0.13 - 2024-09-01
78
+ ---------------------------
79
+ * Bug fixes (see mercurial logs for details)
80
+
81
+
82
+ Version 7.0.12 - 2024-08-01
83
+ ---------------------------
84
+ * Bug fixes (see mercurial logs for details)
85
+
86
+
87
+ Version 7.0.11 - 2024-07-01
88
+ ---------------------------
89
+ * Bug fixes (see mercurial logs for details)
90
+
91
+
92
+ Version 7.0.10 - 2024-05-01
93
+ ---------------------------
94
+ * Bug fixes (see mercurial logs for details)
95
+
96
+
2
97
  Version 7.0.9 - 2024-04-17
3
98
  --------------------------
4
99
  * Bug fixes (see mercurial logs for details)
@@ -1,11 +1,11 @@
1
1
  Copyright (C) 2004-2008 Tiny SPRL.
2
2
  Copyright (C) 2007-2009 Lorenzo Gil Sanchez.
3
3
  Copyright (C) 2007-2013 Bertrand Chenal.
4
- Copyright (C) 2007-2024 Cédric Krier.
4
+ Copyright (C) 2007-2025 Cédric Krier.
5
5
  Copyright (C) 2008-2011 Udo Spallek.
6
6
  Copyright (C) 2008-2011 virtual things - Preisler & Spallek GbR.
7
- Copyright (C) 2008-2024 B2CK SPRL.
8
- Copyright (C) 2010-2024 Nicolas Évrard.
7
+ Copyright (C) 2008-2025 B2CK SPRL.
8
+ Copyright (C) 2010-2025 Nicolas Évrard.
9
9
  Copyright (C) 2011-2012 Rodrigo Hübner.
10
10
  Copyright (C) 2012-2013 Antoine Smolders.
11
11
  Copyright (C) 2020-2021 Maxime Richez
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: tryton
3
- Version: 7.0.9
3
+ Version: 7.0.28
4
4
  Summary: Tryton desktop client
5
5
  Home-page: http://www.tryton.org/
6
6
  Download-URL: http://downloads.tryton.org/7.0/
@@ -57,6 +57,21 @@ Provides-Extra: calendar
57
57
  Requires-Dist: GooCalendar>=0.7; extra == "calendar"
58
58
  Provides-Extra: sound
59
59
  Requires-Dist: playsound; extra == "sound"
60
+ Dynamic: author
61
+ Dynamic: author-email
62
+ Dynamic: classifier
63
+ Dynamic: description
64
+ Dynamic: download-url
65
+ Dynamic: home-page
66
+ Dynamic: keywords
67
+ Dynamic: license
68
+ Dynamic: license-file
69
+ Dynamic: platform
70
+ Dynamic: project-url
71
+ Dynamic: provides-extra
72
+ Dynamic: requires-dist
73
+ Dynamic: requires-python
74
+ Dynamic: summary
60
75
 
61
76
  tryton
62
77
  ======
@@ -15,7 +15,8 @@ if hasattr(sys, 'frozen'):
15
15
  share = os.path.join(prefix, 'share')
16
16
  os.environ['GTK_EXE_PREFIX'] = prefix
17
17
  os.environ['GTK_DATA_PREFIX'] = prefix
18
- os.environ['EV_BACKENDS_DIR'] = prefix
18
+ os.environ['EV_BACKENDS_DIR'] = os.path.join(
19
+ prefix, 'lib', 'evince', '4', 'backends')
19
20
  os.environ['XDG_DATA_DIRS'] = share
20
21
  os.environ['GDK_PIXBUF_MODULE_FILE'] = os.path.join(
21
22
  share, 'gtk-3.0', 'gdk-pixbuf.loaders')
@@ -491,8 +491,7 @@ A list of values can be set using ``;`` as separator.
491
491
 
492
492
  For example: ``Name: Michael; Pam``
493
493
 
494
- It will find all records having the ``Name`` starting with ``Michael`` or
495
- ``Pam``.
494
+ It will find all records with ``Name`` equal to ``Michael`` or ``Pam``.
496
495
 
497
496
  A range of number values can be set using ``..``.
498
497
 
@@ -627,7 +626,7 @@ Local user plugins directory
627
626
  :file:`~/.config/tryton/x.y/plugins`
628
627
 
629
628
  Custom CSS theme
630
- :file:`~/.config.tryton/x.y/theme.css`
629
+ :file:`~/.config/tryton/x.y/theme.css`
631
630
 
632
631
  .. note::
633
632
  ``~`` means the home directory of the user.
@@ -0,0 +1,25 @@
1
+ #!/bin/sh
2
+ set -e
3
+ version=`./setup.py --version`
4
+ rm -rf build dist
5
+ mkdir -p darwin/gtk-3.0
6
+ GDK_PIXBUF_MODULEDIR="$(dirname $(which gdk-pixbuf-query-loaders))/../lib/gdk-pixbuf-2.0/2.10.0/loaders" \
7
+ gdk-pixbuf-query-loaders \
8
+ | sed -e '/^#/d' \
9
+ | sed -e 's@/.*/lib/gdk-pixbuf-2.0@\@executable_path/lib/gdk-pixbuf-2.0@' \
10
+ > darwin/gtk-3.0/gdk-pixbuf.loaders
11
+ gtk-query-immodules-3.0 \
12
+ | sed -e '/^#/d' \
13
+ | sed -e 's@/.*/lib/gtk-3.0@\@executable_path/lib/gtk-3.0@' \
14
+ > darwin/gtk-3.0/gtk.immodules
15
+ ./setup.py compile_catalog
16
+ ./setup-freeze.py bdist_mac
17
+ mkdir dist
18
+ mv build/Tryton.app dist/
19
+ for f in CHANGELOG COPYRIGHT LICENSE; do
20
+ cp ${f} dist/${f}.txt
21
+ done
22
+ cp -r doc dist/
23
+ rm -f "tryton-${version}.dmg"
24
+ hdiutil create "tryton-${version}.dmg" -volname "Tryton Client ${version}" \
25
+ -fs HFS+ -srcfolder dist
@@ -4,6 +4,9 @@ version=`./setup.py --version`
4
4
  series=${version%.*}
5
5
  bits=`python -c "import platform; print(platform.architecture()[0])"`
6
6
  rm -rf build dist
7
+ mkdir -p win32/gtk-3.0
8
+ gdk-pixbuf-query-loaders | sed -e '/^#/d' > win32/gtk-3.0/gdk-pixbuf.loaders
9
+ gtk-query-immodules-3.0 | sed -e '/^#/d' > win32/gtk-3.0/gtk.immodules
7
10
  ./setup.py compile_catalog
8
11
  ./setup-freeze.py install_exe -d dist
9
12
  cp `which gdbus.exe` dist/
@@ -124,14 +124,13 @@ version = version.strip()
124
124
 
125
125
  setup(name='tryton',
126
126
  version=version,
127
- packages=find_packages(),
128
127
  options={
129
128
  'build_exe': {
130
129
  'no_compress': True,
131
130
  'include_files': include_files,
132
131
  'excludes': ['tkinter'],
133
132
  'silent': True,
134
- 'packages': ['gi'],
133
+ 'packages': find_packages() + ['gi'],
135
134
  'include_msvcr': True,
136
135
  },
137
136
  'bdist_mac': {
@@ -1,6 +1,6 @@
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
- __version__ = "7.0.9"
3
+ __version__ = "7.0.28"
4
4
  import locale
5
5
 
6
6
  import gi
@@ -229,7 +229,7 @@ class ModelAccess(object):
229
229
  self._models = rpc.execute('model', 'ir.model', 'list_models',
230
230
  rpc.CONTEXT)
231
231
  except TrytonServerError:
232
- pass
232
+ logger.error("Unable to get model list.")
233
233
 
234
234
  def __getitem__(self, model):
235
235
  if model in self._access:
@@ -243,7 +243,14 @@ class ModelAccess(object):
243
243
  access = rpc.execute('model', 'ir.model.access', 'get_access',
244
244
  self._models[to_load], rpc.CONTEXT)
245
245
  except TrytonServerError:
246
- access = {}
246
+ logger.error("Unable to get access for %s.", model)
247
+ access = {
248
+ model: {
249
+ 'read': True,
250
+ 'write': False,
251
+ 'create': False,
252
+ 'delete': False},
253
+ }
247
254
  self._access.update(access)
248
255
  return self._access[model]
249
256
 
@@ -1254,6 +1261,8 @@ class RPCProgress(object):
1254
1261
 
1255
1262
  def return_():
1256
1263
  if self.exception:
1264
+ if not isinstance(self.exception, RPCException):
1265
+ raise RPCException(self.exception)
1257
1266
  raise self.exception
1258
1267
  else:
1259
1268
  return self.res
@@ -9,7 +9,9 @@ from gi.repository import Gdk, GObject, Gtk
9
9
 
10
10
  from .common import IconFactory
11
11
 
12
- __all__ = ['Date', 'CellRendererDate', 'Time', 'CellRendererTime', 'DateTime']
12
+ __all__ = [
13
+ 'Date', 'CellRendererDate', 'Time', 'CellRendererTime', 'DateTime',
14
+ 'date_parse']
13
15
 
14
16
  _ = gettext.gettext
15
17
 
@@ -433,7 +433,8 @@ def unique_value(domain, single_value=True):
433
433
  and operator == 'in' and len(value) == 1))
434
434
  and (not count
435
435
  or (count == 1 and model and name.endswith('.id')))):
436
- value = value if operator == '=' and single_value else value[0]
436
+ if operator == 'in' and single_value:
437
+ value = value[0]
437
438
  if model and name.endswith('.id'):
438
439
  model = model[0]
439
440
  value = [model, value]
@@ -5,6 +5,7 @@ import decimal
5
5
  import gettext
6
6
  import io
7
7
  import locale
8
+ import math
8
9
  from collections import OrderedDict
9
10
  from decimal import Decimal
10
11
  from shlex import shlex
@@ -128,10 +129,12 @@ def unescape(value, escape='\\'):
128
129
  return value.replace(escape + '%', '%').replace(escape + '_', '_')
129
130
 
130
131
 
131
- def quote(value):
132
+ def quote(value, empty=False):
132
133
  "Quote string if needed"
133
134
  if not isinstance(value, str):
134
135
  return value
136
+ if empty and value == '':
137
+ return '""'
135
138
  if '\\' in value:
136
139
  value = value.replace('\\', '\\\\')
137
140
  if '"' in value:
@@ -307,7 +310,7 @@ def convert_value(field, value, context=None):
307
310
  return converts.get(field['type'], lambda: value)()
308
311
 
309
312
 
310
- def format_value(field, value, target=None, context=None):
313
+ def format_value(field, value, target=None, context=None, _quote_empty=False):
311
314
  "Format value for field"
312
315
  if context is None:
313
316
  context = {}
@@ -334,17 +337,18 @@ def format_value(field, value, target=None, context=None):
334
337
  or isinstance(value, bool))):
335
338
  return ''
336
339
  digit = 0
337
- if isinstance(value, Decimal):
338
- cast = Decimal
339
- else:
340
- cast = float
341
- factor = cast(field.get('factor', 1))
342
- string_ = str(value * factor)
340
+ string_ = str(value)
343
341
  if 'e' in string_:
344
342
  string_, exp = string_.split('e')
345
343
  digit -= int(exp)
346
344
  if '.' in string_:
347
345
  digit += len(string_.rstrip('0').split('.')[1])
346
+ if isinstance(value, Decimal):
347
+ cast = Decimal
348
+ else:
349
+ cast = float
350
+ factor = cast(field.get('factor', 1))
351
+ digit -= round(math.log10(factor))
348
352
  return locale.localize(
349
353
  '{0:.{1}f}'.format(value * factor or 0, digit), True)
350
354
 
@@ -410,9 +414,11 @@ def format_value(field, value, target=None, context=None):
410
414
  'many2one': format_many2one,
411
415
  }
412
416
  if isinstance(value, (list, tuple)):
413
- return ';'.join(format_value(field, x, context=context) for x in value)
417
+ return ';'.join(
418
+ format_value(field, x, context=context, _quote_empty=True)
419
+ for x in value)
414
420
  return quote(converts.get(field['type'],
415
- lambda: value if value is not None else '')())
421
+ lambda: value if value is not None else '')(), empty=_quote_empty)
416
422
 
417
423
 
418
424
  def complete_value(field, value):
@@ -647,10 +653,16 @@ class DomainParser(object):
647
653
  operator = operator.rstrip(def_operator
648
654
  ).replace('not', '!').strip()
649
655
  if operator.endswith('in'):
650
- if operator == 'not in':
651
- operator = '!'
656
+ if isinstance(value, (list, tuple)) and len(value) == 1:
657
+ if operator == 'not in':
658
+ operator = '!='
659
+ else:
660
+ operator = '='
652
661
  else:
653
- operator = ''
662
+ if operator == 'not in':
663
+ operator = '!'
664
+ else:
665
+ operator = ''
654
666
  formatted_value = format_value(field, value, target, self.context)
655
667
  if (operator in OPERATORS
656
668
  and field['type'] in ('char', 'text', 'selection')
@@ -11,7 +11,7 @@ from tryton.common import get_toplevel_window
11
11
  from tryton.config import CONFIG, PIXMAPS_DIR
12
12
 
13
13
  COPYRIGHT = '''\
14
- Copyright (C) 2004-2024 Tryton.
14
+ Copyright (C) 2004-2025 Tryton.
15
15
  '''
16
16
  AUTHORS = [
17
17
  'Bertrand Chenal <bertrand.chenal@b2ck.com>',
@@ -429,7 +429,7 @@ class Form(TabContent):
429
429
  delimiter = ';'
430
430
  fileno, fname = tempfile.mkstemp(
431
431
  '.csv', common.slugify(export['name']) + '_')
432
- with open(fname, 'w') as fp:
432
+ with open(fname, 'w', newline='') as fp:
433
433
  writer = csv.writer(fp, delimiter=delimiter)
434
434
  for row, path in zip_longest(data, paths or []):
435
435
  indent = len(path) - 1 if path else 0
@@ -463,9 +463,9 @@ class Form(TabContent):
463
463
  if widget:
464
464
  # Called from button so we must save the tree state
465
465
  self.screen.save_tree_state()
466
- if not (common.MODELACCESS[self.model]['write']
467
- or common.MODELACCESS[self.model]['create']
468
- or self.screen.writable):
466
+ if (self.screen.readonly
467
+ or not (common.MODELACCESS[self.model]['write']
468
+ or common.MODELACCESS[self.model]['create'])):
469
469
  return
470
470
  if self.screen.save_current():
471
471
  self.info_bar_add(_('Record saved.'), Gtk.MessageType.INFO)
@@ -578,6 +578,7 @@ class Form(TabContent):
578
578
  name = str(position) if position else '_'
579
579
  selected = len(self.screen.selected_records)
580
580
  view_type = self.screen.current_view.view_type
581
+ next_view_type = self.screen.next_view_type
581
582
  has_views = self.screen.number_of_views > 1
582
583
  if selected > 1:
583
584
  name += '#%i' % selected
@@ -593,7 +594,9 @@ class Form(TabContent):
593
594
  for b in self.screen.get_buttons())
594
595
  set_sensitive(button_id, bool(position) and can_be_sensitive)
595
596
  set_sensitive(
596
- 'switch', (position or view_type == 'form') and has_views)
597
+ 'switch',
598
+ (position or view_type == 'form' or next_view_type != 'form')
599
+ and has_views)
597
600
  set_sensitive('remove', self.screen.deletable)
598
601
  set_sensitive('previous', self.screen.has_prev())
599
602
  set_sensitive('next', self.screen.has_next())
@@ -633,12 +636,15 @@ class Form(TabContent):
633
636
  if value == 'ok':
634
637
  return self.sig_save(None)
635
638
  if value == 'ko':
636
- record_id = self.screen.current_record.id
639
+ record_id = None
640
+ if self.screen.current_record:
641
+ record_id = self.screen.current_record.id
637
642
  if self.sig_reload(test_modified=False):
638
- if record_id < 0:
639
- return None
640
- elif self.screen.current_record:
641
- return record_id == self.screen.current_record.id
643
+ if record_id is not None:
644
+ if record_id < 0:
645
+ return None
646
+ elif self.screen.current_record:
647
+ return record_id == self.screen.current_record.id
642
648
  return False
643
649
  return True
644
650