Merge lp:~camptocamp/openobject-server/trunk-deprecate-osv_osv into lp:openobject-server

Proposed by Alexandre Fayolle - camptocamp
Status: Needs review
Proposed branch: lp:~camptocamp/openobject-server/trunk-deprecate-osv_osv
Merge into: lp:openobject-server
Diff against target: 435 lines (+108/-30)
11 files modified
openerp/loglevels.py (+3/-4)
openerp/modules/module.py (+4/-0)
openerp/netsvc.py (+7/-0)
openerp/osv/fields.py (+7/-4)
openerp/osv/orm.py (+34/-11)
openerp/osv/osv.py (+16/-6)
openerp/sql_db.py (+6/-3)
openerp/tools/config.py (+5/-1)
openerp/tools/convert.py (+3/-1)
openerp/tools/deprecate.py (+19/-0)
openerp/tools/misc.py (+4/-0)
To merge this branch: bzr merge lp:~camptocamp/openobject-server/trunk-deprecate-osv_osv
Reviewer Review Type Date Requested Status
Stephane Wirtel (OpenERP) Pending
Review via email: mp+124874@code.launchpad.net

Description of the change

use warnings to flag deprecated features

* adds a deprecated decorator to flag methods and functions
* added a new metaclass for deprecated models (osv.osv, osv.osv_memory...)
* use warnings.warn explicitely in some parts of the core framework where comments told that something was deprecated
* added a new command line option to direct the warnings to the logs (default), stderr or hide them completely

To post a comment you must log in.
4447. By Alexandre Fayolle @ camptocamp <email address hidden>

[MRG] from trunk

4448. By Alexandre Fayolle @ camptocamp <email address hidden>

[MRG] from trunk

Revision history for this message
Alexandre Fayolle - camptocamp (alexandre-fayolle-c2c) wrote :

updated the MP to the lastest trunk

4449. By Alexandre Fayolle @ camptocamp <email address hidden>

[MRG] updated to current trunk

4450. By Alexandre Fayolle - camptocamp

[MRG] updated to latest trunk

Revision history for this message
Alexandre Fayolle - camptocamp (alexandre-fayolle-c2c) wrote :

updated MP to latest trunk

Unmerged revisions

4450. By Alexandre Fayolle - camptocamp

[MRG] updated to latest trunk

4449. By Alexandre Fayolle @ camptocamp <email address hidden>

[MRG] updated to current trunk

4448. By Alexandre Fayolle @ camptocamp <email address hidden>

[MRG] from trunk

4447. By Alexandre Fayolle @ camptocamp <email address hidden>

[MRG] from trunk

4446. By Alexandre Fayolle @ camptocamp <email address hidden>

[FIX] do not regiser the deprecated base classes

4445. By Alexandre Fayolle @ camptocamp <email address hidden>

[IMP] add some DeprecationWarnings where comments say a method/class is deprecated

4444. By Alexandre Fayolle @ camptocamp <email address hidden>

[FIX] move deprecated_model metaclass from tools.deprecate to osv.orm

this avoids circular imports via osv.osv

4443. By Alexandre Fayolle @ camptocamp <email address hidden>

[IMP] control the display of DeprecationWarning from the command line

4442. By Alexandre Fayolle @ camptocamp <email address hidden>

[FIX] fix the deprecation warning in osv.osv

4441. By Alexandre Fayolle @ camptocamp <email address hidden>

