Add PYSON widget

issue4631
review24021002
This commit is contained in:
Sergi Almacellas Abellana committed 2016-10-31 13:39:50 +01:00
1 parent 0d3f57b761
commit 0225962b25
5 files changed
+60 -25

No files matched your search

+1
View File
@@ -1,3 +1,4 @@
* Add PYSON Widget
* Show records names in wizard title
* Add support for datetime_field to Reference
* Show non editable widget as insensitive
+2
View File
@@ -31,6 +31,7 @@ from .form_gtk.one2one import One2One
from .form_gtk.richtextbox import RichTextBox
from .form_gtk.dictionary import DictWidget
from .form_gtk.multiselection import MultiSelection
from .form_gtk.pyson import PYSON
from .form_gtk.state_widget import (Label, VBox, Image, Frame, ScrolledWindow,
Notebook, Alignment)
@@ -377,6 +378,7 @@ class ViewForm(View):
'richtext': RichTextBox,
'dict': DictWidget,
'multiselection': MultiSelection,
'pyson': PYSON,
}
@classmethod
@@ -82,9 +82,8 @@ class Char(Widget, TranslateMixin, PopdownMixin):
@property
def modified(self):
if self.record and self.field:
entry = self.entry.get_child() if self.autocomplete else self.entry
value = entry.get_text() or ''
return self.field.get_client(self.record) != value
value = self.get_client_value(self.record, self.field)
return value != self.get_value()
return False
def set_value(self, record, field):
@@ -96,6 +95,13 @@ class Char(Widget, TranslateMixin, PopdownMixin):
entry = self.entry.get_child() if self.autocomplete else self.entry
return entry.get_text()
def get_client_value(self, record, field):
if not field:
value = ''
else:
value = field.get_client(record)
return value
def display(self, record, field):
super(Char, self).display(record, field)
if self.autocomplete:
@@ -118,11 +124,7 @@ class Char(Widget, TranslateMixin, PopdownMixin):
size_entry.set_width_chars(-1)
size_entry.set_max_length(0)
if not field:
value = ''
else:
value = field.get_client(record)
value = self.get_client_value(record, field)
if not self.autocomplete:
self.entry.set_text(value)
reset_position(self.entry)
@@ -3,8 +3,6 @@
from .char import Char
import locale
from tryton.common.entry_position import reset_position
class Integer(Char):
"Integer"
@@ -21,26 +19,16 @@ class Integer(Char):
self.entry.connect('insert_text', self.sig_insert_text)
self.factor = float(attrs.get('factor', 1))
@property
def modified(self):
if self.record and self.field:
entry = self.entry.get_child() if self.autocomplete else self.entry
value = entry.get_text() or ''
return self.field.get_client(self.record, self.factor) != value
return False
def set_value(self, record, field):
return field.set_client(record, self.entry.get_text(),
factor=self.factor)
def display(self, record, field):
# skip Char call because set_text doesn't work with int
super(Char, self).display(record, field)
def get_client_value(self, record, field):
if not field:
self.entry.set_text('')
return False
self.entry.set_text(field.get_client(record, factor=self.factor))
reset_position(self.entry)
value = ''
else:
value = field.get_client(record, factor=self.factor)
return value
def sig_insert_text(self, entry, new_text, new_text_length, position):
value = entry.get_text()
@@ -0,0 +1,42 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import gtk
from .char import Char
from tryton.pyson import CONTEXT, PYSONEncoder, PYSONDecoder
class PYSON(Char):
def __init__(self, view, attrs):
super(PYSON, self).__init__(view, attrs)
self.encoder = PYSONEncoder()
self.decoder = PYSONDecoder(noeval=True)
self.entry.connect('key-release-event', self.validate_pyson)
def get_encoded_value(self):
value = self.get_value()
if not value:
return value
try:
return self.encoder.encode(eval(value, CONTEXT))
except (ValueError, TypeError, NameError, SyntaxError):
return None
def set_value(self, record, field):
field.set_client(record, self.get_encoded_value())
def get_client_value(self, record, field):
value = super(PYSON, self).get_client_value(record, field)
if value:
value = repr(self.decoder.decode(value))
return value
def validate_pyson(self, *args):
icon = gtk.STOCK_OK
if self.get_encoded_value() is None:
icon = gtk.STOCK_CANCEL
self.entry.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY, icon)
def _focus_out(self):
self.validate_pyson()
super(PYSON, self)._focus_out()