diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py index ce8bafe89b6..a46430c6cfd 100644 --- a/addons/marketing_campaign/marketing_campaign.py +++ b/addons/marketing_campaign/marketing_campaign.py @@ -160,7 +160,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 671c6a4c1f7..4d3f047ed1f 100644 --- a/openerp/addons/base/ir/ir_model.py +++ b/openerp/addons/base/ir/ir_model.py @@ -1148,30 +1148,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 5d50a90c783..6186fb1bd45 100644 --- a/openerp/addons/base/ir/ir_values.py +++ b/openerp/addons/base/ir/ir_values.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -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 321c477ce8b..6d56217d7e1 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -27,7 +27,6 @@ import functools import itertools import logging import operator -import pickle import pytz import re import time @@ -51,7 +50,7 @@ from .osv.query import Query from .tools import frozendict, lazy_property, ormcache, Collector 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 80540a98f2d..c81f668f838 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -5,7 +5,6 @@ import cStringIO import csv import logging import os.path -import pickle import re import sys import time @@ -26,7 +25,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 b765cb6d7ca..122c87f89ce 100644 --- a/openerp/tools/misc.py +++ b/openerp/tools/misc.py @@ -7,6 +7,7 @@ Miscellaneous tools used by OpenERP. """ from functools import wraps +import cPickle import cProfile from contextlib import contextmanager import subprocess @@ -19,6 +20,7 @@ import threading import time import werkzeug.utils import zipfile +from cStringIO import StringIO from collections import defaultdict, Hashable, Iterable, Mapping, OrderedDict from itertools import islice, izip, groupby from lxml import etree @@ -987,7 +989,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. @@ -1168,4 +1169,21 @@ def _consteq(str1, str2): known length only, because length difference is optimized. """ return len(str1) == len(str2) and sum(ord(x)^ord(y) for x, y in zip(str1, str2)) == 0 -consteq = getattr(passlib.utils, 'consteq', _consteq) \ No newline at end of file +consteq = getattr(passlib.utils, 'consteq', _consteq) + +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