diff --git a/CHANGELOG b/CHANGELOG index 7dfd90bec0..ae3c547e2a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Change Pool into a Singleton * Remove support of zipped modules Version 2.0.0 - 2011-04-26 diff --git a/doc/ref/models/fields.rst b/doc/ref/models/fields.rst index 4d741c22ba..52e8d036ee 100644 --- a/doc/ref/models/fields.rst +++ b/doc/ref/models/fields.rst @@ -508,7 +508,7 @@ A many-to-many relation field. Instance methods: -.. method:: Many2Many.get_target(pool) +.. method:: Many2Many.get_target() Return the target :class:`~trytond.model.Model`. @@ -530,7 +530,7 @@ A one-to-one relation field. Instance methods: -.. method:: One2One.get_target(pool) +.. method:: One2One.get_target() Return the target :class:`~trytond.model.Model`. diff --git a/doc/topics/reports/index.rst b/doc/topics/reports/index.rst index f45b8a62f5..96a70b11ad 100644 --- a/doc/topics/reports/index.rst +++ b/doc/topics/reports/index.rst @@ -61,7 +61,7 @@ When defining an `ir.action.report` the following attributes are available: * ``name``: The name of the report. * ``report_name``: The name of the report model, for example - my_module.my_report. This is the name you would use with `pool.get` + my_module.my_report. This is the name you would use with `Pool().get` * ``module_name``: If this report is of an existing model this is its name. For example my_module.my_model. Custom reports that aren't of a specific @@ -228,7 +228,7 @@ context. Now the invoice report will be able to access the employee object. class InvoiceReport(Report): _name = 'account.invoice' def parse(self, report, objects, datas, localcontext): - employee_obj = self.pool.get('company.employee') + employee_obj = Pool().get('company.employee') employee = False if Transaction().context.get('employee'): employee = employee_obj.browse(Transaction().context['employee']) diff --git a/trytond/error.py b/trytond/error.py index 1ca8e42b9c..46381d2dd8 100644 --- a/trytond/error.py +++ b/trytond/error.py @@ -1,6 +1,7 @@ #This file is part of Tryton. The COPYRIGHT file at the top level of #this repository contains the full copyright notices and license terms. from trytond.transaction import Transaction +from trytond.pool import Pool class WarningErrorMixin(object): @@ -24,7 +25,7 @@ class WarningErrorMixin(object): (or tuple if error_description is not empty) instead of raising an exception. ''' - translation_obj = self.pool.get('ir.translation') + translation_obj = Pool().get('ir.translation') error = self._error_messages.get(error, error) @@ -92,7 +93,7 @@ class WarningErrorMixin(object): :param warning_description_args: the arguments that will be used for "%"-based substitution ''' - warning_obj = self.pool.get('res.user.warning') + warning_obj = Pool().get('res.user.warning') if warning_obj.check(warning_name): if warning_description: warning, warning_description = self.raise_user_error(warning, diff --git a/trytond/ir/action.py b/trytond/ir/action.py index 6996c13b04..06611031cb 100644 --- a/trytond/ir/action.py +++ b/trytond/ir/action.py @@ -9,6 +9,7 @@ from trytond.backend import TableHandler from trytond.pyson import PYSONEncoder, CONTEXT, PYSON from trytond.transaction import Transaction from trytond.cache import Cache +from trytond.pool import Pool class Action(ModelSQL, ModelView): @@ -38,6 +39,7 @@ class Action(ModelSQL, ModelView): return True def get_action_id(self, action_id): + pool = Pool() with Transaction().set_context(active_test=False): if self.search([ ('id', '=', action_id), @@ -49,7 +51,7 @@ class Action(ModelSQL, ModelView): 'ir.action.wizard', 'ir.action.url', ): - action_obj = self.pool.get(action_type) + action_obj = pool.get(action_type) action_id2 = action_obj.search([ ('id', '=', action_id), ]) @@ -88,7 +90,8 @@ class ActionKeyword(ModelSQL, ModelView): }) def check_wizard_model(self, ids): - action_wizard_obj = self.pool.get('ir.action.wizard') + pool = Pool() + action_wizard_obj = pool.get('ir.action.wizard') for action_keyword in self.browse(ids): if action_keyword.action.type == 'ir.action.wizard': action_wizard_id = action_wizard_obj.search([ @@ -103,13 +106,15 @@ class ActionKeyword(ModelSQL, ModelView): def _convert_vals(self, vals): vals = vals.copy() - action_obj = self.pool.get('ir.action') + pool = Pool() + action_obj = pool.get('ir.action') if 'action' in vals: vals['action'] = action_obj.get_action_id(vals['action']) return vals def models_get(self): - model_obj = self.pool.get('ir.model') + pool = Pool() + model_obj = pool.get('ir.model') model_ids = model_obj.search([]) res = [] for model in model_obj.browse(model_ids): @@ -117,36 +122,39 @@ class ActionKeyword(ModelSQL, ModelView): return res def delete(self, ids): + pool = Pool() if isinstance(ids, (int, long)): ids = [ids] for keyword in self.browse(ids): # Restart the cache view try: - self.pool.get(keyword.model.split(',')[0] + pool.get(keyword.model.split(',')[0] ).fields_view_get.reset() except Exception: pass return super(ActionKeyword, self).delete(ids) def create(self, vals): + pool = Pool() vals = self._convert_vals(vals) if 'model' in vals: # Restart the cache view try: - self.pool.get(vals['model'].split(',')[0] + pool.get(vals['model'].split(',')[0] ).fields_view_get.reset() except Exception: pass return super(ActionKeyword, self).create(vals) def write(self, ids, vals): + pool = Pool() vals = self._convert_vals(vals) if isinstance(ids, (int, long)): ids = [ids] for keyword in self.browse(ids): # Restart the cache view try: - self.pool.get(keyword.model.split(',')[0] + pool.get(keyword.model.split(',')[0] ).fields_view_get.reset() except Exception: pass @@ -154,13 +162,14 @@ class ActionKeyword(ModelSQL, ModelView): for keyword in self.browse(ids): # Restart the cache view try: - self.pool.get(keyword.model.split(',')[0] + pool.get(keyword.model.split(',')[0] ).fields_view_get.reset() except Exception: pass return res def get_keyword(self, keyword, value): + pool = Pool() res = [] model, model_id = value @@ -176,7 +185,7 @@ class ActionKeyword(ModelSQL, ModelView): ])) for action_keyword in self.browse(action_keyword_ids): try: - action_obj = self.pool.get(action_keyword.action.type) + action_obj = pool.get(action_keyword.action.type) except Exception: continue action_id = action_obj.search([ @@ -369,7 +378,8 @@ class ActionReport(ModelSQL, ModelView): return super(ActionReport, self).write(ids, vals) def delete(self, ids): - action_obj = self.pool.get('ir.action') + pool = Pool() + action_obj = pool.get('ir.action') if isinstance(ids, (int, long)): ids = [ids] @@ -563,7 +573,8 @@ class ActionActWindow(ModelSQL, ModelView): return new_id def delete(self, ids): - action_obj = self.pool.get('ir.action') + pool = Pool() + action_obj = pool.get('ir.action') if isinstance(ids, (int, long)): ids = [ids] @@ -639,7 +650,8 @@ class ActionWizard(ModelSQL, ModelView): return new_id def delete(self, ids): - action_obj = self.pool.get('ir.action') + pool = Pool() + action_obj = pool.get('ir.action') if isinstance(ids, (int, long)): ids = [ids] @@ -773,7 +785,8 @@ class ActionURL(ModelSQL, ModelView): return new_id def delete(self, ids): - action_obj = self.pool.get('ir.action') + pool = Pool() + action_obj = pool.get('ir.action') if isinstance(ids, (int, long)): ids = [ids] diff --git a/trytond/ir/attachment.py b/trytond/ir/attachment.py index 46d5df1aa1..a8432da0bf 100644 --- a/trytond/ir/attachment.py +++ b/trytond/ir/attachment.py @@ -13,6 +13,7 @@ from trytond.config import CONFIG from trytond.backend import TableHandler from trytond.transaction import Transaction from trytond.pyson import Not, Equal, Eval +from trytond.pool import Pool def firstline(description): try: @@ -84,7 +85,8 @@ class Attachment(ModelSQL, ModelView): return 0 def models_get(self): - model_obj = self.pool.get('ir.model') + pool = Pool() + model_obj = pool.get('ir.model') model_ids = model_obj.search([]) res = [] for model in model_obj.browse(model_ids): @@ -189,7 +191,8 @@ class Attachment(ModelSQL, ModelView): def check_access(self, ids, mode='read'): - model_access_obj = self.pool.get('ir.model.access') + pool = Pool() + model_access_obj = pool.get('ir.model.access') if Transaction().user == 0: return if not ids: @@ -224,7 +227,8 @@ class Attachment(ModelSQL, ModelView): return res def view_header_get(self, value, view_type='form'): - ir_model_obj = self.pool.get('ir.model') + pool = Pool() + ir_model_obj = pool.get('ir.model') value = super(Attachment, self).view_header_get(value, view_type=view_type) resource = Transaction().context.get('resource') @@ -232,7 +236,7 @@ class Attachment(ModelSQL, ModelView): model_name, record_id = resource.split(',', 1) ir_model_id, = ir_model_obj.search([('model', '=', model_name)]) ir_model = ir_model_obj.browse(ir_model_id) - model_obj = self.pool.get(model_name) + model_obj = pool.get(model_name) record = model_obj.browse(int(record_id)) value = '%s - %s - %s' % (ir_model.name, record.rec_name, value) return value diff --git a/trytond/ir/cron.py b/trytond/ir/cron.py index 9ed8151779..d55355d38e 100644 --- a/trytond/ir/cron.py +++ b/trytond/ir/cron.py @@ -11,6 +11,7 @@ from trytond.backend import Database from trytond.model import ModelView, ModelSQL, fields from trytond.tools import safe_eval from trytond.transaction import Transaction +from trytond.pool import Pool from trytond.backend import TableHandler _INTERVALTYPES = { @@ -130,15 +131,16 @@ class Cron(ModelSQL, ModelView): return values def _callback(self, cron): + pool = Pool() try: args = (cron.args or []) and safe_eval(cron.args) - model_obj = self.pool.get(cron.model) + model_obj = pool.get(cron.model) with Transaction().set_user(cron.user.id): getattr(model_obj, cron.function)(*args) except Exception, error: Transaction().cursor.rollback() - request_obj = self.pool.get('res.request') + request_obj = pool.get('res.request') req_user = cron.request_user language = (req_user.language.code if req_user.language else 'en_US') diff --git a/trytond/ir/lang.py b/trytond/ir/lang.py index 6ce101fb87..f218f0dc8f 100644 --- a/trytond/ir/lang.py +++ b/trytond/ir/lang.py @@ -7,6 +7,7 @@ from trytond.model import ModelView, ModelSQL, fields from trytond.model.cacheable import Cacheable from trytond.tools import safe_eval, datetime_strftime from trytond.transaction import Transaction +from trytond.pool import Pool from time_locale import TIME_LOCALE from locale import CHAR_MAX @@ -57,7 +58,8 @@ class Lang(ModelSQL, ModelView, Cacheable): return [('name',) + clause[1:]] def read(self, ids, fields_names=None): - translation_obj = self.pool.get('ir.translation') + pool = Pool() + translation_obj = pool.get('ir.translation') res = super(Lang, self).read(ids, fields_names=fields_names) if (Transaction().context.get('translate_name') and (not fields_names or 'name' in fields_names)): diff --git a/trytond/ir/model.py b/trytond/ir/model.py index bb36f8df80..a458af1d87 100644 --- a/trytond/ir/model.py +++ b/trytond/ir/model.py @@ -8,6 +8,7 @@ from trytond.report import Report from trytond.wizard import Wizard from trytond.transaction import Transaction from trytond.cache import Cache +from trytond.pool import Pool IDENTIFIER = re.compile(r'^[a-zA-z_][a-zA-Z0-9_]*$') @@ -47,21 +48,24 @@ class Model(ModelSQL, ModelView): return True def create(self, vals): - property_obj = self.pool.get('ir.property') + pool = Pool() + property_obj = pool.get('ir.property') res = super(Model, self).create(vals) # Restart the cache of models_get property_obj.models_get.reset() return res def write(self, ids, vals): - property_obj = self.pool.get('ir.property') + pool = Pool() + property_obj = pool.get('ir.property') res = super(Model, self).write(ids, vals) # Restart the cache of models_get property_obj.models_get.reset() return res def delete(self, ids): - property_obj = self.pool.get('ir.property') + pool = Pool() + property_obj = pool.get('ir.property') res = super(Model, self).delete(ids) # Restart the cache of models_get property_obj.models_get.reset() @@ -117,7 +121,8 @@ class ModelField(ModelSQL, ModelView): return True def read(self, ids, fields_names=None): - translation_obj = self.pool.get('ir.translation') + pool = Pool() + translation_obj = pool.get('ir.translation') to_delete = [] if Transaction().context.get('language'): @@ -249,8 +254,9 @@ class ModelAccess(ModelSQL, ModelView): if Transaction().user == 0: return True - ir_model_obj = self.pool.get('ir.model') - user_group_obj = self.pool.get('res.user-res.group') + pool = Pool() + ir_model_obj = pool.get('ir.model') + user_group_obj = pool.get('res.user-res.group') cursor = Transaction().cursor cursor.execute('SELECT MAX(CASE WHEN a.perm_%s THEN 1 ELSE 0 END) ' @@ -275,7 +281,8 @@ class ModelAccess(ModelSQL, ModelView): res = super(ModelAccess, self).write(ids, vals) # Restart the cache self.check.reset() - for _, model in self.pool.iterobject(): + pool = Pool() + for _, model in pool.iterobject(): try: model.fields_view_get.reset() except Exception: @@ -286,7 +293,8 @@ class ModelAccess(ModelSQL, ModelView): res = super(ModelAccess, self).create(vals) # Restart the cache self.check.reset() - for _, model in self.pool.iterobject(): + pool = Pool() + for _, model in pool.iterobject(): try: model.fields_view_get.reset() except Exception: @@ -297,7 +305,8 @@ class ModelAccess(ModelSQL, ModelView): res = super(ModelAccess, self).delete(ids) # Restart the cache self.check.reset() - for _, model in self.pool.iterobject(): + pool = Pool() + for _, model in pool.iterobject(): try: model.fields_view_get.reset() except Exception: @@ -359,9 +368,10 @@ class ModelFieldAccess(ModelSQL, ModelView): return dict((x, True) for x in fields) return True - ir_model_obj = self.pool.get('ir.model') - ir_model_field_obj = self.pool.get('ir.model.field') - user_group_obj = self.pool.get('res.user-res.group') + pool = Pool() + ir_model_obj = pool.get('ir.model') + ir_model_field_obj = pool.get('ir.model.field') + user_group_obj = pool.get('res.user-res.group') cursor = Transaction().cursor @@ -394,7 +404,8 @@ class ModelFieldAccess(ModelSQL, ModelView): res = super(ModelFieldAccess, self).write(ids, vals) # Restart the cache self.check.reset() - for _, model in self.pool.iterobject(): + pool = Pool() + for _, model in pool.iterobject(): try: model.fields_view_get.reset() except Exception: @@ -405,7 +416,8 @@ class ModelFieldAccess(ModelSQL, ModelView): res = super(ModelFieldAccess, self).create(vals) # Restart the cache self.check.reset() - for _, model in self.pool.iterobject(): + pool = Pool() + for _, model in pool.iterobject(): try: model.fields_view_get.reset() except Exception: @@ -416,7 +428,8 @@ class ModelFieldAccess(ModelSQL, ModelView): res = super(ModelFieldAccess, self).delete(ids) # Restart the cache self.check.reset() - for _, model in self.pool.iterobject(): + pool = Pool() + for _, model in pool.iterobject(): try: model.fields_view_get.reset() except Exception: @@ -525,8 +538,9 @@ class ModelGraph(Report): def execute(self, ids, datas): import pydot - model_obj = self.pool.get('ir.model') - action_report_obj = self.pool.get('ir.action.report') + pool = Pool() + model_obj = pool.get('ir.model') + action_report_obj = pool.get('ir.action.report') if not datas['form']['filter']: filter = None @@ -560,7 +574,8 @@ class ModelGraph(Report): models ''' import pydot - model_obj = self.pool.get('ir.model') + pool = Pool() + model_obj = pool.get('ir.model') sub_models = set() if level > 0: diff --git a/trytond/ir/module/module.py b/trytond/ir/module/module.py index 4f3ee3ee57..da232c5676 100644 --- a/trytond/ir/module/module.py +++ b/trytond/ir/module/module.py @@ -216,7 +216,8 @@ class Module(ModelSQL, ModelView): # update the list of available packages def update_list(self): - lang_obj = self.pool.get('ir.lang') + pool = Pool() + lang_obj = pool.get('ir.lang') res = 0 with Transaction().set_context(language=False): lang_ids = lang_obj.search([ @@ -313,7 +314,8 @@ class Module(ModelSQL, ModelView): return res def _update_dependencies(self, module, depends=None): - dependency_obj = self.pool.get('ir.module.module.dependency') + pool = Pool() + dependency_obj = pool.get('ir.module.module.dependency') dependency_obj.delete([x.id for x in module.dependencies if x.name not in depends]) if depends is None: @@ -354,7 +356,8 @@ class ModuleDependency(ModelSQL, ModelView): def get_state(self, ids, name): result = {} - module_obj = self.pool.get('ir.module.module') + pool = Pool() + module_obj = pool.get('ir.module.module') for dependency in self.browse(ids): ids = module_obj.search([ ('name', '=', dependency.name), @@ -442,7 +445,8 @@ class ModuleConfigWizard(Wizard): return res def _action_wizard(self, data): - item_obj = self.pool.get('ir.module.module.config_wizard.item') + pool = Pool() + item_obj = pool.get('ir.module.module.config_wizard.item') item_ids = item_obj.search([ ('state', '=', 'open'), ], limit=1) @@ -458,7 +462,8 @@ class ModuleConfigWizard(Wizard): return {} def _next(self, data): - item_obj = self.pool.get('ir.module.module.config_wizard.item') + pool = Pool() + item_obj = pool.get('ir.module.module.config_wizard.item') item_ids = item_obj.search([ ('state', '=', 'open'), ]) @@ -491,7 +496,8 @@ class ModuleInstallUpgrade(Wizard): _name = 'ir.module.module.install_upgrade' def _get_install(self, data): - module_obj = self.pool.get('ir.module.module') + pool = Pool() + module_obj = pool.get('ir.module.module') module_ids = module_obj.search([ ('state', 'in', ['to upgrade', 'to remove', 'to install']), ]) @@ -502,9 +508,9 @@ class ModuleInstallUpgrade(Wizard): } def _upgrade_module(self, data): - module_obj = self.pool.get('ir.module.module') - lang_obj = self.pool.get('ir.lang') - dbname = Transaction().cursor.dbname + pool = Pool() + module_obj = pool.get('ir.module.module') + lang_obj = pool.get('ir.lang') with Transaction().new_cursor() as transaction: module_ids = module_obj.search([ ('state', 'in', ['to upgrade', 'to remove', 'to install']), @@ -515,7 +521,6 @@ class ModuleInstallUpgrade(Wizard): lang = [x.code for x in lang_obj.browse(lang_ids)] transaction.cursor.commit() if module_ids: - pool = Pool(dbname) pool.init(update=True, lang=lang) new_wizard = pool.get('ir.module.module.install_upgrade', type='wizard') @@ -563,8 +568,9 @@ class ModuleInstallUpgrade(Wizard): } def _menu(self, data): - model_data_obj = self.pool.get('ir.model.data') - act_window_obj = self.pool.get('ir.action.act_window') + pool = Pool() + model_data_obj = pool.get('ir.model.data') + act_window_obj = pool.get('ir.action.act_window') act_window_id = model_data_obj.get_id('ir', 'act_menu_tree') res = act_window_obj.read(act_window_id) return res @@ -592,8 +598,9 @@ class ModuleConfig(Wizard): } def _action_open(self, datas): - model_data_obj = self.pool.get('ir.model.data') - act_window_obj = self.pool.get('ir.action.act_window') + pool = Pool() + model_data_obj = pool.get('ir.model.data') + act_window_obj = pool.get('ir.action.act_window') act_window_id = model_data_obj.get_id('ir', 'act_module_form') res = act_window_obj.read(act_window_id) return res diff --git a/trytond/ir/property.py b/trytond/ir/property.py index 17c8365c32..a9bbb9698d 100644 --- a/trytond/ir/property.py +++ b/trytond/ir/property.py @@ -5,6 +5,7 @@ from decimal import Decimal from trytond.model import ModelView, ModelSQL, fields from trytond.transaction import Transaction from trytond.cache import Cache +from trytond.pool import Pool class Property(ModelSQL, ModelView): @@ -32,7 +33,8 @@ class Property(ModelSQL, ModelView): :param res_ids: a list of record ids :return: a dictionary """ - model_access_obj = self.pool.get('ir.model.access') + pool = Pool() + model_access_obj = pool.get('ir.model.access') res = {} model_access_obj.check(model, 'read') @@ -44,7 +46,7 @@ class Property(ModelSQL, ModelView): if res_ids is None: res_ids = [] - model_obj = self.pool.get(model) + model_obj = pool.get(model) fields = dict((name, field) for name, field in model_obj._columns.iteritems() if name in names) @@ -126,8 +128,9 @@ class Property(ModelSQL, ModelView): :param val: the value :return: the id of the record created """ - model_field_obj = self.pool.get('ir.model.field') - model_access_obj = self.pool.get('ir.model.access') + pool = Pool() + model_field_obj = pool.get('ir.model.field') + model_access_obj = pool.get('ir.model.access') model_access_obj.check(model, 'write') @@ -135,7 +138,7 @@ class Property(ModelSQL, ModelView): ('name', '=', name), ('model.model', '=', model), ], order=[], limit=1)[0] - model_obj = self.pool.get(model) + model_obj = pool.get(model) field = model_obj._columns[name] property_ids = self.search([ diff --git a/trytond/ir/rule.py b/trytond/ir/rule.py index 12e61f0846..e5b2dcc87d 100644 --- a/trytond/ir/rule.py +++ b/trytond/ir/rule.py @@ -9,6 +9,7 @@ from trytond.pyson import Eval, Get from trytond.transaction import Transaction from trytond.cache import Cache from trytond.const import OPERATORS +from trytond.pool import Pool class RuleGroup(ModelSQL, ModelView): @@ -65,19 +66,19 @@ class RuleGroup(ModelSQL, ModelView): def delete(self, ids): res = super(RuleGroup, self).delete(ids) # Restart the cache on the domain_get method of ir.rule - self.pool.get('ir.rule').domain_get.reset() + Pool().get('ir.rule').domain_get.reset() return res def create(self, vals): res = super(RuleGroup, self).create(vals) # Restart the cache on the domain_get method of ir.rule - self.pool.get('ir.rule').domain_get.reset() + Pool().get('ir.rule').domain_get.reset() return res def write(self, ids, vals): res = super(RuleGroup, self).write(ids, vals) # Restart the cache on the domain_get method of ir.rule - self.pool.get('ir.rule').domain_get.reset() + Pool().get('ir.rule').domain_get.reset() return res RuleGroup() @@ -115,7 +116,7 @@ class Rule(ModelSQL, ModelView): if not recur: recur = [] with Transaction().set_context(language='en_US'): - obj_fields = self.pool.get(obj_name).fields_get() + obj_fields = Pool().get(obj_name).fields_get() key = obj_fields.keys() key.sort() for k in key: @@ -158,12 +159,13 @@ class Rule(ModelSQL, ModelView): with Transaction().set_user(Transaction().context['user']): return self.domain_get(model_name) - rule_group_obj = self.pool.get('ir.rule.group') - model_obj = self.pool.get('ir.model') - rule_group_user_obj = self.pool.get('ir.rule.group-res.user') - rule_group_group_obj = self.pool.get('ir.rule.group-res.group') - user_group_obj = self.pool.get('res.user-res.group') - user_obj = self.pool.get('res.user') + pool = Pool() + rule_group_obj = pool.get('ir.rule.group') + model_obj = pool.get('ir.model') + rule_group_user_obj = pool.get('ir.rule.group-res.user') + rule_group_group_obj = pool.get('ir.rule.group-res.group') + user_group_obj = pool.get('res.user-res.group') + user_obj = pool.get('res.user') cursor = Transaction().cursor cursor.execute('SELECT r.id FROM "' + self._table + '" r ' \ @@ -187,7 +189,7 @@ class Rule(ModelSQL, ModelView): ids = [x[0] for x in cursor.fetchall()] if not ids: return '', [] - obj = self.pool.get(model_name) + obj = pool.get(model_name) clause = {} clause_global = {} operand2query = self._operand_get('res.user', level=1, diff --git a/trytond/ir/sequence.py b/trytond/ir/sequence.py index 828f4b27ce..3c2c97d00b 100644 --- a/trytond/ir/sequence.py +++ b/trytond/ir/sequence.py @@ -8,6 +8,7 @@ from trytond.model import ModelView, ModelSQL, fields from trytond.tools import datetime_strftime from trytond.pyson import In, Eval, Not from trytond.transaction import Transaction +from trytond.pool import Pool class SequenceType(ModelSQL, ModelView): @@ -105,7 +106,8 @@ class Sequence(ModelSQL, ModelView): return Transaction().context.get('code', False) def code_get(self): - sequence_type_obj = self.pool.get('ir.sequence.type') + pool = Pool() + sequence_type_obj = pool.get('ir.sequence.type') sequence_type_ids = sequence_type_obj.search([]) sequence_types = sequence_type_obj.browse(sequence_type_ids) return [(x.code, x.name) for x in sequence_types] @@ -131,7 +133,8 @@ class Sequence(ModelSQL, ModelView): return True def _process(self, string, date=None): - date_obj = self.pool.get('ir.date') + pool = Pool() + date_obj = pool.get('ir.date') if not date: date = date_obj.today() year = datetime_strftime(date, '%Y') diff --git a/trytond/ir/translation.py b/trytond/ir/translation.py index 5206264c78..6d1d355fc0 100644 --- a/trytond/ir/translation.py +++ b/trytond/ir/translation.py @@ -25,6 +25,7 @@ from trytond.tools import file_open, reduce_ids from trytond.backend import TableHandler, FIELDS from trytond.pyson import PYSONEncoder from trytond.transaction import Transaction +from trytond.pool import Pool TRANSLATION_TYPE = [ ('field', 'Field'), @@ -143,7 +144,8 @@ class Translation(ModelSQL, ModelView, Cacheable): return [('id', 'in', [x[0] for x in cursor.fetchall()])] def get_language(self): - lang_obj = self.pool.get('ir.lang') + pool = Pool() + lang_obj = pool.get('ir.lang') lang_ids = lang_obj.search([]) langs = lang_obj.browse(lang_ids) res = [(lang.code, lang.name) for lang in langs] @@ -153,8 +155,9 @@ class Translation(ModelSQL, ModelView, Cacheable): return md5((src or '').encode('utf-8')).hexdigest() def _get_ids(self, name, ttype, lang, ids): - model_fields_obj = self.pool.get('ir.model.field') - model_obj = self.pool.get('ir.model') + pool = Pool() + model_fields_obj = pool.get('ir.model.field') + model_obj = pool.get('ir.model') translations, to_fetch = {}, [] name = unicode(name) @@ -220,8 +223,9 @@ class Translation(ModelSQL, ModelView, Cacheable): return translations def _set_ids(self, name, ttype, lang, ids, value): - model_fields_obj = self.pool.get('ir.model.field') - model_obj = self.pool.get('ir.model') + pool = Pool() + model_fields_obj = pool.get('ir.model.field') + model_obj = pool.get('ir.model') if lang == 'en_US': return 0 @@ -262,7 +266,7 @@ class Translation(ModelSQL, ModelView, Cacheable): 'fuzzy': False, }) return len(ids) - model_obj = self.pool.get(model_name) + model_obj = pool.get(model_name) for record in model_obj.browse(ids): ids2 = self.search([ ('lang', '=', lang), @@ -439,7 +443,8 @@ class Translation(ModelSQL, ModelView, Cacheable): return super(Translation, self).write(ids, vals) def translation_import(self, lang, module, datas): - model_data_obj = self.pool.get('ir.model.data') + pool = Pool() + model_data_obj = pool.get('ir.model.data') model_data_ids = model_data_obj.search([ ('module', '=', module), ]) @@ -537,7 +542,8 @@ class Translation(ModelSQL, ModelView, Cacheable): return len(translation_ids) def translation_export(self, lang, module): - model_data_obj = self.pool.get('ir.model.data') + pool = Pool() + model_data_obj = pool.get('ir.model.data') model_data_ids = model_data_obj.search([ ('module', '=', module), @@ -651,8 +657,9 @@ class ReportTranslationSet(Wizard): return strings def _set_report_translation(self, data): - report_obj = self.pool.get('ir.action.report') - translation_obj = self.pool.get('ir.translation') + pool = Pool() + report_obj = pool.get('ir.action.report') + translation_obj = pool.get('ir.translation') with Transaction().set_context(active_test=False): report_ids = report_obj.search([]) @@ -808,9 +815,10 @@ class TranslationClean(Wizard): } def _clean_translation(self, data): - translation_obj = self.pool.get('ir.translation') - model_data_obj = self.pool.get('ir.model.data') - report_obj = self.pool.get('ir.action.report') + pool = Pool() + translation_obj = pool.get('ir.translation') + model_data_obj = pool.get('ir.model.data') + report_obj = pool.get('ir.action.report') offset = 0 cursor = Transaction().cursor @@ -829,10 +837,10 @@ class TranslationClean(Wizard): except ValueError: to_delete.append(translation.id) continue - if model_name not in self.pool.object_name_list(): + if model_name not in pool.object_name_list(): to_delete.append(translation.id) continue - model_obj = self.pool.get(model_name) + model_obj = pool.get(model_name) if field_name not in model_obj._columns: to_delete.append(translation.id) continue @@ -842,11 +850,11 @@ class TranslationClean(Wizard): except ValueError: to_delete.append(translation.id) continue - if model_name not in self.pool.object_name_list(): + if model_name not in pool.object_name_list(): to_delete.append(translation.id) continue if translation.res_id: - model_obj = self.pool.get(model_name) + model_obj = pool.get(model_name) if field_name not in model_obj._columns: to_delete.append(translation.id) continue @@ -871,10 +879,10 @@ class TranslationClean(Wizard): except ValueError: to_delete.append(translation.id) continue - if model_name not in self.pool.object_name_list(): + if model_name not in pool.object_name_list(): to_delete.append(translation.id) continue - model_obj = self.pool.get(model_name) + model_obj = pool.get(model_name) if field_name not in model_obj._columns: to_delete.append(translation.id) continue @@ -891,7 +899,7 @@ class TranslationClean(Wizard): continue elif translation.type == 'view': model_name = translation.name - if model_name not in self.pool.object_name_list(): + if model_name not in pool.object_name_list(): to_delete.append(translation.id) continue elif translation.type == 'wizard_button': @@ -902,10 +910,10 @@ class TranslationClean(Wizard): to_delete.append(translation.id) continue if wizard_name not in \ - self.pool.object_name_list(type='wizard'): + pool.object_name_list(type='wizard'): to_delete.append(translation.id) continue - wizard = self.pool.get(wizard_name, type='wizard') + wizard = pool.get(wizard_name, type='wizard') if not wizard: to_delete.append(translation.id) continue @@ -926,10 +934,10 @@ class TranslationClean(Wizard): except ValueError: to_delete.append(translation.id) continue - if model_name not in self.pool.object_name_list(): + if model_name not in pool.object_name_list(): to_delete.append(translation.id) continue - model_obj = self.pool.get(model_name) + model_obj = pool.get(model_name) if field_name not in model_obj._columns: to_delete.append(translation.id) continue @@ -962,8 +970,8 @@ class TranslationClean(Wizard): 'search_function_missing', ): continue - if model_name in self.pool.object_name_list(): - model_obj = self.pool.get(model_name) + if model_name in pool.object_name_list(): + model_obj = pool.get(model_name) errors = model_obj._error_messages.values() + \ model_obj._sql_error_messages.values() for _, _, error in model_obj._sql_constraints: @@ -971,8 +979,8 @@ class TranslationClean(Wizard): if translation.src not in errors: to_delete.append(translation.id) continue - elif model_name in self.pool.object_name_list(type='wizard'): - wizard_obj = self.pool.get(model_name, type='wizard') + elif model_name in pool.object_name_list(type='wizard'): + wizard_obj = pool.get(model_name, type='wizard') errors = wizard_obj._error_messages.values() if translation.src not in errors: to_delete.append(translation.id) @@ -1006,7 +1014,8 @@ class TranslationUpdateInit(ModelView): return Transaction().context.get('language', False) def get_language(self): - lang_obj = self.pool.get('ir.lang') + pool = Pool() + lang_obj = pool.get('ir.lang') lang_ids = lang_obj.search([('translatable', '=', True)]) langs = lang_obj.browse(lang_ids) res = [(lang.code, lang.name) for lang in langs if lang.code != 'en_US'] @@ -1020,7 +1029,8 @@ class TranslationUpdate(Wizard): _name = "ir.translation.update" def _update_translation(self, data): - translation_obj = self.pool.get('ir.translation') + pool = Pool() + translation_obj = pool.get('ir.translation') cursor = Transaction().cursor cursor.execute('SELECT name, res_id, type, src, module ' \ 'FROM ir_translation ' \ @@ -1108,8 +1118,9 @@ class TranslationUpdate(Wizard): return {} def _action_translation_open(self, data): - model_data_obj = self.pool.get('ir.model.data') - act_window_obj = self.pool.get('ir.action.act_window') + pool = Pool() + model_data_obj = pool.get('ir.model.data') + act_window_obj = pool.get('ir.action.act_window') model_data_ids = model_data_obj.search([ ('fs_id', '=', 'act_translation_form'), @@ -1162,7 +1173,8 @@ class TranslationExportInit(ModelView): return Transaction().context.get('language', False) def get_language(self): - lang_obj = self.pool.get('ir.lang') + pool = Pool() + lang_obj = pool.get('ir.lang') lang_ids = lang_obj.search([ ('translatable', '=', True), ]) @@ -1171,7 +1183,8 @@ class TranslationExportInit(ModelView): return res def get_module(self): - module_obj = self.pool.get('ir.module.module') + pool = Pool() + module_obj = pool.get('ir.module.module') module_ids = module_obj.search([ ('state', 'in', ['installed', 'to upgrade', 'to remove']), ]) @@ -1196,7 +1209,8 @@ class TranslationExport(Wizard): _name = "ir.translation.export" def _export_translation(self, data): - translation_obj = self.pool.get('ir.translation') + pool = Pool() + translation_obj = pool.get('ir.translation') file_data = translation_obj.translation_export(data['form']['lang'], data['form']['module']) return { diff --git a/trytond/ir/trigger.py b/trytond/ir/trigger.py index 971f29f6c1..2e8cd12d18 100644 --- a/trytond/ir/trigger.py +++ b/trytond/ir/trigger.py @@ -9,6 +9,7 @@ from trytond.backend import TableHandler from trytond.tools import reduce_ids from trytond.transaction import Transaction from trytond.cache import Cache +from trytond.pool import Pool class Trigger(ModelSQL, ModelView): @@ -135,7 +136,8 @@ class Trigger(ModelSQL, ModelView): :param record: a BrowseRecord of the tested model :return: a boolean """ - model_obj = self.pool.get(trigger.model.model) + pool = Pool() + model_obj = pool.get(trigger.model.model) env = {} env['current_date'] = datetime.datetime.today() env['time'] = time @@ -150,9 +152,10 @@ class Trigger(ModelSQL, ModelView): :param ids: the list of record ids triggered :param trigger_id: the trigger id """ - trigger_log_obj = self.pool.get('ir.trigger.log') + pool = Pool() + trigger_log_obj = pool.get('ir.trigger.log') trigger = self.browse(trigger_id) - model_obj = self.pool.get(trigger.action_model.model) + model_obj = pool.get(trigger.action_model.model) cursor = Transaction().cursor # Filter on limit_number @@ -220,11 +223,12 @@ class Trigger(ModelSQL, ModelView): ''' Trigger time actions ''' + pool = Pool() trigger_ids = self.search([ ('on_time', '=', True), ]) for trigger in self.browse(trigger_ids): - model_obj = self.pool.get(trigger.model.model) + model_obj = pool.get(trigger.model.model) triggered_ids = [] # TODO add a domain record_ids = model_obj.search([]) diff --git a/trytond/ir/ui/menu.py b/trytond/ir/ui/menu.py index 74a58fb76d..d5c06934bd 100644 --- a/trytond/ir/ui/menu.py +++ b/trytond/ir/ui/menu.py @@ -3,6 +3,7 @@ from __future__ import with_statement from trytond.model import ModelView, ModelSQL, fields from trytond.transaction import Transaction +from trytond.pool import Pool def one_in(i, j): """Check the presence of an element of setA in setB @@ -106,7 +107,8 @@ class UIMenu(ModelSQL, ModelView): return True def list_icons(self): - icon_obj = self.pool.get('ir.ui.icon') + pool = Pool() + icon_obj = pool.get('ir.ui.icon') return sorted(CLIENT_ICONS + [(name, name) for _, name in icon_obj.list_icons()]) @@ -166,7 +168,8 @@ class UIMenu(ModelSQL, ModelView): return res def get_action(self, ids, name): - action_keyword_obj = self.pool.get('ir.action.keyword') + pool = Pool() + action_keyword_obj = pool.get('ir.action.keyword') res = {} for menu_id in ids: res[menu_id] = False @@ -178,7 +181,7 @@ class UIMenu(ModelSQL, ModelView): for action_keyword in action_keyword_obj.browse(action_keyword_ids): model_id = int( action_keyword.model.split(',')[1].split(',')[0].strip('(')) - action_obj = self.pool.get(action_keyword.action.type) + action_obj = pool.get(action_keyword.action.type) with Transaction().set_context(active_test=False): action_id = action_obj.search([ ('action', '=', action_keyword.action.id), @@ -193,7 +196,8 @@ class UIMenu(ModelSQL, ModelView): def set_action(self, ids, name, value): if not value: return - action_keyword_obj = self.pool.get('ir.action.keyword') + pool = Pool() + action_keyword_obj = pool.get('ir.action.keyword') action_keyword_ids = [] cursor = Transaction().cursor for i in range(0, len(ids), cursor.IN_MAX): @@ -209,7 +213,7 @@ class UIMenu(ModelSQL, ModelView): action_type, action_id = value.split(',') if not int(action_id): return - action_obj = self.pool.get(action_type) + action_obj = pool.get(action_type) action = action_obj.browse(int(action_id)) for menu_id in ids: with Transaction().set_context(_timestamp=False): diff --git a/trytond/ir/ui/view.py b/trytond/ir/ui/view.py index f2d2b5e95a..544fbe6676 100644 --- a/trytond/ir/ui/view.py +++ b/trytond/ir/ui/view.py @@ -11,6 +11,7 @@ from trytond.pyson import PYSONEncoder, CONTEXT, Eval, Not, Bool, Equal from trytond.tools import safe_eval from trytond.transaction import Transaction from trytond.wizard import Wizard +from trytond.pool import Pool class View(ModelSQL, ModelView): @@ -66,7 +67,8 @@ class View(ModelSQL, ModelView): def check_xml(self, ids): "Check XML" - translation_obj = self.pool.get('ir.translation') + pool = Pool() + translation_obj = pool.get('ir.translation') cursor = Transaction().cursor views = self.browse(ids) for view in views: @@ -188,7 +190,8 @@ class View(ModelSQL, ModelView): def delete(self, ids): res = super(View, self).delete(ids) # Restart the cache - for _, model in self.pool.iterobject(): + pool = Pool() + for _, model in pool.iterobject(): try: model.fields_view_get.reset() except Exception: @@ -198,7 +201,8 @@ class View(ModelSQL, ModelView): def create(self, vals): res = super(View, self).create(vals) # Restart the cache - for _, model in self.pool.iterobject(): + pool = Pool() + for _, model in pool.iterobject(): try: model.fields_view_get.reset() except Exception: @@ -208,7 +212,8 @@ class View(ModelSQL, ModelView): def write(self, ids, vals): res = super(View, self).write(ids, vals) # Restart the cache - for _, model in self.pool.iterobject(): + pool = Pool() + for _, model in pool.iterobject(): try: model.fields_view_get.reset() except Exception: @@ -274,8 +279,9 @@ class AddShortcut(Wizard): } def _add_shortcut(self, data): - view_sc_obj = self.pool.get('ir.ui.view_sc') - model_obj = self.pool.get(data['model']) + pool = Pool() + view_sc_obj = pool.get('ir.ui.view_sc') + model_obj = pool.get(data['model']) record = model_obj.browse(data['id']) view_sc_obj.create({ @@ -304,8 +310,9 @@ class OpenShortcut(Wizard): } def _open(self, data): - view_sc_obj = self.pool.get('ir.ui.view_sc') - action_keyword_obj = self.pool.get('ir.action.keyword') + pool = Pool() + view_sc_obj = pool.get('ir.ui.view_sc') + action_keyword_obj = pool.get('ir.action.keyword') view_sc = view_sc_obj.browse(data['id']) models = ( @@ -323,7 +330,7 @@ class OpenShortcut(Wizard): if not action_keyword_ids: return {} action_keyword = action_keyword_obj.browse(action_keyword_ids[0]) - action_obj = self.pool.get(action_keyword.action.type) + action_obj = pool.get(action_keyword.action.type) action_ids = action_obj.search([ ('action.id', '=', action_keyword.action.id), ]) @@ -352,37 +359,40 @@ class ViewTreeWidth(ModelSQL, ModelView): }) def delete(self, ids): + pool = Pool() if isinstance(ids, (int, long)): ids = [ids] views = self.browse(ids) for view in views: # Restart the cache try: - self.pool.get(view.model).fields_view_get.reset() + pool.get(view.model).fields_view_get.reset() except Exception: pass res = super(ViewTreeWidth, self).delete(ids) return res def create(self, vals): + pool = Pool() res = super(ViewTreeWidth, self).create(vals) if 'model' in vals: model = vals['model'] # Restart the cache try: - self.pool.get(model).fields_view_get.reset() + pool.get(model).fields_view_get.reset() except Exception: pass return res def write(self, ids, vals): + pool = Pool() if isinstance(ids, (int, long)): ids = [ids] views = self.browse(ids) for view in views: # Restart the cache try: - self.pool.get(view.model).fields_view_get.reset() + pool.get(view.model).fields_view_get.reset() except Exception: pass res = super(ViewTreeWidth, self).write(ids, vals) @@ -390,7 +400,7 @@ class ViewTreeWidth(ModelSQL, ModelView): for view in views: # Restart the cache try: - self.pool.get(view.model).fields_view_get.reset() + pool.get(view.model).fields_view_get.reset() except Exception: pass return res diff --git a/trytond/model/browse.py b/trytond/model/browse.py index a3b1ed2d08..83d69cec96 100644 --- a/trytond/model/browse.py +++ b/trytond/model/browse.py @@ -5,6 +5,7 @@ import contextlib from itertools import islice, ifilter, ifilterfalse, chain from trytond.model import fields from trytond.transaction import Transaction +from trytond.pool import Pool from trytond.cache import LRUDict from trytond.const import MODEL_CACHE_SIZE, RECORD_CACHE_SIZE, \ BROWSE_FIELD_TRESHOLD @@ -59,6 +60,7 @@ class BrowseRecord(object): self._model = model self._model_name = self._model._name self._context = Transaction().context + self._pool = Pool() self._ids = ids cache = self._cursor.get_cache(self._context) @@ -94,10 +96,10 @@ class BrowseRecord(object): ffields = {} if col.loading == 'eager': - field_access_obj = self._model.pool.get('ir.model.field.access') + field_access_obj = self._pool.get('ir.model.field.access') fread_accesses = {} for inherit_name in self._model._inherits: - inherit_obj = self._model.pool.get(inherit_name) + inherit_obj = self._pool.get(inherit_name) fread_accesses.update(field_access_obj.check(inherit_name, inherit_obj._columns.keys(), 'read', access=True)) fread_accesses.update(field_access_obj.check(self._model._name, @@ -172,10 +174,10 @@ class BrowseRecord(object): model = None if (hasattr(j, 'model_name') and j.model_name in - self._model.pool.object_name_list()): - model = self._model.pool.get(j.model_name) + self._pool.object_name_list()): + model = self._pool.get(j.model_name) elif hasattr(j, 'get_target'): - model = j.get_target(self._model.pool) + model = j.get_target() if model and j._type in ('many2one', 'one2one'): if (not data[i] and not (isinstance(data[i], (int, long)) @@ -296,6 +298,7 @@ class EvalEnvironment(dict): super(EvalEnvironment, self).__init__() self._record = record self._model = model + self._pool = Pool() def __getitem__(self, item): if item.startswith('_parent_'): @@ -304,7 +307,7 @@ class EvalEnvironment(dict): model_name = self._model._columns[field].model_name else: model_name = self._model._inherit_fields[field][2].model_name - model = self._model.pool.get(model_name) + model = self._pool.get(model_name) return EvalEnvironment(self._record[field], model) if item in self._model._columns \ or item in self._model._inherit_fields: diff --git a/trytond/model/fields/many2many.py b/trytond/model/fields/many2many.py index aebe53affa..64fc0182b9 100644 --- a/trytond/model/fields/many2many.py +++ b/trytond/model/fields/many2many.py @@ -3,6 +3,7 @@ from itertools import chain from trytond.model.fields.field import Field from trytond.transaction import Transaction +from trytond.pool import Pool class Many2Many(Field): @@ -68,7 +69,7 @@ class Many2Many(Field): else: order = self.order - relation_obj = model.pool.get(self.relation_name) + relation_obj = Pool().get(self.relation_name) relation_ids = [] for i in range(0, len(ids), Transaction().cursor.IN_MAX): @@ -101,8 +102,8 @@ class Many2Many(Field): ''' if not values: return - relation_obj = model.pool.get(self.relation_name) - target_obj = self.get_target(model.pool) + relation_obj = Pool().get(self.relation_name) + target_obj = self.get_target() for act in values: if act[0] == 'create': for record_id in ids: @@ -177,20 +178,19 @@ class Many2Many(Field): else: raise Exception('Bad arguments') - def get_target(self, pool): + def get_target(self): ''' Return the target model. - :param pool: The pool :return: A Model ''' - relation_obj = pool.get(self.relation_name) + relation_obj = Pool().get(self.relation_name) if not self.target: return relation_obj if self.target in relation_obj._columns: - target_obj = pool.get( + target_obj = Pool().get( relation_obj._columns[self.target].model_name) else: - target_obj = pool.get( + target_obj = Pool().get( relation_obj._inherit_fields[self.target][2].model_name) return target_obj diff --git a/trytond/model/fields/one2many.py b/trytond/model/fields/one2many.py index a02a4f9da3..fac141c8be 100644 --- a/trytond/model/fields/one2many.py +++ b/trytond/model/fields/one2many.py @@ -3,6 +3,7 @@ from itertools import chain from trytond.model.fields.field import Field from trytond.transaction import Transaction +from trytond.pool import Pool def add_remove_validate(value): if value: @@ -70,13 +71,14 @@ class One2Many(Field): :param values: a dictionary with the read values :return: a dictionary with ids as key and values as value ''' + pool = Pool() res = {} for i in ids: res[i] = [] ids2 = [] for i in range(0, len(ids), Transaction().cursor.IN_MAX): sub_ids = ids[i:i + Transaction().cursor.IN_MAX] - ids2.append(model.pool.get(self.model_name).search([ + ids2.append(pool.get(self.model_name).search([ (self.field, 'in', sub_ids), ], order=self.order)) @@ -91,7 +93,7 @@ class One2Many(Field): ids3.append(i) if ids3: - for i in model.pool.get(self.model_name).read(ids3, [self.field]): + for i in pool.get(self.model_name).read(ids3, [self.field]): res[i[self.field]].append(i['id']) index_of_ids2 = dict((i, index) for index, i in enumerate(chain(*ids2))) @@ -116,9 +118,10 @@ class One2Many(Field): (``unlink_all``), (``set``, ````) ''' + pool = Pool() if not values: return - model = model.pool.get(self.model_name) + model = pool.get(self.model_name) for act in values: if act[0] == 'create': for record_id in ids: diff --git a/trytond/model/fields/one2one.py b/trytond/model/fields/one2one.py index d3ad640e68..6e0133fb7d 100644 --- a/trytond/model/fields/one2one.py +++ b/trytond/model/fields/one2one.py @@ -3,6 +3,7 @@ from trytond.model.fields.many2many import Many2Many from trytond.transaction import Transaction +from trytond.pool import Pool class One2One(Many2Many): @@ -35,7 +36,8 @@ class One2One(Many2Many): :param name: A string with the name of the field :param value: The id to link ''' - relation_obj = model.pool.get(self.relation_name) + pool = Pool() + relation_obj = pool.get(self.relation_name) relation_ids = relation_obj.search([ (self.origin, 'in', ids), ]) diff --git a/trytond/model/fields/property.py b/trytond/model/fields/property.py index a566c61295..cb493c3e08 100644 --- a/trytond/model/fields/property.py +++ b/trytond/model/fields/property.py @@ -6,6 +6,7 @@ from trytond.model.fields.function import Function from trytond.model.fields.field import Field from trytond import backend from trytond.transaction import Transaction +from trytond.pool import Pool class Property(Function): @@ -34,7 +35,8 @@ class Property(Function): :param values: :return: a dictionary with ids as key and values as value ''' - property_obj = model.pool.get('ir.property') + pool = Pool() + property_obj = pool.get('ir.property') res = property_obj.get(name, model._name, ids) return res @@ -48,7 +50,8 @@ class Property(Function): :param name: The name of the field. :param value: The value to set. ''' - property_obj = model.pool.get('ir.property') + pool = Pool() + property_obj = pool.get('ir.property') return property_obj.set(name, model._name, ids, (value and getattr(self, 'model_name', '') + ',' + str(value)) or False) @@ -60,10 +63,11 @@ class Property(Function): :param clause: The search domain clause. See ModelStorage.search :return: New list of domain. ''' - rule_obj = model.pool.get('ir.rule') - property_obj = model.pool.get('ir.property') - model_obj = model.pool.get('ir.model') - field_obj = model.pool.get('ir.model.field') + pool = Pool() + rule_obj = pool.get('ir.rule') + property_obj = pool.get('ir.property') + model_obj = pool.get('ir.model') + field_obj = pool.get('ir.model.field') cursor = Transaction().cursor field_class = backend.FIELDS[self._type] diff --git a/trytond/model/fields/reference.py b/trytond/model/fields/reference.py index db66492985..d4ef42dc4c 100644 --- a/trytond/model/fields/reference.py +++ b/trytond/model/fields/reference.py @@ -5,6 +5,7 @@ import contextlib from trytond.model.fields.field import Field from trytond.tools import safe_eval from trytond.transaction import Transaction +from trytond.pool import Pool class Reference(Field): @@ -42,6 +43,7 @@ class Reference(Field): :param values: a dictionary with the read values :return: a dictionary with ids as key and values as value ''' + pool = Pool() if values is None: values = {} res = {} @@ -76,10 +78,10 @@ class Reference(Field): with contextlib.nested(Transaction().set_context(active_test=False), Transaction().set_user(0)): for ref_model, (ref_ids, ids) in ref_to_check.iteritems(): - if ref_model not in model.pool.object_name_list(): + if ref_model not in pool.object_name_list(): res.update(dict((i, False) for i in ids)) continue - ref_obj = model.pool.get(ref_model) + ref_obj = pool.get(ref_model) ref_ids = ref_obj.search([ ('id', 'in', list(ref_ids)), ], order=[]) diff --git a/trytond/model/model.py b/trytond/model/model.py index 716752a003..19cddf66ea 100644 --- a/trytond/model/model.py +++ b/trytond/model/model.py @@ -16,7 +16,6 @@ class Model(WarningErrorMixin): _name = None _inherits = {} _description = '' - pool = None #XXX change to avoid collision with field __columns = None __xxx2many_targets = None __defaults = None @@ -102,9 +101,10 @@ class Model(WarningErrorMixin): self._rpc.setdefault(function_name, False) def __getattr__(self, name): + pool = Pool() # Search if a function exists in inherits parents for model_name, field_name in self._inherits.iteritems(): - model_obj = self.pool.get(model_name) + model_obj = pool.get(model_name) if hasattr(model_obj, name) and \ callable(getattr(model_obj, name)): return getattr(model_obj, name) @@ -115,19 +115,20 @@ class Model(WarningErrorMixin): Reconstruct _inherit_fields """ res = {} + pool = Pool() for model in self._inherits: - res.update(self.pool.get(model)._inherit_fields) - for field_name in self.pool.get(model)._columns.keys(): + res.update(pool.get(model)._inherit_fields) + for field_name in pool.get(model)._columns.keys(): res[field_name] = (model, self._inherits[model], - self.pool.get(model)._columns[field_name]) - for field_name in self.pool.get(model)._inherit_fields.keys(): + pool.get(model)._columns[field_name]) + for field_name in pool.get(model)._inherit_fields.keys(): res[field_name] = (model, self._inherits[model], - self.pool.get(model)._inherit_fields[field_name][2]) + pool.get(model)._inherit_fields[field_name][2]) self._inherit_fields = res self._reset_xxx2many_targets() # Update objects that uses this one to update their _inherits fields - for obj_name in self.pool.object_name_list(): - obj = self.pool.get(obj_name) + for obj_name in pool.object_name_list(): + obj = pool.get(obj_name) if self._name in obj._inherits: obj._inherits_reload() @@ -148,7 +149,7 @@ class Model(WarningErrorMixin): continue if hasattr(field, 'get_target'): try: - model_name = field.get_target(self.pool)._name + model_name = field.get_target()._name except KeyError: to_cache = False continue @@ -166,7 +167,7 @@ class Model(WarningErrorMixin): continue if hasattr(field, 'get_target'): try: - model_name = field.get_target(self.pool)._name + model_name = field.get_target()._name except KeyError: to_cache = False continue @@ -186,7 +187,7 @@ class Model(WarningErrorMixin): :param module_name: the module name """ - translation_obj = self.pool.get('ir.translation') + translation_obj = Pool().get('ir.translation') cursor = Transaction().cursor # Add model in ir_model @@ -388,7 +389,8 @@ class Model(WarningErrorMixin): :return: a dictionary with field name as key and default value as value ''' - property_obj = self.pool.get('ir.property') + pool = Pool() + property_obj = pool.get('ir.property') value = {} # get the default values defined in the object @@ -407,7 +409,7 @@ class Model(WarningErrorMixin): if (with_rec_name and field._type in ('many2one',) and value.get(field_name)): - obj = self.pool.get(field.model_name) + obj = pool.get(field.model_name) if 'rec_name' in obj._columns: value[field_name + '.rec_name'] = obj.browse( value[field_name]).rec_name @@ -427,10 +429,11 @@ class Model(WarningErrorMixin): :param value: a dictionnary with the default value :return: a new dictionnary of default value """ + pool = Pool() res = value.copy() val = {} for i in self._inherits.keys(): - val.update(self.pool.get(i)._default_on_change(value)) + val.update(pool.get(i)._default_on_change(value)) for field in value.keys(): if field in self._columns: if self._columns[field].on_change: @@ -443,7 +446,7 @@ class Model(WarningErrorMixin): args[arg] = args[arg][0] val.update(getattr(self, 'on_change_' + field)(args)) if self._columns[field]._type in ('one2many',): - obj = self.pool.get(self._columns[field].model_name) + obj = pool.get(self._columns[field].model_name) for val2 in res[field]: val2.update(obj._default_on_change(val2)) res.update(val) @@ -457,12 +460,13 @@ class Model(WarningErrorMixin): :return: a dictionary with field name as key and definition as value """ res = {} - translation_obj = self.pool.get('ir.translation') - model_access_obj = self.pool.get('ir.model.access') - field_access_obj = self.pool.get('ir.model.field.access') + pool = Pool() + translation_obj = pool.get('ir.translation') + model_access_obj = pool.get('ir.model.access') + field_access_obj = pool.get('ir.model.field.access') for parent in self._inherits: - res.update(self.pool.get(parent).fields_get(fields_names)) + res.update(pool.get(parent).fields_get(fields_names)) write_access = model_access_obj.check(self._name, 'write', raise_exception=False) @@ -576,8 +580,8 @@ class Model(WarningErrorMixin): if hasattr(self._columns[field], 'model_name'): relation = copy.copy(self._columns[field].model_name) else: - relation = copy.copy(self._columns[field].get_target( - self.pool)._name) + relation = copy.copy( + self._columns[field].get_target()._name) res[field]['relation'] = relation res[field]['domain'] = copy.copy(self._columns[field].domain) res[field]['context'] = copy.copy(self._columns[field].context) diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py index 472fec7324..30e3fef8e2 100644 --- a/trytond/model/modelsql.py +++ b/trytond/model/modelsql.py @@ -13,6 +13,7 @@ from trytond.backend import DatabaseIntegrityError, Database from trytond.tools import reduce_ids from trytond.const import OPERATORS, RECORD_CACHE_SIZE from trytond.transaction import Transaction +from trytond.pool import Pool from trytond.cache import LRUDict _RE_UNIQUE = re.compile('UNIQUE\s*\((.*)\)', re.I) _RE_CHECK = re.compile('CHECK\s*\((.*)\)', re.I) @@ -45,6 +46,8 @@ class ModelSQL(ModelStorage): if self.table_query(): return + pool = Pool() + # create/update table in the database table = TableHandler(Transaction().cursor, self, module_name) if self._history: @@ -135,7 +138,7 @@ class ModelSQL(ModelStorage): if field.model_name in ('res.user', 'res.group'): ref = field.model_name.replace('.','_') else: - ref = self.pool.get(field.model_name)._table + ref = pool.get(field.model_name)._table table.add_fk(field_name, ref, field.ondelete) table.index_action( @@ -204,10 +207,11 @@ class ModelSQL(ModelStorage): ''' Return the default value for sequence field. ''' + pool = Pool() table = self._table if 'sequence' not in self._columns: for model in self._inherits: - model_obj = self.pool.get(model) + model_obj = pool.get(model) if 'sequence' in model_obj._columns: table = model_obj._table break @@ -231,6 +235,7 @@ class ModelSQL(ModelStorage): def create(self, values): super(ModelSQL, self).create(values) cursor = Transaction().cursor + pool = Pool() if self.table_query(): return False @@ -290,7 +295,7 @@ class ModelSQL(ModelStorage): del values[i] for inherits in tocreate: - inherits_obj = self.pool.get(inherits) + inherits_obj = pool.get(inherits) inherits_id = inherits_obj.create(tocreate[inherits]) values[self._inherits[inherits]] = inherits_id @@ -356,7 +361,7 @@ class ModelSQL(ModelStorage): field_name)) if isinstance(field, fields.Many2One) \ and values.get(field_name): - model_obj = self.pool.get(field.model_name) + model_obj = pool.get(field.model_name) create_records = Transaction().create_records.get( field.model_name, set()) delete_records = Transaction().delete_records.get( @@ -377,7 +382,7 @@ class ModelSQL(ModelStorage): self.raise_user_error(error) raise - domain1, domain2 = self.pool.get('ir.rule').domain_get(self._name, + domain1, domain2 = pool.get('ir.rule').domain_get(self._name, mode='create') if domain1: cursor.execute('SELECT id FROM "' + self._table + '" ' \ @@ -390,7 +395,7 @@ class ModelSQL(ModelStorage): for field in values: if getattr(self._columns[field], 'translate', False): - self.pool.get('ir.translation')._set_ids( + pool.get('ir.translation')._set_ids( self._name + ',' + field, 'model', Transaction().language, [id_new], values[field]) @@ -419,8 +424,9 @@ class ModelSQL(ModelStorage): return id_new def read(self, ids, fields_names=None): - rule_obj = self.pool.get('ir.rule') - translation_obj = self.pool.get('ir.translation') + pool = Pool() + rule_obj = pool.get('ir.rule') + translation_obj = pool.get('ir.translation') super(ModelSQL, self).read(ids, fields_names=fields_names) cursor = Transaction().cursor @@ -563,7 +569,7 @@ class ModelSQL(ModelStorage): for field_related in fields_related[inherit_field]: inherit_related_fields.append( inherit_field + '.' + field_related) - res2 = self.pool.get(table).read([x[field] for x in res], + res2 = pool.get(table).read([x[field] for x in res], fields_names=inherits_fields + inherit_related_fields) res3 = {} @@ -635,9 +641,9 @@ class ModelSQL(ModelStorage): fields_related2values.setdefault(field, {}) if self._columns[field]._type in ('many2one', 'one2one'): if hasattr(self._columns[field], 'model_name'): - obj = self.pool.get(self._columns[field].model_name) + obj = pool.get(self._columns[field].model_name) else: - obj = self._columns[field].get_target(self.pool) + obj = self._columns[field].get_target() if hasattr(self._columns[field], 'datetime_field') \ and self._columns[field].datetime_field: for record in res: @@ -671,7 +677,7 @@ class ModelSQL(ModelStorage): record_id = int(record_id) if not record_id: continue - obj = self.pool.get(model_name) + obj = pool.get(model_name) record2 = obj.read(record_id, fields_related[field]) del record2['id'] fields_related2values[field][record_id] = record2 @@ -710,6 +716,8 @@ class ModelSQL(ModelStorage): def write(self, ids, values): cursor = Transaction().cursor + pool = Pool() + translation_obj = pool.get('ir.translation') # Call before cursor cache cleaning trigger_eligibles = self.trigger_write_get_eligibles( @@ -818,7 +826,7 @@ class ModelSQL(ModelStorage): upd1.append(Transaction().user) upd1.append(datetime.datetime.now()) - domain1, domain2 = self.pool.get('ir.rule').domain_get(self._name, + domain1, domain2 = pool.get('ir.rule').domain_get(self._name, mode='write') if domain1: domain1 = ' AND (' + domain1 + ') ' @@ -871,7 +879,7 @@ class ModelSQL(ModelStorage): field_name)) if isinstance(field, fields.Many2One) \ and values[field_name]: - model_obj = self.pool.get(field.model_name) + model_obj = pool.get(field.model_name) create_records = Transaction().create_records.get( field.model_name, set()) delete_records = Transaction().delete_records.get( @@ -894,7 +902,7 @@ class ModelSQL(ModelStorage): for field in direct: if getattr(self._columns[field], 'translate', False): - self.pool.get('ir.translation')._set_ids( + translation_obj._set_ids( self._name + ',' + field, 'model', Transaction().language, ids, values[field]) @@ -927,7 +935,7 @@ class ModelSQL(ModelStorage): for val in updend: if self._inherit_fields[val][0] == table: values2[val] = values[val] - self.pool.get(table).write(nids, values2) + pool.get(table).write(nids, values2) self._validate(ids) @@ -953,6 +961,7 @@ class ModelSQL(ModelStorage): def delete(self, ids): cursor = Transaction().cursor + pool = Pool() if not ids: return True @@ -1008,7 +1017,7 @@ class ModelSQL(ModelStorage): foreign_keys_tocheck = [] foreign_keys_toupdate = [] foreign_keys_todelete = [] - for _, model in self.pool.iterobject(): + for _, model in pool.iterobject(): if hasattr(model, 'table_query') \ and model.table_query(): continue @@ -1029,7 +1038,7 @@ class ModelSQL(ModelStorage): Transaction().delete.setdefault(self._name, set()).update(ids) - domain1, domain2 = self.pool.get('ir.rule').domain_get(self._name, + domain1, domain2 = pool.get('ir.rule').domain_get(self._name, mode='delete') if domain1: domain1 = ' AND (' + domain1 + ') ' @@ -1125,7 +1134,8 @@ class ModelSQL(ModelStorage): def search(self, domain, offset=0, limit=None, order=None, count=False, query_string=False): - rule_obj = self.pool.get('ir.rule') + pool = Pool() + rule_obj = pool.get('ir.rule') cursor = Transaction().cursor # Get domain clauses @@ -1285,6 +1295,7 @@ class ModelSQL(ModelStorage): return qu1, qu2, tables, tables_args def __search_domain_oper(self, domain, tables, tables_args): + pool = Pool() operator = 'AND' if len(domain) and isinstance(domain[0], basestring): if domain[0] not in ('AND', 'OR'): @@ -1324,6 +1335,7 @@ class ModelSQL(ModelStorage): return qu1, qu2 def __search_domain_calc(self, domain, tables, tables_args): + pool = Pool() domain = domain[:] cursor = Transaction().cursor @@ -1337,7 +1349,7 @@ class ModelSQL(ModelStorage): table = self fargs = domain[i][0].split('.', 1) if fargs[0] in self._inherit_fields: - itable = self.pool.get(self._inherit_fields[fargs[0]][0]) + itable = pool.get(self._inherit_fields[fargs[0]][0]) table_query = '' table_arg = [] if itable.table_query(): @@ -1355,11 +1367,11 @@ class ModelSQL(ModelStorage): if not fargs[0] in self._inherit_fields: raise Exception('ValidateError', 'Field "%s" doesn\'t ' \ 'exist on "%s"' % (fargs[0], self._name)) - table = self.pool.get(self._inherit_fields[fargs[0]][0]) + table = pool.get(self._inherit_fields[fargs[0]][0]) field = table._columns.get(fargs[0], False) if len(fargs) > 1: if field._type == 'many2one': - target_obj = self.pool.get(field.model_name) + target_obj = pool.get(field.model_name) if hasattr(field, 'search'): domain.extend([(fargs[0], 'in', target_obj.search([ (fargs[1], domain[i][1], domain[i][2]), @@ -1373,11 +1385,11 @@ class ModelSQL(ModelStorage): continue elif field._type in ('one2one', 'many2many', 'one2many'): if hasattr(field, 'model_name'): - target_obj = self.pool.get(field.model_name) + target_obj = pool.get(field.model_name) else: - target_obj = field.get_target(self.pool) + target_obj = field.get_target() if hasattr(field, 'relation_name'): - relation_obj = self.pool.get(field.relation_name) + relation_obj = pool.get(field.relation_name) origin, target = field.origin, field.target else: relation_obj = target_obj @@ -1404,7 +1416,7 @@ class ModelSQL(ModelStorage): clause = domain.pop(i) domain.extend(field.search(table, clause[0], clause)) elif field._type == 'one2many': - field_obj = self.pool.get(field.model_name) + field_obj = pool.get(field.model_name) if isinstance(domain[i][2], basestring): # get the ids of the records of the "distant" resource @@ -1460,9 +1472,9 @@ class ModelSQL(ModelStorage): elif field._type in ('many2many', 'one2one'): # XXX must find a solution for long id list if hasattr(field, 'model_name'): - target_obj = self.pool.get(field.model_name) + target_obj = pool.get(field.model_name) else: - target_obj = field.get_target(self.pool) + target_obj = field.get_target() if domain[i][1] in ('child_of', 'not child_of'): if isinstance(domain[i][2], basestring): ids2 = [x[0] for x in target_obj.search([ @@ -1490,7 +1502,7 @@ class ModelSQL(ModelStorage): ids2 = target_obj.search([ (domain[i][3], 'child_of', ids2), ], order=[]) - relation_obj = self.pool.get(field.relation_name) + relation_obj = pool.get(field.relation_name) red_sql, red_ids = reduce_ids('"' + field.target + '"', ids2) query1 = 'SELECT "' + field.origin + '" ' \ @@ -1511,7 +1523,7 @@ class ModelSQL(ModelStorage): table, domain[i][0])) else: if isinstance(domain[i][2], bool): - relation_obj = self.pool.get(field.relation_name) + relation_obj = pool.get(field.relation_name) query1 = 'SELECT "' + field.origin + '" ' \ 'FROM "' + relation_obj._table + '" '\ 'WHERE "' + field.origin + '" IS NOT NULL' @@ -1525,7 +1537,7 @@ class ModelSQL(ModelStorage): target_field = 'rec_name' else: target_field = 'id' - relation_obj = self.pool.get(field.relation_name) + relation_obj = pool.get(field.relation_name) query1, query2 = target_obj.search([ (target_field, domain[i][1], domain[i][2]), @@ -1540,7 +1552,7 @@ class ModelSQL(ModelStorage): # XXX must find a solution for long id list if domain[i][1] in ('child_of', 'not child_of'): if isinstance(domain[i][2], basestring): - field_obj = self.pool.get(field.model_name) + field_obj = pool.get(field.model_name) ids2 = [x[0] for x in field_obj.search([ ('rec_name', 'like', domain[i][2]), ], order=[])] @@ -1563,7 +1575,7 @@ class ModelSQL(ModelStorage): raise Exception('Error', 'Programming error: ' \ 'child_of on field "%s" is not allowed!' % \ (domain[i][0],)) - ids2 = self.pool.get(field.model_name).search([ + ids2 = pool.get(field.model_name).search([ (domain[i][3], 'child_of', ids2), ], order=[]) if domain[i][1] == 'child_of': @@ -1600,7 +1612,7 @@ class ModelSQL(ModelStorage): ids2, table, domain[i][0]), table) else: if isinstance(domain[i][2], basestring): - field_obj = self.pool.get(field.model_name) + field_obj = pool.get(field.model_name) res_ids = field_obj.search([ ('rec_name', domain[i][1], domain[i][2]), ], order=[]) @@ -1653,7 +1665,7 @@ class ModelSQL(ModelStorage): table_query, table_args = table.table_query() table_query = '(' + table_query + ') AS ' - translation_obj = self.pool.get('ir.translation') + translation_obj = pool.get('ir.translation') qu1, qu2, tables, table_args = \ translation_obj.search_domain([ @@ -1804,6 +1816,7 @@ class ModelSQL(ModelStorage): return qu1, qu2 def _order_calc(self, field, otype): + pool = Pool() order_by = [] tables = [] tables_args = {} @@ -1821,7 +1834,7 @@ class ModelSQL(ModelStorage): field_name = self._columns[field].order_field if isinstance(self._columns[field], fields.Many2One): - obj = self.pool.get(self._columns[field].model_name) + obj = pool.get(self._columns[field].model_name) table_name = obj._table link_field = field field_name = None @@ -1856,12 +1869,12 @@ class ModelSQL(ModelStorage): obj2 = None if obj._rec_name in obj._inherit_fields.keys(): - obj2 = self.pool.get( + obj2 = pool.get( obj._inherit_fields[obj._rec_name][0]) field_name = obj._rec_name if obj._order_name in obj._inherit_fields.keys(): - obj2 = self.pool.get( + obj2 = pool.get( obj._inherit_fields[obj._order_name][0]) field_name = obj._order_name @@ -1995,7 +2008,7 @@ class ModelSQL(ModelStorage): return order_by, tables, tables_args if field in self._inherit_fields.keys(): - obj = self.pool.get(self._inherit_fields[field][0]) + obj = pool.get(self._inherit_fields[field][0]) table_name = obj._table link_field = self._inherits[obj._name] order_by, tables, tables_args = obj._order_calc(field, otype) diff --git a/trytond/model/modelstorage.py b/trytond/model/modelstorage.py index 5f131c93da..49b5202426 100644 --- a/trytond/model/modelstorage.py +++ b/trytond/model/modelstorage.py @@ -21,6 +21,7 @@ from trytond.tools import safe_eval, reduce_domain from trytond.pyson import PYSONEncoder, PYSONDecoder, PYSON from trytond.const import OPERATORS, RECORD_CACHE_SIZE from trytond.transaction import Transaction +from trytond.pool import Pool from trytond.cache import LRUDict @@ -63,7 +64,7 @@ class ModelStorage(Model): def __clean_xxx2many_cache(self): # Clean cursor cache to_clean = [(model._name, field_name) - for model_name, model in self.pool.iterobject(type='model') + for model_name, model in Pool().iterobject(type='model') for field_name, target_name in model._xxx2many_targets if target_name == self._name] for cache in Transaction().cursor.cache.values(): @@ -82,8 +83,9 @@ class ModelStorage(Model): and created values as value :return: the id of the created record ''' - model_access_obj = self.pool.get('ir.model.access') - model_field_access_obj = self.pool.get('ir.model.field.access') + pool = Pool() + model_access_obj = pool.get('ir.model.access') + model_field_access_obj = pool.get('ir.model.field.access') model_access_obj.check(self._name, 'create') model_field_access_obj.check(self._name, @@ -97,7 +99,7 @@ class ModelStorage(Model): :param id: the created id ''' - trigger_obj = self.pool.get('ir.trigger') + trigger_obj = Pool().get('ir.trigger') trigger_ids = trigger_obj.get_triggers(self._name, 'create') if not trigger_ids: return @@ -117,8 +119,9 @@ class ModelStorage(Model): the dictionnaries will have fields names as key and fields value as value. The list will not be in the same order. ''' - model_access_obj = self.pool.get('ir.model.access') - model_field_access_obj = self.pool.get('ir.model.field.access') + pool = Pool() + model_access_obj = pool.get('ir.model.access') + model_field_access_obj = pool.get('ir.model.field.access') model_access_obj.check(self._name, 'read') model_field_access_obj.check(self._name, @@ -136,8 +139,9 @@ class ModelStorage(Model): and written values as value :return: True if succeed ''' - model_access_obj = self.pool.get('ir.model.access') - model_field_access_obj = self.pool.get('ir.model.field.access') + pool = Pool() + model_access_obj = pool.get('ir.model.access') + model_field_access_obj = pool.get('ir.model.field.access') model_access_obj.check(self._name, 'write') model_field_access_obj.check(self._name, @@ -166,7 +170,7 @@ class ModelStorage(Model): :param ids: a list of ids :return: a dictionary of the lists of eligible ids by triggers ''' - trigger_obj = self.pool.get('ir.trigger') + trigger_obj = Pool().get('ir.trigger') trigger_ids = trigger_obj.get_triggers(self._name, 'write') if not trigger_ids: return {} @@ -186,7 +190,7 @@ class ModelStorage(Model): :param eligibles: a dictionary of the lists of eligible ids by triggers ''' - trigger_obj = self.pool.get('ir.trigger') + trigger_obj = Pool().get('ir.trigger') trigger_ids = eligibles.keys() if not trigger_ids: return @@ -209,7 +213,7 @@ class ModelStorage(Model): :param ids: a list of ids or an id :return: True if succeed ''' - model_access_obj = self.pool.get('ir.model.access') + model_access_obj = Pool().get('ir.model.access') model_access_obj.check(self._name, 'delete') if not self.check_xml_record(ids, None): @@ -235,7 +239,7 @@ class ModelStorage(Model): :param ids: the deleted ids ''' - trigger_obj = self.pool.get('ir.trigger') + trigger_obj = Pool().get('ir.trigger') trigger_ids = trigger_obj.get_triggers(self._name, 'delete') if not trigger_ids: return @@ -258,7 +262,8 @@ class ModelStorage(Model): new value for the field as value :return: a list of new ids or the new id ''' - lang_obj = self.pool.get('ir.lang') + pool = Pool() + lang_obj = pool.get('ir.lang') if default is None: default = {} @@ -315,7 +320,7 @@ class ModelStorage(Model): data, data_o2m = convert_data(field_defs, data) new_ids[data_id] = self.create(data) for field_name in data_o2m: - relation_model = self.pool.get( + relation_model = pool.get( field_defs[field_name]['relation']) relation_field = field_defs[field_name]['relation_field'] if relation_field: @@ -519,6 +524,7 @@ class ModelStorage(Model): for x in ids)) def __export_row(self, record, fields_names): + pool = Pool() lines = [] data = ['' for x in range(len(fields_names))] done = [] @@ -532,7 +538,7 @@ class ModelStorage(Model): if not isinstance(value, BrowseRecord): break field_name = fields_tree[i] - model_obj = self.pool.get(value._model_name) + model_obj = pool.get(value._model_name) field = model_obj._columns[field_name] if field.states and 'invisible' in field.states: pyson_invisible = PYSONEncoder().encode( @@ -604,6 +610,7 @@ class ModelStorage(Model): - the exception if failed - the warning if failed ''' + pool = Pool() def process_lines(self, datas, prefix, fields_def, position=0): def warn(msgname, *args): @@ -626,7 +633,7 @@ class ModelStorage(Model): def get_many2one(relation, value): if not value: return False - relation_obj = self.pool.get(relation) + relation_obj = pool.get(relation) res = relation_obj.search([ ('rec_name', '=', value), ], limit=2) @@ -644,7 +651,7 @@ class ModelStorage(Model): if not value: return False res = [] - relation_obj = self.pool.get(relation) + relation_obj = pool.get(relation) for word in csv.reader(StringIO.StringIO(value), delimiter=',', quoting=csv.QUOTE_NONE, escapechar='\\').next(): res2 = relation_obj.search([ @@ -671,7 +678,7 @@ class ModelStorage(Model): except Exception: warn('reference_syntax_error', value, '/'.join(field)) return False - relation_obj = self.pool.get(relation) + relation_obj = pool.get(relation) res = relation_obj.search([ ('rec_name', '=', value), ], limit=2) @@ -776,7 +783,7 @@ class ModelStorage(Model): # Import one2many fields nbrmax = 1 for field in todo: - newfd = self.pool.get(fields_def[field]['relation'] + newfd = pool.get(fields_def[field]['relation'] ).fields_get() res = process_lines(self, datas, prefix + [field], newfd, position) @@ -807,7 +814,7 @@ class ModelStorage(Model): datas.pop(0) return (row, nbrmax, translate) - ir_model_data_obj = self.pool.get('ir.model.data') + ir_model_data_obj = pool.get('ir.model.data') # logger for collecting warnings for the client warnings = logging.Logger("import") @@ -862,7 +869,7 @@ class ModelStorage(Model): written values as value :return: True or False """ - model_data_obj = self.pool.get('ir.model.data') + model_data_obj = Pool().get('ir.model.data') # Allow root user to update/delete if Transaction().user == 0: return True @@ -935,7 +942,8 @@ class ModelStorage(Model): return True def _get_error_args(self, field_name): - model_field_obj = self.pool.get('ir.model.field') + pool = Pool() + model_field_obj = pool.get('ir.model.field') error_args = (field_name, self._name) if model_field_obj: model_field_ids = model_field_obj.search([ @@ -950,6 +958,7 @@ class ModelStorage(Model): def _validate(self, ids): + pool = Pool() if (Transaction().user == 0 and Transaction().context.get('user')): with Transaction().set_user(Transaction().context.get('user')): @@ -959,12 +968,12 @@ class ModelStorage(Model): if not getattr(self, field[0])(ids): self.raise_user_error(field[1]) - if not 'res.user' in self.pool.object_name_list() \ + if not 'res.user' in pool.object_name_list() \ or Transaction().user == 0: ctx_pref = { } else: - user_obj = self.pool.get('res.user') + user_obj = pool.get('res.user') ctx_pref = user_obj.get_preferences(context_only=True) def is_pyson(test): @@ -990,9 +999,9 @@ class ModelStorage(Model): ('many2one', 'many2many', 'one2many', 'one2one') and field.domain): if field._type in ('many2one', 'one2many'): - relation_obj = self.pool.get(field.model_name) + relation_obj = pool.get(field.model_name) else: - relation_obj = field.get_target(self.pool) + relation_obj = field.get_target() if is_pyson(field.domain): pyson_domain = PYSONEncoder().encode(field.domain) for record in records: @@ -1111,6 +1120,7 @@ class ModelStorage(Model): field_name) def _clean_defaults(self, defaults): + pool = Pool() vals = {} for field in defaults.keys(): fld_def = (field in self._columns) and self._columns[field] \ @@ -1121,7 +1131,7 @@ class ModelStorage(Model): else: vals[field] = defaults[field] elif fld_def._type in ('one2many',): - obj = self.pool.get(fld_def.model_name) + obj = pool.get(fld_def.model_name) vals[field] = [] for defaults2 in defaults[field]: vals2 = obj._clean_defaults(defaults2) @@ -1140,8 +1150,9 @@ class ModelStorage(Model): :param ids: a list of id or an id ''' - trigger_obj = self.pool.get('workflow.trigger') - instance_obj = self.pool.get('workflow.instance') + pool = Pool() + trigger_obj = pool.get('workflow.trigger') + instance_obj = pool.get('workflow.instance') if isinstance(ids, (int, long)): ids = [ids] diff --git a/trytond/model/modelview.py b/trytond/model/modelview.py index 55b4fcce5d..f153b272dd 100644 --- a/trytond/model/modelview.py +++ b/trytond/model/modelview.py @@ -12,6 +12,7 @@ from trytond.tools import safe_eval from trytond.pyson import PYSONEncoder, CONTEXT from trytond.transaction import Transaction from trytond.cache import Cache +from trytond.pool import Pool def _find(tree, element): if element.tag == 'xpath': @@ -115,6 +116,7 @@ class ModelView(Model): - md5: the check sum of the dictionary without this checksum ''' result = {'model': self._name} + pool = Pool() test = True model = True @@ -152,7 +154,7 @@ class ModelView(Model): # Check if view is not from an inherited model if sql_res[5] != self._name: - inherit_obj = self.pool.get(sql_res[5]) + inherit_obj = pool.get(sql_res[5]) result['arch'] = inherit_obj.fields_view_get( result['view_id'])['arch'] view_id = inherit_view_id @@ -226,7 +228,7 @@ class ModelView(Model): # Add toolbar if toolbar: - action_obj = self.pool.get('ir.action.keyword') + action_obj = pool.get('ir.action.keyword') prints = action_obj.get_keyword('form_print', (self._name, 0)) actions = action_obj.get_keyword('form_action', (self._name, 0)) relates = action_obj.get_keyword('form_relate', (self._name, 0)) @@ -257,7 +259,8 @@ class ModelView(Model): return value def _view_look_dom_arch(self, tree, type, field_children=None): - field_access_obj = self.pool.get('ir.model.field.access') + pool = Pool() + field_access_obj = pool.get('ir.model.field.access') fields_width = {} tree_root = tree.getroottree().getroot() @@ -274,7 +277,7 @@ class ModelView(Model): # Find field inherited without read access for inherit_name in self._inherits: - inherit_obj = self.pool.get(inherit_name) + inherit_obj = pool.get(inherit_name) fread_accesses = field_access_obj.check(inherit_obj._name, inherit_obj._columns.keys(), 'read', access=True) fields_to_remove += list(x for x, y in fread_accesses.iteritems() @@ -297,7 +300,7 @@ class ModelView(Model): parent.remove(element) if type == 'tree': - viewtreewidth_obj = self.pool.get('ir.ui.view_tree_width') + viewtreewidth_obj = pool.get('ir.ui.view_tree_width') viewtreewidth_ids = viewtreewidth_obj.search([ ('model', '=', self._name), ('user', '=', Transaction().user), @@ -341,7 +344,8 @@ class ModelView(Model): return arch, fields2 def __view_look_dom(self, element, type, fields_width=None): - translation_obj = self.pool.get('ir.translation') + pool = Pool() + translation_obj = pool.get('ir.translation') if fields_width is None: fields_width = {} @@ -362,7 +366,7 @@ class ModelView(Model): if hasattr(field, 'model_name'): relation = field.model_name else: - relation = field.get_target(self.pool)._name + relation = field.get_target()._name except Exception: relation = False if relation and element.tag == 'field': @@ -392,7 +396,7 @@ class ModelView(Model): if Transaction().language != 'en_US': _translate_field(field2) - relation_obj = self.pool.get(relation) + relation_obj = pool.get(relation) if hasattr(relation_obj, '_view_look_dom_arch'): xarch, xfields = \ relation_obj._view_look_dom_arch( diff --git a/trytond/model/modelworkflow.py b/trytond/model/modelworkflow.py index bcd2d51da0..f3f722d8bc 100644 --- a/trytond/model/modelworkflow.py +++ b/trytond/model/modelworkflow.py @@ -3,6 +3,7 @@ from __future__ import with_statement from trytond.model import ModelStorage from trytond.transaction import Transaction +from trytond.pool import Pool class ModelWorkflow(ModelStorage): @@ -27,7 +28,7 @@ class ModelWorkflow(ModelStorage): return res def delete(self, ids): - instance_obj = self.pool.get('workflow.instance') + instance_obj = Pool().get('workflow.instance') if isinstance(ids, (int, long)): ids = [ids] @@ -49,8 +50,9 @@ class ModelWorkflow(ModelStorage): :param ids: a list of id or an id ''' - workflow_obj = self.pool.get('workflow') - instance_obj = self.pool.get('workflow.instance') + pool = Pool() + workflow_obj = pool.get('workflow') + instance_obj = pool.get('workflow.instance') if isinstance(ids, (int, long)): ids = [ids] @@ -75,7 +77,7 @@ class ModelWorkflow(ModelStorage): :param ids: a list of id or an id ''' - instance_obj = self.pool.get('workflow.instance') + instance_obj = Pool().get('workflow.instance') if isinstance(ids, (int, long)): ids = [ids] @@ -96,7 +98,7 @@ class ModelWorkflow(ModelStorage): :param ids: a list of id or an id ''' - instance_obj = self.pool.get('workflow.instance') + instance_obj = Pool().get('workflow.instance') if isinstance(ids, (int, long)): ids = [ids] @@ -119,7 +121,7 @@ class ModelWorkflow(ModelStorage): ''' if self._name == 'workflow.instance': return - instance_obj = self.pool.get('workflow.instance') + instance_obj = Pool().get('workflow.instance') if isinstance(ids, (int, long)): ids = [ids] diff --git a/trytond/pool.py b/trytond/pool.py index ff97c27bac..b431b73260 100644 --- a/trytond/pool.py +++ b/trytond/pool.py @@ -1,8 +1,10 @@ #This file is part of Tryton. The COPYRIGHT file at the top level of #this repository contains the full copyright notices and license terms. -from trytond.modules import load_modules, register_classes +from __future__ import with_statement from threading import RLock import logging +from trytond.modules import load_modules, register_classes +from trytond.transaction import Transaction import __builtin__ @@ -16,32 +18,27 @@ class Pool(object): _lock = RLock() _locks = {} _pool = {} - _pools = {} test = False + _instances = {} - def __new__(cls, database_name): - cls._lock.acquire() - lock = cls._locks.setdefault(database_name, RLock()) - cls._lock.release() - lock.acquire() - if database_name in cls._pools: - res = cls._pools[database_name] - lock.release() - return res - lock.release() - return object.__new__(cls) + def __new__(cls, database_name=None): + if database_name is None: + database_name = Transaction().cursor.database_name + result = cls._instances.get(database_name) + if result: + return result + lock = cls._locks.get(database_name) + if not lock: + with cls._lock: + lock = cls._locks.setdefault(database_name, RLock()) + with lock: + return cls._instances.setdefault(database_name, + super(Pool, cls).__new__(cls)) - def __init__(self, database_name): + def __init__(self, database_name=None): + if database_name is None: + database_name = Transaction().cursor.database_name self.database_name = database_name - self._lock.acquire() - lock = self._locks.setdefault(database_name, RLock()) - self._lock.release() - lock.acquire() - self._pool.setdefault(database_name, {}) - for type in self.classes.keys(): - self._pool[database_name].setdefault(type, {}) - self._pools.setdefault(database_name, self) - lock.release() @staticmethod def register(klass, type='model'): @@ -58,53 +55,47 @@ class Pool(object): if module: Pool.classes[type].setdefault(module, []).append(klass) - @staticmethod - def start(): + @classmethod + def start(cls): ''' Start/restart the Pool ''' - Pool._lock.acquire() - try: + with cls._lock: reload_p = False prev_classes = {} - for type in Pool.classes: - if Pool.classes[type]: + for type in cls.classes: + if cls.classes.get(type): reload_p = True - prev_classes[type] = Pool.classes[type] - Pool.classes[type] = {} + prev_classes[type] = cls.classes.get(type) + cls.classes[type] = {} try: register_classes(reload_p=reload_p) except Exception: if not reload_p: raise for type in prev_classes: - Pool.classes[type] = prev_classes[type] - for db_name in Pool.database_list(): - Pool(db_name).init() - finally: - Pool._lock.release() + cls.classes[type] = prev_classes[type] + for db_name in cls.database_list(): + cls(db_name).init() - @staticmethod - def stop(database_name): + @classmethod + def stop(cls, database_name): ''' Stop the Pool ''' - Pool._lock.acquire() - lock = Pool._locks.setdefault(database_name, RLock()) - Pool._lock.release() - lock.acquire() - if database_name in Pool._pool: - del Pool._pool[database_name] - if database_name in Pool._pools: - del Pool._pools[database_name] - lock.release() + with cls._lock: + if database_name in cls._instances: + del cls._instances[database_name] + with cls._locks[database_name]: + if database_name in cls._pool: + del cls._pool[database_name] - @staticmethod - def database_list(): + @classmethod + def database_list(cls): ''' :return: database list ''' - return Pool._pool.keys() + return cls._pool.keys() def init(self, update=False, lang=None): ''' @@ -116,11 +107,8 @@ class Pool(object): ''' logger = logging.getLogger('pool') logger.info('init pool for "%s"' % self.database_name) - self._lock.acquire() - lock = self._locks.setdefault(self.database_name, RLock()) - self._lock.release() - lock.acquire() - try: + with self._locks[self.database_name]: + self._pool.setdefault(self.database_name, {}) #Clean the _pool before loading modules for type in self.classes.keys(): self._pool[self.database_name][type] = {} @@ -128,8 +116,6 @@ class Pool(object): lang=lang) if restart: self.init() - finally: - lock.release() def get(self, name, type='model'): ''' @@ -164,8 +150,8 @@ class Pool(object): :param obj: the object :param type: the type ''' - self._pool[self.database_name][type][obj._name] = obj - obj.pool = self + with self._locks[self.database_name]: + self._pool[self.database_name][type][obj._name] = obj def object_name_list(self, type='model'): ''' diff --git a/trytond/report/report.py b/trytond/report/report.py index 2138023bef..b3988d4c8c 100644 --- a/trytond/report/report.py +++ b/trytond/report/report.py @@ -104,7 +104,8 @@ class Report(object): a boolean to direct print, the report name ''' - action_report_obj = self.pool.get('ir.action.report') + pool = Pool() + action_report_obj = pool.get('ir.action.report') action_report_ids = action_report_obj.search([ ('report_name', '=', self._name) ]) @@ -119,7 +120,8 @@ class Report(object): action_report.name) def _get_objects(self, ids, model, datas): - model_obj = self.pool.get(model) + pool = Pool() + model_obj = pool.get(model) return model_obj.browse(ids) def parse(self, report, objects, datas, localcontext): @@ -135,8 +137,9 @@ class Report(object): report type report ''' + pool = Pool() localcontext['datas'] = datas - localcontext['user'] = self.pool.get('res.user' + localcontext['user'] = pool.get('res.user' ).browse(Transaction().user) localcontext['formatLang'] = lambda *args, **kargs: \ self.format_lang(*args, **kargs) @@ -147,7 +150,7 @@ class Report(object): localcontext['context'] = Transaction().context translate = TranslateFactory(self._name, Transaction().language, - self.pool.get('ir.translation')) + pool.get('ir.translation')) localcontext['setLang'] = lambda language: translate.set_language(language) if not report.report_content: @@ -297,7 +300,8 @@ class Report(object): def format_lang(self, value, lang, digits=2, grouping=True, monetary=False, date=False, currency=None, symbol=True): - lang_obj = self.pool.get('ir.lang') + pool = Pool() + lang_obj = pool.get('ir.lang') if date: if lang: diff --git a/trytond/res/group.py b/trytond/res/group.py index d5407f1509..dbf117116a 100644 --- a/trytond/res/group.py +++ b/trytond/res/group.py @@ -4,12 +4,13 @@ from itertools import chain from trytond.model import ModelView, ModelSQL, fields from trytond.transaction import Transaction +from trytond.pool import Pool class MenuMany2Many(fields.Many2Many): def get(self, ids, model, name, values=None): - menu_obj = self.get_target(model.pool) + menu_obj = self.get_target() res = super(MenuMany2Many, self).get(ids, model, name, values=values) menu_ids = list(set(chain(*res.values()))) @@ -72,32 +73,35 @@ class Group(ModelSQL, ModelView): def create(self, vals): res = super(Group, self).create(vals) + pool = Pool() # Restart the cache on the domain_get method - self.pool.get('ir.rule').domain_get.reset() + pool.get('ir.rule').domain_get.reset() # Restart the cache for get_groups - self.pool.get('res.user').get_groups.reset() + pool.get('res.user').get_groups.reset() # Restart the cache for get_preferences - self.pool.get('res.user').get_preferences.reset() + pool.get('res.user').get_preferences.reset() return res def write(self, ids, vals): res = super(Group, self).write(ids, vals) + pool = Pool() # Restart the cache on the domain_get method - self.pool.get('ir.rule').domain_get.reset() + pool.get('ir.rule').domain_get.reset() # Restart the cache for get_groups - self.pool.get('res.user').get_groups.reset() + pool.get('res.user').get_groups.reset() # Restart the cache for get_preferences - self.pool.get('res.user').get_preferences.reset() + pool.get('res.user').get_preferences.reset() return res def delete(self, ids): res = super(Group, self).delete(ids) + pool = Pool() # Restart the cache on the domain_get method - self.pool.get('ir.rule').domain_get.reset() + pool.get('ir.rule').domain_get.reset() # Restart the cache for get_groups - self.pool.get('res.user').get_groups.reset() + pool.get('res.user').get_groups.reset() # Restart the cache for get_preferences - self.pool.get('res.user').get_preferences.reset() + pool.get('res.user').get_preferences.reset() return res Group() diff --git a/trytond/res/ir.py b/trytond/res/ir.py index 3aea3a3087..9a17d04128 100644 --- a/trytond/res/ir.py +++ b/trytond/res/ir.py @@ -3,6 +3,7 @@ from trytond.model import ModelView, ModelSQL, fields from trytond.backend import TableHandler from trytond.transaction import Transaction +from trytond.pool import Pool class UIMenuGroup(ModelSQL): @@ -25,19 +26,19 @@ class UIMenuGroup(ModelSQL): def create(self, vals): res = super(UIMenuGroup, self).create(vals) # Restart the cache on the domain_get method - self.pool.get('ir.rule').domain_get.reset() + Pool().get('ir.rule').domain_get.reset() return res def write(self, ids, vals): res = super(UIMenuGroup, self).write(ids, vals) # Restart the cache on the domain_get method - self.pool.get('ir.rule').domain_get.reset() + Pool().get('ir.rule').domain_get.reset() return res def delete(self, ids): res = super(UIMenuGroup, self).delete(ids) # Restart the cache on the domain_get method - self.pool.get('ir.rule').domain_get.reset() + Pool().get('ir.rule').domain_get.reset() return res UIMenuGroup() @@ -63,19 +64,19 @@ class ActionGroup(ModelSQL): def create(self, vals): res = super(ActionGroup, self).create(vals) # Restart the cache on the domain_get method - self.pool.get('ir.rule').domain_get.reset() + Pool().get('ir.rule').domain_get.reset() return res def write(self, ids, vals): res = super(ActionGroup, self).write(ids, vals) # Restart the cache on the domain_get method - self.pool.get('ir.rule').domain_get.reset() + Pool().get('ir.rule').domain_get.reset() return res def delete(self, ids): res = super(ActionGroup, self).delete(ids) # Restart the cache on the domain_get method - self.pool.get('ir.rule').domain_get.reset() + Pool().get('ir.rule').domain_get.reset() return res ActionGroup() @@ -147,7 +148,7 @@ class Lang(ModelSQL, ModelView): def write(self, ids, vals): res = super(Lang, self).write(ids, vals) # Restart the cache for get_preferences - self.pool.get('res.user').get_preferences.reset() + Pool().get('res.user').get_preferences.reset() return res Lang() @@ -172,21 +173,21 @@ class SequenceTypeGroup(ModelSQL): ondelete='CASCADE', select=1, required=True) def delete(self, ids): - rule_obj = self.pool.get('ir.rule') + rule_obj = Pool().get('ir.rule') res = super(SequenceTypeGroup, self).delete(ids) # Restart the cache on the domain_get method of ir.rule rule_obj.domain_get.reset() return res def create(self, vals): - rule_obj = self.pool.get('ir.rule') + rule_obj = Pool().get('ir.rule') res = super(SequenceTypeGroup, self).create(vals) # Restart the cache on the domain_get method of ir.rule rule_obj.domain_get.reset() return res def write(self, ids, vals): - rule_obj = self.pool.get('ir.rule') + rule_obj = Pool().get('ir.rule') res = super(SequenceTypeGroup, self).write(ids, vals) # Restart the cache on the domain_get method rule_obj.domain_get.reset() @@ -201,7 +202,7 @@ class Sequence(ModelSQL, ModelView): 'User Groups'), 'get_groups', searcher='search_groups') def get_groups(self, ids, name): - sequence_type_obj = self.pool.get('ir.sequence.type') + sequence_type_obj = Pool().get('ir.sequence.type') sequences= self.browse(ids) code2seq = {} for sequence in sequences: @@ -221,7 +222,7 @@ class Sequence(ModelSQL, ModelView): return res def search_groups(self, name, clause): - sequence_type_obj = self.pool.get('ir.sequence.type') + sequence_type_obj = Pool().get('ir.sequence.type') ids = sequence_type_obj.search([clause], order=[]) seq_types = sequence_type_obj.browse(ids) codes = set(st.code for st in seq_types) diff --git a/trytond/res/request.py b/trytond/res/request.py index 268106d26b..33d9d7cda8 100644 --- a/trytond/res/request.py +++ b/trytond/res/request.py @@ -5,6 +5,7 @@ import datetime from trytond.model import ModelView, ModelSQL, fields from trytond.pyson import Eval, In, If, Not, Equal from trytond.transaction import Transaction +from trytond.pool import Pool _STATES = [ ('draft', 'Draft'), @@ -101,7 +102,8 @@ class Request(ModelSQL, ModelView): return res def request_send(self, ids): - request_history_obj = self.pool.get('res.request.history') + pool = Pool() + request_history_obj = pool.get('res.request.history') for request in self.browse(ids): values = { 'request': request.id, @@ -177,7 +179,8 @@ class RequestLink(ModelSQL, ModelView): return 5 def models_get(self): - model_obj = self.pool.get('ir.model') + pool = Pool() + model_obj = pool.get('ir.model') model_ids = model_obj.search([]) res = [] for model in model_obj.browse(model_ids): @@ -239,7 +242,8 @@ class RequestReference(ModelSQL, ModelView): required=True) def links_get(self): - request_link_obj = self.pool.get('res.request.link') + pool = Pool() + request_link_obj = pool.get('res.request.link') ids = request_link_obj.search([]) request_links = request_link_obj.browse(ids) return [(x.model, x.name) for x in request_links] diff --git a/trytond/res/user.py b/trytond/res/user.py index 3f2e4ac609..36605d8c8a 100644 --- a/trytond/res/user.py +++ b/trytond/res/user.py @@ -18,6 +18,7 @@ from trytond.security import get_connections from trytond.transaction import Transaction from trytond.cache import Cache from trytond.pyson import Eval, Greater +from trytond.pool import Pool class User(ModelSQL, ModelView): @@ -112,7 +113,8 @@ class User(ModelSQL, ModelView): return 1 def default_menu(self): - action_obj = self.pool.get('ir.action') + pool = Pool() + action_obj = pool.get('ir.action') action_ids = action_obj.search([ ('usage', '=', 'menu'), ], limit=1) @@ -125,7 +127,8 @@ class User(ModelSQL, ModelView): def get_language_direction(self, ids, name): res = {} - lang_obj = self.pool.get('ir.lang') + pool = Pool() + lang_obj = pool.get('ir.lang') default_direction = lang_obj.default_direction() for user in self.browse(ids): if user.language: @@ -150,7 +153,8 @@ class User(ModelSQL, ModelView): def _convert_vals(self, vals): vals = vals.copy() - action_obj = self.pool.get('ir.action') + pool = Pool() + action_obj = pool.get('ir.action') if 'action' in vals: vals['action'] = action_obj.get_action_id(vals['action']) if 'menu' in vals: @@ -175,7 +179,8 @@ class User(ModelSQL, ModelView): vals = self._convert_vals(vals) res = super(User, self).write(ids, vals) # Restart the cache for domain_get method - self.pool.get('ir.rule').domain_get.reset() + pool = Pool() + pool.get('ir.rule').domain_get.reset() # Restart the cache for get_groups self.get_groups.reset() # Restart the cache for _get_login @@ -183,9 +188,9 @@ class User(ModelSQL, ModelView): # Restart the cache for get_preferences self.get_preferences.reset() # Restart the cache of check - self.pool.get('ir.model.access').check.reset() + pool.get('ir.model.access').check.reset() # Restart the cache - for _, model in self.pool.iterobject(): + for _, model in pool.iterobject(): try: model.fields_view_get.reset() except Exception: @@ -290,7 +295,8 @@ class User(ModelSQL, ModelView): :param values: a dictionary with values :param old_password: the previous password if password is in values ''' - lang_obj = self.pool.get('ir.lang') + pool = Pool() + lang_obj = pool.get('ir.lang') values_clean = values.copy() fields = self._preferences_fields + self._context_fields user_id = Transaction().user @@ -314,8 +320,9 @@ class User(ModelSQL, ModelView): self.write(user_id, values_clean) def get_preferences_fields_view(self): - model_data_obj = self.pool.get('ir.model.data') - lang_obj = self.pool.get('ir.lang') + pool = Pool() + model_data_obj = pool.get('ir.model.data') + lang_obj = pool.get('ir.lang') view_id = model_data_obj.get_id('res', 'user_view_form_preferences') res = self.fields_view_get(view_id=view_id) @@ -492,7 +499,8 @@ class UserConfig(Wizard): return {} def _add(self, data): - res_obj = self.pool.get('res.user') + pool = Pool() + res_obj = pool.get('res.user') res_obj.create(data['form']) return {} diff --git a/trytond/webdav/webdav.py b/trytond/webdav/webdav.py index 3ab5d75c64..724b6ac905 100644 --- a/trytond/webdav/webdav.py +++ b/trytond/webdav/webdav.py @@ -7,6 +7,7 @@ from trytond.model import ModelView, ModelSQL, fields from trytond.version import PACKAGE, VERSION, WEBSITE from trytond.tools import reduce_ids, safe_eval from trytond.transaction import Transaction +from trytond.pool import Pool class Collection(ModelSQL, ModelView): @@ -47,7 +48,8 @@ class Collection(ModelSQL, ModelView): return '[]' def check_attachment(self, ids): - attachment_obj = self.pool.get('ir.attachment') + pool = Pool() + attachment_obj = pool.get('ir.attachment') for collection in self.browse(ids): if collection.parent: attachment_ids = attachment_obj.search([ @@ -60,8 +62,9 @@ class Collection(ModelSQL, ModelView): return True def _uri2object(self, uri, object_name=_name, object_id=False, cache=None): - attachment_obj = self.pool.get('ir.attachment') - report_obj = self.pool.get('ir.action.report') + pool = Pool() + attachment_obj = pool.get('ir.attachment') + report_obj = pool.get('ir.action.report') cache_uri = uri if cache is not None: @@ -233,7 +236,8 @@ class Collection(ModelSQL, ModelView): return object_name, object_id def get_childs(self, uri, filter=None, cache=None): - report_obj = self.pool.get('ir.action.report') + pool = Pool() + report_obj = pool.get('ir.action.report') res = [] if filter: return [] @@ -253,7 +257,7 @@ class Collection(ModelSQL, ModelView): if object_name == self._name and object_id: collection = self.browse(object_id) if collection.model: - model_obj = self.pool.get(collection.model.model) + model_obj = pool.get(collection.model.model) if not model_obj: return res model_ids = model_obj.search( @@ -289,7 +293,7 @@ class Collection(ModelSQL, ModelView): cache.setdefault(report_obj._name, {}) cache[report_obj._name][report.id] = {} - attachment_obj = self.pool.get('ir.attachment') + attachment_obj = pool.get('ir.attachment') attachment_ids = attachment_obj.search([ ('resource', '=', '%s,%s' % (object_name, object_id)), ]) @@ -312,11 +316,12 @@ class Collection(ModelSQL, ModelView): def get_displayname(self, uri, cache=None): object_name, object_id = self._uri2object(uri, cache=cache) - model_obj = self.pool.get(object_name) + model_obj = Pool().get(object_name) return model_obj.browse(object_id).rec_name def get_contentlength(self, uri, cache=None): - attachment_obj = self.pool.get('ir.attachment') + pool = Pool() + attachment_obj = pool.get('ir.attachment') object_name, object_id = self._uri2object(uri, cache=cache) if object_name == 'ir.attachment': @@ -360,9 +365,10 @@ class Collection(ModelSQL, ModelView): return "application/octet-stream" def get_creationdate(self, uri, cache=None): + pool = Pool() object_name, object_id = self._uri2object(uri, cache=cache) if object_name == 'ir.attachment': - model_obj = self.pool.get(object_name) + model_obj = pool.get(object_name) if object_id: if cache is not None: cache.setdefault(model_obj._name, {}) @@ -394,9 +400,10 @@ class Collection(ModelSQL, ModelView): return time.time() def get_lastmodified(self, uri, cache=None): + pool = Pool() object_name, object_id = self._uri2object(uri, cache=cache) if object_name == 'ir.attachment': - model_obj = self.pool.get(object_name) + model_obj = pool.get(object_name) if object_id: if cache is not None: cache.setdefault(model_obj._name, {}) @@ -430,8 +437,9 @@ class Collection(ModelSQL, ModelView): def get_data(self, uri, cache=None): from DAV.errors import DAV_NotFound - attachment_obj = self.pool.get('ir.attachment') - report_obj = self.pool.get('ir.action.report') + pool = Pool() + attachment_obj = pool.get('ir.attachment') + report_obj = pool.get('ir.action.report') if uri: object_name, object_id = self._uri2object(uri, cache=cache) @@ -473,7 +481,7 @@ class Collection(ModelSQL, ModelView): 1)[-1].rsplit('.', 1)[0]) report = report_obj.browse(report_id) if report.report_name: - report_obj = self.pool.get(report.report_name, + report_obj = pool.get(report.report_name, type='report') val = report_obj.execute([object_id], {'id': object_id, 'ids': [object_id]}) @@ -489,7 +497,8 @@ class Collection(ModelSQL, ModelView): or object_name in ('ir.attachment') \ or not object_id: raise DAV_Forbidden - attachment_obj = self.pool.get('ir.attachment') + pool = Pool() + attachment_obj = pool.get('ir.attachment') object_name2, object_id2 = self._uri2object(uri, cache=cache) if not object_id2: name = get_urifilename(uri) @@ -550,7 +559,8 @@ class Collection(ModelSQL, ModelView): if object_name != 'ir.attachment' \ or not object_id: raise DAV_Forbidden - model_obj = self.pool.get(object_name) + pool = Pool() + model_obj = pool.get(object_name) try: model_obj.delete(object_id) except Exception: @@ -584,7 +594,8 @@ class Attachment(ModelSQL, ModelView): }) def check_collection(self, ids): - collection_obj = self.pool.get('webdav.collection') + pool = Pool() + collection_obj = pool.get('webdav.collection') for attachment in self.browse(ids): if attachment.resource: model_name, record_id = attachment.resource.split(',') diff --git a/trytond/wizard/wizard.py b/trytond/wizard/wizard.py index 65ecec4bad..86deaa50ae 100644 --- a/trytond/wizard/wizard.py +++ b/trytond/wizard/wizard.py @@ -12,7 +12,6 @@ from trytond.error import WarningErrorMixin class Wizard(WarningErrorMixin): _name = "" states = {} - pool = None def __new__(cls): Pool.register(cls, type='wizard') @@ -29,7 +28,8 @@ class Wizard(WarningErrorMixin): self._datas = {} def init(self, module_name): - translation_obj = self.pool.get('ir.translation') + pool = Pool() + translation_obj = pool.get('ir.translation') cursor = Transaction().cursor for state in self.states.keys(): if self.states[state]['result']['type'] == 'form': @@ -100,8 +100,9 @@ class Wizard(WarningErrorMixin): self._lock.release() def execute(self, wiz_id, data, state='init'): - translation_obj = self.pool.get('ir.translation') - wizard_size_obj = self.pool.get('ir.action.wizard_size') + pool = Pool() + translation_obj = pool.get('ir.translation') + wizard_size_obj = pool.get('ir.action.wizard_size') res = {} if self._datas.get(wiz_id, {}).get('user') != Transaction().user: @@ -129,7 +130,7 @@ class Wizard(WarningErrorMixin): if result_def['type'] == 'action': res['action'] = getattr(self, result_def['action'])(data) elif result_def['type'] == 'form': - obj = self.pool.get(result_def['object']) + obj = pool.get(result_def['object']) view = obj.fields_view_get(view_type='form', toolbar=False) fields = view['fields'] diff --git a/trytond/workflow/workflow.py b/trytond/workflow/workflow.py index c1075b917c..14464a6ee7 100644 --- a/trytond/workflow/workflow.py +++ b/trytond/workflow/workflow.py @@ -10,6 +10,7 @@ from trytond.tools import exec_command_pipe from trytond.backend import TableHandler from trytond.pyson import Eval, Equal, Not from trytond.transaction import Transaction +from trytond.pool import Pool class Workflow(ModelSQL, ModelView): @@ -172,8 +173,9 @@ class WorkflowInstance(ModelSQL, ModelView): return res def create(self, values): - activity_obj = self.pool.get('workflow.activity') - workitem_obj = self.pool.get('workflow.workitem') + pool = Pool() + activity_obj = pool.get('workflow.activity') + workitem_obj = pool.get('workflow.workitem') instance_id = super(WorkflowInstance, self).create(values) @@ -196,7 +198,8 @@ class WorkflowInstance(ModelSQL, ModelView): def update(self, instance): ''' ''' - workitem_obj = self.pool.get('workflow.workitem') + pool = Pool() + workitem_obj = pool.get('workflow.workitem') for workitem in instance.workitems: workitem_obj.process(workitem) instance = self.browse(instance.id) @@ -205,7 +208,8 @@ class WorkflowInstance(ModelSQL, ModelView): def validate(self, instance, signal, force_running=False): ''' ''' - workitem_obj = self.pool.get('workflow.workitem') + pool = Pool() + workitem_obj = pool.get('workflow.workitem') for workitem in instance.workitems: workitem_obj.process(workitem, signal=signal, force_running=force_running) @@ -213,7 +217,8 @@ class WorkflowInstance(ModelSQL, ModelView): return self._update_end(instance) def _update_end(self, instance): - workitem_obj = self.pool.get('workflow.workitem') + pool = Pool() + workitem_obj = pool.get('workflow.workitem') res = True for workitem in instance.workitems: if (workitem.state != 'complete') \ @@ -309,7 +314,8 @@ class WorkflowWorkitem(ModelSQL, ModelView): :param signal: the signal :param force_running: a boolean ''' - trigger_obj = self.pool.get('workflow.trigger') + pool = Pool() + trigger_obj = pool.get('workflow.trigger') activity = workitem.activity triggers = False if workitem.state == 'active': @@ -347,7 +353,8 @@ class WorkflowWorkitem(ModelSQL, ModelView): workitem._data[workitem.id]['state'] = state def _execute(self, workitem, activity): - instance_obj = self.pool.get('workflow.instance') + pool = Pool() + instance_obj = pool.get('workflow.instance') #send a signal to overflow if (workitem.state == 'active') and activity.signal_send: for overflow in workitem.overflows: @@ -409,7 +416,8 @@ class WorkflowWorkitem(ModelSQL, ModelView): return True def _split_test(self, workitem, split_mode, signal=None): - instance_obj = self.pool.get('workflow.instance') + pool = Pool() + instance_obj = pool.get('workflow.instance') test = False transitions = [] if split_mode == 'XOR' or split_mode == 'OR': @@ -443,7 +451,8 @@ class WorkflowWorkitem(ModelSQL, ModelView): return False def _join_test(self, transition, instance): - instance_obj = self.pool.get('workflow.instance') + pool = Pool() + instance_obj = pool.get('workflow.instance') activity = transition.act_to if activity.join_mode == 'XOR': self.create({ @@ -515,9 +524,10 @@ class InstanceGraph(Report): def execute(self, ids, datas): import pydot - lang_obj = self.pool.get('ir.lang') - workflow_obj = self.pool.get('workflow') - instance_obj = self.pool.get('workflow.instance') + pool = Pool() + lang_obj = pool.get('ir.lang') + workflow_obj = pool.get('workflow') + instance_obj = pool.get('workflow.instance') lang_id = lang_obj.search([ ('code', '=', Transaction().language), @@ -562,14 +572,16 @@ class InstanceGraph(Report): return ('png', base64.encodestring(data), False, workflow.name) def graph_instance_get(self, graph, instance_id, nested=False): - instance_obj = self.pool.get('workflow.instance') + pool = Pool() + instance_obj = pool.get('workflow.instance') instance = instance_obj.browse(instance_id) self.graph_get(graph, instance.workflow.id, nested, self.workitem_get(instance.id)) def workitem_get(self, instance_id): res = {} - workitem_obj = self.pool.get('workflow.workitem') + pool = Pool() + workitem_obj = pool.get('workflow.workitem') workitem_ids = workitem_obj.search([ ('instance', '=', instance_id), ]) @@ -585,9 +597,10 @@ class InstanceGraph(Report): import pydot if workitem is None: workitem = {} - activity_obj = self.pool.get('workflow.activity') - workflow_obj = self.pool.get('workflow') - transition_obj = self.pool.get('workflow.transition') + pool = Pool() + activity_obj = pool.get('workflow.activity') + workflow_obj = pool.get('workflow') + transition_obj = pool.get('workflow.transition') activity_ids = activity_obj.search([ ('workflow', '=', workflow_id), ])