|
|
|
@ -26,7 +26,7 @@ import types
|
|
|
|
|
|
|
|
|
|
import openerp
|
|
|
|
|
from openerp import SUPERUSER_ID
|
|
|
|
|
from openerp import netsvc, pooler, tools
|
|
|
|
|
from openerp import netsvc, tools
|
|
|
|
|
from openerp.osv import fields,osv
|
|
|
|
|
from openerp.osv.orm import Model
|
|
|
|
|
from openerp.tools.safe_eval import safe_eval as eval
|
|
|
|
@ -50,7 +50,7 @@ def _get_fields_type(self, cr, uid, context=None):
|
|
|
|
|
|
|
|
|
|
def _in_modules(self, cr, uid, ids, field_name, arg, context=None):
|
|
|
|
|
#pseudo-method used by fields.function in ir.model/ir.model.fields
|
|
|
|
|
module_pool = self.pool.get("ir.module.module")
|
|
|
|
|
module_pool = self.pool["ir.module.module"]
|
|
|
|
|
installed_module_ids = module_pool.search(cr, uid, [('state','=','installed')])
|
|
|
|
|
installed_module_names = module_pool.read(cr, uid, installed_module_ids, ['name'], context=context)
|
|
|
|
|
installed_modules = set(x['name'] for x in installed_module_names)
|
|
|
|
@ -71,7 +71,7 @@ class ir_model(osv.osv):
|
|
|
|
|
res = dict.fromkeys(ids)
|
|
|
|
|
for model in models:
|
|
|
|
|
if self.pool.get(model.model):
|
|
|
|
|
res[model.id] = self.pool.get(model.model).is_transient()
|
|
|
|
|
res[model.id] = self.pool[model.model].is_transient()
|
|
|
|
|
else:
|
|
|
|
|
_logger.error('Missing model %s' % (model.model, ))
|
|
|
|
|
return res
|
|
|
|
@ -91,7 +91,7 @@ class ir_model(osv.osv):
|
|
|
|
|
models = self.browse(cr, uid, ids)
|
|
|
|
|
res = {}
|
|
|
|
|
for model in models:
|
|
|
|
|
res[model.id] = self.pool.get("ir.ui.view").search(cr, uid, [('model', '=', model.model)])
|
|
|
|
|
res[model.id] = self.pool["ir.ui.view"].search(cr, uid, [('model', '=', model.model)])
|
|
|
|
|
return res
|
|
|
|
|
|
|
|
|
|
_columns = {
|
|
|
|
@ -144,7 +144,7 @@ class ir_model(osv.osv):
|
|
|
|
|
|
|
|
|
|
def _drop_table(self, cr, uid, ids, context=None):
|
|
|
|
|
for model in self.browse(cr, uid, ids, context):
|
|
|
|
|
model_pool = self.pool.get(model.model)
|
|
|
|
|
model_pool = self.pool[model.model]
|
|
|
|
|
cr.execute('select relkind from pg_class where relname=%s', (model_pool._table,))
|
|
|
|
|
result = cr.fetchone()
|
|
|
|
|
if result and result[0] == 'v':
|
|
|
|
@ -168,7 +168,7 @@ class ir_model(osv.osv):
|
|
|
|
|
if not context.get(MODULE_UNINSTALL_FLAG):
|
|
|
|
|
# only reload pool for normal unlink. For module uninstall the
|
|
|
|
|
# reload is done independently in openerp.modules.loading
|
|
|
|
|
pooler.restart_pool(cr.dbname)
|
|
|
|
|
openerp.modules.registry.RegistryManager.new(cr.dbname)
|
|
|
|
|
|
|
|
|
|
return res
|
|
|
|
|
|
|
|
|
@ -193,8 +193,7 @@ class ir_model(osv.osv):
|
|
|
|
|
field_name=vals['name'],
|
|
|
|
|
field_state='manual',
|
|
|
|
|
select=vals.get('select_level', '0'))
|
|
|
|
|
self.pool.get(vals['model'])._auto_init(cr, ctx)
|
|
|
|
|
#pooler.restart_pool(cr.dbname)
|
|
|
|
|
self.pool[vals['model']]._auto_init(cr, ctx)
|
|
|
|
|
return res
|
|
|
|
|
|
|
|
|
|
def instanciate(self, cr, user, model, context=None):
|
|
|
|
@ -298,7 +297,7 @@ class ir_model_fields(osv.osv):
|
|
|
|
|
|
|
|
|
|
def _drop_column(self, cr, uid, ids, context=None):
|
|
|
|
|
for field in self.browse(cr, uid, ids, context):
|
|
|
|
|
model = self.pool.get(field.model)
|
|
|
|
|
model = self.pool[field.model]
|
|
|
|
|
cr.execute('select relkind from pg_class where relname=%s', (model._table,))
|
|
|
|
|
result = cr.fetchone()
|
|
|
|
|
cr.execute("SELECT column_name FROM information_schema.columns WHERE table_name ='%s' and column_name='%s'" %(model._table, field.name))
|
|
|
|
@ -323,7 +322,7 @@ class ir_model_fields(osv.osv):
|
|
|
|
|
|
|
|
|
|
def create(self, cr, user, vals, context=None):
|
|
|
|
|
if 'model_id' in vals:
|
|
|
|
|
model_data = self.pool.get('ir.model').browse(cr, user, vals['model_id'])
|
|
|
|
|
model_data = self.pool['ir.model'].browse(cr, user, vals['model_id'])
|
|
|
|
|
vals['model'] = model_data.model
|
|
|
|
|
if context is None:
|
|
|
|
|
context = {}
|
|
|
|
@ -338,18 +337,18 @@ class ir_model_fields(osv.osv):
|
|
|
|
|
if not vals['name'].startswith('x_'):
|
|
|
|
|
raise except_orm(_('Error'), _("Custom fields must have a name that starts with 'x_' !"))
|
|
|
|
|
|
|
|
|
|
if vals.get('relation',False) and not self.pool.get('ir.model').search(cr, user, [('model','=',vals['relation'])]):
|
|
|
|
|
if vals.get('relation',False) and not self.pool['ir.model'].search(cr, user, [('model','=',vals['relation'])]):
|
|
|
|
|
raise except_orm(_('Error'), _("Model %s does not exist!") % vals['relation'])
|
|
|
|
|
|
|
|
|
|
if self.pool.get(vals['model']):
|
|
|
|
|
self.pool.get(vals['model']).__init__(self.pool, cr)
|
|
|
|
|
self.pool[vals['model']].__init__(self.pool, cr)
|
|
|
|
|
#Added context to _auto_init for special treatment to custom field for select_level
|
|
|
|
|
ctx = dict(context,
|
|
|
|
|
field_name=vals['name'],
|
|
|
|
|
field_state='manual',
|
|
|
|
|
select=vals.get('select_level', '0'),
|
|
|
|
|
update_custom_fields=True)
|
|
|
|
|
self.pool.get(vals['model'])._auto_init(cr, ctx)
|
|
|
|
|
self.pool[vals['model']]._auto_init(cr, ctx)
|
|
|
|
|
|
|
|
|
|
return res
|
|
|
|
|
|
|
|
|
@ -498,7 +497,7 @@ class ir_model_constraint(Model):
|
|
|
|
|
Delete PostgreSQL foreign keys and constraints tracked by this model.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
if uid != SUPERUSER_ID and not self.pool.get('ir.model.access').check_groups(cr, uid, "base.group_system"):
|
|
|
|
|
if uid != SUPERUSER_ID and not self.pool['ir.model.access'].check_groups(cr, uid, "base.group_system"):
|
|
|
|
|
raise except_orm(_('Permission Denied'), (_('Administrator access is required to uninstall a module')))
|
|
|
|
|
|
|
|
|
|
context = dict(context or {})
|
|
|
|
@ -559,7 +558,7 @@ class ir_model_relation(Model):
|
|
|
|
|
Delete PostgreSQL many2many relations tracked by this model.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
if uid != SUPERUSER_ID and not self.pool.get('ir.model.access').check_groups(cr, uid, "base.group_system"):
|
|
|
|
|
if uid != SUPERUSER_ID and not self.pool['ir.model.access'].check_groups(cr, uid, "base.group_system"):
|
|
|
|
|
raise except_orm(_('Permission Denied'), (_('Administrator access is required to uninstall a module')))
|
|
|
|
|
|
|
|
|
|
ids_set = set(ids)
|
|
|
|
@ -685,7 +684,7 @@ class ir_model_access(osv.osv):
|
|
|
|
|
# TransientModel records have no access rights, only an implicit access rule
|
|
|
|
|
if not self.pool.get(model_name):
|
|
|
|
|
_logger.error('Missing model %s' % (model_name, ))
|
|
|
|
|
elif self.pool.get(model_name).is_transient():
|
|
|
|
|
elif self.pool[model_name].is_transient():
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
# We check if a specific rule exists
|
|
|
|
@ -793,7 +792,7 @@ class ir_model_data(osv.osv):
|
|
|
|
|
|
|
|
|
|
for model in result:
|
|
|
|
|
try:
|
|
|
|
|
r = dict(self.pool.get(model).name_get(cr, uid, result[model].keys(), context=context))
|
|
|
|
|
r = dict(self.pool[model].name_get(cr, uid, result[model].keys(), context=context))
|
|
|
|
|
for key,val in result[model].items():
|
|
|
|
|
result2[val] = r.get(key, False)
|
|
|
|
|
except:
|
|
|
|
@ -867,7 +866,7 @@ class ir_model_data(osv.osv):
|
|
|
|
|
def get_object(self, cr, uid, module, xml_id, context=None):
|
|
|
|
|
"""Returns a browsable record for the given module name and xml_id or raise ValueError if not found"""
|
|
|
|
|
res_model, res_id = self.get_object_reference(cr, uid, module, xml_id)
|
|
|
|
|
result = self.pool.get(res_model).browse(cr, uid, res_id, context=context)
|
|
|
|
|
result = self.pool[res_model].browse(cr, uid, res_id, context=context)
|
|
|
|
|
if not result.exists():
|
|
|
|
|
raise ValueError('No record found for unique ID %s.%s. It may have been deleted.' % (module, xml_id))
|
|
|
|
|
return result
|
|
|
|
@ -1001,7 +1000,7 @@ class ir_model_data(osv.osv):
|
|
|
|
|
cr.execute('select * from ir_values where model=%s and key=%s and name=%s'+where,(model, key, name))
|
|
|
|
|
res = cr.fetchone()
|
|
|
|
|
if not res:
|
|
|
|
|
ir_values_obj = pooler.get_pool(cr.dbname).get('ir.values')
|
|
|
|
|
ir_values_obj = openerp.registry(cr.dbname)['ir.values']
|
|
|
|
|
ir_values_obj.set(cr, uid, key, key2, name, models, value, replace, isobject, meta)
|
|
|
|
|
elif xml_id:
|
|
|
|
|
cr.execute('UPDATE ir_values set value=%s WHERE model=%s and key=%s and name=%s'+where,(value, model, key, name))
|
|
|
|
@ -1020,7 +1019,7 @@ class ir_model_data(osv.osv):
|
|
|
|
|
|
|
|
|
|
ids = self.search(cr, uid, [('module', 'in', modules_to_remove)])
|
|
|
|
|
|
|
|
|
|
if uid != 1 and not self.pool.get('ir.model.access').check_groups(cr, uid, "base.group_system"):
|
|
|
|
|
if uid != 1 and not self.pool['ir.model.access'].check_groups(cr, uid, "base.group_system"):
|
|
|
|
|
raise except_orm(_('Permission Denied'), (_('Administrator access is required to uninstall a module')))
|
|
|
|
|
|
|
|
|
|
context = dict(context or {})
|
|
|
|
@ -1063,7 +1062,7 @@ class ir_model_data(osv.osv):
|
|
|
|
|
if model == 'ir.model.fields':
|
|
|
|
|
# Don't remove the LOG_ACCESS_COLUMNS unless _log_access
|
|
|
|
|
# has been turned off on the model.
|
|
|
|
|
field = self.pool.get(model).browse(cr, uid, [res_id], context=context)[0]
|
|
|
|
|
field = self.pool[model].browse(cr, uid, [res_id], context=context)[0]
|
|
|
|
|
if field.name in openerp.osv.orm.LOG_ACCESS_COLUMNS and self.pool[field.model]._log_access:
|
|
|
|
|
continue
|
|
|
|
|
if field.name == 'id':
|
|
|
|
@ -1071,7 +1070,7 @@ class ir_model_data(osv.osv):
|
|
|
|
|
_logger.info('Deleting %s@%s', res_id, model)
|
|
|
|
|
try:
|
|
|
|
|
cr.execute('SAVEPOINT record_unlink_save')
|
|
|
|
|
self.pool.get(model).unlink(cr, uid, [res_id], context=context)
|
|
|
|
|
self.pool[model].unlink(cr, uid, [res_id], context=context)
|
|
|
|
|
except Exception:
|
|
|
|
|
_logger.info('Unable to delete %s@%s', res_id, model, exc_info=True)
|
|
|
|
|
cr.execute('ROLLBACK TO SAVEPOINT record_unlink_save')
|
|
|
|
@ -1084,8 +1083,8 @@ class ir_model_data(osv.osv):
|
|
|
|
|
unlink_if_refcount((model, res_id) for model, res_id in to_unlink
|
|
|
|
|
if model == 'ir.model.fields')
|
|
|
|
|
|
|
|
|
|
ir_model_relation = self.pool.get('ir.model.relation')
|
|
|
|
|
ir_module_module = self.pool.get('ir.module.module')
|
|
|
|
|
ir_model_relation = self.pool['ir.model.relation']
|
|
|
|
|
ir_module_module = self.pool['ir.module.module']
|
|
|
|
|
modules_to_remove_ids = ir_module_module.search(cr, uid, [('name', 'in', modules_to_remove)])
|
|
|
|
|
relation_ids = ir_model_relation.search(cr, uid, [('module', 'in', modules_to_remove_ids)])
|
|
|
|
|
ir_model_relation._module_data_uninstall(cr, uid, relation_ids, context)
|
|
|
|
@ -1118,6 +1117,6 @@ class ir_model_data(osv.osv):
|
|
|
|
|
for (model, res_id) in to_unlink:
|
|
|
|
|
if self.pool.get(model):
|
|
|
|
|
_logger.info('Deleting %s@%s', res_id, model)
|
|
|
|
|
self.pool.get(model).unlink(cr, uid, [res_id])
|
|
|
|
|
self.pool[model].unlink(cr, uid, [res_id])
|
|
|
|
|
|
|
|
|
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
|
|
|