summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Collet <rco@openerp.com>2014-07-08 10:16:16 +0200
committerRaphael Collet <rco@openerp.com>2014-07-08 10:16:16 +0200
commita6b025d6d9a10f1f6594e7cd1aa5367b4e6c3fcb (patch)
tree08f05bdc868328c691167c68792fa3b102889c8b
parente9fae40faf742a0d2f89b0e01d7feb559aa142f7 (diff)
[FIX] models, fields: add model dependencies for models backed up by sql views
-rw-r--r--addons/hr_timesheet_sheet/hr_timesheet_sheet.py5
-rw-r--r--openerp/fields.py14
-rw-r--r--openerp/models.py4
3 files changed, 20 insertions, 3 deletions
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index a2845171212..7bbcda29c09 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -532,6 +532,11 @@ class hr_timesheet_sheet_sheet_day(osv.osv):
'total_attendance': fields.float('Attendance', readonly=True),
'total_difference': fields.float('Difference', readonly=True),
}
+ _depends = {
+ 'hr.analytic.timesheet': ['line_id', 'sheet_id'],
+ 'account.analytic.line': ['date', 'unit_amount'],
+ 'hr.attendance': ['name', 'action', 'sheet_id'],
+ }
def init(self, cr):
cr.execute("""create or replace view hr_timesheet_sheet_sheet_day as
diff --git a/openerp/fields.py b/openerp/fields.py
index ede066e37fe..f8b5bd4189c 100644
--- a/openerp/fields.py
+++ b/openerp/fields.py
@@ -366,9 +366,17 @@ class Field(object):
else:
self._setup_regular(env)
- # put invalidation/recomputation triggers on dependencies
+ # put invalidation/recomputation triggers on field dependencies
+ model = env[self.model_name]
for path in self.depends:
- self._setup_dependency([], env[self.model_name], path.split('.'))
+ self._setup_dependency([], model, path.split('.'))
+
+ # put invalidation triggers on model dependencies
+ for dep_model_name, field_names in model._depends.iteritems():
+ dep_model = env[dep_model_name]
+ for field_name in field_names:
+ field = dep_model._fields[field_name]
+ field._triggers.add((self, None))
#
# Setup of related fields
@@ -800,7 +808,7 @@ class Field(object):
# invalidate the fields that depend on self, and prepare recomputation
spec = [(self, records._ids)]
for field, path in self._triggers:
- if field.store:
+ if path and field.store:
# don't move this line to function top, see log
env = records.env(user=SUPERUSER_ID, context={'active_test': False})
target = env[field.model_name].search([(path, 'in', records.ids)])
diff --git a/openerp/models.py b/openerp/models.py
index 6f017b617b1..3b8e1a93648 100644
--- a/openerp/models.py
+++ b/openerp/models.py
@@ -326,6 +326,10 @@ class BaseModel(object):
_log_create = False
_sql_constraints = []
+ # model dependencies, for models backed up by sql views:
+ # {model_name: field_names, ...}
+ _depends = {}
+
CONCURRENCY_CHECK_FIELD = '__last_update'
def log(self, cr, uid, id, message, secondary=False, context=None):