merge
This commit is contained in:
commit
2d44cec016
6 files changed
+61
-26
No files matched your search
Binary file not shown.
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.3 KiB |
@@ -192,8 +192,19 @@ class NumericField(FloatField):
|
||||
|
||||
def set_client(self, model, value, test_state=True, force_change=False):
|
||||
value = Decimal(str(value))
|
||||
return super(NumericField, self).set_client(model, value,
|
||||
test_state=test_state, force_change=force_change)
|
||||
internal = model.value[self.name]
|
||||
self.set(model, value, test_state)
|
||||
if isinstance(self.attrs.get('digits'), str):
|
||||
digits = model.expr_eval(self.attrs['digits'])
|
||||
else:
|
||||
digits = self.attrs.get('digits', (12, 2))
|
||||
if abs((internal or Decimal('0.0')) - (model.value[self.name] or Decimal('0.0'))) \
|
||||
>= Decimal(str(10.0**(-int(digits[1])))):
|
||||
if not self.get_state_attrs(model).get('readonly', False):
|
||||
model.modified = True
|
||||
model.modified_fields.setdefault(self.name)
|
||||
self.sig_changed(model)
|
||||
model.signal('record-changed', model)
|
||||
|
||||
|
||||
class IntegerField(CharField):
|
||||
@@ -341,7 +352,7 @@ class O2MField(CharField):
|
||||
for model2 in model.value[self.name].models:
|
||||
if (modified and not model2.is_modified()):
|
||||
continue
|
||||
if model2.id:
|
||||
if model2.id > 0:
|
||||
result.append(('write', model2.id,
|
||||
model2.get(check_load=check_load, get_readonly=readonly,
|
||||
get_modifiedonly=modified)))
|
||||
@@ -408,14 +419,12 @@ class O2MField(CharField):
|
||||
return True
|
||||
|
||||
def set_on_change(self, model, value):
|
||||
from group import ModelRecordGroup
|
||||
|
||||
if value and value.get('add'):
|
||||
if value and (value.get('add') or value.get('update')):
|
||||
context = self.context_get(model)
|
||||
rpc2 = RPCProxy(self.attrs['relation'])
|
||||
try:
|
||||
fields_name = []
|
||||
for val in value['add']:
|
||||
for val in (value.get('add', []) + value.get('update', [])):
|
||||
for fieldname in val.keys():
|
||||
if fieldname not in fields_name:
|
||||
fields_name.append(fieldname)
|
||||
@@ -436,12 +445,19 @@ class O2MField(CharField):
|
||||
model.value[self.name].remove(mod)
|
||||
|
||||
mod = None
|
||||
if value and value.get('add'):
|
||||
if value and value.get('add') or value.get('update', []):
|
||||
model.value[self.name].add_fields(fields, model.value[self.name])
|
||||
for record in (value['add'] or []):
|
||||
for record in value.get('add', []):
|
||||
mod = model.value[self.name].model_new(default=False)
|
||||
model.value[self.name].model_add(mod)
|
||||
mod.set(record, modified=True, signal=True)
|
||||
mod.set(record, modified=True, signal=False)
|
||||
|
||||
for record in value.get('update', []):
|
||||
if 'id' not in record:
|
||||
continue
|
||||
mod = model.value[self.name].get_by_id(record['id'])
|
||||
if mod:
|
||||
mod.set(record, modified=True, signal=False)
|
||||
model.value[self.name].current_model = mod
|
||||
return True
|
||||
|
||||
|
||||
@@ -287,7 +287,7 @@ class ModelRecordGroup(SignalEvent):
|
||||
|
||||
def remove(self, model, remove=False, modified=True):
|
||||
idx = self.models.index(model)
|
||||
if self.models[idx].id:
|
||||
if self.models[idx].id > 0:
|
||||
if remove:
|
||||
self.model_removed.append(self.models[idx].id)
|
||||
else:
|
||||
@@ -325,7 +325,7 @@ class ModelRecordGroup(SignalEvent):
|
||||
old = []
|
||||
new = []
|
||||
for model in models:
|
||||
if model.id:
|
||||
if model.id > 0:
|
||||
if model.is_modified():
|
||||
old.append(model.id)
|
||||
elif to_add:
|
||||
|
||||
@@ -23,12 +23,18 @@ class EvalEnvironment(object):
|
||||
|
||||
class ModelRecord(SignalEvent):
|
||||
|
||||
id = -1
|
||||
|
||||
|
||||
def __init__(self, resource, obj_id, window, group=None, parent=None, new=False ):
|
||||
global ID_COUNT
|
||||
super(ModelRecord, self).__init__()
|
||||
self.window = window
|
||||
self.resource = resource
|
||||
self.rpc = RPCProxy(self.resource)
|
||||
self.id = obj_id
|
||||
self.id = obj_id or ModelRecord.id
|
||||
if self.id < 0:
|
||||
ModelRecord.id -= 1
|
||||
self._loaded = False
|
||||
self.parent = parent
|
||||
self.mgroup = group
|
||||
@@ -47,7 +53,7 @@ class ModelRecord(SignalEvent):
|
||||
self.value[key].model_add(mod)
|
||||
|
||||
def __getitem__(self, name):
|
||||
if not self._loaded and self.id:
|
||||
if not self._loaded and self.id > 0:
|
||||
ids = [self.id]
|
||||
idx = self.mgroup.models.index(self)
|
||||
length = len(self.mgroup.models)
|
||||
@@ -135,7 +141,7 @@ class ModelRecord(SignalEvent):
|
||||
|
||||
def save(self, force_reload=True):
|
||||
self._check_load()
|
||||
if not self.id:
|
||||
if self.id < 0:
|
||||
value = self.get(get_readonly=True)
|
||||
try:
|
||||
self.id = self.rpc.create(value, self.context_get())
|
||||
@@ -143,7 +149,7 @@ class ModelRecord(SignalEvent):
|
||||
self.id = common.process_exception(exception, self.window, 'object',
|
||||
'execute', self.resource, 'create', value,
|
||||
self.context_get())
|
||||
if not self.id:
|
||||
if not self.id or self.id < 0:
|
||||
return False
|
||||
else:
|
||||
if not self.is_modified():
|
||||
@@ -256,7 +262,7 @@ class ModelRecord(SignalEvent):
|
||||
self.signal('record-changed')
|
||||
|
||||
def reload(self):
|
||||
if not self.id:
|
||||
if self.id < 0:
|
||||
return
|
||||
ctx = rpc.CONTEXT.copy()
|
||||
ctx.update(self.context_get())
|
||||
@@ -297,7 +303,7 @@ class ModelRecord(SignalEvent):
|
||||
args[arg] = self.expr_eval(arg)
|
||||
except:
|
||||
args[arg] = False
|
||||
ids = self.id and [self.id] or []
|
||||
ids = [self.id]
|
||||
ctx = rpc.CONTEXT.copy()
|
||||
ctx.update(self.context_get())
|
||||
try:
|
||||
@@ -320,19 +326,21 @@ class ModelRecord(SignalEvent):
|
||||
self.mgroup.mfields[fieldname].set_on_change(self, value)
|
||||
self.signal('record-changed')
|
||||
|
||||
def on_change_with(self, fieldname):
|
||||
def on_change_with(self, field_name):
|
||||
for fieldname in self.mgroup.mfields:
|
||||
on_change_with = self.mgroup.mfields[fieldname].attrs.get(
|
||||
'on_change_with')
|
||||
if not on_change_with:
|
||||
continue
|
||||
if field_name not in on_change_with:
|
||||
continue
|
||||
args = {}
|
||||
for arg in on_change_with:
|
||||
try:
|
||||
args[arg] = self.expr_eval(arg)
|
||||
except:
|
||||
args[arg] = False
|
||||
ids = self.id and [self.id] or []
|
||||
ids = [self.id]
|
||||
ctx = rpc.CONTEXT.copy()
|
||||
ctx.update(self.context_get())
|
||||
try:
|
||||
@@ -357,7 +365,7 @@ class ModelRecord(SignalEvent):
|
||||
field_name + '=' + str(value), ctx))
|
||||
|
||||
def get_attachment_count(self, reload=False):
|
||||
if not self.id:
|
||||
if self.id < 0:
|
||||
return 0
|
||||
if self.attachment_count < 0 or reload:
|
||||
ir_attachment = RPCProxy('ir.attachment')
|
||||
|
||||
@@ -461,7 +461,7 @@ class Screen(SignalEvent):
|
||||
reload_ids = []
|
||||
if self.current_view.view_type == 'form' and self.current_model:
|
||||
obj_id = self.current_model.id
|
||||
if delete and obj_id:
|
||||
if delete and obj_id > 0:
|
||||
try:
|
||||
reload_ids = self.models.on_write_ids(obj_id)
|
||||
if reload_ids and obj_id in reload_ids:
|
||||
|
||||
@@ -160,6 +160,7 @@ class Dialog(object):
|
||||
|
||||
self.dia = gtk.Dialog(_('Link'), window,
|
||||
gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT)
|
||||
self.dia.connect('close', self._sig_close)
|
||||
self.window = window
|
||||
self.dia.set_property('default-width', 760)
|
||||
self.dia.set_property('default-height', 500)
|
||||
@@ -169,11 +170,11 @@ class Dialog(object):
|
||||
self.accel_group = gtk.AccelGroup()
|
||||
self.dia.add_accel_group(self.accel_group)
|
||||
|
||||
icon_cancel = gtk.STOCK_CLOSE
|
||||
self.but_cancel = None
|
||||
if not model:
|
||||
icon_cancel = gtk.STOCK_CANCEL
|
||||
self.but_cancel = self.dia.add_button(icon_cancel,
|
||||
gtk.RESPONSE_CANCEL)
|
||||
self.but_cancel = self.dia.add_button(icon_cancel,
|
||||
gtk.RESPONSE_CANCEL)
|
||||
|
||||
self.but_ok = self.dia.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
|
||||
self.but_ok.add_accelerator('clicked', self.accel_group,
|
||||
@@ -366,13 +367,23 @@ class Dialog(object):
|
||||
if not end:
|
||||
self.screen.current_view.set_cursor()
|
||||
self.screen.display()
|
||||
self.but_cancel.set_label(gtk.STOCK_CLOSE)
|
||||
if self.but_cancel:
|
||||
self.but_cancel.set_label(gtk.STOCK_CLOSE)
|
||||
|
||||
if res == gtk.RESPONSE_OK:
|
||||
model = self.screen.current_model
|
||||
return (True, model)
|
||||
return (False, None)
|
||||
|
||||
def _sig_close(self, widget):
|
||||
self.screen.current_view.set_value()
|
||||
if not self.but_cancel \
|
||||
and self.screen.current_model \
|
||||
and not self.screen.current_model.validate():
|
||||
self.screen.current_view.set_cursor()
|
||||
self.screen.display()
|
||||
widget.emit_stop_by_name('close')
|
||||
|
||||
def destroy(self):
|
||||
self.screen.signal_unconnect(self)
|
||||
self.window.present()
|
||||
|
||||
Reference in new issue
Block a user