tryton 7.0.8__tar.gz → 7.0.10__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.

Potentially problematic release.


This version of tryton might be problematic. Click here for more details.

Files changed (287) hide show
  1. {tryton-7.0.8 → tryton-7.0.10}/CHANGELOG +10 -0
  2. {tryton-7.0.8 → tryton-7.0.10}/COPYRIGHT +1 -1
  3. {tryton-7.0.8 → tryton-7.0.10}/PKG-INFO +1 -1
  4. {tryton-7.0.8 → tryton-7.0.10}/setup-freeze.py +1 -2
  5. {tryton-7.0.8 → tryton-7.0.10}/tryton/__init__.py +1 -1
  6. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/common.py +10 -3
  7. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/datetime_.py +3 -1
  8. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/bg/LC_MESSAGES/tryton.mo +0 -0
  9. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/ca/LC_MESSAGES/tryton.mo +0 -0
  10. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/cs/LC_MESSAGES/tryton.mo +0 -0
  11. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/de/LC_MESSAGES/tryton.mo +0 -0
  12. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/es/LC_MESSAGES/tryton.mo +0 -0
  13. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/es_419/LC_MESSAGES/tryton.mo +0 -0
  14. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/et/LC_MESSAGES/tryton.mo +0 -0
  15. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/fa/LC_MESSAGES/tryton.mo +0 -0
  16. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/fi/LC_MESSAGES/tryton.mo +0 -0
  17. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/fr/LC_MESSAGES/tryton.mo +0 -0
  18. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/hu/LC_MESSAGES/tryton.mo +0 -0
  19. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/id/LC_MESSAGES/tryton.mo +0 -0
  20. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/it/LC_MESSAGES/tryton.mo +0 -0
  21. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/ja_JP/LC_MESSAGES/tryton.mo +0 -0
  22. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/lo/LC_MESSAGES/tryton.mo +0 -0
  23. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/lt/LC_MESSAGES/tryton.mo +0 -0
  24. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/nl/LC_MESSAGES/tryton.mo +0 -0
  25. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/pl/LC_MESSAGES/tryton.mo +0 -0
  26. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/pt/LC_MESSAGES/tryton.mo +0 -0
  27. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/ro/LC_MESSAGES/tryton.mo +0 -0
  28. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/ru/LC_MESSAGES/tryton.mo +0 -0
  29. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/sl/LC_MESSAGES/tryton.mo +0 -0
  30. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/tr/LC_MESSAGES/tryton.mo +0 -0
  31. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/uk/LC_MESSAGES/tryton.mo +0 -0
  32. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/zh_CN/LC_MESSAGES/tryton.mo +0 -0
  33. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/form.py +2 -1
  34. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/screen/screen.py +60 -36
  35. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/char.py +5 -6
  36. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/graph_gtk/graph.py +3 -1
  37. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/list_gtk/editabletree.py +2 -1
  38. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/list_gtk/widget.py +21 -1
  39. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/win_form.py +1 -1
  40. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/win_import.py +9 -4
  41. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/wizard.py +2 -0
  42. {tryton-7.0.8 → tryton-7.0.10}/tryton/jsonrpc.py +5 -1
  43. {tryton-7.0.8 → tryton-7.0.10}/tryton/plugins/__init__.py +5 -3
  44. {tryton-7.0.8 → tryton-7.0.10}/tryton/pyson.py +1 -1
  45. {tryton-7.0.8 → tryton-7.0.10}/tryton.egg-info/PKG-INFO +1 -1
  46. {tryton-7.0.8 → tryton-7.0.10}/LICENSE +0 -0
  47. {tryton-7.0.8 → tryton-7.0.10}/MANIFEST.in +0 -0
  48. {tryton-7.0.8 → tryton-7.0.10}/README.rst +0 -0
  49. {tryton-7.0.8 → tryton-7.0.10}/bin/tryton +0 -0
  50. {tryton-7.0.8 → tryton-7.0.10}/catalan.nsh +0 -0
  51. {tryton-7.0.8 → tryton-7.0.10}/darwin/gtk-3.0/gdk-pixbuf.loaders +0 -0
  52. {tryton-7.0.8 → tryton-7.0.10}/darwin/gtk-3.0/gtk.immodules +0 -0
  53. {tryton-7.0.8 → tryton-7.0.10}/doc/conf.py +0 -0
  54. {tryton-7.0.8 → tryton-7.0.10}/doc/glossary.rst +0 -0
  55. {tryton-7.0.8 → tryton-7.0.10}/doc/index.rst +0 -0
  56. {tryton-7.0.8 → tryton-7.0.10}/doc/installation.rst +0 -0
  57. {tryton-7.0.8 → tryton-7.0.10}/doc/releases.rst +0 -0
  58. {tryton-7.0.8 → tryton-7.0.10}/doc/requirements-doc.txt +0 -0
  59. {tryton-7.0.8 → tryton-7.0.10}/doc/usage.rst +0 -0
  60. {tryton-7.0.8 → tryton-7.0.10}/english.nsh +0 -0
  61. {tryton-7.0.8 → tryton-7.0.10}/farsi.nsh +0 -0
  62. {tryton-7.0.8 → tryton-7.0.10}/french.nsh +0 -0
  63. {tryton-7.0.8 → tryton-7.0.10}/german.nsh +0 -0
  64. {tryton-7.0.8 → tryton-7.0.10}/make-darwin-installer.sh +0 -0
  65. {tryton-7.0.8 → tryton-7.0.10}/make-win32-installer.sh +0 -0
  66. {tryton-7.0.8 → tryton-7.0.10}/portuguese.nsh +0 -0
  67. {tryton-7.0.8 → tryton-7.0.10}/setup.cfg +0 -0
  68. {tryton-7.0.8 → tryton-7.0.10}/setup.nsi +0 -0
  69. {tryton-7.0.8 → tryton-7.0.10}/setup.py +0 -0
  70. {tryton-7.0.8 → tryton-7.0.10}/slovenian.nsh +0 -0
  71. {tryton-7.0.8 → tryton-7.0.10}/spanish.nsh +0 -0
  72. {tryton-7.0.8 → tryton-7.0.10}/tox.ini +0 -0
  73. {tryton-7.0.8 → tryton-7.0.10}/tryton/action/__init__.py +0 -0
  74. {tryton-7.0.8 → tryton-7.0.10}/tryton/action/main.py +0 -0
  75. {tryton-7.0.8 → tryton-7.0.10}/tryton/bus.py +0 -0
  76. {tryton-7.0.8 → tryton-7.0.10}/tryton/client.py +0 -0
  77. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/__init__.py +0 -0
  78. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/button.py +0 -0
  79. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/cellrendererbinary.py +0 -0
  80. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/cellrendererbutton.py +0 -0
  81. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/cellrendererclickablepixbuf.py +0 -0
  82. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/cellrenderercombo.py +0 -0
  83. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/cellrendererfloat.py +0 -0
  84. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/cellrendererinteger.py +0 -0
  85. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/cellrenderertext.py +0 -0
  86. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/cellrenderertoggle.py +0 -0
  87. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/completion.py +0 -0
  88. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/domain_inversion.py +0 -0
  89. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/domain_parser.py +0 -0
  90. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/entry_position.py +0 -0
  91. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/environment.py +0 -0
  92. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/focus.py +0 -0
  93. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/htmltextbuffer.py +0 -0
  94. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/number_entry.py +0 -0
  95. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/popup_menu.py +0 -0
  96. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/richtext.py +0 -0
  97. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/selection.py +0 -0
  98. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/timedelta.py +0 -0
  99. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/underline.py +0 -0
  100. {tryton-7.0.8 → tryton-7.0.10}/tryton/common/widget_style.py +0 -0
  101. {tryton-7.0.8 → tryton-7.0.10}/tryton/config.py +0 -0
  102. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/bg/LC_MESSAGES/tryton.po +0 -0
  103. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/ca/LC_MESSAGES/tryton.po +0 -0
  104. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/cs/LC_MESSAGES/tryton.po +0 -0
  105. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/de/LC_MESSAGES/tryton.po +0 -0
  106. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/es/LC_MESSAGES/tryton.po +0 -0
  107. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/es_419/LC_MESSAGES/tryton.po +0 -0
  108. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/et/LC_MESSAGES/tryton.po +0 -0
  109. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/fa/LC_MESSAGES/tryton.po +0 -0
  110. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/fi/LC_MESSAGES/tryton.po +0 -0
  111. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/fr/LC_MESSAGES/tryton.po +0 -0
  112. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/hu/LC_MESSAGES/tryton.po +0 -0
  113. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/id/LC_MESSAGES/tryton.po +0 -0
  114. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/it/LC_MESSAGES/tryton.po +0 -0
  115. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/ja_JP/LC_MESSAGES/tryton.po +0 -0
  116. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/lo/LC_MESSAGES/tryton.po +0 -0
  117. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/lt/LC_MESSAGES/tryton.po +0 -0
  118. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/nl/LC_MESSAGES/tryton.po +0 -0
  119. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/pl/LC_MESSAGES/tryton.po +0 -0
  120. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/pt/LC_MESSAGES/tryton.po +0 -0
  121. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/ro/LC_MESSAGES/tryton.po +0 -0
  122. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/ru/LC_MESSAGES/tryton.po +0 -0
  123. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/sl/LC_MESSAGES/tryton.po +0 -0
  124. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/tr/LC_MESSAGES/tryton.po +0 -0
  125. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/tryton.pot +0 -0
  126. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/uk/LC_MESSAGES/tryton.po +0 -0
  127. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/locale/zh_CN/LC_MESSAGES/tryton.po +0 -0
  128. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/LICENSE +0 -0
  129. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-add.svg +0 -0
  130. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-archive.svg +0 -0
  131. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-arrow-down.svg +0 -0
  132. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-arrow-left.svg +0 -0
  133. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-arrow-right.svg +0 -0
  134. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-arrow-up.svg +0 -0
  135. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-attach.svg +0 -0
  136. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-back.svg +0 -0
  137. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-barcode-scanner.svg +0 -0
  138. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-bookmark-border.svg +0 -0
  139. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-bookmark.svg +0 -0
  140. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-bookmarks.svg +0 -0
  141. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-cancel.svg +0 -0
  142. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-clear.svg +0 -0
  143. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-close.svg +0 -0
  144. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-copy.svg +0 -0
  145. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-create.svg +0 -0
  146. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-date.svg +0 -0
  147. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-delete.svg +0 -0
  148. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-download.svg +0 -0
  149. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-drag.svg +0 -0
  150. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-email.svg +0 -0
  151. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-error.svg +0 -0
  152. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-exit.svg +0 -0
  153. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-export.svg +0 -0
  154. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-filter.svg +0 -0
  155. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-format-align-center.svg +0 -0
  156. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-format-align-justify.svg +0 -0
  157. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-format-align-left.svg +0 -0
  158. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-format-align-right.svg +0 -0
  159. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-format-bold.svg +0 -0
  160. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-format-color-text.svg +0 -0
  161. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-format-italic.svg +0 -0
  162. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-format-underline.svg +0 -0
  163. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-forward.svg +0 -0
  164. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-history.svg +0 -0
  165. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-icon.png +0 -0
  166. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-icon.svg +0 -0
  167. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-import.svg +0 -0
  168. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-info.svg +0 -0
  169. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-launch.svg +0 -0
  170. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-link.svg +0 -0
  171. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-log.svg +0 -0
  172. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-menu.svg +0 -0
  173. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-note.svg +0 -0
  174. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-ok.svg +0 -0
  175. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-open.svg +0 -0
  176. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-print.svg +0 -0
  177. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-public.svg +0 -0
  178. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-question.svg +0 -0
  179. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-refresh.svg +0 -0
  180. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-remove.svg +0 -0
  181. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-save.svg +0 -0
  182. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-search.svg +0 -0
  183. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-send.svg +0 -0
  184. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-sound-off.svg +0 -0
  185. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-sound-on.svg +0 -0
  186. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-star-border.svg +0 -0
  187. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-star.svg +0 -0
  188. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-switch.svg +0 -0
  189. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-translate.svg +0 -0
  190. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-unarchive.svg +0 -0
  191. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-undo.svg +0 -0
  192. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton-warning.svg +0 -0
  193. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton.icns +0 -0
  194. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton.ico +0 -0
  195. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/pixmaps/tryton/tryton.svg +0 -0
  196. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/sounds/LICENSE +0 -0
  197. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/sounds/danger.wav +0 -0
  198. {tryton-7.0.8 → tryton-7.0.10}/tryton/data/sounds/success.wav +0 -0
  199. {tryton-7.0.8 → tryton-7.0.10}/tryton/device_cookie.py +0 -0
  200. {tryton-7.0.8 → tryton-7.0.10}/tryton/exceptions.py +0 -0
  201. {tryton-7.0.8 → tryton-7.0.10}/tryton/fingerprints.py +0 -0
  202. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/__init__.py +0 -0
  203. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/main.py +0 -0
  204. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/__init__.py +0 -0
  205. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/about.py +0 -0
  206. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/attachment.py +0 -0
  207. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/board.py +0 -0
  208. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/code_scanner.py +0 -0
  209. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/dblogin.py +0 -0
  210. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/email_.py +0 -0
  211. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/infobar.py +0 -0
  212. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/limit.py +0 -0
  213. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/log.py +0 -0
  214. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/nomodal.py +0 -0
  215. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/note.py +0 -0
  216. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/preference.py +0 -0
  217. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/revision.py +0 -0
  218. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/tabcontent.py +0 -0
  219. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_board/__init__.py +0 -0
  220. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_board/action.py +0 -0
  221. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_board/view_board.py +0 -0
  222. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/__init__.py +0 -0
  223. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/model/__init__.py +0 -0
  224. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/model/field.py +0 -0
  225. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/model/group.py +0 -0
  226. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/model/record.py +0 -0
  227. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/screen/__init__.py +0 -0
  228. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/__init__.py +0 -0
  229. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/calendar_.py +0 -0
  230. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/calendar_gtk/__init__.py +0 -0
  231. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py +0 -0
  232. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/calendar_gtk/dates_period.py +0 -0
  233. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/calendar_gtk/toolbar.py +0 -0
  234. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form.py +0 -0
  235. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/__init__.py +0 -0
  236. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/binary.py +0 -0
  237. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/calendar_.py +0 -0
  238. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/checkbox.py +0 -0
  239. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/dictionary.py +0 -0
  240. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/document.py +0 -0
  241. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/float.py +0 -0
  242. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/image.py +0 -0
  243. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/integer.py +0 -0
  244. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/many2many.py +0 -0
  245. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/many2one.py +0 -0
  246. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/multiselection.py +0 -0
  247. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/one2many.py +0 -0
  248. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/one2one.py +0 -0
  249. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/progressbar.py +0 -0
  250. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/pyson.py +0 -0
  251. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/reference.py +0 -0
  252. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/richtextbox.py +0 -0
  253. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/selection.py +0 -0
  254. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/state_widget.py +0 -0
  255. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/textbox.py +0 -0
  256. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/timedelta.py +0 -0
  257. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/url.py +0 -0
  258. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/form_gtk/widget.py +0 -0
  259. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/graph.py +0 -0
  260. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/graph_gtk/__init__.py +0 -0
  261. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/graph_gtk/bar.py +0 -0
  262. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/graph_gtk/line.py +0 -0
  263. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/graph_gtk/pie.py +0 -0
  264. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/list.py +0 -0
  265. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/list_form.py +0 -0
  266. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/list_gtk/__init__.py +0 -0
  267. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/view_form/view/screen_container.py +0 -0
  268. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/win_csv.py +0 -0
  269. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/win_export.py +0 -0
  270. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/win_search.py +0 -0
  271. {tryton-7.0.8 → tryton-7.0.10}/tryton/gui/window/window.py +0 -0
  272. {tryton-7.0.8 → tryton-7.0.10}/tryton/plugins/translation/__init__.py +0 -0
  273. {tryton-7.0.8 → tryton-7.0.10}/tryton/rpc.py +0 -0
  274. {tryton-7.0.8 → tryton-7.0.10}/tryton/tests/__init__.py +0 -0
  275. {tryton-7.0.8 → tryton-7.0.10}/tryton/tests/test_common.py +0 -0
  276. {tryton-7.0.8 → tryton-7.0.10}/tryton/tests/test_common_domain_parser.py +0 -0
  277. {tryton-7.0.8 → tryton-7.0.10}/tryton/tests/test_common_selection.py +0 -0
  278. {tryton-7.0.8 → tryton-7.0.10}/tryton/tests/test_common_timedelta.py +0 -0
  279. {tryton-7.0.8 → tryton-7.0.10}/tryton/translate.py +0 -0
  280. {tryton-7.0.8 → tryton-7.0.10}/tryton.desktop +0 -0
  281. {tryton-7.0.8 → tryton-7.0.10}/tryton.egg-info/SOURCES.txt +0 -0
  282. {tryton-7.0.8 → tryton-7.0.10}/tryton.egg-info/dependency_links.txt +0 -0
  283. {tryton-7.0.8 → tryton-7.0.10}/tryton.egg-info/not-zip-safe +0 -0
  284. {tryton-7.0.8 → tryton-7.0.10}/tryton.egg-info/requires.txt +0 -0
  285. {tryton-7.0.8 → tryton-7.0.10}/tryton.egg-info/top_level.txt +0 -0
  286. {tryton-7.0.8 → tryton-7.0.10}/win32/gtk-3.0/gdk-pixbuf.loaders +0 -0
  287. {tryton-7.0.8 → tryton-7.0.10}/win32/gtk-3.0/gtk.immodules +0 -0
@@ -1,4 +1,14 @@
1
1
 
2
+ Version 7.0.10 - 2024-05-01
3
+ ---------------------------
4
+ * Bug fixes (see mercurial logs for details)
5
+
6
+
7
+ Version 7.0.9 - 2024-04-17
8
+ --------------------------
9
+ * Bug fixes (see mercurial logs for details)
10
+
11
+
2
12
  Version 7.0.8 - 2024-04-04
3
13
  --------------------------
4
14
  * Bug fixes (see mercurial logs for details)
@@ -5,7 +5,7 @@ Copyright (C) 2007-2024 Cédric Krier.
5
5
  Copyright (C) 2008-2011 Udo Spallek.
6
6
  Copyright (C) 2008-2011 virtual things - Preisler & Spallek GbR.
7
7
  Copyright (C) 2008-2024 B2CK SPRL.
8
- Copyright (C) 2010-2023 Nicolas Évrard.
8
+ Copyright (C) 2010-2024 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
1
  Metadata-Version: 2.1
2
2
  Name: tryton
3
- Version: 7.0.8
3
+ Version: 7.0.10
4
4
  Summary: Tryton desktop client
5
5
  Home-page: http://www.tryton.org/
6
6
  Download-URL: http://downloads.tryton.org/7.0/
@@ -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.8"
3
+ __version__ = "7.0.10"
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,7 +1261,7 @@ class RPCProgress(object):
1254
1261
 
1255
1262
  def return_():
1256
1263
  if self.exception:
1257
- raise self.exception
1264
+ raise RPCException(self.exception)
1258
1265
  else:
1259
1266
  return self.res
1260
1267
 
@@ -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
 
@@ -66,7 +66,8 @@ class Form(TabContent):
66
66
  if isinstance(res_id, int):
67
67
  res_id = [res_id]
68
68
  self.screen.load(res_id)
69
- self.screen.current_record = self.screen.group.get(res_id[0])
69
+ if res_id:
70
+ self.screen.current_record = self.screen.group.get(res_id[0])
70
71
  self.screen.display()
71
72
  else:
72
73
  if self.screen.current_view.view_type == 'form':
@@ -116,11 +116,10 @@ class Screen:
116
116
  return child
117
117
 
118
118
  # Remove first level Viewport and ScrolledWindow to fill the Vbox
119
- for widget in [
120
- self.context_screen.screen_container.viewport,
121
- self.context_screen.current_view.widget.get_children()[0],
122
- ]:
123
- remove_bin(widget)
119
+ remove_bin(self.context_screen.screen_container.viewport)
120
+ if self.context_screen.current_view:
121
+ remove_bin(
122
+ self.context_screen.current_view.widget.get_children()[0])
124
123
 
125
124
  self.screen_container.filter_vbox.pack_start(
126
125
  context_widget, expand=False, fill=True, padding=0)
@@ -520,7 +519,8 @@ class Screen:
520
519
  self.group.destroy()
521
520
 
522
521
  def default_row_activate(self):
523
- if (self.current_view.view_type == 'tree'
522
+ if (self.current_view
523
+ and self.current_view.view_type == 'tree'
524
524
  and int(self.current_view.attributes.get('keyword_open', 0))):
525
525
  return Action.exec_keyword('tree_open', {
526
526
  'model': self.model_name,
@@ -642,7 +642,7 @@ class Screen:
642
642
 
643
643
  def new(self, default=True, defaults=None):
644
644
  previous_view = self.current_view
645
- if self.current_view.view_type == 'calendar':
645
+ if self.current_view and self.current_view.view_type == 'calendar':
646
646
  selected_date = self.current_view.get_selected_date()
647
647
  if self.current_view and not self.current_view.creatable:
648
648
  self.switch_view(creatable=True)
@@ -695,16 +695,19 @@ class Screen:
695
695
 
696
696
  def save_current(self):
697
697
  if not self.current_record:
698
- if self.current_view.view_type == 'tree' and len(self.group):
698
+ if (self.current_view
699
+ and self.current_view.view_type == 'tree'
700
+ and len(self.group)):
699
701
  self.current_record = self.group[0]
700
702
  else:
701
703
  return True
702
- self.current_view.set_value()
703
704
  saved = False
704
705
  record_id = None
705
- fields = self.current_view.get_fields()
706
+ if self.current_view:
707
+ self.current_view.set_value()
708
+ fields = self.current_view.get_fields()
706
709
  path = self.current_record.get_path(self.group)
707
- if self.current_view.view_type == 'tree':
710
+ if self.current_view and self.current_view.view_type == 'tree':
708
711
  # False value must be not saved
709
712
  saved = all((
710
713
  x is not False and x >= 0
@@ -714,7 +717,7 @@ class Screen:
714
717
  record_id = self.current_record.save(force_reload=True)
715
718
  # False value must be not saved
716
719
  saved = record_id is not False and record_id >= 0
717
- else:
720
+ elif self.current_view:
718
721
  self.set_cursor()
719
722
  self.current_view.display()
720
723
  return False
@@ -742,17 +745,19 @@ class Screen:
742
745
  def get(self):
743
746
  if not self.current_record:
744
747
  return None
745
- self.current_view.set_value()
748
+ if self.current_view:
749
+ self.current_view.set_value()
746
750
  return self.current_record.get()
747
751
 
748
752
  def get_on_change_value(self):
749
753
  if not self.current_record:
750
754
  return None
751
- self.current_view.set_value()
755
+ if self.current_view:
756
+ self.current_view.set_value()
752
757
  return self.current_record.get_on_change_value()
753
758
 
754
759
  def modified(self):
755
- if self.current_view.view_type != 'tree':
760
+ if self.current_view and self.current_view.view_type != 'tree':
756
761
  if self.current_record:
757
762
  if self.current_record.modified or self.current_record.id < 0:
758
763
  return True
@@ -760,7 +765,7 @@ class Screen:
760
765
  for record in self.group:
761
766
  if record.modified or record.id < 0:
762
767
  return True
763
- if self.current_view.modified:
768
+ if self.current_view and self.current_view.modified:
764
769
  return True
765
770
  return False
766
771
 
@@ -829,6 +834,8 @@ class Screen:
829
834
 
830
835
  def set_tree_state(self):
831
836
  view = self.current_view
837
+ if not view:
838
+ return
832
839
  if view.view_type not in {'tree', 'form', 'list-form'}:
833
840
  return
834
841
  if id(view) in self.tree_states_done:
@@ -938,12 +945,13 @@ class Screen:
938
945
 
939
946
  def load(self, ids, set_cursor=True, modified=False, position=-1):
940
947
  self.group.load(ids, modified=modified, position=position)
941
- self.current_view.reset()
948
+ if self.current_view:
949
+ self.current_view.reset()
942
950
  self.current_record = None
943
951
  self.display(set_cursor=set_cursor)
944
952
 
945
953
  def display(self, set_cursor=False):
946
- if self.views:
954
+ if self.views and self.current_view:
947
955
  self.search_active(self.current_view.view_type
948
956
  in ('tree', 'graph', 'calendar'))
949
957
  for view in self.views:
@@ -975,7 +983,8 @@ class Screen:
975
983
 
976
984
  def _get_next_record(self, test=False):
977
985
  view = self.current_view
978
- if (view.view_type in {'tree', 'form'}
986
+ if (view
987
+ and view.view_type in {'tree', 'form'}
979
988
  and self.current_record
980
989
  and self.current_record.group):
981
990
  group = self.current_record.group
@@ -1003,12 +1012,14 @@ class Screen:
1003
1012
  record = next
1004
1013
  break
1005
1014
  return record
1006
- elif (view.view_type == 'list-form' and len(self.group)
1015
+ elif (view
1016
+ and view.view_type == 'list-form'
1017
+ and len(self.group)
1007
1018
  and self.current_record in self.group):
1008
1019
  idx = self.group.index(self.current_record)
1009
1020
  if 0 <= idx < len(self.group) - 1:
1010
1021
  return self.group[idx + 1]
1011
- elif view.view_type == 'calendar':
1022
+ elif view and view.view_type == 'calendar':
1012
1023
  record = self.current_record
1013
1024
  goocalendar = view.widgets.get('goocalendar')
1014
1025
  if goocalendar:
@@ -1042,15 +1053,18 @@ class Screen:
1042
1053
 
1043
1054
  def display_next(self):
1044
1055
  view = self.current_view
1045
- view.set_value()
1056
+ if view:
1057
+ view.set_value()
1046
1058
  self.set_cursor(reset_view=False)
1047
1059
  self.current_record = self._get_next_record()
1048
1060
  self.set_cursor(reset_view=False)
1049
- view.display()
1061
+ if view:
1062
+ view.display()
1050
1063
 
1051
1064
  def _get_prev_record(self, test=False):
1052
1065
  view = self.current_view
1053
- if (view.view_type in {'tree', 'form'}
1066
+ if (view
1067
+ and view.view_type in {'tree', 'form'}
1054
1068
  and self.current_record
1055
1069
  and self.current_record.group):
1056
1070
  group = self.current_record.group
@@ -1068,7 +1082,7 @@ class Screen:
1068
1082
  if parent and record.model_name == parent.model_name:
1069
1083
  record = parent
1070
1084
  return record
1071
- elif view.view_type == 'calendar':
1085
+ elif view and view.view_type == 'calendar':
1072
1086
  record = self.current_record
1073
1087
  goocalendar = view.widgets.get('goocalendar')
1074
1088
  if goocalendar:
@@ -1093,7 +1107,9 @@ class Screen:
1093
1107
  if prev_id >= 0:
1094
1108
  return events[prev_id].record
1095
1109
  break
1096
- elif (view.view_type == 'list-form' and len(self.group)
1110
+ elif (view
1111
+ and view.view_type == 'list-form'
1112
+ and len(self.group)
1097
1113
  and self.current_record in self.group):
1098
1114
  idx = self.group.index(self.current_record)
1099
1115
  if 0 < idx <= len(self.group) - 1:
@@ -1107,11 +1123,13 @@ class Screen:
1107
1123
 
1108
1124
  def display_prev(self):
1109
1125
  view = self.current_view
1110
- view.set_value()
1126
+ if view:
1127
+ view.set_value()
1111
1128
  self.set_cursor(reset_view=False)
1112
1129
  self.current_record = self._get_prev_record()
1113
1130
  self.set_cursor(reset_view=False)
1114
- view.display()
1131
+ if view:
1132
+ view.display()
1115
1133
 
1116
1134
  def invalid_message(self, record=None):
1117
1135
  if record is None:
@@ -1184,7 +1202,7 @@ class Screen:
1184
1202
  if not self.selected_records:
1185
1203
  return []
1186
1204
 
1187
- buttons = self.current_view.get_buttons()
1205
+ buttons = self.current_view.get_buttons() if self.current_view else []
1188
1206
 
1189
1207
  for record in self.selected_records:
1190
1208
  buttons = [b for b in buttons if is_active(record, b)]
@@ -1194,8 +1212,9 @@ class Screen:
1194
1212
 
1195
1213
  def button(self, button):
1196
1214
  'Execute button on the selected records'
1197
- self.current_view.set_value()
1198
- fields = self.current_view.get_fields()
1215
+ if self.current_view:
1216
+ self.current_view.set_value()
1217
+ fields = self.current_view.get_fields()
1199
1218
  for record in self.selected_records:
1200
1219
  domain = record.expr_eval(
1201
1220
  button.get('states', {})).get('pre_validate', [])
@@ -1209,7 +1228,8 @@ class Screen:
1209
1228
  if button.get('confirm', False) and not sur(button['confirm']):
1210
1229
  return
1211
1230
  if button.get('type', 'class') == 'class':
1212
- if not self.current_record.save(force_reload=False):
1231
+ record_id = self.current_record.save(force_reload=False)
1232
+ if record_id is False or record_id < 0:
1213
1233
  return
1214
1234
  if button.get('type', 'class') == 'class':
1215
1235
  self._button_class(button)
@@ -1240,6 +1260,7 @@ class Screen:
1240
1260
  except RPCException:
1241
1261
  action = None
1242
1262
  self.reload(ids, written=True)
1263
+ self.record_saved()
1243
1264
  if isinstance(action, str):
1244
1265
  self.client_action(action)
1245
1266
  elif action:
@@ -1276,7 +1297,9 @@ class Screen:
1276
1297
  elif action.startswith('switch'):
1277
1298
  self.switch_view(*action.split(None, 2)[1:])
1278
1299
  elif action == 'reload':
1279
- if (self.current_view.view_type in ['tree', 'graph', 'calendar']
1300
+ if (self.current_view
1301
+ and self.current_view.view_type in [
1302
+ 'tree', 'graph', 'calendar']
1280
1303
  and not self.parent):
1281
1304
  self.search_filter()
1282
1305
  elif action == 'reload menu':
@@ -1306,7 +1329,7 @@ class Screen:
1306
1329
  cls=JSONEncoder, separators=(',', ':'))))
1307
1330
  path = [CONFIG['login.db'], 'model', self.model_name]
1308
1331
  view_ids = [v.view_id for v in self.views] + self.view_ids
1309
- if self.current_view.view_type != 'form':
1332
+ if self.current_view and self.current_view.view_type != 'form':
1310
1333
  if self.search_value:
1311
1334
  search_value = self.search_value
1312
1335
  else:
@@ -1318,8 +1341,9 @@ class Screen:
1318
1341
  separators=(',', ':'))))
1319
1342
  elif self.current_record and self.current_record.id > -1:
1320
1343
  path.append(str(self.current_record.id))
1321
- i = view_ids.index(self.current_view.view_id)
1322
- view_ids = view_ids[i:] + view_ids[:i]
1344
+ if self.current_view:
1345
+ i = view_ids.index(self.current_view.view_id)
1346
+ view_ids = view_ids[i:] + view_ids[:i]
1323
1347
  if view_ids:
1324
1348
  query_string.append(('views', json.dumps(
1325
1349
  view_ids, separators=(',', ':'))))
@@ -171,10 +171,9 @@ class Password(Char):
171
171
  self.widget.pack_start(
172
172
  self.visibility_checkbox, expand=False, fill=True, padding=0)
173
173
 
174
- def _readonly_set(self, value):
175
- super(Char, self)._readonly_set(value)
176
- self.entry.set_editable(not value)
177
- self.visibility_checkbox.props.visible = not value
178
-
179
174
  def toggle_visibility(self, button):
180
- self.entry.props.visibility = not self.entry.props.visibility
175
+ if self.autocomplete:
176
+ entry = self.entry.get_child()
177
+ else:
178
+ entry = self.entry
179
+ entry.props.visibility = not self.entry.props.visibility
@@ -12,6 +12,7 @@ from dateutil.relativedelta import relativedelta
12
12
  from gi.repository import Gdk, Gtk
13
13
 
14
14
  import tryton.rpc as rpc
15
+ from tryton import common
15
16
  from tryton.action import Action
16
17
  from tryton.common import COLOR_SCHEMES, generateColorscheme, hex2rgb
17
18
  from tryton.config import CONFIG
@@ -386,7 +387,8 @@ class Graph(Gtk.DrawingArea):
386
387
  if isinstance(value, datetime.timedelta):
387
388
  value = value.total_seconds()
388
389
  self.datas[x][key] += float(value or 0)
389
- date_format = self.view.screen.context.get('date_format', '%x')
390
+ date_format = common.date_format(
391
+ self.view.screen.context.get('date_format'))
390
392
  datetime_format = date_format + ' %X'
391
393
  if isinstance(minx, datetime.datetime):
392
394
  date = minx
@@ -163,7 +163,8 @@ class EditableTreeView(TreeView):
163
163
  for renderer in column.get_cells():
164
164
  if renderer.props.editing:
165
165
  widget = self.view.get_column_widget(column)
166
- self.on_editing_done(widget.editable, renderer)
166
+ editable = widget.get_editable(renderer)
167
+ self.on_editing_done(editable, renderer)
167
168
  return True
168
169
 
169
170
  def on_keypressed(self, entry, event, renderer):
@@ -23,7 +23,8 @@ from tryton.common.cellrenderertext import (
23
23
  CellRendererText, CellRendererTextCompletion)
24
24
  from tryton.common.cellrenderertoggle import CellRendererToggle
25
25
  from tryton.common.completion import get_completion, update_completion
26
- from tryton.common.datetime_ import CellRendererDate, CellRendererTime
26
+ from tryton.common.datetime_ import (
27
+ CellRendererDate, CellRendererTime, date_parse)
27
28
  from tryton.common.domain_parser import quote
28
29
  from tryton.common.selection import (
29
30
  PopdownMixin, SelectionMixin, selection_shortcuts)
@@ -376,6 +377,14 @@ class GenericText(Cell):
376
377
  editable.connect('remove-widget', remove)
377
378
  return False
378
379
 
380
+ def get_editable(self, renderer):
381
+ if self.renderer == renderer:
382
+ return self.editable
383
+ for cell in self.prefixes + self.suffixes:
384
+ editable = cell.get_editable(renderer)
385
+ if editable:
386
+ return editable
387
+
379
388
 
380
389
  class Char(GenericText):
381
390
 
@@ -493,6 +502,17 @@ class Date(GenericText):
493
502
  else:
494
503
  return ''
495
504
 
505
+ def value_from_text(self, record, text, callback=None):
506
+ if isinstance(text, str):
507
+ field = record[self.attrs['name']]
508
+ try:
509
+ # Use a datetime instance and rely on field to convert to the
510
+ # proper type
511
+ text = date_parse(text, self.get_format(record, field))
512
+ except (ValueError, OverflowError):
513
+ text = None
514
+ return super().value_from_text(record, text, callback=callback)
515
+
496
516
 
497
517
  class Time(Date):
498
518
 
@@ -445,7 +445,7 @@ class WinForm(NoModal, InfoBar):
445
445
  record.modified_fields.setdefault('id')
446
446
  result = False
447
447
  else:
448
- result = response_id not in cancel_responses
448
+ result = (response_id not in cancel_responses) and not readonly
449
449
  if self.callback:
450
450
  self.callback(result)
451
451
  self.destroy()
@@ -2,6 +2,7 @@
2
2
  # this repository contains the full copyright notices and license terms.
3
3
  import base64
4
4
  import csv
5
+ import datetime as dt
5
6
  import gettext
6
7
  import locale
7
8
  from decimal import Decimal
@@ -10,7 +11,6 @@ from gi.repository import Gtk
10
11
 
11
12
  import tryton.common as common
12
13
  from tryton.common import RPCException, RPCExecute
13
- from tryton.common.datetime_ import date_parse
14
14
  from tryton.gui.window.win_csv import WinCSV
15
15
 
16
16
  _ = gettext.gettext
@@ -212,13 +212,18 @@ class WinImport(WinCSV):
212
212
  val = locale.atof(val)
213
213
  elif type_ == 'numeric':
214
214
  val = Decimal(locale.delocalize(val))
215
- elif type_ in ['date', 'datetime']:
216
- val = date_parse(val, common.date_format())
215
+ elif type_ == 'date':
216
+ val = dt.datetime.strptime(
217
+ val, common.date_format()).date()
218
+ elif type_ == 'datetime':
219
+ val = dt.datetime.strptime(
220
+ val, common.date_format() + ' %X')
217
221
  elif type_ == 'binary':
218
222
  val = base64.b64decode(val)
219
223
  row.append(val)
220
224
  data.append(row)
221
- except (IOError, UnicodeDecodeError, csv.Error) as exception:
225
+ except (IOError, UnicodeDecodeError, csv.Error, ValueError) \
226
+ as exception:
222
227
  common.warning(str(exception), _("Import failed"))
223
228
  return
224
229
  try:
@@ -402,6 +402,8 @@ class WizardDialog(Wizard, NoModal):
402
402
  return True
403
403
 
404
404
  def show(self):
405
+ if not self.screen:
406
+ return
405
407
  view = self.screen.current_view
406
408
  if view.view_type == 'form':
407
409
  expand = False
@@ -138,7 +138,6 @@ class JSONUnmarshaller(object):
138
138
  class Transport(xmlrpc.client.SafeTransport):
139
139
 
140
140
  accept_gzip_encoding = True
141
- encode_threshold = 1400 # common MTU
142
141
 
143
142
  def __init__(
144
143
  self, fingerprints=None, ca_certs=None, session=None):
@@ -241,6 +240,11 @@ class Transport(xmlrpc.client.SafeTransport):
241
240
  self._connection[1].sock.settimeout(DEFAULT_TIMEOUT)
242
241
  return self._connection[1]
243
242
 
243
+ @property
244
+ def encode_threshold(self):
245
+ if self.session:
246
+ return 1400 # common MTU
247
+
244
248
 
245
249
  class ServerProxy(xmlrpc.client.ServerProxy):
246
250
  __id = 0
@@ -24,9 +24,11 @@ def register():
24
24
  imported = set()
25
25
  for path in paths:
26
26
  finder = importlib.machinery.FileFinder(
27
- path, (
28
- importlib.machinery.SourceFileLoader,
29
- importlib.machinery.SOURCE_SUFFIXES))
27
+ path,
28
+ (importlib.machinery.SourceFileLoader,
29
+ importlib.machinery.SOURCE_SUFFIXES),
30
+ (importlib.machinery.SourcelessFileLoader,
31
+ importlib.machinery.BYTECODE_SUFFIXES))
30
32
  for plugin in os.listdir(path):
31
33
  module = os.path.splitext(plugin)[0]
32
34
  if (module.startswith('_') or module in imported):
@@ -198,7 +198,7 @@ class Not(PYSON):
198
198
 
199
199
  @staticmethod
200
200
  def eval(dct, context):
201
- return not dct['v']
201
+ return not Bool(dct['v']).eval(dct, context)
202
202
 
203
203
 
204
204
  class Bool(PYSON):