[IMP] added openerp.tools.deprecate with some utilities to deprecate classes and methods
use these utilities to deprecate osv.osv, osv.osv_memory and osv.osv_abstract

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'openerp/loglevels.py'
--- openerp/loglevels.py 2012-12-14 13:07:58 +0000
+++ openerp/loglevels.py 2012-12-20 14:32:31 +0000
@@ -21,6 +21,7 @@
2121
22import sys22import sys
23import logging23import logging
24from openerp.tools.deprecate import deprecated
2425
25LOG_NOTSET = 'notset'26LOG_NOTSET = 'notset'
26LOG_DEBUG = 'debug'27LOG_DEBUG = 'debug'
@@ -41,11 +42,9 @@
41 "The netsvc.Logger API shouldn't be used anymore, please "42 "The netsvc.Logger API shouldn't be used anymore, please "
42 "use the standard `logging.getLogger` API instead.")43 "use the standard `logging.getLogger` API instead.")
43 super(Logger, self).__init__()44 super(Logger, self).__init__()
4445 @deprecated("notifyChannel API shouldn't be used anymore, please use "
46 "the standard `logging` module instead.")
45 def notifyChannel(self, name, level, msg):47 def notifyChannel(self, name, level, msg):
46 _logger.warning(
47 "notifyChannel API shouldn't be used anymore, please use "
48 "the standard `logging` module instead.")
49 from service.web_services import common48 from service.web_services import common
5049
51 log = logging.getLogger(__name__ + '.deprecated.' + ustr(name))50 log = logging.getLogger(__name__ + '.deprecated.' + ustr(name))
5251
=== modified file 'openerp/modules/module.py'
--- openerp/modules/module.py 2012-12-16 19:39:32 +0000
+++ openerp/modules/module.py 2012-12-20 14:32:31 +0000
@@ -27,6 +27,7 @@
27import sys27import sys
28import types28import types
29import zipimport29import zipimport
30import warnings
3031
31import openerp.tools as tools32import openerp.tools as tools
32import openerp.tools.osutil as osutil33import openerp.tools.osutil as osutil
@@ -312,6 +313,9 @@
312 terp_file = get_module_resource(module, '__openerp__.py')313 terp_file = get_module_resource(module, '__openerp__.py')
313 if not terp_file:314 if not terp_file:
314 terp_file = get_module_resource(module, '__terp__.py')315 terp_file = get_module_resource(module, '__terp__.py')
316 warnings.warn('__terp__.py is deprecated. Use __openerp__.py (%s)' % terp_file,
317 DeprecationWarning)
318
315 mod_path = get_module_path(module)319 mod_path = get_module_path(module)
316 if terp_file:320 if terp_file:
317 info = {}321 info = {}
318322
=== modified file 'openerp/netsvc.py'
--- openerp/netsvc.py 2012-12-10 13:21:33 +0000
+++ openerp/netsvc.py 2012-12-20 14:32:31 +0000
@@ -35,6 +35,7 @@
35import time35import time
36import types36import types
37from pprint import pformat37from pprint import pformat
38import warnings
3839
39# TODO modules that import netsvc only for things from loglevels must be changed to use loglevels.40# TODO modules that import netsvc only for things from loglevels must be changed to use loglevels.
40from loglevels import *41from loglevels import *
@@ -232,6 +233,12 @@
232 for logconfig_item in default_config + pseudo_config + logconfig:233 for logconfig_item in default_config + pseudo_config + logconfig:
233 _logger.debug('logger level set: "%s"', logconfig_item)234 _logger.debug('logger level set: "%s"', logconfig_item)
234235
236 if tools.config['deprecation_warnings'] == 'show':
237 warnings.filterwarnings('default', category=DeprecationWarning)
238 elif tools.config['deprecation_warnings'] == 'log':
239 warnings.filterwarnings('default', category=DeprecationWarning)
240 logging.captureWarnings(True)
241
235# A alternative logging scheme for automated runs of the242# A alternative logging scheme for automated runs of the
236# server intended to test it.243# server intended to test it.
237def init_alternative_logger():244def init_alternative_logger():
238245
=== modified file 'openerp/osv/fields.py'
--- openerp/osv/fields.py 2012-12-19 09:36:55 +0000
+++ openerp/osv/fields.py 2012-12-20 14:32:31 +0000
@@ -42,6 +42,7 @@
42import re42import re
43import xmlrpclib43import xmlrpclib
44from psycopg2 import Binary44from psycopg2 import Binary
45import warnings
4546
46import openerp47import openerp
47import openerp.tools as tools48import openerp.tools as tools
@@ -164,10 +165,11 @@
164 def __init__(self, string='unknown', required=False, **args):165 def __init__(self, string='unknown', required=False, **args):
165 super(boolean, self).__init__(string=string, required=required, **args)166 super(boolean, self).__init__(string=string, required=required, **args)
166 if required:167 if required:
167 _logger.debug(168 warnings.warn(
168 "required=True is deprecated: making a boolean field"169 "required=True is deprecated: making a boolean field"
169 " `required` has no effect, as NULL values are "170 " `required` has no effect, as NULL values are "
170 "automatically turned into False. args: %r",args)171 "automatically turned into False. args: %r" % args,
172 DeprecationWarning, stacklevel=2)
171173
172class integer(_column):174class integer(_column):
173 _type = 'integer'175 _type = 'integer'
@@ -695,9 +697,10 @@
695 for id in ids:697 for id in ids:
696 res[id] = []698 res[id] = []
697 if offset:699 if offset:
698 _logger.warning(700 warnings.warn(
699 "Specifying offset at a many2many.get() is deprecated and may"701 "Specifying offset at a many2many.get() is deprecated and may"
700 " produce unpredictable results.")702 " produce unpredictable results.",
703 DeprecationWarning, stacklevel=2)
701 obj = model.pool.get(self._obj)704 obj = model.pool.get(self._obj)
702 rel, id1, id2 = self._sql_names(model)705 rel, id1, id2 = self._sql_names(model)
703706
704707
=== modified file 'openerp/osv/orm.py'
--- openerp/osv/orm.py 2012-12-18 22:39:59 +0000
+++ openerp/osv/orm.py 2012-12-20 14:32:31 +0000
@@ -58,6 +58,7 @@
5858
59import psycopg259import psycopg2
60from lxml import etree60from lxml import etree
61import warnings
6162
62import fields63import fields
63import openerp64import openerp
@@ -67,6 +68,7 @@
67from openerp.tools.misc import CountingStream68from openerp.tools.misc import CountingStream
68from openerp.tools.safe_eval import safe_eval as eval69from openerp.tools.safe_eval import safe_eval as eval
69from openerp.tools.translate import _70from openerp.tools.translate import _
71from openerp.tools.deprecate import deprecated
70from openerp import SUPERUSER_ID72from openerp import SUPERUSER_ID
71from query import Query73from query import Query
7274
@@ -333,7 +335,6 @@
333 self._cr = cr335 self._cr = cr
334 self._uid = uid336 self._uid = uid
335 self._id = id337 self._id = id
336 self._table = table # deprecated, use _model!
337 self._model = table338 self._model = table
338 self._table_name = self._table._name339 self._table_name = self._table._name
339 self.__logger = logging.getLogger('openerp.osv.orm.browse_record.' + self._table_name)340 self.__logger = logging.getLogger('openerp.osv.orm.browse_record.' + self._table_name)
@@ -353,6 +354,11 @@
353354
354 self._cache = cache355 self._cache = cache
355356
357 @property
358 def _table(self):
359 warnings.warn('_table is deprecated. Use _model', DeprecationWarning, stacklevel=2)
360 return self._model
361
356 def __getitem__(self, name):362 def __getitem__(self, name):
357 if name == 'id':363 if name == 'id':
358 return self._id364 return self._id
@@ -376,10 +382,8 @@
376 else:382 else:
377 return attr383 return attr
378 else:384 else:
379 error_msg = "Field '%s' does not exist in object '%s'" % (name, self)385 error_msg = "Field '%s' does not exist in object '%s'" % (name, self)
380 self.__logger.warning(error_msg)386 self.__logger.warning(error_msg)
381 if self.__logger.isEnabledFor(logging.DEBUG):
382 self.__logger.debug(''.join(traceback.format_stack()))
383 raise KeyError(error_msg)387 raise KeyError(error_msg)
384388
385 # if the field is a classic one or a many2one, we'll fetch all classic and many2one fields389 # if the field is a classic one or a many2one, we'll fetch all classic and many2one fields
@@ -714,9 +718,11 @@
714718
715 CONCURRENCY_CHECK_FIELD = '__last_update'719 CONCURRENCY_CHECK_FIELD = '__last_update'
716720
721 @deprecated("log() is deprecated. Please use OpenChatter notification "
722 "system instead of the res.log mechanism.")
717 def log(self, cr, uid, id, message, secondary=False, context=None):723 def log(self, cr, uid, id, message, secondary=False, context=None):
718 return _logger.warning("log() is deprecated. Please use OpenChatter notification system instead of the res.log mechanism.")724 return
719725
720 def view_init(self, cr, uid, fields_list, context=None):726 def view_init(self, cr, uid, fields_list, context=None):
721 """Override this method to do specific things when a view on the object is opened."""727 """Override this method to do specific things when a view on the object is opened."""
722 pass728 pass
@@ -2059,7 +2065,9 @@
2059 """2065 """
2060 if context is None:2066 if context is None:
2061 context = {}2067 context = {}
20622068 if submenu:
2069 warnings.warn('using the submenu named argument in Model.fields_view_get is deprecated',
2070 DeprecationWarning, stacklevel=2)
2063 def encode(s):2071 def encode(s):
2064 if isinstance(s, unicode):2072 if isinstance(s, unicode):
2065 return s.encode('utf8')2073 return s.encode('utf8')
@@ -3735,7 +3743,8 @@
3735 for f in list(fields_pre) + list(fields_post):3743 for f in list(fields_pre) + list(fields_post):
3736 field_column = self._all_columns.get(f) and self._all_columns.get(f).column3744 field_column = self._all_columns.get(f) and self._all_columns.get(f).column
3737 if field_column and field_column.deprecated:3745 if field_column and field_column.deprecated:
3738 _logger.warning('Field %s.%s is deprecated: %s', self._name, f, field_column.deprecated)3746 warnings.warn('Field %s.%s is deprecated: %s' % (self._name, f, field_column.deprecated),
3747 DeprecationWarning, stacklevel=2)
37393748
3740 readonly = None3749 readonly = None
3741 for vals in res:3750 for vals in res:
@@ -4124,7 +4133,9 @@
4124 for field in vals:4133 for field in vals:
4125 field_column = self._all_columns.get(field) and self._all_columns.get(field).column4134 field_column = self._all_columns.get(field) and self._all_columns.get(field).column
4126 if field_column and field_column.deprecated:4135 if field_column and field_column.deprecated:
4127 _logger.warning('Field %s.%s is deprecated: %s', self._name, field, field_column.deprecated)4136 warnings.warn('Field %s.%s is deprecated: %s' % (self._name, field,
4137 field_column.deprecated),
4138 DeprecationWarning, stacklevel=2)
4128 if field in self._columns:4139 if field in self._columns:
4129 if self._columns[field]._classic_write and not (hasattr(self._columns[field], '_fnct_inv')):4140 if self._columns[field]._classic_write and not (hasattr(self._columns[field], '_fnct_inv')):
4130 if (not totranslate) or not self._columns[field].translate:4141 if (not totranslate) or not self._columns[field].translate:
@@ -5038,9 +5049,9 @@
5038 cr.execute(query + "WHERE ID IN %s", (tuple(ids),))5049 cr.execute(query + "WHERE ID IN %s", (tuple(ids),))
5039 return [x[0] for x in cr.fetchall()]5050 return [x[0] for x in cr.fetchall()]
50405051
5052 @deprecated("You are using deprecated Model.check_recursion(). "
5053 "Please use '_check_recursion()' instead!")
5041 def check_recursion(self, cr, uid, ids, context=None, parent=None):5054 def check_recursion(self, cr, uid, ids, context=None, parent=None):
5042 _logger.warning("You are using deprecated %s.check_recursion(). Please use the '_check_recursion()' instead!" % \
5043 self._name)
5044 assert parent is None or parent in self._columns or parent in self._inherit_fields,\5055 assert parent is None or parent in self._columns or parent in self._inherit_fields,\
5045 "The 'parent' parameter passed to check_recursion() must be None or a valid field name"5056 "The 'parent' parameter passed to check_recursion() must be None or a valid field name"
5046 return self._check_recursion(cr, uid, ids, context, parent)5057 return self._check_recursion(cr, uid, ids, context, parent)
@@ -5282,12 +5293,24 @@
5282 if len(items) == 1:5293 if len(items) == 1:
5283 return lambda gettable: (gettable[items[0]],)5294 return lambda gettable: (gettable[items[0]],)
5284 return operator.itemgetter(*items)5295 return operator.itemgetter(*items)
5296
5285class ImportWarning(Warning):5297class ImportWarning(Warning):
5286 """ Used to send warnings upwards the stack during the import process5298 """ Used to send warnings upwards the stack during the import process
5287 """5299 """
5288 pass5300 pass
52895301
52905302
5303class deprecated_model(MetaModel):
5304 """issues a DeprecationWarning when the class is used as a parent class
5305 """
5306 def __new__(meta, name, bases, attrs):
5307 for b in bases:
5308 if isinstance(b, deprecated_model):
5309 warning = getattr(b, '__deprecation_warning__', '%(class)s is deprecated')
5310 warnings.warn(warning % {'class': name}, DeprecationWarning, stacklevel=2)
5311 return super(deprecated_model, meta).__new__(meta, name, bases, attrs)
5312
5313
5291def convert_pgerror_23502(model, fields, info, e):5314def convert_pgerror_23502(model, fields, info, e):
5292 m = re.match(r'^null value in column "(?P<field>\w+)" violates '5315 m = re.match(r'^null value in column "(?P<field>\w+)" violates '
5293 r'not-null constraint\n',5316 r'not-null constraint\n',
52945317
=== modified file 'openerp/osv/osv.py'
--- openerp/osv/osv.py 2012-12-09 03:49:10 +0000
+++ openerp/osv/osv.py 2012-12-20 14:32:31 +0000
@@ -26,6 +26,7 @@
26import threading26import threading
2727
28from psycopg2 import IntegrityError, errorcodes28from psycopg2 import IntegrityError, errorcodes
29import warnings
2930
30import orm31import orm
31import openerp32import openerp
@@ -33,7 +34,7 @@
33import openerp.pooler as pooler34import openerp.pooler as pooler
34import openerp.sql_db as sql_db35import openerp.sql_db as sql_db
35from openerp.tools.translate import translate36from openerp.tools.translate import translate
36from openerp.osv.orm import MetaModel, Model, TransientModel, AbstractModel37from openerp.osv.orm import MetaModel, Model, TransientModel, AbstractModel, deprecated_model
37import openerp.exceptions38import openerp.exceptions
3839
39_logger = logging.getLogger(__name__)40_logger = logging.getLogger(__name__)
@@ -41,6 +42,7 @@
41# Deprecated.42# Deprecated.
42class except_osv(Exception):43class except_osv(Exception):
43 def __init__(self, name, value):44 def __init__(self, name, value):
45 warnings.warn('except_osv is deprecated', DeprecationWarning, stacklevel=2)
44 self.name = name46 self.name = name
45 self.value = value47 self.value = value
46 self.args = (name, value)48 self.args = (name, value)
@@ -208,11 +210,19 @@
208 cr.close()210 cr.close()
209 return res211 return res
210212
211# deprecated - for backward compatibility.213# deprecated - for backward compatibility
212osv = Model214class osv(Model):
213osv_memory = TransientModel215 __metaclass__ = deprecated_model
214osv_abstract = AbstractModel # ;-)216 __deprecation_warning__ = "osv.osv is deprecated. Use orm.Model"
215217 _register=False
218class osv_memory(TransientModel):
219 __metaclass__ = deprecated_model
220 __deprecation_warning__ = "osv.osv_memory is deprecated. Use orm.TransientModel"
221 _register=False
222class osv_abstract(AbstractModel):
223 __metaclass__ = deprecated_model
224 __deprecation_warning__ = "osv.osv_abstract is deprecated. Use orm.AbstractModel"
225 _register=False
216226
217def start_object_proxy():227def start_object_proxy():
218 object_proxy()228 object_proxy()
219229
=== modified file 'openerp/sql_db.py'
--- openerp/sql_db.py 2012-12-14 12:43:10 +0000
+++ openerp/sql_db.py 2012-12-20 14:32:31 +0000
@@ -37,11 +37,13 @@
3737
38from functools import wraps38from functools import wraps
39import logging39import logging
40import warnings
40import psycopg2.extensions41import psycopg2.extensions
41from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT, ISOLATION_LEVEL_READ_COMMITTED, ISOLATION_LEVEL_REPEATABLE_READ42from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT, ISOLATION_LEVEL_READ_COMMITTED, ISOLATION_LEVEL_REPEATABLE_READ
42from psycopg2.pool import PoolError43from psycopg2.pool import PoolError
43from psycopg2.psycopg1 import cursor as psycopg1cursor44from psycopg2.psycopg1 import cursor as psycopg1cursor
44from threading import currentThread45from threading import currentThread
46from openerp.tools.deprecate import deprecated
4547
46psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)48psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
4749
@@ -476,13 +478,14 @@
476 _logger.debug('create %scursor to %r', cursor_type, self.dbname)478 _logger.debug('create %scursor to %r', cursor_type, self.dbname)
477 return Cursor(self._pool, self.dbname, serialized=serialized)479 return Cursor(self._pool, self.dbname, serialized=serialized)
478480
479 # serialized_cursor is deprecated - cursors are serialized by default481 @deprecated("serialized_cursor is deprecated - cursors are serialized by default")
480 serialized_cursor = cursor482 def serialized_cursor(self):
483 return self.cursor()
481484
485 @deprecated("__nonzero__() is deprecated. (It is too expensive to test a connection.)")
482 def __nonzero__(self):486 def __nonzero__(self):
483 """Check if connection is possible"""487 """Check if connection is possible"""
484 try:488 try:
485 _logger.warning("__nonzero__() is deprecated. (It is too expensive to test a connection.)")
486 cr = self.cursor()489 cr = self.cursor()
487 cr.close()490 cr.close()
488 return True491 return True
489492
=== modified file 'openerp/tools/config.py'
--- openerp/tools/config.py 2012-12-20 10:15:11 +0000
+++ openerp/tools/config.py 2012-12-20 14:32:31 +0000
@@ -187,6 +187,9 @@
187 group.add_option('--log-response', action="append_const", dest="log_handler", const="openerp.netsvc.rpc.response:DEBUG", help='shortcut for --log-handler=openerp.netsvc.rpc.response:DEBUG')187 group.add_option('--log-response', action="append_const", dest="log_handler", const="openerp.netsvc.rpc.response:DEBUG", help='shortcut for --log-handler=openerp.netsvc.rpc.response:DEBUG')
188 group.add_option('--log-web', action="append_const", dest="log_handler", const="openerp.addons.web.http:DEBUG", help='shortcut for --log-handler=openerp.addons.web.http:DEBUG')188 group.add_option('--log-web', action="append_const", dest="log_handler", const="openerp.addons.web.http:DEBUG", help='shortcut for --log-handler=openerp.addons.web.http:DEBUG')
189 group.add_option('--log-sql', action="append_const", dest="log_handler", const="openerp.sql_db:DEBUG", help='shortcut for --log-handler=openerp.sql_db:DEBUG')189 group.add_option('--log-sql', action="append_const", dest="log_handler", const="openerp.sql_db:DEBUG", help='shortcut for --log-handler=openerp.sql_db:DEBUG')
190 group.add_option('--deprecation-warnings', metavar='<log|stderr|hide>',
191 default='log', dest="deprecation_warnings",
192 help="log deprecation warnings (default), print them on stderr, or hide them altogether")
190 # For backward-compatibility, map the old log levels to something193 # For backward-compatibility, map the old log levels to something
191 # quite close.194 # quite close.
192 levels = ['info', 'debug_rpc', 'warn', 'test', 'critical',195 levels = ['info', 'debug_rpc', 'warn', 'test', 'critical',
@@ -384,7 +387,8 @@
384 'netrpc', 'xmlrpc', 'syslog', 'without_demo', 'timezone',387 'netrpc', 'xmlrpc', 'syslog', 'without_demo', 'timezone',
385 'xmlrpcs_interface', 'xmlrpcs_port', 'xmlrpcs',388 'xmlrpcs_interface', 'xmlrpcs_port', 'xmlrpcs',
386 'static_http_enable', 'static_http_document_root', 'static_http_url_prefix',389 'static_http_enable', 'static_http_document_root', 'static_http_url_prefix',
387 'secure_cert_file', 'secure_pkey_file', 'dbfilter', 'log_handler', 'log_level'390 'secure_cert_file', 'secure_pkey_file', 'dbfilter', 'log_handler', 'log_level',
391 'deprecation_warnings',
388 ]392 ]
389393
390 for arg in keys:394 for arg in keys:
391395
=== modified file 'openerp/tools/convert.py'
--- openerp/tools/convert.py 2012-12-17 14:47:53 +0000
+++ openerp/tools/convert.py 2012-12-20 14:32:31 +0000
@@ -25,6 +25,7 @@
25import os.path25import os.path
26import pickle26import pickle
27import re27import re
28import warnings
2829
29# for eval context:30# for eval context:
30import time31import time
@@ -838,7 +839,8 @@
838 raise Exception( "Mismatch xml format: only terp or openerp as root tag" )839 raise Exception( "Mismatch xml format: only terp or openerp as root tag" )
839840
840 if de.tag == 'terp':841 if de.tag == 'terp':
841 _logger.warning("The tag <terp/> is deprecated, use <openerp/>")842 warnings.warn("The tag <terp/> is deprecated, use <openerp/>",
843 DeprecationWarning, stacklevel=2)
842844
843 for n in de.findall('./data'):845 for n in de.findall('./data'):
844 for rec in n:846 for rec in n:
845847
=== added file 'openerp/tools/deprecate.py'
--- openerp/tools/deprecate.py 1970-01-01 00:00:00 +0000
+++ openerp/tools/deprecate.py 2012-12-20 14:32:31 +0000
@@ -0,0 +1,19 @@
1
2from warnings import warn
3import openerp
4
5
6
7def deprecated(message=None, name=None):
8 def decorator(func):
9 if message is None:
10 msg = 'the function %s is deprecated' % func.func_name
11 else:
12 msg = message
13 def wrapper(*args, **kwargs):
14 warn(msg, DeprecationWarning, stacklevel=2)
15 return func(*args, **kwargs)
16 wrapper.__name__ = name or func.__name__
17 wrapper.__doc__ = func.__doc__
18 return wrapper
19 return decorator
020
=== modified file 'openerp/tools/misc.py'
--- openerp/tools/misc.py 2012-12-17 15:02:41 +0000
+++ openerp/tools/misc.py 2012-12-20 14:32:31 +0000
@@ -36,6 +36,7 @@
36import threading36import threading
37import time37import time
38import zipfile38import zipfile
39import warnings
39from collections import defaultdict40from collections import defaultdict
40from datetime import datetime41from datetime import datetime
41from itertools import islice, izip42from itertools import islice, izip
@@ -48,6 +49,7 @@
48except ImportError:49except ImportError:
49 html2text = None50 html2text = None
5051
52from openerp.tools.deprecate import deprecated
51from config import config53from config import config
52from cache import *54from cache import *
5355
@@ -410,6 +412,8 @@
410 """412 """
411413
412 def __init__(self, value, accuracy=2, rounding=None):414 def __init__(self, value, accuracy=2, rounding=None):
415 warnings.warn('Use res.currency.round instead of currency',
416 DeprecationWarning, stacklevel=2)
413 if rounding is None:417 if rounding is None:
414 rounding=10**-accuracy418 rounding=10**-accuracy
415 self.rounding=rounding419 self.rounding=rounding