From 0e197d5eec048fe8ddb4ede0ecbc1ad39f2882b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sun, 14 Apr 2024 10:56:27 +0200 Subject: [PATCH] Parse text as datetime when it is a string The on_paste method is calling value_from_text for each widget using the string from the clipboard. So textual value needs to be supported even for date and time widgets which uses a cell renderer that provides datetime value. Closes #12860 (grafted from 06448d7bdb976b7057a465ca332bbc638e91653e) --HG-- branch : 7.0 --- tryton/tryton/common/datetime_.py | 4 +++- .../gui/window/view_form/view/list_gtk/widget.py | 14 +++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/tryton/tryton/common/datetime_.py b/tryton/tryton/common/datetime_.py index 0501e65d75..e70b4a306d 100644 --- a/tryton/tryton/common/datetime_.py +++ b/tryton/tryton/common/datetime_.py @@ -9,7 +9,9 @@ from gi.repository import Gdk, GObject, Gtk from .common import IconFactory -__all__ = ['Date', 'CellRendererDate', 'Time', 'CellRendererTime', 'DateTime'] +__all__ = [ + 'Date', 'CellRendererDate', 'Time', 'CellRendererTime', 'DateTime', + 'date_parse'] _ = gettext.gettext diff --git a/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py b/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py index a11e5eeb42..61a70daad2 100644 --- a/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py +++ b/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py @@ -23,7 +23,8 @@ from tryton.common.cellrenderertext import ( CellRendererText, CellRendererTextCompletion) from tryton.common.cellrenderertoggle import CellRendererToggle from tryton.common.completion import get_completion, update_completion -from tryton.common.datetime_ import CellRendererDate, CellRendererTime +from tryton.common.datetime_ import ( + CellRendererDate, CellRendererTime, date_parse) from tryton.common.domain_parser import quote from tryton.common.selection import ( PopdownMixin, SelectionMixin, selection_shortcuts) @@ -493,6 +494,17 @@ class Date(GenericText): else: return '' + def value_from_text(self, record, text, callback=None): + if isinstance(text, str): + field = record[self.attrs['name']] + try: + # Use a datetime instance and rely on field to convert to the + # proper type + text = date_parse(text, self.get_format(record, field)) + except (ValueError, OverflowError): + text = None + return super().value_from_text(record, text, callback=callback) + class Time(Date):