tryton 7.0.9__tar.gz → 7.0.11__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.9 → tryton-7.0.11}/CHANGELOG +10 -0
  2. {tryton-7.0.9 → tryton-7.0.11}/PKG-INFO +1 -1
  3. {tryton-7.0.9 → tryton-7.0.11}/bin/tryton +2 -1
  4. {tryton-7.0.9 → tryton-7.0.11}/setup-freeze.py +1 -2
  5. {tryton-7.0.9 → tryton-7.0.11}/tryton/__init__.py +1 -1
  6. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/common.py +10 -3
  7. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/datetime_.py +3 -1
  8. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/bg/LC_MESSAGES/tryton.mo +0 -0
  9. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/ca/LC_MESSAGES/tryton.mo +0 -0
  10. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/cs/LC_MESSAGES/tryton.mo +0 -0
  11. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/de/LC_MESSAGES/tryton.mo +0 -0
  12. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/es/LC_MESSAGES/tryton.mo +0 -0
  13. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/es_419/LC_MESSAGES/tryton.mo +0 -0
  14. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/et/LC_MESSAGES/tryton.mo +0 -0
  15. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/fa/LC_MESSAGES/tryton.mo +0 -0
  16. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/fi/LC_MESSAGES/tryton.mo +0 -0
  17. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/fr/LC_MESSAGES/tryton.mo +0 -0
  18. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/hu/LC_MESSAGES/tryton.mo +0 -0
  19. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/id/LC_MESSAGES/tryton.mo +0 -0
  20. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/it/LC_MESSAGES/tryton.mo +0 -0
  21. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/ja_JP/LC_MESSAGES/tryton.mo +0 -0
  22. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/lo/LC_MESSAGES/tryton.mo +0 -0
  23. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/lt/LC_MESSAGES/tryton.mo +0 -0
  24. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/nl/LC_MESSAGES/tryton.mo +0 -0
  25. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/pl/LC_MESSAGES/tryton.mo +0 -0
  26. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/pt/LC_MESSAGES/tryton.mo +0 -0
  27. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/ro/LC_MESSAGES/tryton.mo +0 -0
  28. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/ru/LC_MESSAGES/tryton.mo +0 -0
  29. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/sl/LC_MESSAGES/tryton.mo +0 -0
  30. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/tr/LC_MESSAGES/tryton.mo +0 -0
  31. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/uk/LC_MESSAGES/tryton.mo +0 -0
  32. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/zh_CN/LC_MESSAGES/tryton.mo +0 -0
  33. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/model/field.py +48 -18
  34. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/screen/screen.py +60 -36
  35. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py +12 -7
  36. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/char.py +5 -6
  37. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/document.py +9 -10
  38. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/list_gtk/editabletree.py +2 -1
  39. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/list_gtk/widget.py +21 -1
  40. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/win_form.py +8 -6
  41. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/win_import.py +9 -4
  42. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/wizard.py +2 -0
  43. {tryton-7.0.9 → tryton-7.0.11}/tryton/jsonrpc.py +5 -1
  44. {tryton-7.0.9 → tryton-7.0.11}/tryton/plugins/__init__.py +5 -3
  45. {tryton-7.0.9 → tryton-7.0.11}/tryton.egg-info/PKG-INFO +1 -1
  46. {tryton-7.0.9 → tryton-7.0.11}/COPYRIGHT +0 -0
  47. {tryton-7.0.9 → tryton-7.0.11}/LICENSE +0 -0
  48. {tryton-7.0.9 → tryton-7.0.11}/MANIFEST.in +0 -0
  49. {tryton-7.0.9 → tryton-7.0.11}/README.rst +0 -0
  50. {tryton-7.0.9 → tryton-7.0.11}/catalan.nsh +0 -0
  51. {tryton-7.0.9 → tryton-7.0.11}/darwin/gtk-3.0/gdk-pixbuf.loaders +0 -0
  52. {tryton-7.0.9 → tryton-7.0.11}/darwin/gtk-3.0/gtk.immodules +0 -0
  53. {tryton-7.0.9 → tryton-7.0.11}/doc/conf.py +0 -0
  54. {tryton-7.0.9 → tryton-7.0.11}/doc/glossary.rst +0 -0
  55. {tryton-7.0.9 → tryton-7.0.11}/doc/index.rst +0 -0
  56. {tryton-7.0.9 → tryton-7.0.11}/doc/installation.rst +0 -0
  57. {tryton-7.0.9 → tryton-7.0.11}/doc/releases.rst +0 -0
  58. {tryton-7.0.9 → tryton-7.0.11}/doc/requirements-doc.txt +0 -0
  59. {tryton-7.0.9 → tryton-7.0.11}/doc/usage.rst +0 -0
  60. {tryton-7.0.9 → tryton-7.0.11}/english.nsh +0 -0
  61. {tryton-7.0.9 → tryton-7.0.11}/farsi.nsh +0 -0
  62. {tryton-7.0.9 → tryton-7.0.11}/french.nsh +0 -0
  63. {tryton-7.0.9 → tryton-7.0.11}/german.nsh +0 -0
  64. {tryton-7.0.9 → tryton-7.0.11}/make-darwin-installer.sh +0 -0
  65. {tryton-7.0.9 → tryton-7.0.11}/make-win32-installer.sh +0 -0
  66. {tryton-7.0.9 → tryton-7.0.11}/portuguese.nsh +0 -0
  67. {tryton-7.0.9 → tryton-7.0.11}/setup.cfg +0 -0
  68. {tryton-7.0.9 → tryton-7.0.11}/setup.nsi +0 -0
  69. {tryton-7.0.9 → tryton-7.0.11}/setup.py +0 -0
  70. {tryton-7.0.9 → tryton-7.0.11}/slovenian.nsh +0 -0
  71. {tryton-7.0.9 → tryton-7.0.11}/spanish.nsh +0 -0
  72. {tryton-7.0.9 → tryton-7.0.11}/tox.ini +0 -0
  73. {tryton-7.0.9 → tryton-7.0.11}/tryton/action/__init__.py +0 -0
  74. {tryton-7.0.9 → tryton-7.0.11}/tryton/action/main.py +0 -0
  75. {tryton-7.0.9 → tryton-7.0.11}/tryton/bus.py +0 -0
  76. {tryton-7.0.9 → tryton-7.0.11}/tryton/client.py +0 -0
  77. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/__init__.py +0 -0
  78. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/button.py +0 -0
  79. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/cellrendererbinary.py +0 -0
  80. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/cellrendererbutton.py +0 -0
  81. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/cellrendererclickablepixbuf.py +0 -0
  82. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/cellrenderercombo.py +0 -0
  83. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/cellrendererfloat.py +0 -0
  84. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/cellrendererinteger.py +0 -0
  85. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/cellrenderertext.py +0 -0
  86. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/cellrenderertoggle.py +0 -0
  87. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/completion.py +0 -0
  88. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/domain_inversion.py +0 -0
  89. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/domain_parser.py +0 -0
  90. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/entry_position.py +0 -0
  91. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/environment.py +0 -0
  92. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/focus.py +0 -0
  93. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/htmltextbuffer.py +0 -0
  94. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/number_entry.py +0 -0
  95. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/popup_menu.py +0 -0
  96. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/richtext.py +0 -0
  97. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/selection.py +0 -0
  98. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/timedelta.py +0 -0
  99. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/underline.py +0 -0
  100. {tryton-7.0.9 → tryton-7.0.11}/tryton/common/widget_style.py +0 -0
  101. {tryton-7.0.9 → tryton-7.0.11}/tryton/config.py +0 -0
  102. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/bg/LC_MESSAGES/tryton.po +0 -0
  103. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/ca/LC_MESSAGES/tryton.po +0 -0
  104. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/cs/LC_MESSAGES/tryton.po +0 -0
  105. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/de/LC_MESSAGES/tryton.po +0 -0
  106. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/es/LC_MESSAGES/tryton.po +0 -0
  107. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/es_419/LC_MESSAGES/tryton.po +0 -0
  108. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/et/LC_MESSAGES/tryton.po +0 -0
  109. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/fa/LC_MESSAGES/tryton.po +0 -0
  110. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/fi/LC_MESSAGES/tryton.po +0 -0
  111. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/fr/LC_MESSAGES/tryton.po +0 -0
  112. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/hu/LC_MESSAGES/tryton.po +0 -0
  113. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/id/LC_MESSAGES/tryton.po +0 -0
  114. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/it/LC_MESSAGES/tryton.po +0 -0
  115. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/ja_JP/LC_MESSAGES/tryton.po +0 -0
  116. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/lo/LC_MESSAGES/tryton.po +0 -0
  117. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/lt/LC_MESSAGES/tryton.po +0 -0
  118. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/nl/LC_MESSAGES/tryton.po +0 -0
  119. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/pl/LC_MESSAGES/tryton.po +0 -0
  120. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/pt/LC_MESSAGES/tryton.po +0 -0
  121. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/ro/LC_MESSAGES/tryton.po +0 -0
  122. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/ru/LC_MESSAGES/tryton.po +0 -0
  123. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/sl/LC_MESSAGES/tryton.po +0 -0
  124. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/tr/LC_MESSAGES/tryton.po +0 -0
  125. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/tryton.pot +0 -0
  126. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/uk/LC_MESSAGES/tryton.po +0 -0
  127. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/locale/zh_CN/LC_MESSAGES/tryton.po +0 -0
  128. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/LICENSE +0 -0
  129. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-add.svg +0 -0
  130. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-archive.svg +0 -0
  131. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-arrow-down.svg +0 -0
  132. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-arrow-left.svg +0 -0
  133. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-arrow-right.svg +0 -0
  134. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-arrow-up.svg +0 -0
  135. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-attach.svg +0 -0
  136. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-back.svg +0 -0
  137. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-barcode-scanner.svg +0 -0
  138. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-bookmark-border.svg +0 -0
  139. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-bookmark.svg +0 -0
  140. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-bookmarks.svg +0 -0
  141. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-cancel.svg +0 -0
  142. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-clear.svg +0 -0
  143. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-close.svg +0 -0
  144. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-copy.svg +0 -0
  145. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-create.svg +0 -0
  146. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-date.svg +0 -0
  147. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-delete.svg +0 -0
  148. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-download.svg +0 -0
  149. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-drag.svg +0 -0
  150. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-email.svg +0 -0
  151. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-error.svg +0 -0
  152. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-exit.svg +0 -0
  153. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-export.svg +0 -0
  154. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-filter.svg +0 -0
  155. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-format-align-center.svg +0 -0
  156. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-format-align-justify.svg +0 -0
  157. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-format-align-left.svg +0 -0
  158. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-format-align-right.svg +0 -0
  159. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-format-bold.svg +0 -0
  160. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-format-color-text.svg +0 -0
  161. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-format-italic.svg +0 -0
  162. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-format-underline.svg +0 -0
  163. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-forward.svg +0 -0
  164. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-history.svg +0 -0
  165. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-icon.png +0 -0
  166. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-icon.svg +0 -0
  167. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-import.svg +0 -0
  168. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-info.svg +0 -0
  169. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-launch.svg +0 -0
  170. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-link.svg +0 -0
  171. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-log.svg +0 -0
  172. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-menu.svg +0 -0
  173. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-note.svg +0 -0
  174. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-ok.svg +0 -0
  175. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-open.svg +0 -0
  176. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-print.svg +0 -0
  177. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-public.svg +0 -0
  178. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-question.svg +0 -0
  179. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-refresh.svg +0 -0
  180. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-remove.svg +0 -0
  181. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-save.svg +0 -0
  182. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-search.svg +0 -0
  183. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-send.svg +0 -0
  184. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-sound-off.svg +0 -0
  185. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-sound-on.svg +0 -0
  186. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-star-border.svg +0 -0
  187. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-star.svg +0 -0
  188. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-switch.svg +0 -0
  189. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-translate.svg +0 -0
  190. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-unarchive.svg +0 -0
  191. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-undo.svg +0 -0
  192. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton-warning.svg +0 -0
  193. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton.icns +0 -0
  194. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton.ico +0 -0
  195. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/pixmaps/tryton/tryton.svg +0 -0
  196. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/sounds/LICENSE +0 -0
  197. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/sounds/danger.wav +0 -0
  198. {tryton-7.0.9 → tryton-7.0.11}/tryton/data/sounds/success.wav +0 -0
  199. {tryton-7.0.9 → tryton-7.0.11}/tryton/device_cookie.py +0 -0
  200. {tryton-7.0.9 → tryton-7.0.11}/tryton/exceptions.py +0 -0
  201. {tryton-7.0.9 → tryton-7.0.11}/tryton/fingerprints.py +0 -0
  202. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/__init__.py +0 -0
  203. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/main.py +0 -0
  204. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/__init__.py +0 -0
  205. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/about.py +0 -0
  206. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/attachment.py +0 -0
  207. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/board.py +0 -0
  208. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/code_scanner.py +0 -0
  209. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/dblogin.py +0 -0
  210. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/email_.py +0 -0
  211. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/form.py +0 -0
  212. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/infobar.py +0 -0
  213. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/limit.py +0 -0
  214. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/log.py +0 -0
  215. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/nomodal.py +0 -0
  216. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/note.py +0 -0
  217. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/preference.py +0 -0
  218. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/revision.py +0 -0
  219. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/tabcontent.py +0 -0
  220. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_board/__init__.py +0 -0
  221. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_board/action.py +0 -0
  222. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_board/view_board.py +0 -0
  223. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/__init__.py +0 -0
  224. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/model/__init__.py +0 -0
  225. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/model/group.py +0 -0
  226. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/model/record.py +0 -0
  227. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/screen/__init__.py +0 -0
  228. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/__init__.py +0 -0
  229. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/calendar_.py +0 -0
  230. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/calendar_gtk/__init__.py +0 -0
  231. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/calendar_gtk/dates_period.py +0 -0
  232. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/calendar_gtk/toolbar.py +0 -0
  233. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form.py +0 -0
  234. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/__init__.py +0 -0
  235. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/binary.py +0 -0
  236. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/calendar_.py +0 -0
  237. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/checkbox.py +0 -0
  238. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/dictionary.py +0 -0
  239. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/float.py +0 -0
  240. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/image.py +0 -0
  241. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/integer.py +0 -0
  242. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/many2many.py +0 -0
  243. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/many2one.py +0 -0
  244. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/multiselection.py +0 -0
  245. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/one2many.py +0 -0
  246. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/one2one.py +0 -0
  247. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/progressbar.py +0 -0
  248. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/pyson.py +0 -0
  249. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/reference.py +0 -0
  250. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/richtextbox.py +0 -0
  251. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/selection.py +0 -0
  252. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/state_widget.py +0 -0
  253. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/textbox.py +0 -0
  254. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/timedelta.py +0 -0
  255. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/url.py +0 -0
  256. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/form_gtk/widget.py +0 -0
  257. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/graph.py +0 -0
  258. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/graph_gtk/__init__.py +0 -0
  259. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/graph_gtk/bar.py +0 -0
  260. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/graph_gtk/graph.py +0 -0
  261. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/graph_gtk/line.py +0 -0
  262. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/graph_gtk/pie.py +0 -0
  263. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/list.py +0 -0
  264. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/list_form.py +0 -0
  265. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/list_gtk/__init__.py +0 -0
  266. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/view_form/view/screen_container.py +0 -0
  267. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/win_csv.py +0 -0
  268. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/win_export.py +0 -0
  269. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/win_search.py +0 -0
  270. {tryton-7.0.9 → tryton-7.0.11}/tryton/gui/window/window.py +0 -0
  271. {tryton-7.0.9 → tryton-7.0.11}/tryton/plugins/translation/__init__.py +0 -0
  272. {tryton-7.0.9 → tryton-7.0.11}/tryton/pyson.py +0 -0
  273. {tryton-7.0.9 → tryton-7.0.11}/tryton/rpc.py +0 -0
  274. {tryton-7.0.9 → tryton-7.0.11}/tryton/tests/__init__.py +0 -0
  275. {tryton-7.0.9 → tryton-7.0.11}/tryton/tests/test_common.py +0 -0
  276. {tryton-7.0.9 → tryton-7.0.11}/tryton/tests/test_common_domain_parser.py +0 -0
  277. {tryton-7.0.9 → tryton-7.0.11}/tryton/tests/test_common_selection.py +0 -0
  278. {tryton-7.0.9 → tryton-7.0.11}/tryton/tests/test_common_timedelta.py +0 -0
  279. {tryton-7.0.9 → tryton-7.0.11}/tryton/translate.py +0 -0
  280. {tryton-7.0.9 → tryton-7.0.11}/tryton.desktop +0 -0
  281. {tryton-7.0.9 → tryton-7.0.11}/tryton.egg-info/SOURCES.txt +0 -0
  282. {tryton-7.0.9 → tryton-7.0.11}/tryton.egg-info/dependency_links.txt +0 -0
  283. {tryton-7.0.9 → tryton-7.0.11}/tryton.egg-info/not-zip-safe +0 -0
  284. {tryton-7.0.9 → tryton-7.0.11}/tryton.egg-info/requires.txt +0 -0
  285. {tryton-7.0.9 → tryton-7.0.11}/tryton.egg-info/top_level.txt +0 -0
  286. {tryton-7.0.9 → tryton-7.0.11}/win32/gtk-3.0/gdk-pixbuf.loaders +0 -0
  287. {tryton-7.0.9 → tryton-7.0.11}/win32/gtk-3.0/gtk.immodules +0 -0
