Catch exception in sig_changed and restore previous state for issue617

This commit is contained in:
Cédric Krier committed 2008-11-26 11:53:32 +01:00
1 parent 92f2817972
commit b36dcf5017
1 file changed
+52 -8
+52 -8
View File
@@ -79,11 +79,17 @@ class CharField(object):
def set_client(self, model, value, force_change=False):
internal = model.value.get(self.name, False)
prev_modified = model.modified
self.set(model, value)
if (internal or False) != (model.value.get(self.name, False) or False):
model.modified = True
model.modified_fields.setdefault(self.name)
self.sig_changed(model)
try:
self.sig_changed(model)
except:
model.value[self.name] = internal
model.modified = prev_modified
return
model.signal('record-changed', model)
def get_client(self, model):
@@ -194,6 +200,7 @@ class FloatField(CharField):
def set_client(self, model, value, force_change=False):
internal = model.value[self.name]
prev_modified = model.modified
self.set(model, value)
if isinstance(self.attrs.get('digits'), str):
digits = model.expr_eval(self.attrs['digits'])
@@ -204,7 +211,11 @@ class FloatField(CharField):
if not self.get_state_attrs(model).get('readonly', False):
model.modified = True
model.modified_fields.setdefault(self.name)
self.sig_changed(model)
try:
self.sig_changed(model)
except:
model.value[self.name] = internal
model.modified = prev_modified
model.signal('record-changed', model)
@@ -213,6 +224,7 @@ class NumericField(FloatField):
def set_client(self, model, value, force_change=False):
value = Decimal(str(value))
internal = model.value[self.name]
prev_modified = model.modified
self.set(model, value)
if isinstance(self.attrs.get('digits'), str):
digits = model.expr_eval(self.attrs['digits'])
@@ -223,7 +235,12 @@ class NumericField(FloatField):
if not self.get_state_attrs(model).get('readonly', False):
model.modified = True
model.modified_fields.setdefault(self.name)
self.sig_changed(model)
try:
self.sig_changed(model)
except:
model.value[self.name] = internal
model.modified = prev_modified
return
model.signal('record-changed', model)
@@ -240,11 +257,17 @@ class BooleanField(CharField):
def set_client(self, model, value, force_change=False):
value = bool(value)
internal = bool(model.value.get(self.name, False))
prev_modified = model.modified
self.set(model, value)
if internal != bool(model.value.get(self.name, False)):
model.modified = True
model.modified_fields.setdefault(self.name)
self.sig_changed(model)
try:
self.sig_changed(model)
except:
model.value[self.name] = internal
model.modified = prev_modified
return
model.signal('record-changed', model)
def get(self, model, check_load=True, readonly=True, modified=False):
@@ -298,14 +321,23 @@ class M2OField(CharField):
def set_client(self, model, value, force_change=False):
internal = model.value[self.name]
prev_modified = model.modified
self.set(model, value)
if internal != model.value[self.name]:
model.modified = True
model.modified_fields.setdefault(self.name)
self.sig_changed(model)
try:
self.sig_changed(model)
except:
model.value[self.name] = internal
model.modified = prev_modified
return
model.signal('record-changed', model)
elif force_change:
self.sig_changed(model)
try:
self.sig_changed(model)
except:
model.value[self.name] = internal
class M2MField(CharField):
@@ -337,11 +369,17 @@ class M2MField(CharField):
def set_client(self, model, value, force_change=False):
internal = model.value[self.name]
prev_modified = model.modified
self.set(model, value, modified=False)
if set(internal) != set(value):
model.modified = True
model.modified_fields.setdefault(self.name)
self.sig_changed(model)
try:
self.sig_changed(model)
except:
model.value[self.name] = internal
model.modified = prev_modified
return
model.signal('record-changed', model)
def get_default(self, model):
@@ -540,11 +578,17 @@ class ReferenceField(CharField):
def set_client(self, model, value, force_change=False):
internal = model.value[self.name]
prev_modified = model.modified
model.value[self.name] = value
if (internal or False) != (model.value[self.name] or False):
model.modified = True
model.modified_fields.setdefault(self.name)
self.sig_changed(model)
try:
self.sig_changed(model)
except:
model.value[self.name] = internal
model.modified = prev_modified
return
model.signal('record-changed', model)
def set(self, model, value, modified=False):