diff --git a/bin/addons/base/ir/ir_actions.py b/bin/addons/base/ir/ir_actions.py
index a20d780c671..4b9d59743cb 100644
--- a/bin/addons/base/ir/ir_actions.py
+++ b/bin/addons/base/ir/ir_actions.py
@@ -209,16 +209,6 @@ class act_window(osv.osv):
res[act.id] = str(form_arch)
return res
- def _get_help_status(self, cr, uid, ids, name, arg, context={}):
- activate_tips = self.pool.get('res.users').browse(cr, uid, uid).menu_tips
- if activate_tips:
- cr.execute(""" SELECT action.id,
- CASE WHEN r.uid IS NULL THEN True ELSE False END
- AS help_status FROM ir_act_window action
- LEFT JOIN ir_act_window_user_rel r ON
- (action.id = r.act_id AND (r.uid IS NULL or r.uid= %s)) WHERE action.id = ANY(%s)""",(uid,ids,))
- return dict(cr.fetchall())
-
_columns = {
'name': fields.char('Action Name', size=64, translate=True),
'type': fields.char('Action Type', size=32, required=True),
@@ -252,8 +242,6 @@ class act_window(osv.osv):
'menus': fields.char('Menus', size=4096),
'help': fields.text('Action description',
help='Optional help text for the users with a description of the target view, such as its usage and purpose.'),
- 'display_help':fields.function(_get_help_status, type='boolean', method=True, string='Display Help',
- help='It gives the status if the help message has to be displayed or not when a user performs an action')
}
_defaults = {
@@ -266,12 +254,7 @@ class act_window(osv.osv):
'auto_refresh': lambda *a: 0,
'auto_search':lambda *a: True
}
- def _auto_init(self, cr, context={}):
- super(act_window, self)._auto_init(cr, context)
- cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = \'act_window_action_uid_index\'')
- if not cr.fetchone():
- cr.execute('CREATE INDEX act_window_action_uid_index ON ir_act_window_user_rel (act_id, uid)')
- cr.commit()
+
act_window()
class act_window_view(osv.osv):
diff --git a/bin/addons/base/module/module_view.xml b/bin/addons/base/module/module_view.xml
index 6f2155b7c7f..bf5164d8276 100644
--- a/bin/addons/base/module/module_view.xml
+++ b/bin/addons/base/module/module_view.xml
@@ -162,9 +162,9 @@
-
+
-
+
diff --git a/bin/addons/base/module/wizard/base_language_install_view.xml b/bin/addons/base/module/wizard/base_language_install_view.xml
index b97ba101284..794ea6bed7d 100644
--- a/bin/addons/base/module/wizard/base_language_install_view.xml
+++ b/bin/addons/base/module/wizard/base_language_install_view.xml
@@ -3,27 +3,24 @@
- Install Language
+ Load Official Translation
base.language.install
form
-
+
- Install Language
+ Load Official Translation
ir.actions.act_window
base.language.install
form
@@ -38,23 +35,21 @@
parent="menu_translation"/>
- Install Language Message
+ Official Translation Loaded
base.module.import.msg
form
-
- Install Language Message
+ Official Translation Loaded
base.module.import.msg
form
form
diff --git a/bin/addons/base/res/ir_property.py b/bin/addons/base/res/ir_property.py
index 17514898eeb..27536ff80f5 100644
--- a/bin/addons/base/res/ir_property.py
+++ b/bin/addons/base/res/ir_property.py
@@ -20,8 +20,9 @@
##############################################################################
from osv import osv,fields
-from operator import attrgetter
+from tools.misc import attrgetter
import time
+
# -------------------------------------------------------------------------
# Properties
# -------------------------------------------------------------------------
@@ -31,7 +32,6 @@ class ir_property(osv.osv):
def _models_field_get(self, cr, uid, field_key, field_value, context=None):
get = attrgetter(field_key, field_value)
-
obj = self.pool.get('ir.model.fields')
ids = obj.search(cr, uid, [('view_load','=',1)], context=context)
res = set()
@@ -40,7 +40,7 @@ class ir_property(osv.osv):
return res
def _models_get(self, cr, uid, context=None):
- return self._models_field_get(cr, uid, 'model', 'name', context)
+ return self._models_field_get(cr, uid, 'model', 'model_id.name', context)
def _models_get2(self, cr, uid, context=None):
return self._models_field_get(cr, uid, 'relation', 'relation', context)
@@ -50,7 +50,7 @@ class ir_property(osv.osv):
'name': fields.char('Name', size=128, select=1),
'res_id': fields.reference('Resource', selection=_models_get, size=128,
- help="If not set, act as default property", select=1),
+ help="If not set, acts as a default value for new resources", select=1),
'company_id': fields.many2one('res.company', 'Company', select=1),
'fields_id': fields.many2one('ir.model.fields', 'Field', ondelete='cascade', required=True, select=1),
diff --git a/bin/addons/base/test/bug_lp541545.xml b/bin/addons/base/test/bug_lp541545.xml
index 4c1df7a0383..79c3c05c729 100644
--- a/bin/addons/base/test/bug_lp541545.xml
+++ b/bin/addons/base/test/bug_lp541545.xml
@@ -5,7 +5,7 @@
diff --git a/bin/addons/base/test/test_context.xml b/bin/addons/base/test/test_context.xml
index d6c6fa0afed..44751644403 100644
--- a/bin/addons/base/test/test_context.xml
+++ b/bin/addons/base/test/test_context.xml
@@ -6,15 +6,15 @@
--->
+
-
+
- 58.8287
+ 59.9739
diff --git a/bin/netsvc.py b/bin/netsvc.py
index ca81372a8fe..e5a60f9d3ae 100644
--- a/bin/netsvc.py
+++ b/bin/netsvc.py
@@ -350,7 +350,7 @@ class Agent(object):
delattr(current_thread, 'dbname')
task_thread = threading.Thread(target=function, name='netsvc.Agent.task', args=args, kwargs=kwargs)
# force non-daemon task threads (the runner thread must be daemon, and this property is inherited by default)
- task_thread.daemon = False
+ task_thread.setDaemon(False)
task_thread.start()
time.sleep(1)
time.sleep(60)
@@ -359,7 +359,7 @@ agent_runner = threading.Thread(target=Agent.runner, name="netsvc.Agent.runner")
# the agent runner is a typical daemon thread, that will never quit and must be
# terminated when the main process exits - with no consequence (the processing
# threads it spawns are not marked daemon)
-agent_runner.daemon = True
+agent_runner.setDaemon(True)
agent_runner.start()
diff --git a/bin/openerp-server.py b/bin/openerp-server.py
index 9061b0ae3c8..9486d6e49d5 100755
--- a/bin/openerp-server.py
+++ b/bin/openerp-server.py
@@ -182,8 +182,9 @@ def handler(signum, frame):
def dumpstacks(signum, frame):
# code from http://stackoverflow.com/questions/132058/getting-stack-trace-from-a-running-python-application#answer-2569696
-
- id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
+ # modified for python 2.5 compatibility
+ thread_map = dict(threading._active, **threading._limbo)
+ id2name = dict([(threadId, thread.getName()) for threadId, thread in thread_map.items()])
code = []
for threadId, stack in sys._current_frames().items():
code.append("\n# Thread: %s(%d)" % (id2name[threadId], threadId))
@@ -191,7 +192,6 @@ def dumpstacks(signum, frame):
code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
if line:
code.append(" %s" % (line.strip()))
-
logging.getLogger('dumpstacks').info("\n".join(code))
for signum in SIGNALS:
@@ -214,7 +214,7 @@ def quit():
# to trigger _force_quit() in case some non-daemon threads won't exit cleanly.
# threading.Thread.join() should not mask signals (at least in python 2.5)
for thread in threading.enumerate():
- if thread != threading.currentThread() and not thread.daemon:
+ if thread != threading.currentThread() and not thread.isDaemon():
while thread.isAlive():
# need a busyloop here as thread.join() masks signals
# and would present the forced shutdown
diff --git a/bin/osv/orm.py b/bin/osv/orm.py
index 64b118f3e15..1024136093f 100644
--- a/bin/osv/orm.py
+++ b/bin/osv/orm.py
@@ -548,11 +548,10 @@ class orm_template(object):
else:
return False
-
lines = []
data = map(lambda x: '', range(len(fields)))
- done = []
for fpos in range(len(fields)):
+ done = []
f = fields[fpos]
if f:
r = row
diff --git a/bin/tools/misc.py b/bin/tools/misc.py
index 1256adb46f6..5a3d21bef86 100644
--- a/bin/tools/misc.py
+++ b/bin/tools/misc.py
@@ -419,6 +419,13 @@ def _email_send(smtp_from, smtp_to_list, message, openobject_id=None, ssl=False,
:return: True if the mail was delivered successfully to the smtp,
else False (+ exception logged)
"""
+ class WriteToLogger(object):
+ def __init__(self):
+ self.logger = netsvc.Logger()
+
+ def write(self, s):
+ self.logger.notifyChannel('email_send', netsvc.LOG_DEBUG, s)
+
if openobject_id:
message['Message-Id'] = generate_tracking_message_id(openobject_id)
@@ -534,13 +541,6 @@ def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=Non
part.add_header('Content-Disposition', 'attachment; filename="%s"' % (fname,))
msg.attach(part)
- class WriteToLogger(object):
- def __init__(self):
- self.logger = netsvc.Logger()
-
- def write(self, s):
- self.logger.notifyChannel('email_send', netsvc.LOG_DEBUG, s)
-
return _email_send(email_from, flatten([email_to, email_cc, email_bcc]), msg, openobject_id=openobject_id, ssl=ssl, debug=debug)
#----------------------------------------------------------
@@ -1406,5 +1406,24 @@ def upload_data(email, data, type='SURVEY'):
a = upload_data_thread(email, data, type)
a.start()
return True
+
+
+# port of python 2.6's attrgetter with support for dotted notation
+def resolve_attr(obj, attr):
+ for name in attr.split("."):
+ obj = getattr(obj, name)
+ return obj
+
+def attrgetter(*items):
+ if len(items) == 1:
+ attr = items[0]
+ def g(obj):
+ return resolve_attr(obj, attr)
+ else:
+ def g(obj):
+ return tuple(resolve_attr(obj, attr) for attr in items)
+ return g
+
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: