tryton 6.0.38__tar.gz → 6.0.40__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.
- {tryton-6.0.38 → tryton-6.0.40}/CHANGELOG +10 -0
- {tryton-6.0.38 → tryton-6.0.40}/PKG-INFO +1 -1
- {tryton-6.0.38 → tryton-6.0.40}/bin/tryton +2 -1
- {tryton-6.0.38 → tryton-6.0.40}/setup-freeze.py +1 -2
- {tryton-6.0.38 → tryton-6.0.40}/tryton/__init__.py +1 -1
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/common.py +10 -3
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/datetime_.py +3 -1
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/bg/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/ca/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/cs/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/de/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/es/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/es_419/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/et/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/fa/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/fi/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/fr/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/hu/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/id/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/it/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/ja_JP/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/lo/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/lt/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/nl/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/pl/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/pt/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/ro/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/ru/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/sl/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/tr/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/zh_CN/LC_MESSAGES/tryton.mo +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/model/field.py +48 -18
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/screen/screen.py +58 -36
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py +12 -7
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/char.py +5 -6
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/document.py +9 -10
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/list_gtk/editabletree.py +2 -1
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/list_gtk/widget.py +21 -1
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/win_form.py +8 -6
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/wizard.py +2 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/jsonrpc.py +5 -1
- {tryton-6.0.38 → tryton-6.0.40}/tryton/plugins/__init__.py +5 -3
- {tryton-6.0.38 → tryton-6.0.40}/tryton.egg-info/PKG-INFO +1 -1
- {tryton-6.0.38 → tryton-6.0.40}/COPYRIGHT +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/LICENSE +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/MANIFEST.in +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/README.rst +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/catalan.nsh +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/darwin/gtk-3.0/gdk-pixbuf.loaders +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/darwin/gtk-3.0/gtk.immodules +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/doc/conf.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/doc/glossary.rst +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/doc/index.rst +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/doc/installation.rst +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/doc/usage.rst +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/english.nsh +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/farsi.nsh +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/french.nsh +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/german.nsh +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/make-darwin-installer.sh +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/make-win32-installer.sh +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/portuguese.nsh +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/setup.cfg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/setup.nsi +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/setup.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/slovenian.nsh +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/spanish.nsh +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tox.ini +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/action/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/action/main.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/bus.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/client.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/button.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/cellrendererbinary.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/cellrendererbutton.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/cellrendererclickablepixbuf.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/cellrenderercombo.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/cellrendererfloat.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/cellrendererinteger.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/cellrenderertext.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/cellrenderertoggle.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/completion.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/domain_inversion.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/domain_parser.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/entry_position.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/environment.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/focus.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/htmltextbuffer.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/number_entry.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/popup_menu.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/richtext.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/selection.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/timedelta.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/treeviewcontrol.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/underline.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/common/widget_style.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/config.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/bg/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/ca/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/cs/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/de/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/es/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/es_419/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/et/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/fa/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/fi/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/fr/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/hu/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/id/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/it/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/ja_JP/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/lo/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/lt/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/nl/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/pl/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/pt/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/ro/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/ru/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/sl/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/tr/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/tryton.pot +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/locale/zh_CN/LC_MESSAGES/tryton.po +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/LICENSE +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-add.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-archive.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-arrow-down.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-arrow-left.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-arrow-right.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-arrow-up.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-attach.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-back.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-bookmark-border.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-bookmark.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-bookmarks.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-cancel.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-clear.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-close.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-copy.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-create.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-date.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-delete.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-drag.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-email.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-error.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-exit.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-export.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-filter.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-format-align-center.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-format-align-justify.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-format-align-left.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-format-align-right.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-format-bold.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-format-color-text.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-format-italic.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-format-underline.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-forward.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-history.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-icon.png +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-import.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-info.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-launch.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-link.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-log.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-menu.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-note.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-ok.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-open.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-print.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-public.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-question.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-refresh.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-remove.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-save.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-search.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-send.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-star-border.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-star.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-switch.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-translate.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-unarchive.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-undo.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton-warning.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton.icns +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton.ico +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/data/pixmaps/tryton/tryton.svg +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/device_cookie.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/exceptions.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/fingerprints.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/main.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/about.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/attachment.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/board.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/dblogin.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/email_.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/form.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/infobar.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/limit.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/nomodal.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/note.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/preference.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/revision.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/tabcontent.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_board/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_board/action.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_board/view_board.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/model/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/model/group.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/model/record.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/screen/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/calendar_.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/calendar_gtk/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/calendar_gtk/dates_period.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/calendar_gtk/toolbar.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/binary.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/calendar_.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/checkbox.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/dictionary.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/float.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/image.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/integer.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/many2many.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/many2one.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/multiselection.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/one2many.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/one2one.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/progressbar.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/pyson.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/reference.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/richtextbox.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/selection.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/state_widget.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/textbox.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/timedelta.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/url.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/form_gtk/widget.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/graph.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/graph_gtk/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/graph_gtk/bar.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/graph_gtk/graph.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/graph_gtk/line.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/graph_gtk/pie.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/list.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/list_form.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/list_gtk/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/view_form/view/screen_container.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/win_csv.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/win_export.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/win_import.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/win_search.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/gui/window/window.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/plugins/translation/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/pyson.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/rpc.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/signal_event.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/tests/__init__.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/tests/test_common_domain_parser.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/tests/test_common_selection.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/tests/test_common_timedelta.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton/translate.py +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton.desktop +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton.egg-info/SOURCES.txt +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton.egg-info/dependency_links.txt +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton.egg-info/not-zip-safe +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton.egg-info/requires.txt +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/tryton.egg-info/top_level.txt +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/win32/gtk-3.0/gdk-pixbuf.loaders +0 -0
- {tryton-6.0.38 → tryton-6.0.40}/win32/gtk-3.0/gtk.immodules +0 -0
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
|
|
2
|
+
Version 6.0.40 - 2024-07-01
|
|
3
|
+
---------------------------
|
|
4
|
+
* Bug fixes (see mercurial logs for details)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Version 6.0.39 - 2024-05-01
|
|
8
|
+
---------------------------
|
|
9
|
+
* Bug fixes (see mercurial logs for details)
|
|
10
|
+
|
|
11
|
+
|
|
2
12
|
Version 6.0.38 - 2024-04-17
|
|
3
13
|
---------------------------
|
|
4
14
|
* Bug fixes (see mercurial logs for details)
|
|
@@ -18,7 +18,8 @@ if hasattr(sys, 'frozen'):
|
|
|
18
18
|
share = os.path.join(prefix, 'share')
|
|
19
19
|
os.environ['GTK_EXE_PREFIX'] = prefix
|
|
20
20
|
os.environ['GTK_DATA_PREFIX'] = prefix
|
|
21
|
-
os.environ['EV_BACKENDS_DIR'] =
|
|
21
|
+
os.environ['EV_BACKENDS_DIR'] = os.path.join(
|
|
22
|
+
prefix, 'lib', 'evince', '4', 'backends')
|
|
22
23
|
os.environ['XDG_DATA_DIRS'] = share
|
|
23
24
|
os.environ['GDK_PIXBUF_MODULE_FILE'] = os.path.join(
|
|
24
25
|
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': {
|
|
@@ -219,7 +219,7 @@ class ModelAccess(object):
|
|
|
219
219
|
self._models = rpc.execute('model', 'ir.model', 'list_models',
|
|
220
220
|
rpc.CONTEXT)
|
|
221
221
|
except TrytonServerError:
|
|
222
|
-
|
|
222
|
+
logger.error("Unable to get model list.")
|
|
223
223
|
|
|
224
224
|
def __getitem__(self, model):
|
|
225
225
|
if model in self._access:
|
|
@@ -233,7 +233,14 @@ class ModelAccess(object):
|
|
|
233
233
|
access = rpc.execute('model', 'ir.model.access', 'get_access',
|
|
234
234
|
self._models[to_load], rpc.CONTEXT)
|
|
235
235
|
except TrytonServerError:
|
|
236
|
-
access
|
|
236
|
+
logger.error("Unable to get access for %s.", model)
|
|
237
|
+
access = {
|
|
238
|
+
model: {
|
|
239
|
+
'read': True,
|
|
240
|
+
'write': False,
|
|
241
|
+
'create': False,
|
|
242
|
+
'delete': False},
|
|
243
|
+
}
|
|
237
244
|
self._access.update(access)
|
|
238
245
|
return self._access[model]
|
|
239
246
|
|
|
@@ -1135,7 +1142,7 @@ class RPCProgress(object):
|
|
|
1135
1142
|
|
|
1136
1143
|
def return_():
|
|
1137
1144
|
if self.exception:
|
|
1138
|
-
raise self.exception
|
|
1145
|
+
raise RPCException(self.exception)
|
|
1139
1146
|
else:
|
|
1140
1147
|
return self.res
|
|
1141
1148
|
|
|
@@ -10,7 +10,9 @@ from dateutil.parser import parse
|
|
|
10
10
|
|
|
11
11
|
from .common import IconFactory
|
|
12
12
|
|
|
13
|
-
__all__ = [
|
|
13
|
+
__all__ = [
|
|
14
|
+
'Date', 'CellRendererDate', 'Time', 'CellRendererTime', 'DateTime',
|
|
15
|
+
'date_parse']
|
|
14
16
|
|
|
15
17
|
_ = gettext.gettext
|
|
16
18
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -15,6 +15,7 @@ import datetime
|
|
|
15
15
|
import decimal
|
|
16
16
|
from decimal import Decimal
|
|
17
17
|
import math
|
|
18
|
+
from pathlib import Path
|
|
18
19
|
from tryton.common import RPCExecute, RPCException
|
|
19
20
|
from tryton.common.htmltextbuffer import guess_decode
|
|
20
21
|
from tryton.pyson import PYSONDecoder
|
|
@@ -993,26 +994,56 @@ class ReferenceField(Field):
|
|
|
993
994
|
|
|
994
995
|
|
|
995
996
|
class _FileCache(object):
|
|
996
|
-
def __init__(self,
|
|
997
|
-
|
|
997
|
+
def __init__(self, data=None):
|
|
998
|
+
_, filename = tempfile.mkstemp(prefix='tryton_')
|
|
999
|
+
self.path = Path(filename)
|
|
1000
|
+
self.suffixes = {}
|
|
1001
|
+
if data:
|
|
1002
|
+
with open(self.path, 'wb') as fp:
|
|
1003
|
+
fp.write(data)
|
|
1004
|
+
|
|
1005
|
+
@property
|
|
1006
|
+
def data(self):
|
|
1007
|
+
with open(self.path, 'rb') as fp:
|
|
1008
|
+
return fp.read()
|
|
998
1009
|
|
|
999
1010
|
def __del__(self):
|
|
1000
1011
|
try:
|
|
1001
1012
|
os.remove(self.path)
|
|
1002
1013
|
except IOError:
|
|
1003
1014
|
pass
|
|
1015
|
+
for path in self.suffixes.values():
|
|
1016
|
+
try:
|
|
1017
|
+
os.remove(path)
|
|
1018
|
+
except IOError:
|
|
1019
|
+
pass
|
|
1020
|
+
|
|
1021
|
+
def with_suffix(self, suffix):
|
|
1022
|
+
if suffix in self.suffixes:
|
|
1023
|
+
return self.suffixes[suffix]
|
|
1024
|
+
_, filename = tempfile.mkstemp(prefix='tryton_', suffix=suffix)
|
|
1025
|
+
self.suffixes[suffix] = path = Path(filename)
|
|
1026
|
+
with open(path, 'wb') as fp:
|
|
1027
|
+
fp.write(self.data)
|
|
1028
|
+
return path
|
|
1004
1029
|
|
|
1005
1030
|
|
|
1006
1031
|
class BinaryField(Field):
|
|
1007
1032
|
|
|
1008
1033
|
_default = None
|
|
1009
1034
|
|
|
1035
|
+
def _set_file_cache(self, record, data):
|
|
1036
|
+
if isinstance(data, str):
|
|
1037
|
+
data = data.encode('utf-8')
|
|
1038
|
+
file_cache = _FileCache(data)
|
|
1039
|
+
self.set(record, file_cache)
|
|
1040
|
+
return file_cache
|
|
1041
|
+
|
|
1010
1042
|
def get(self, record):
|
|
1011
1043
|
result = record.value.get(self.name, self._default)
|
|
1012
1044
|
if isinstance(result, _FileCache):
|
|
1013
1045
|
try:
|
|
1014
|
-
|
|
1015
|
-
result = fp.read()
|
|
1046
|
+
result = result.data
|
|
1016
1047
|
except IOError:
|
|
1017
1048
|
result = self.get_data(record)
|
|
1018
1049
|
return result
|
|
@@ -1021,13 +1052,7 @@ class BinaryField(Field):
|
|
|
1021
1052
|
return self.get(record)
|
|
1022
1053
|
|
|
1023
1054
|
def set_client(self, record, value, force_change=False):
|
|
1024
|
-
|
|
1025
|
-
data = value or b''
|
|
1026
|
-
if isinstance(data, str):
|
|
1027
|
-
data = data.encode('utf-8')
|
|
1028
|
-
with open(filename, 'wb') as fp:
|
|
1029
|
-
fp.write(data)
|
|
1030
|
-
self.set(record, _FileCache(filename))
|
|
1055
|
+
self._set_file_cache(record, value or b'')
|
|
1031
1056
|
record.modified_fields.setdefault(self.name)
|
|
1032
1057
|
record.signal('record-modified')
|
|
1033
1058
|
self.sig_changed(record)
|
|
@@ -1053,15 +1078,20 @@ class BinaryField(Field):
|
|
|
1053
1078
|
[record.id], [self.name], context=context)
|
|
1054
1079
|
except RPCException:
|
|
1055
1080
|
return b''
|
|
1056
|
-
|
|
1057
|
-
data = values[self.name] or b''
|
|
1058
|
-
if isinstance(data, str):
|
|
1059
|
-
data = data.encode('utf-8')
|
|
1060
|
-
with open(filename, 'wb') as fp:
|
|
1061
|
-
fp.write(data)
|
|
1062
|
-
self.set(record, _FileCache(filename))
|
|
1081
|
+
self._set_file_cache(record, values[self.name] or b'')
|
|
1063
1082
|
return self.get(record)
|
|
1064
1083
|
|
|
1084
|
+
def get_filename(self, record, suffix=None):
|
|
1085
|
+
data = self.get_data(record)
|
|
1086
|
+
file_cache = record.value.get(self.name)
|
|
1087
|
+
if not isinstance(file_cache, _FileCache):
|
|
1088
|
+
file_cache = self._set_file_cache(record, data)
|
|
1089
|
+
if suffix:
|
|
1090
|
+
filename = file_cache.with_suffix(suffix)
|
|
1091
|
+
else:
|
|
1092
|
+
filename = file_cache.path
|
|
1093
|
+
return filename
|
|
1094
|
+
|
|
1065
1095
|
|
|
1066
1096
|
class DictField(Field):
|
|
1067
1097
|
|
|
@@ -113,11 +113,10 @@ class Screen(SignalEvent):
|
|
|
113
113
|
return child
|
|
114
114
|
|
|
115
115
|
# Remove first level Viewport and ScrolledWindow to fill the Vbox
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
]
|
|
120
|
-
remove_bin(widget)
|
|
116
|
+
remove_bin(self.context_screen.screen_container.viewport)
|
|
117
|
+
if self.context_screen.current_view:
|
|
118
|
+
remove_bin(
|
|
119
|
+
self.context_screen.current_view.widget.get_children()[0])
|
|
121
120
|
|
|
122
121
|
self.screen_container.filter_vbox.pack_start(
|
|
123
122
|
context_widget, expand=False, fill=True, padding=0)
|
|
@@ -490,7 +489,8 @@ class Screen(SignalEvent):
|
|
|
490
489
|
self.group.destroy()
|
|
491
490
|
|
|
492
491
|
def default_row_activate(self):
|
|
493
|
-
if (self.current_view
|
|
492
|
+
if (self.current_view
|
|
493
|
+
and self.current_view.view_type == 'tree'
|
|
494
494
|
and int(self.current_view.attributes.get('keyword_open', 0))):
|
|
495
495
|
return Action.exec_keyword('tree_open', {
|
|
496
496
|
'model': self.model_name,
|
|
@@ -611,7 +611,7 @@ class Screen(SignalEvent):
|
|
|
611
611
|
|
|
612
612
|
def new(self, default=True, rec_name=None):
|
|
613
613
|
previous_view = self.current_view
|
|
614
|
-
if self.current_view.view_type == 'calendar':
|
|
614
|
+
if self.current_view and self.current_view.view_type == 'calendar':
|
|
615
615
|
selected_date = self.current_view.get_selected_date()
|
|
616
616
|
if self.current_view and not self.current_view.editable:
|
|
617
617
|
self.switch_view('form', display=False)
|
|
@@ -664,16 +664,19 @@ class Screen(SignalEvent):
|
|
|
664
664
|
|
|
665
665
|
def save_current(self):
|
|
666
666
|
if not self.current_record:
|
|
667
|
-
if self.current_view
|
|
667
|
+
if (self.current_view
|
|
668
|
+
and self.current_view.view_type == 'tree'
|
|
669
|
+
and len(self.group)):
|
|
668
670
|
self.current_record = self.group[0]
|
|
669
671
|
else:
|
|
670
672
|
return True
|
|
671
|
-
self.current_view.set_value()
|
|
672
673
|
saved = False
|
|
673
674
|
record_id = None
|
|
674
|
-
|
|
675
|
+
if self.current_view:
|
|
676
|
+
self.current_view.set_value()
|
|
677
|
+
fields = self.current_view.get_fields()
|
|
675
678
|
path = self.current_record.get_path(self.group)
|
|
676
|
-
if self.current_view.view_type == 'tree':
|
|
679
|
+
if self.current_view and self.current_view.view_type == 'tree':
|
|
677
680
|
# False value must be not saved
|
|
678
681
|
saved = all((
|
|
679
682
|
x is not False and x >= 0
|
|
@@ -683,7 +686,7 @@ class Screen(SignalEvent):
|
|
|
683
686
|
record_id = self.current_record.save(force_reload=True)
|
|
684
687
|
# False value must be not saved
|
|
685
688
|
saved = record_id is not False and record_id >= 0
|
|
686
|
-
|
|
689
|
+
elif self.current_view:
|
|
687
690
|
self.set_cursor()
|
|
688
691
|
self.current_view.display()
|
|
689
692
|
return False
|
|
@@ -711,17 +714,19 @@ class Screen(SignalEvent):
|
|
|
711
714
|
def get(self):
|
|
712
715
|
if not self.current_record:
|
|
713
716
|
return None
|
|
714
|
-
self.current_view
|
|
717
|
+
if self.current_view:
|
|
718
|
+
self.current_view.set_value()
|
|
715
719
|
return self.current_record.get()
|
|
716
720
|
|
|
717
721
|
def get_on_change_value(self):
|
|
718
722
|
if not self.current_record:
|
|
719
723
|
return None
|
|
720
|
-
self.current_view
|
|
724
|
+
if self.current_view:
|
|
725
|
+
self.current_view.set_value()
|
|
721
726
|
return self.current_record.get_on_change_value()
|
|
722
727
|
|
|
723
728
|
def modified(self):
|
|
724
|
-
if self.current_view.view_type != 'tree':
|
|
729
|
+
if self.current_view and self.current_view.view_type != 'tree':
|
|
725
730
|
if self.current_record:
|
|
726
731
|
if self.current_record.modified or self.current_record.id < 0:
|
|
727
732
|
return True
|
|
@@ -729,7 +734,7 @@ class Screen(SignalEvent):
|
|
|
729
734
|
for record in self.group:
|
|
730
735
|
if record.modified or record.id < 0:
|
|
731
736
|
return True
|
|
732
|
-
if self.current_view.modified:
|
|
737
|
+
if self.current_view and self.current_view.modified:
|
|
733
738
|
return True
|
|
734
739
|
return False
|
|
735
740
|
|
|
@@ -807,6 +812,8 @@ class Screen(SignalEvent):
|
|
|
807
812
|
|
|
808
813
|
def set_tree_state(self):
|
|
809
814
|
view = self.current_view
|
|
815
|
+
if not view:
|
|
816
|
+
return
|
|
810
817
|
if view.view_type not in ('tree', 'form'):
|
|
811
818
|
return
|
|
812
819
|
if id(view) in self.tree_states_done:
|
|
@@ -909,8 +916,10 @@ class Screen(SignalEvent):
|
|
|
909
916
|
|
|
910
917
|
def load(self, ids, set_cursor=True, modified=False, position=-1):
|
|
911
918
|
self.group.load(ids, modified=modified, position=position)
|
|
912
|
-
self.current_view
|
|
913
|
-
|
|
919
|
+
if self.current_view:
|
|
920
|
+
self.current_view.reset()
|
|
921
|
+
if (ids and self.current_view
|
|
922
|
+
and self.current_view.view_type != 'calendar'):
|
|
914
923
|
self.display(ids[0])
|
|
915
924
|
else:
|
|
916
925
|
self.current_record = None
|
|
@@ -929,7 +938,7 @@ class Screen(SignalEvent):
|
|
|
929
938
|
self.current_record = self.group[0]
|
|
930
939
|
else:
|
|
931
940
|
self.current_record = None
|
|
932
|
-
if self.views:
|
|
941
|
+
if self.views and self.current_view:
|
|
933
942
|
self.search_active(self.current_view.view_type
|
|
934
943
|
in ('tree', 'graph', 'calendar'))
|
|
935
944
|
for view in self.views:
|
|
@@ -974,7 +983,8 @@ class Screen(SignalEvent):
|
|
|
974
983
|
model = view.treeview.get_model()
|
|
975
984
|
iter_ = model.get_iter(end)
|
|
976
985
|
self.current_record = model.get_value(iter_, 0)
|
|
977
|
-
elif (view
|
|
986
|
+
elif (view
|
|
987
|
+
and view.view_type == 'form'
|
|
978
988
|
and self.current_record
|
|
979
989
|
and self.current_record.group):
|
|
980
990
|
group = self.current_record.group
|
|
@@ -1002,12 +1012,14 @@ class Screen(SignalEvent):
|
|
|
1002
1012
|
record = next
|
|
1003
1013
|
break
|
|
1004
1014
|
self.current_record = record
|
|
1005
|
-
elif (view
|
|
1015
|
+
elif (view
|
|
1016
|
+
and view.view_type == 'list-form'
|
|
1017
|
+
and len(self.group)
|
|
1006
1018
|
and self.current_record in self.group):
|
|
1007
1019
|
idx = self.group.index(self.current_record)
|
|
1008
1020
|
if 0 <= idx < len(self.group) - 1:
|
|
1009
1021
|
self.current_record = self.group[idx + 1]
|
|
1010
|
-
elif view.view_type == 'calendar':
|
|
1022
|
+
elif view and view.view_type == 'calendar':
|
|
1011
1023
|
record = self.current_record
|
|
1012
1024
|
goocalendar = view.widgets.get('goocalendar')
|
|
1013
1025
|
if goocalendar:
|
|
@@ -1039,9 +1051,10 @@ class Screen(SignalEvent):
|
|
|
1039
1051
|
|
|
1040
1052
|
def display_prev(self):
|
|
1041
1053
|
view = self.current_view
|
|
1042
|
-
view
|
|
1054
|
+
if view:
|
|
1055
|
+
view.set_value()
|
|
1043
1056
|
self.set_cursor(reset_view=False)
|
|
1044
|
-
if view.view_type == 'tree' and len(self.group):
|
|
1057
|
+
if view and view.view_type == 'tree' and len(self.group):
|
|
1045
1058
|
range_ = view.treeview.get_visible_range()
|
|
1046
1059
|
if range_:
|
|
1047
1060
|
start, end = range_
|
|
@@ -1052,7 +1065,8 @@ class Screen(SignalEvent):
|
|
|
1052
1065
|
model = view.treeview.get_model()
|
|
1053
1066
|
iter_ = model.get_iter(start)
|
|
1054
1067
|
self.current_record = model.get_value(iter_, 0)
|
|
1055
|
-
elif (view
|
|
1068
|
+
elif (view
|
|
1069
|
+
and view.view_type == 'form'
|
|
1056
1070
|
and self.current_record
|
|
1057
1071
|
and self.current_record.group):
|
|
1058
1072
|
group = self.current_record.group
|
|
@@ -1070,7 +1084,7 @@ class Screen(SignalEvent):
|
|
|
1070
1084
|
if parent and record.model_name == parent.model_name:
|
|
1071
1085
|
record = parent
|
|
1072
1086
|
self.current_record = record
|
|
1073
|
-
elif view.view_type == 'calendar':
|
|
1087
|
+
elif view and view.view_type == 'calendar':
|
|
1074
1088
|
record = self.current_record
|
|
1075
1089
|
goocalendar = view.widgets.get('goocalendar')
|
|
1076
1090
|
if goocalendar:
|
|
@@ -1095,7 +1109,9 @@ class Screen(SignalEvent):
|
|
|
1095
1109
|
if prev_id >= 0:
|
|
1096
1110
|
self.current_record = events[prev_id].record
|
|
1097
1111
|
break
|
|
1098
|
-
elif (view
|
|
1112
|
+
elif (view
|
|
1113
|
+
and view.view_type == 'list-form'
|
|
1114
|
+
and len(self.group)
|
|
1099
1115
|
and self.current_record in self.group):
|
|
1100
1116
|
idx = self.group.index(self.current_record)
|
|
1101
1117
|
if 0 < idx <= len(self.group) - 1:
|
|
@@ -1103,7 +1119,8 @@ class Screen(SignalEvent):
|
|
|
1103
1119
|
else:
|
|
1104
1120
|
self.current_record = self.group[-1] if len(self.group) else None
|
|
1105
1121
|
self.set_cursor(reset_view=False)
|
|
1106
|
-
view
|
|
1122
|
+
if view:
|
|
1123
|
+
view.display()
|
|
1107
1124
|
|
|
1108
1125
|
def invalid_message(self, record=None):
|
|
1109
1126
|
if record is None:
|
|
@@ -1174,7 +1191,7 @@ class Screen(SignalEvent):
|
|
|
1174
1191
|
if not self.selected_records:
|
|
1175
1192
|
return []
|
|
1176
1193
|
|
|
1177
|
-
buttons = self.current_view.get_buttons()
|
|
1194
|
+
buttons = self.current_view.get_buttons() if self.current_view else []
|
|
1178
1195
|
|
|
1179
1196
|
for record in self.selected_records:
|
|
1180
1197
|
buttons = [b for b in buttons if is_active(record, b)]
|
|
@@ -1184,8 +1201,9 @@ class Screen(SignalEvent):
|
|
|
1184
1201
|
|
|
1185
1202
|
def button(self, button):
|
|
1186
1203
|
'Execute button on the selected records'
|
|
1187
|
-
self.current_view
|
|
1188
|
-
|
|
1204
|
+
if self.current_view:
|
|
1205
|
+
self.current_view.set_value()
|
|
1206
|
+
fields = self.current_view.get_fields()
|
|
1189
1207
|
for record in self.selected_records:
|
|
1190
1208
|
domain = record.expr_eval(
|
|
1191
1209
|
button.get('states', {})).get('pre_validate', [])
|
|
@@ -1199,7 +1217,8 @@ class Screen(SignalEvent):
|
|
|
1199
1217
|
if button.get('confirm', False) and not sur(button['confirm']):
|
|
1200
1218
|
return
|
|
1201
1219
|
if button.get('type', 'class') == 'class':
|
|
1202
|
-
|
|
1220
|
+
record_id = self.current_record.save(force_reload=False)
|
|
1221
|
+
if record_id is False or record_id < 0:
|
|
1203
1222
|
return
|
|
1204
1223
|
if button.get('type', 'class') == 'class':
|
|
1205
1224
|
self._button_class(button)
|
|
@@ -1266,7 +1285,9 @@ class Screen(SignalEvent):
|
|
|
1266
1285
|
elif action.startswith('switch'):
|
|
1267
1286
|
self.switch_view(*action.split(None, 2)[1:])
|
|
1268
1287
|
elif action == 'reload':
|
|
1269
|
-
if (self.current_view
|
|
1288
|
+
if (self.current_view
|
|
1289
|
+
and self.current_view.view_type in [
|
|
1290
|
+
'tree', 'graph', 'calendar']
|
|
1270
1291
|
and not self.parent):
|
|
1271
1292
|
self.search_filter()
|
|
1272
1293
|
elif action == 'reload menu':
|
|
@@ -1296,7 +1317,7 @@ class Screen(SignalEvent):
|
|
|
1296
1317
|
cls=JSONEncoder, separators=(',', ':'))))
|
|
1297
1318
|
path = [CONFIG['login.db'], 'model', self.model_name]
|
|
1298
1319
|
view_ids = [v.view_id for v in self.views] + self.view_ids
|
|
1299
|
-
if self.current_view.view_type != 'form':
|
|
1320
|
+
if self.current_view and self.current_view.view_type != 'form':
|
|
1300
1321
|
if self.search_value:
|
|
1301
1322
|
search_value = self.search_value
|
|
1302
1323
|
else:
|
|
@@ -1308,8 +1329,9 @@ class Screen(SignalEvent):
|
|
|
1308
1329
|
separators=(',', ':'))))
|
|
1309
1330
|
elif self.current_record and self.current_record.id > -1:
|
|
1310
1331
|
path.append(str(self.current_record.id))
|
|
1311
|
-
|
|
1312
|
-
|
|
1332
|
+
if self.current_view:
|
|
1333
|
+
i = view_ids.index(self.current_view.view_id)
|
|
1334
|
+
view_ids = view_ids[i:] + view_ids[:i]
|
|
1313
1335
|
if view_ids:
|
|
1314
1336
|
query_string.append(('views', json.dumps(
|
|
1315
1337
|
view_ids, separators=(',', ':'))))
|
|
@@ -65,13 +65,18 @@ class Calendar_(goocalendar.Calendar):
|
|
|
65
65
|
self.current_domain_period.get_dates(True)
|
|
66
66
|
dtstart = self.attrs['dtstart']
|
|
67
67
|
dtend = self.attrs.get('dtend') or dtstart
|
|
68
|
-
domain = [
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
['
|
|
72
|
-
(
|
|
73
|
-
|
|
74
|
-
(dtend, '
|
|
68
|
+
domain = [
|
|
69
|
+
(dtstart, '!=', None),
|
|
70
|
+
(dtend, '!=', None),
|
|
71
|
+
['OR',
|
|
72
|
+
['AND', (dtstart, '>=', first_datetime),
|
|
73
|
+
(dtstart, '<', last_datetime)],
|
|
74
|
+
['AND', (dtend, '>=', first_datetime),
|
|
75
|
+
(dtend, '<', last_datetime)],
|
|
76
|
+
['AND', (dtstart, '<', first_datetime),
|
|
77
|
+
(dtend, '>', last_datetime)],
|
|
78
|
+
],
|
|
79
|
+
]
|
|
75
80
|
return domain
|
|
76
81
|
|
|
77
82
|
def get_colors(self, record):
|
|
@@ -170,10 +170,9 @@ class Password(Char):
|
|
|
170
170
|
self.widget.pack_start(
|
|
171
171
|
self.visibility_checkbox, expand=False, fill=True, padding=0)
|
|
172
172
|
|
|
173
|
-
def _readonly_set(self, value):
|
|
174
|
-
super(Char, self)._readonly_set(value)
|
|
175
|
-
self.entry.set_editable(not value)
|
|
176
|
-
self.visibility_checkbox.props.visible = not value
|
|
177
|
-
|
|
178
173
|
def toggle_visibility(self, button):
|
|
179
|
-
|
|
174
|
+
if self.autocomplete:
|
|
175
|
+
entry = self.entry.get_child()
|
|
176
|
+
else:
|
|
177
|
+
entry = self.entry
|
|
178
|
+
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 Gtk, Gdk, GLib
|
|
7
6
|
try:
|
|
@@ -75,17 +74,17 @@ class Document(BinaryMixin, Widget):
|
|
|
75
74
|
self.image.hide()
|
|
76
75
|
if self.evince_view:
|
|
77
76
|
self.evince_scroll.show()
|
|
77
|
+
suffix = None
|
|
78
78
|
if self.filename_field:
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
filename = self.filename_field.get(self.record)
|
|
80
|
+
if filename:
|
|
81
|
+
suffix = Path(filename).suffix
|
|
82
|
+
filename = Path(self.field.get_filename(self.record, suffix))
|
|
82
83
|
try:
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
EvinceDocument.Document.factory_get_document(
|
|
88
|
-
path.as_uri()))
|
|
84
|
+
document = (
|
|
85
|
+
EvinceDocument.Document.factory_get_document_full(
|
|
86
|
+
filename.as_uri(),
|
|
87
|
+
EvinceDocument.DocumentLoadFlags.NONE))
|
|
89
88
|
model = EvinceView.DocumentModel()
|
|
90
89
|
model.set_document(document)
|
|
91
90
|
self.evince_view.set_model(model)
|
|
@@ -153,7 +153,8 @@ class EditableTreeView(TreeView):
|
|
|
153
153
|
for renderer in column.get_cells():
|
|
154
154
|
if renderer.props.editing:
|
|
155
155
|
widget = self.view.get_column_widget(column)
|
|
156
|
-
|
|
156
|
+
editable = widget.get_editable(renderer)
|
|
157
|
+
self.on_editing_done(editable, renderer)
|
|
157
158
|
return True
|
|
158
159
|
|
|
159
160
|
def on_keypressed(self, entry, event, renderer):
|