diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py index 4a7d35d6d6e1f00b228c979d71202a66dd584ff1..4b0b8e53d6affe2636787a87d7b3f2dc6b98fe3d 100644 --- a/addons/marketing_campaign/marketing_campaign.py +++ b/addons/marketing_campaign/marketing_campaign.py @@ -180,7 +180,7 @@ Normal - the campaign runs normally and automatically sends all emails and repor def _get_partner_for(self, campaign, record): partner_field = campaign.partner_field_id.name if partner_field: - return getattr(record, partner_field) + return record[partner_field] elif campaign.object_id.model == 'res.partner': return record return None diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py index 5c4b639b6a466fbfdb6e1d565c0684304dbd42c4..4fab346e17650a4f8e7874c2bfcc33eb986f8108 100644 --- a/openerp/addons/base/ir/ir_model.py +++ b/openerp/addons/base/ir/ir_model.py @@ -1091,30 +1091,8 @@ class ir_model_data(osv.osv): return res_id def ir_set(self, cr, uid, key, key2, name, models, value, replace=True, isobject=False, meta=None, xml_id=False): - if isinstance(models[0], (list, tuple)): - model,res_id = models[0] - else: - res_id=None - model = models[0] - - if res_id: - where = ' and res_id=%s' % (res_id,) - else: - where = ' and (res_id is null)' - - if key2: - where += ' and key2=\'%s\'' % (key2,) - else: - where += ' and (key2 is null)' - - cr.execute('select * from ir_values where model=%s and key=%s and name=%s'+where,(model, key, name)) - res = cr.fetchone() ir_values_obj = openerp.registry(cr.dbname)['ir.values'] - if not res: - ir_values_obj.set(cr, uid, key, key2, name, models, value, replace, isobject, meta) - elif xml_id: - cr.execute('UPDATE ir_values set value=%s WHERE model=%s and key=%s and name=%s'+where,(value, model, key, name)) - ir_values_obj.invalidate_cache(cr, uid, ['value']) + ir_values_obj.set(cr, uid, key, key2, name, models, value, replace, isobject, meta) return True def _module_data_uninstall(self, cr, uid, modules_to_remove, context=None): diff --git a/openerp/addons/base/ir/ir_values.py b/openerp/addons/base/ir/ir_values.py index c6cdd4f6233296e9a2e2b1c14f8074cc165ce791..1b2b4c97329c9aced15af5c5c124bb72c5f6471e 100644 --- a/openerp/addons/base/ir/ir_values.py +++ b/openerp/addons/base/ir/ir_values.py @@ -18,12 +18,12 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## -import pickle from openerp import tools from openerp.osv import osv, fields from openerp.exceptions import AccessError, MissingError from openerp.tools.translate import _ +from openerp.tools import pickle EXCLUDED_FIELDS = set(( 'report_sxw_content', 'report_rml_content', 'report_sxw', 'report_rml', diff --git a/openerp/models.py b/openerp/models.py index 0e2a56ce335de143a305a8c579c6ff44c3ad5381..0ec370e88ee7f41c93582d438c067d009ca58c5f 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -44,7 +44,6 @@ import functools import itertools import logging import operator -import pickle import pytz import re import time @@ -68,7 +67,7 @@ from .osv.query import Query from .tools import frozendict, lazy_property, ormcache from .tools.config import config from .tools.func import frame_codeinfo -from .tools.misc import CountingStream, DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT +from .tools.misc import CountingStream, DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT, pickle from .tools.safe_eval import safe_eval as eval from .tools.translate import _ diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index 560ed3f656a4490af129a1b1efec03642ac417ef..f7ae2e9d89fd93721e133318f6fd45aeb044dc55 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -23,7 +23,6 @@ import cStringIO import csv import logging import os.path -import pickle import re import sys import time @@ -44,7 +43,7 @@ import misc from config import config # List of etree._Element subclasses that we choose to ignore when parsing XML. from misc import SKIPPED_ELEMENT_TYPES -from misc import unquote +from misc import pickle, unquote from openerp import SUPERUSER_ID from translate import _ from yaml_import import convert_yaml_import diff --git a/openerp/tools/misc.py b/openerp/tools/misc.py index cf245ffbbf7c6d0edbe6f0468b03fb65403a7c50..dc7b4c5507555b38eb067c38e90a691a08f6c279 100644 --- a/openerp/tools/misc.py +++ b/openerp/tools/misc.py @@ -26,6 +26,7 @@ Miscellaneous tools used by OpenERP. """ from functools import wraps +import cPickle import cProfile from contextlib import contextmanager import subprocess @@ -37,6 +38,7 @@ import threading import time import werkzeug.utils import zipfile +from cStringIO import StringIO from collections import defaultdict, Mapping, OrderedDict from datetime import datetime from itertools import islice, izip, groupby @@ -1059,7 +1061,6 @@ def stripped_sys_argv(*strip_args): return [x for i, x in enumerate(args) if not strip(args, i)] - class ConstantMapping(Mapping): """ An immutable mapping returning the provided value for every single key. @@ -1166,3 +1167,21 @@ if parse_version(getattr(werkzeug, '__version__', '0.0')) < parse_version('0.9.0 else: def html_escape(text): return werkzeug.utils.escape(text) + +class Pickle(object): + @classmethod + def load(cls, stream): + unpickler = cPickle.Unpickler(stream) + # pickle builtins: str/unicode, int/long, float, bool, tuple, list, dict, None + unpickler.find_global = None + return unpickler.load() + + @classmethod + def loads(cls, text): + return cls.load(StringIO(text)) + + dumps = cPickle.dumps + dump = cPickle.dump + +pickle = Pickle +