@@ -1,4 +1,14 @@
1
1
 
2
+ Version 7.0.11 - 2024-07-01
3
+ ---------------------------
4
+ * Bug fixes (see mercurial logs for details)
5
+
6
+
7
+ Version 7.0.10 - 2024-05-01
8
+ ---------------------------
9
+ * Bug fixes (see mercurial logs for details)
10
+
11
+
2
12
  Version 7.0.9 - 2024-04-17
3
13
  --------------------------
4
14
  * Bug fixes (see mercurial logs for details)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tryton
3
- Version: 7.0.9
3
+ Version: 7.0.11
4
4
  Summary: Tryton desktop client
5
5
  Home-page: http://www.tryton.org/
6
6
  Download-URL: http://downloads.tryton.org/7.0/
@@ -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')
@@ -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.11"
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
 
@@ -9,6 +9,7 @@ import os
9
9
  import tempfile
10
10
  from decimal import Decimal
11
11
  from itertools import chain
12
+ from pathlib import Path
12
13
 
13
14
  import tryton.common as common
14
15
  from tryton.common import (
@@ -1048,26 +1049,56 @@ class ReferenceField(Field):
1048
1049
 
1049
1050
 
1050
1051
  class _FileCache(object):
1051
- def __init__(self, path):
1052
- self.path = path
1052
+ def __init__(self, data=None):
1053
+ _, filename = tempfile.mkstemp(prefix='tryton_')
1054
+ self.path = Path(filename)
1055
+ self.suffixes = {}
1056
+ if data:
1057
+ with open(self.path, 'wb') as fp:
1058
+ fp.write(data)
1059
+
1060
+ @property
1061
+ def data(self):
1062
+ with open(self.path, 'rb') as fp:
1063
+ return fp.read()
1053
1064
 
1054
1065
  def __del__(self):
1055
1066
  try:
1056
1067
  os.remove(self.path)
1057
1068
  except IOError:
1058
1069
  pass
1070
+ for path in self.suffixes.values():
1071
+ try:
1072
+ os.remove(path)
1073
+ except IOError:
1074
+ pass
1075
+
1076
+ def with_suffix(self, suffix):
1077
+ if suffix in self.suffixes:
1078
+ return self.suffixes[suffix]
1079
+ _, filename = tempfile.mkstemp(prefix='tryton_', suffix=suffix)
1080
+ self.suffixes[suffix] = path = Path(filename)
1081
+ with open(path, 'wb') as fp:
1082
+ fp.write(self.data)
1083
+ return path
1059
1084
 
1060
1085
 
1061
1086
  class BinaryField(Field):
1062
1087
 
1063
1088
  _default = None
1064
1089
 
1090
+ def _set_file_cache(self, record, data):
1091
+ if isinstance(data, str):
1092
+ data = data.encode('utf-8')
1093
+ file_cache = _FileCache(data)
1094
+ self.set(record, file_cache)
1095
+ return file_cache
1096
+
1065
1097
  def get(self, record):
1066
1098
  result = record.value.get(self.name, self._default)
1067
1099
  if isinstance(result, _FileCache):
1068
1100
  try:
1069
- with open(result.path, 'rb') as fp:
1070
- result = fp.read()
1101
+ result = result.data
1071
1102
  except IOError:
1072
1103
  result = self.get_data(record)
1073
1104
  return result
@@ -1076,13 +1107,7 @@ class BinaryField(Field):
1076
1107
  return self.get(record)
1077
1108
 
1078
1109
  def set_client(self, record, value, force_change=False):
1079
- _, filename = tempfile.mkstemp(prefix='tryton_')
1080
- data = value or b''
1081
- if isinstance(data, str):
1082
- data = data.encode('utf-8')
1083
- with open(filename, 'wb') as fp:
1084
- fp.write(data)
1085
- self.set(record, _FileCache(filename))
1110
+ self._set_file_cache(record, value or b'')
1086
1111
  self.sig_changed(record)
1087
1112
  record.validate(softvalidation=True)
1088
1113
  record.set_modified(self.name)
@@ -1106,15 +1131,20 @@ class BinaryField(Field):
1106
1131
  [record.id], [self.name], context=context)
1107
1132
  except RPCException:
1108
1133
  return b''
1109
- _, filename = tempfile.mkstemp(prefix='tryton_')
1110
- data = values[self.name] or b''
1111
- if isinstance(data, str):
1112
- data = data.encode('utf-8')
1113
- with open(filename, 'wb') as fp:
1114
- fp.write(data)
1115
- self.set(record, _FileCache(filename))
1134
+ self._set_file_cache(record, values[self.name] or b'')
1116
1135
  return self.get(record)
1117
1136
 
1137
+ def get_filename(self, record, suffix=None):
1138
+ data = self.get_data(record)
1139
+ file_cache = record.value.get(self.name)
1140
+ if not isinstance(file_cache, _FileCache):
1141
+ file_cache = self._set_file_cache(record, data)
1142
+ if suffix:
1143
+ filename = file_cache.with_suffix(suffix)
1144
+ else:
1145
+ filename = file_cache.path
1146
+ return filename
1147
+
1118
1148
 
1119
1149
  class DictField(Field):
1120
1150
 
@@ -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=(',', ':'))))
@@ -67,13 +67,18 @@ class Calendar_(goocalendar.Calendar):
67
67
  self.current_domain_period.get_dates(True)
68
68
  dtstart = self.attrs['dtstart']
69
69
  dtend = self.attrs.get('dtend') or dtstart
70
- domain = ['OR',
71
- ['AND', (dtstart, '>=', first_datetime),
72
- (dtstart, '<', last_datetime)],
73
- ['AND', (dtend, '>=', first_datetime),
74
- (dtend, '<', last_datetime)],
75
- ['AND', (dtstart, '<', first_datetime),
76
- (dtend, '>', last_datetime)]]
70
+ domain = [
71
+ (dtstart, '!=', None),
72
+ (dtend, '!=', None),
73
+ ['OR',
74
+ ['AND', (dtstart, '>=', first_datetime),
75
+ (dtstart, '<', last_datetime)],
76
+ ['AND', (dtend, '>=', first_datetime),
77
+ (dtend, '<', last_datetime)],
78
+ ['AND', (dtstart, '<', first_datetime),
79
+ (dtend, '>', last_datetime)],
80
+ ],
81
+ ]
77
82
  return domain
78
83
 
79
84
  def get_colors(self, record):
@@ -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
@@ -1,7 +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
3
  from pathlib import Path
4
- from tempfile import NamedTemporaryFile
5
4
 
6
5
  from gi.repository import Gdk, GLib, Gtk
7
6
 
@@ -76,17 +75,17 @@ class Document(BinaryMixin, Widget):
76
75
  self.image.hide()
77
76
  if self.evince_view:
78
77
  self.evince_scroll.show()
78
+ suffix = None
79
79
  if self.filename_field:
80
- suffix = self.filename_field.get(self.record)
81
- else:
82
- suffix = None
80
+ filename = self.filename_field.get(self.record)
81
+ if filename:
82
+ suffix = Path(filename).suffix
83
+ filename = Path(self.field.get_filename(self.record, suffix))
83
84
  try:
84
- with NamedTemporaryFile(suffix=suffix) as fp:
85
- fp.write(data)
86
- path = Path(fp.name)
87
- document = (
88
- EvinceDocument.Document.factory_get_document(
89
- path.as_uri()))
85
+ document = (
86
+ EvinceDocument.Document.factory_get_document_full(
87
+ filename.as_uri(),
88
+ EvinceDocument.DocumentLoadFlags.NONE))
90
89
  model = EvinceView.DocumentModel()
91
90
  model.set_document(document)
92
91
  self.evince_view.set_model(model)
@@ -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):