Merge pull request #989 from odoo-dev/8.0-sql-models-rco
[FIX] models, fields: add model dependencies for models backed up by sql views
This commit is contained in:
commit
9ccdbcaca3
|
@ -98,6 +98,24 @@ class account_invoice_report(osv.osv):
|
||||||
}
|
}
|
||||||
_order = 'date desc'
|
_order = 'date desc'
|
||||||
|
|
||||||
|
_depends = {
|
||||||
|
'account.invoice': [
|
||||||
|
'account_id', 'amount_total', 'commercial_partner_id', 'company_id',
|
||||||
|
'currency_id', 'date_due', 'date_invoice', 'fiscal_position',
|
||||||
|
'journal_id', 'partner_bank_id', 'partner_id', 'payment_term',
|
||||||
|
'period_id', 'residual', 'state', 'type', 'user_id',
|
||||||
|
],
|
||||||
|
'account.invoice.line': [
|
||||||
|
'account_id', 'invoice_id', 'price_subtotal', 'product_id',
|
||||||
|
'quantity', 'uos_id',
|
||||||
|
],
|
||||||
|
'product.product': ['product_tmpl_id'],
|
||||||
|
'product.template': ['categ_id'],
|
||||||
|
'product.uom': ['category_id', 'factor', 'name', 'uom_type'],
|
||||||
|
'res.currency.rate': ['currency_id', 'name'],
|
||||||
|
'res.partner': ['country_id'],
|
||||||
|
}
|
||||||
|
|
||||||
def _select(self):
|
def _select(self):
|
||||||
select_str = """
|
select_str = """
|
||||||
SELECT sub.id, sub.date, sub.product_id, sub.partner_id, sub.country_id,
|
SELECT sub.id, sub.date, sub.product_id, sub.partner_id, sub.country_id,
|
||||||
|
|
|
@ -804,6 +804,12 @@ class account_analytic_account_summary_user(osv.osv):
|
||||||
'user': fields.many2one('res.users', 'User'),
|
'user': fields.many2one('res.users', 'User'),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_depends = {
|
||||||
|
'res.users': ['id'],
|
||||||
|
'account.analytic.line': ['account_id', 'journal_id', 'unit_amount', 'user_id'],
|
||||||
|
'account.analytic.journal': ['type'],
|
||||||
|
}
|
||||||
|
|
||||||
def init(self, cr):
|
def init(self, cr):
|
||||||
openerp.tools.sql.drop_view_if_exists(cr, 'account_analytic_analysis_summary_user')
|
openerp.tools.sql.drop_view_if_exists(cr, 'account_analytic_analysis_summary_user')
|
||||||
cr.execute('''CREATE OR REPLACE VIEW account_analytic_analysis_summary_user AS (
|
cr.execute('''CREATE OR REPLACE VIEW account_analytic_analysis_summary_user AS (
|
||||||
|
@ -837,6 +843,11 @@ class account_analytic_account_summary_month(osv.osv):
|
||||||
'month': fields.char('Month', size=32, readonly=True),
|
'month': fields.char('Month', size=32, readonly=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_depends = {
|
||||||
|
'account.analytic.line': ['account_id', 'date', 'journal_id', 'unit_amount'],
|
||||||
|
'account.analytic.journal': ['type'],
|
||||||
|
}
|
||||||
|
|
||||||
def init(self, cr):
|
def init(self, cr):
|
||||||
openerp.tools.sql.drop_view_if_exists(cr, 'account_analytic_analysis_summary_month')
|
openerp.tools.sql.drop_view_if_exists(cr, 'account_analytic_analysis_summary_month')
|
||||||
cr.execute('CREATE VIEW account_analytic_analysis_summary_month AS (' \
|
cr.execute('CREATE VIEW account_analytic_analysis_summary_month AS (' \
|
||||||
|
|
|
@ -42,6 +42,14 @@ class account_followup_stat_by_partner(osv.osv):
|
||||||
'company_id': fields.many2one('res.company', 'Company', readonly=True),
|
'company_id': fields.many2one('res.company', 'Company', readonly=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_depends = {
|
||||||
|
'account.move.line': [
|
||||||
|
'account_id', 'company_id', 'credit', 'date', 'debit',
|
||||||
|
'followup_date', 'followup_line_id', 'partner_id', 'reconcile_id',
|
||||||
|
],
|
||||||
|
'account.account': ['active', 'type'],
|
||||||
|
}
|
||||||
|
|
||||||
def init(self, cr):
|
def init(self, cr):
|
||||||
tools.drop_view_if_exists(cr, 'account_followup_stat_by_partner')
|
tools.drop_view_if_exists(cr, 'account_followup_stat_by_partner')
|
||||||
# Here we don't have other choice but to create a virtual ID based on the concatenation
|
# Here we don't have other choice but to create a virtual ID based on the concatenation
|
||||||
|
|
|
@ -59,6 +59,14 @@ class hr_evaluation_report(osv.Model):
|
||||||
}
|
}
|
||||||
_order = 'create_date desc'
|
_order = 'create_date desc'
|
||||||
|
|
||||||
|
_depends = {
|
||||||
|
'hr.evaluation.interview': ['evaluation_id', 'id', 'request_id'],
|
||||||
|
'hr_evaluation.evaluation': [
|
||||||
|
'create_date', 'date', 'date_close', 'employee_id', 'plan_id',
|
||||||
|
'rating', 'state',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
def init(self, cr):
|
def init(self, cr):
|
||||||
tools.drop_view_if_exists(cr, 'hr_evaluation_report')
|
tools.drop_view_if_exists(cr, 'hr_evaluation_report')
|
||||||
cr.execute("""
|
cr.execute("""
|
||||||
|
|
|
@ -532,6 +532,11 @@ class hr_timesheet_sheet_sheet_day(osv.osv):
|
||||||
'total_attendance': fields.float('Attendance', readonly=True),
|
'total_attendance': fields.float('Attendance', readonly=True),
|
||||||
'total_difference': fields.float('Difference', readonly=True),
|
'total_difference': fields.float('Difference', readonly=True),
|
||||||
}
|
}
|
||||||
|
_depends = {
|
||||||
|
'account.analytic.line': ['date', 'unit_amount'],
|
||||||
|
'hr.analytic.timesheet': ['line_id', 'sheet_id'],
|
||||||
|
'hr.attendance': ['action', 'name', 'sheet_id'],
|
||||||
|
}
|
||||||
|
|
||||||
def init(self, cr):
|
def init(self, cr):
|
||||||
cr.execute("""create or replace view hr_timesheet_sheet_sheet_day as
|
cr.execute("""create or replace view hr_timesheet_sheet_sheet_day as
|
||||||
|
@ -602,6 +607,12 @@ class hr_timesheet_sheet_sheet_account(osv.osv):
|
||||||
'invoice_rate': fields.many2one('hr_timesheet_invoice.factor', 'Invoice rate', readonly=True),
|
'invoice_rate': fields.many2one('hr_timesheet_invoice.factor', 'Invoice rate', readonly=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_depends = {
|
||||||
|
'account.analytic.line': ['account_id', 'date', 'to_invoice', 'unit_amount', 'user_id'],
|
||||||
|
'hr.analytic.timesheet': ['line_id'],
|
||||||
|
'hr_timesheet_sheet.sheet': ['date_from', 'date_to', 'user_id'],
|
||||||
|
}
|
||||||
|
|
||||||
def init(self, cr):
|
def init(self, cr):
|
||||||
cr.execute("""create or replace view hr_timesheet_sheet_sheet_account as (
|
cr.execute("""create or replace view hr_timesheet_sheet_sheet_account as (
|
||||||
select
|
select
|
||||||
|
|
|
@ -25,6 +25,9 @@ class account_invoice_report(osv.osv):
|
||||||
_columns = {
|
_columns = {
|
||||||
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||||
}
|
}
|
||||||
|
_depends = {
|
||||||
|
'account.invoice': ['section_id'],
|
||||||
|
}
|
||||||
|
|
||||||
def _select(self):
|
def _select(self):
|
||||||
return super(account_invoice_report, self)._select() + ", sub.section_id as section_id"
|
return super(account_invoice_report, self)._select() + ", sub.section_id as section_id"
|
||||||
|
|
|
@ -366,9 +366,17 @@ class Field(object):
|
||||||
else:
|
else:
|
||||||
self._setup_regular(env)
|
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:
|
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
|
# Setup of related fields
|
||||||
|
@ -800,7 +808,7 @@ class Field(object):
|
||||||
# invalidate the fields that depend on self, and prepare recomputation
|
# invalidate the fields that depend on self, and prepare recomputation
|
||||||
spec = [(self, records._ids)]
|
spec = [(self, records._ids)]
|
||||||
for field, path in self._triggers:
|
for field, path in self._triggers:
|
||||||
if field.store:
|
if path and field.store:
|
||||||
# don't move this line to function top, see log
|
# don't move this line to function top, see log
|
||||||
env = records.env(user=SUPERUSER_ID, context={'active_test': False})
|
env = records.env(user=SUPERUSER_ID, context={'active_test': False})
|
||||||
target = env[field.model_name].search([(path, 'in', records.ids)])
|
target = env[field.model_name].search([(path, 'in', records.ids)])
|
||||||
|
@ -824,10 +832,13 @@ class Field(object):
|
||||||
computed = target.browse(env.computed[field])
|
computed = target.browse(env.computed[field])
|
||||||
if path == 'id':
|
if path == 'id':
|
||||||
target = records - computed
|
target = records - computed
|
||||||
|
elif path:
|
||||||
|
target = (target.browse(env.cache[field]) - computed).filtered(
|
||||||
|
lambda rec: rec._mapped_cache(path) & records
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
for record in target.browse(env.cache[field]) - computed:
|
target = target.browse(env.cache[field]) - computed
|
||||||
if record._mapped_cache(path) & records:
|
|
||||||
target += record
|
|
||||||
if target:
|
if target:
|
||||||
spec.append((field, target._ids))
|
spec.append((field, target._ids))
|
||||||
|
|
||||||
|
|
|
@ -326,6 +326,10 @@ class BaseModel(object):
|
||||||
_log_create = False
|
_log_create = False
|
||||||
_sql_constraints = []
|
_sql_constraints = []
|
||||||
|
|
||||||
|
# model dependencies, for models backed up by sql views:
|
||||||
|
# {model_name: field_names, ...}
|
||||||
|
_depends = {}
|
||||||
|
|
||||||
CONCURRENCY_CHECK_FIELD = '__last_update'
|
CONCURRENCY_CHECK_FIELD = '__last_update'
|
||||||
|
|
||||||
def log(self, cr, uid, id, message, secondary=False, context=None):
|
def log(self, cr, uid, id, message, secondary=False, context=None):
|
||||||
|
@ -585,6 +589,10 @@ class BaseModel(object):
|
||||||
inherits = dict(parent_class._inherits)
|
inherits = dict(parent_class._inherits)
|
||||||
inherits.update(cls._inherits)
|
inherits.update(cls._inherits)
|
||||||
|
|
||||||
|
depends = dict(parent_class._depends)
|
||||||
|
for m, fs in cls._depends.iteritems():
|
||||||
|
depends.setdefault(m, []).extend(fs)
|
||||||
|
|
||||||
old_constraints = parent_class._constraints
|
old_constraints = parent_class._constraints
|
||||||
new_constraints = cls._constraints
|
new_constraints = cls._constraints
|
||||||
# filter out from old_constraints the ones overridden by a
|
# filter out from old_constraints the ones overridden by a
|
||||||
|
@ -604,6 +612,7 @@ class BaseModel(object):
|
||||||
'_columns': columns,
|
'_columns': columns,
|
||||||
'_defaults': defaults,
|
'_defaults': defaults,
|
||||||
'_inherits': inherits,
|
'_inherits': inherits,
|
||||||
|
'_depends': depends,
|
||||||
'_constraints': constraints,
|
'_constraints': constraints,
|
||||||
'_sql_constraints': sql_constraints,
|
'_sql_constraints': sql_constraints,
|
||||||
}
|
}
|
||||||
|
@ -617,6 +626,7 @@ class BaseModel(object):
|
||||||
'_columns': dict(cls._columns),
|
'_columns': dict(cls._columns),
|
||||||
'_defaults': dict(cls._defaults),
|
'_defaults': dict(cls._defaults),
|
||||||
'_inherits': dict(cls._inherits),
|
'_inherits': dict(cls._inherits),
|
||||||
|
'_depends': dict(cls._depends),
|
||||||
'_constraints': list(cls._constraints),
|
'_constraints': list(cls._constraints),
|
||||||
'_sql_constraints': list(cls._sql_constraints),
|
'_sql_constraints': list(cls._sql_constraints),
|
||||||
'_original_module': original_module,
|
'_original_module': original_module,
|
||||||
|
|
Loading…
Reference in New Issue