Add pre-validation

review537002
This commit is contained in:
Cédric Krier committed 2012-09-29 14:40:50 +02:00
1 parent 5e37d518c6
commit 076a576f9f
7 files changed
+51 -31

No files matched your search

@@ -264,6 +264,15 @@ class Record(SignalEvent):
result.update(field.get_timestamp(self))
return result
def pre_validate(self):
values = self.get()
try:
RPCExecute('model', self.model_name, 'pre_validate', values,
context=self.context_get())
except RPCException:
return False
return True
def save(self, force_reload=True):
if self.id < 0 or self.modified:
if self.id < 0:
@@ -81,6 +81,7 @@ class Screen(SignalEvent):
self.expanded_nodes = collections.defaultdict(
lambda: collections.defaultdict(lambda: None))
self.domain_parser = None
self.pre_validate = False
if mode:
self.view_to_load = mode[1:]
@@ -173,6 +173,7 @@ class One2Many(WidgetInterface):
views_preload=attrs.get('views', {}),
row_activate=self._on_activate,
exclude_field=attrs.get('relation_field', None))
self.screen.pre_validate = bool(int(attrs.get('pre_validate', 0)))
self.screen.signal_connect(self, 'record-message', self._sig_label)
self.widget.pack_start(self.screen.widget, expand=True, fill=True)
@@ -282,16 +283,23 @@ class One2Many(WidgetInterface):
and access['write']
and access['read']))
def _sig_new(self, widget):
if not common.MODELACCESS[self.screen.model_name]['create']:
return
def _validate(self):
self.view.set_value()
record = self.screen.current_record
if record:
fields = self.screen.current_view.get_fields()
if not record.validate(fields):
self.screen.display()
return
return False
if self.screen.pre_validate and not record.pre_validate():
return False
return True
def _sig_new(self, widget):
if not common.MODELACCESS[self.screen.model_name]['create']:
return
if not self._validate():
return
ctx = {}
ctx.update(self.field.context_get(self.record))
sequence = None
@@ -316,33 +324,20 @@ class One2Many(WidgetInterface):
def _sig_edit(self, widget=None):
if not common.MODELACCESS[self.screen.model_name]['read']:
return
self.view.set_value()
if not self._validate():
return
record = self.screen.current_record
if record:
fields = self.screen.current_view.get_fields()
if not record.validate(fields):
self.screen.display()
return
WinForm(self.screen, lambda a: None)
def _sig_next(self, widget):
self.view.set_value()
record = self.screen.current_record
if record:
fields = self.screen.current_view.get_fields()
if not record.validate(fields):
self.screen.display()
return
if not self._validate():
return
self.screen.display_next()
def _sig_previous(self, widget):
self.view.set_value()
record = self.screen.current_record
if record:
fields = self.screen.current_view.get_fields()
if not record.validate(fields):
self.screen.display()
return
if not self._validate():
return
self.screen.display_prev()
def _sig_remove(self, widget, remove=False):
+17 -8
View File
@@ -762,14 +762,14 @@ class ViewList(ParserView):
else:
self.screen.current_record = None
if hasattr(self.widget_tree, 'editable') \
and self.widget_tree.editable \
and not self.screen.parent \
and previous_record != self.screen.current_record:
if previous_record:
def go_previous():
self.screen.current_record = previous_record
self.set_cursor()
if (hasattr(self.widget_tree, 'editable')
and self.widget_tree.editable
and previous_record):
def go_previous():
self.screen.current_record = previous_record
self.set_cursor()
if (not self.screen.parent
and previous_record != self.screen.current_record):
def save():
if not previous_record.destroyed:
@@ -781,6 +781,15 @@ class ViewList(ParserView):
return True
# Delay the save to let GTK process the current event
gobject.idle_add(save)
elif (previous_record != self.screen.current_record
and self.screen.pre_validate):
def pre_validate():
if not previous_record.destroyed:
if not previous_record.pre_validate():
go_previous()
# Delay the pre_validate to let GTK process the current event
gobject.idle_add(pre_validate)
self.update_children()
def set_value(self):
@@ -184,6 +184,9 @@ class EditableTreeView(gtk.TreeView):
break
self.set_cursor(path, col, True)
return True
if self.screen.pre_validate:
if not record.pre_validate():
return True
if not self.screen.parent:
obj_id = record.save()
if not obj_id:
@@ -710,6 +710,7 @@ class O2M(Char):
screen = Screen(relation, mode=['tree', 'form'],
exclude_field=field.attrs.get('relation_field'))
screen.pre_validate = bool(int(self.attrs.get('pre_validate', 0)))
screen.group = group
def open_callback(result):
+2
View File
@@ -398,6 +398,8 @@ class WinForm(NoModal):
and self.screen.current_record is not None):
validate = self.screen.current_record.validate(
self.screen.current_view.get_fields())
if validate and self.screen.pre_validate:
validate = self.screen.current_record.pre_validate()
if validate and self.save_current:
if not self.screen.save_current():
validate = False