From c048a189a7c1ffb87ce4c079dbed58b2a73f5c66 Mon Sep 17 00:00:00 2001 From: Xavier ALT Date: Mon, 26 Apr 2010 15:38:47 +0200 Subject: [PATCH 001/406] [IMP] add new view type: gallery New view is used like that: - string: display name of the view - col: force number of columns (auto if -1), default -1 - width: size of one gallery item (in pixels), default 75 - height: size of one gallery item (in pixels), default 75 - field type='text': field to be used for gallery item text - field type='image': field to be used for gallery image repr. bzr revid: x.alt@ajm.lu-20100426133847-4y0egk230hsf41gq --- bin/addons/base/ir/ir_actions.py | 3 ++- bin/addons/base/ir/ir_ui_view.py | 1 + bin/addons/base/rng/gallery.rng | 21 +++++++++++++++++++++ bin/addons/base/rng/view.rng | 16 ++++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 bin/addons/base/rng/gallery.rng diff --git a/bin/addons/base/ir/ir_actions.py b/bin/addons/base/ir/ir_actions.py index 33be3fe99ee..a5696f220b0 100644 --- a/bin/addons/base/ir/ir_actions.py +++ b/bin/addons/base/ir/ir_actions.py @@ -281,7 +281,8 @@ class act_window_view(osv.osv): ('form', 'Form'), ('graph', 'Graph'), ('calendar', 'Calendar'), - ('gantt', 'Gantt')), string='View Type', required=True), + ('gantt', 'Gantt'), + ('gallery', 'Gallery')), string='View Type', required=True), 'act_window_id': fields.many2one('ir.actions.act_window', 'Action', ondelete='cascade'), 'multi': fields.boolean('On Multiple Doc.', help="If set to true, the action will not be displayed on the right toolbar of a form view."), diff --git a/bin/addons/base/ir/ir_ui_view.py b/bin/addons/base/ir/ir_ui_view.py index b04343e821f..0ba220ce2e7 100644 --- a/bin/addons/base/ir/ir_ui_view.py +++ b/bin/addons/base/ir/ir_ui_view.py @@ -62,6 +62,7 @@ class view(osv.osv): ('calendar', 'Calendar'), ('diagram','Diagram'), ('gantt', 'Gantt'), + ('gallery', 'Gallery'), ('search','Search')), 'View Type', required=True), 'arch': fields.text('View Architecture', required=True), 'inherit_id': fields.many2one('ir.ui.view', 'Inherited View', ondelete='cascade'), diff --git a/bin/addons/base/rng/gallery.rng b/bin/addons/base/rng/gallery.rng new file mode 100644 index 00000000000..73477113f62 --- /dev/null +++ b/bin/addons/base/rng/gallery.rng @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/bin/addons/base/rng/view.rng b/bin/addons/base/rng/view.rng index d822ed3c4ac..e8bafc98866 100644 --- a/bin/addons/base/rng/view.rng +++ b/bin/addons/base/rng/view.rng @@ -332,6 +332,7 @@ + @@ -413,6 +414,7 @@ + @@ -493,6 +495,18 @@ + + + + + + + + + + + + @@ -523,6 +537,7 @@ + @@ -600,6 +615,7 @@ + From 3232e978f60029693c23dacef1edd0de15e7cc2e Mon Sep 17 00:00:00 2001 From: Xavier ALT Date: Thu, 29 Apr 2010 15:30:32 +0200 Subject: [PATCH 002/406] [IMP] add search_mode attribute usable on many2one bzr revid: x.alt@ajm.lu-20100429133032-vmy0cr9t6htrz61g --- bin/addons/base/rng/view.rng | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/addons/base/rng/view.rng b/bin/addons/base/rng/view.rng index e8bafc98866..c2e5af87cee 100644 --- a/bin/addons/base/rng/view.rng +++ b/bin/addons/base/rng/view.rng @@ -382,6 +382,7 @@ + From 4169795ad229cb8a61d71c49354be897046a8bd1 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Wed, 2 Jun 2010 14:41:51 +0200 Subject: [PATCH 003/406] [IMP] Rewrite the setup.py file to use the setuptools package bzr revid: stephane@openerp.com-20100602124151-j07ji0u8ds16qfdy --- setup.py | 112 ++++++++++++++----------------------------------------- 1 file changed, 27 insertions(+), 85 deletions(-) diff --git a/setup.py b/setup.py index 39fda7703e8..587078eb4b5 100755 --- a/setup.py +++ b/setup.py @@ -32,8 +32,8 @@ import os from os.path import join, isfile, basename import glob -from distutils.core import setup, Command -from distutils.command.install import install +from setuptools import setup, find_packages +from setuptools.command.install import install from distutils.sysconfig import get_python_lib has_py2exe = False @@ -51,54 +51,10 @@ if 'bdist_rpm' in sys.argv: # get python short version py_short_version = '%s.%s' % sys.version_info[:2] -required_modules = [ - ('lxml', 'lxml module: pythonic libxml2 and libxslt bindings'), - ('mako', 'Mako template engine'), - ('dateutil', "Extensions to the standard datetime module"), - ('psycopg2', 'PostgreSQL module'), - ('pychart', 'pychart module'), - ('pydot', 'pydot module'), - ('pytz', 'Timezone handling library for Python'), - ('reportlab', 'reportlab module'), - ('yaml', 'YAML parser and emitter for Python'), - ('pywebdav', 'PyWebDAV is a standards compliant WebDAV server and library written in Python'), -] - -def check_modules(): - errors = [] - for modname, desc in required_modules: - try: - imp.find_module(modname) - except ImportError: - errors.append( - 'Error: python module %s (%s) is required' % (modname, desc)) - - if errors: - print '\n'.join(errors) - sys.exit(1) - def find_addons(): - for root, _, names in os.walk(join('bin', 'addons')): + for root, _, names in os.walk(join('bin', 'addons'), followlinks=True): if '__openerp__.py' in names or '__terp__.py' in names: yield basename(root), root - #look for extra modules - try: - empath = os.getenv('EXTRA_MODULES_PATH', '../addons/') - for mname in open(join(empath, 'server_modules.list')): - mname = mname.strip() - if not mname: - continue - - terp = join(empath, mname, '__openerp__.py') - if not os.path.exists(terp): - terp = join(empath, mname, '__terp__.py') - - if os.path.exists(terp): - yield mname, join(empath, mname) - else: - print "Module %s specified, but no valid path." % mname - except: - pass def data_files(): '''Build list of data files to be installed''' @@ -145,17 +101,6 @@ def data_files(): return files -if not os.getenv('NO_CHECK_MODULES') : - check_modules() - -f = file('openerp-server','w') -f.write("""#!/bin/sh -echo "Error: the content of this file should have been replaced during " -echo "installation\n" -exit 1 -""") -f.close() - def find_package_dirs(): package_dirs = {'openerp-server': 'bin'} for mod, path in find_addons(): @@ -201,37 +146,34 @@ setup(name = name, license = license, data_files = data_files(), cmdclass = { - 'install' : openerp_server_install, + 'install' : openerp_server_install, }, scripts = ['openerp-server'], - packages = ['openerp-server', - 'openerp-server.addons', - 'openerp-server.ir', - 'openerp-server.osv', - 'openerp-server.pychart', - 'openerp-server.pychart.afm', - 'openerp-server.report', - 'openerp-server.report.printscreen', - 'openerp-server.report.pyPdf', - 'openerp-server.report.render', - 'openerp-server.report.render.html2html', - 'openerp-server.report.render.makohtml2html', - 'openerp-server.report.render.odt2odt', - 'openerp-server.report.render.rml2html', - 'openerp-server.report.render.rml2pdf', - 'openerp-server.report.render.rml2txt', - 'openerp-server.service', - 'openerp-server.tools', - 'openerp-server.wizard', - 'openerp-server.workflow'] + \ - [('openerp-server.addons.' + name) - for name, _ in find_addons()], + packages = [ + '.'.join(['openerp-server'] + package.split('.')[1:]) for package in find_packages() + ], package_dir = find_package_dirs(), - console = [{"script": join("bin", "openerp-server.py"), - "icon_resources": [(1,join("pixmaps","openerp-icon.ico"))] - }], + console = [ + { + "script": join("bin", "openerp-server.py"), + "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))] + } + ], options = options, - ) + install_requires = ['lxml', + 'mako', + 'python-dateutil', + 'psycopg2', + 'pychart', + 'pydot', + 'pytz', + 'reportlab', + 'pyyaml', + 'pywebdav'], + extras_require={ + 'SSL' : ['pyopenssl'], + } +) if has_py2exe: # Sometime between pytz-2008a and pytz-2008i common_timezones started to From 6a99c6815841e92d8c0c7a91d9297ee57ec1321e Mon Sep 17 00:00:00 2001 From: rga Date: Mon, 14 Jun 2010 15:25:51 +0530 Subject: [PATCH 004/406] [IMP] For Advance filter use ir.filters instead of ir.act.window bzr revid: rga@rga-desktop-20100614095551-mtjkhc0i44c57j0n --- bin/addons/base/base_menu.xml | 1 + bin/addons/base/ir/ir_actions.py | 10 ------- bin/addons/base/ir/ir_filters.py | 5 ++++ bin/addons/base/ir/ir_ui_menu.py | 29 ++++++++++++++++++-- bin/addons/base/security/ir.model.access.csv | 1 + 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/bin/addons/base/base_menu.xml b/bin/addons/base/base_menu.xml index fcbd9611498..465856674f7 100644 --- a/bin/addons/base/base_menu.xml +++ b/bin/addons/base/base_menu.xml @@ -2,6 +2,7 @@ + diff --git a/bin/addons/base/ir/ir_actions.py b/bin/addons/base/ir/ir_actions.py index dd5cbc833b4..1dbb27222be 100644 --- a/bin/addons/base/ir/ir_actions.py +++ b/bin/addons/base/ir/ir_actions.py @@ -158,16 +158,6 @@ class act_window(osv.osv): (_check_model, 'Invalid model name in the action definition.', ['res_model','src_model']) ] - def get_filters(self, cr, uid, model): - cr.execute('SELECT id FROM ir_act_window a WHERE a.id not in (SELECT act_id FROM ir_act_window_user_rel) AND a.res_model=\''+model+'\' and a.filter=\'1\';') - all_ids = cr.fetchall() - filter_ids = map(lambda x:x[0],all_ids) - act_ids = self.search(cr,uid,[('res_model','=',model),('filter','=',1),('default_user_ids','in',(','.join(map(str,[uid,])),))]) - act_ids += filter_ids - act_ids = list(set(act_ids)) - my_acts = self.read(cr, uid, act_ids, ['name', 'domain','context']) - return my_acts - def _views_get_fnc(self, cr, uid, ids, name, arg, context={}): res={} for act in self.browse(cr, uid, ids): diff --git a/bin/addons/base/ir/ir_filters.py b/bin/addons/base/ir/ir_filters.py index 44dd335f34d..17610230d65 100644 --- a/bin/addons/base/ir/ir_filters.py +++ b/bin/addons/base/ir/ir_filters.py @@ -39,6 +39,11 @@ class ir_filters(osv.osv): 'context': fields.char('Context Value', size=250, required=True), 'model_id': fields.selection(_list_all_models, 'Model', required=True), } + + def get_filters(self, cr, uid, model): + act_ids = self.search(cr,uid,[('model_id','=',model),('user_id','=',uid)]) + my_acts = self.read(cr, uid, act_ids, ['name', 'domain','context']) + return my_acts ir_filters() diff --git a/bin/addons/base/ir/ir_ui_menu.py b/bin/addons/base/ir/ir_ui_menu.py index a33686e1eb9..4c8e1a8de9c 100644 --- a/bin/addons/base/ir/ir_ui_menu.py +++ b/bin/addons/base/ir/ir_ui_menu.py @@ -62,13 +62,38 @@ class ir_ui_menu(osv.osv): def clear_cache(self): # radical but this doesn't frequently happen self._cache = {} - + + def create_shortcut(self, cr, uid, datas): + dataobj = self.pool.get('ir.model.data') + menu_id = dataobj._get_id(cr, uid, 'base', 'menu_administration_shortcut') + shortcut_menu_id = int(dataobj.read(cr, uid, menu_id, ['res_id'])['res_id']) + action_id = self.pool.get('ir.actions.act_window').create(cr, uid, datas) + + menu_data = {'name':datas['name'], + 'sequence':10, + 'action':'ir.actions.act_window,'+str(action_id), + 'parent_id':shortcut_menu_id, + 'icon':'STOCK_JUSTIFY_FILL', + } + menu_id = self.pool.get('ir.ui.menu').create(cr, uid, menu_data) + + sc_data= {'name':datas['name'], + 'sequence': 1, + 'res_id': menu_id, + } + + sc_menu_id = self.pool.get('ir.ui.view_sc').create(cr, uid, sc_data) + + user_groups = set(self.pool.get('res.users').read(cr, 1, uid, ['groups_id'])['groups_id']) + key = (cr.dbname, shortcut_menu_id, tuple(user_groups)) + self._cache[key] = True + return True + def search(self, cr, uid, args, offset=0, limit=2000, order=None, context=None, count=False): if context is None: context = {} ids = osv.orm.orm.search(self, cr, uid, args, offset, limit, order, context=context, count=(count and uid==1)) - if not ids: if count: return 0 diff --git a/bin/addons/base/security/ir.model.access.csv b/bin/addons/base/security/ir.model.access.csv index 03abfe107ab..45d096f5fbb 100644 --- a/bin/addons/base/security/ir.model.access.csv +++ b/bin/addons/base/security/ir.model.access.csv @@ -129,3 +129,4 @@ "access_maintenance_contract_wizard","maintenance.contract.wizard","model_maintenance_contract_wizard","group_maintenance_manager",1,1,1,1 "access_multi_company_default user","multi_company_default User","model_multi_company_default","group_user",1,0,0,0 "access_multi_company_default manager","multi_company_default Manager","model_multi_company_default","group_erp_manager",1,1,1,1 +"access_ir_filters","ir_filters_all","model_ir_filters",,1,1,1,1 From d7c82d75773b4b4454cf526c60015ee814af9caa Mon Sep 17 00:00:00 2001 From: rga Date: Fri, 18 Jun 2010 12:02:58 +0530 Subject: [PATCH 005/406] [IMP] add context arg in methods bzr revid: rga@rga-desktop-20100618063258-ihf5hqs95wkistr4 --- bin/addons/base/ir/ir_ui_menu.py | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/bin/addons/base/ir/ir_ui_menu.py b/bin/addons/base/ir/ir_ui_menu.py index 4c8e1a8de9c..6948c0a2100 100644 --- a/bin/addons/base/ir/ir_ui_menu.py +++ b/bin/addons/base/ir/ir_ui_menu.py @@ -63,26 +63,19 @@ class ir_ui_menu(osv.osv): # radical but this doesn't frequently happen self._cache = {} - def create_shortcut(self, cr, uid, datas): + def create_shortcut(self, cr, uid, values, context={}): dataobj = self.pool.get('ir.model.data') - menu_id = dataobj._get_id(cr, uid, 'base', 'menu_administration_shortcut') - shortcut_menu_id = int(dataobj.read(cr, uid, menu_id, ['res_id'])['res_id']) - action_id = self.pool.get('ir.actions.act_window').create(cr, uid, datas) - - menu_data = {'name':datas['name'], - 'sequence':10, - 'action':'ir.actions.act_window,'+str(action_id), - 'parent_id':shortcut_menu_id, - 'icon':'STOCK_JUSTIFY_FILL', - } + menu_id = dataobj._get_id(cr, uid, 'base', 'menu_administration_shortcut', context) + shortcut_menu_id = int(dataobj.read(cr, uid, menu_id, ['res_id'], context)['res_id']) + action_id = self.pool.get('ir.actions.act_window').create(cr, uid, values, context) + menu_data = {'name':values['name'], + 'sequence':10, + 'action':'ir.actions.act_window,'+str(action_id), + 'parent_id':shortcut_menu_id, + 'icon':'STOCK_JUSTIFY_FILL'} menu_id = self.pool.get('ir.ui.menu').create(cr, uid, menu_data) - - sc_data= {'name':datas['name'], - 'sequence': 1, - 'res_id': menu_id, - } - - sc_menu_id = self.pool.get('ir.ui.view_sc').create(cr, uid, sc_data) + sc_data= {'name':values['name'], 'sequence': 1,'res_id': menu_id } + sc_menu_id = self.pool.get('ir.ui.view_sc').create(cr, uid, sc_data, context) user_groups = set(self.pool.get('res.users').read(cr, 1, uid, ['groups_id'])['groups_id']) key = (cr.dbname, shortcut_menu_id, tuple(user_groups)) From 8af368159be801f5ee24d8be8fdcad7025688cae Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Tue, 21 Sep 2010 16:04:57 +0200 Subject: [PATCH 006/406] [IMP] addons.init: avoid spurious warnings during validation of -i / -u server parameters Includes revert of revision 2111.5.24 rvo@tinyerp.co.in-20100503134414-ma87k4htpifi00tz bzr revid: odo@openerp.com-20100921140457-cwhl843wz86nfmm8 --- bin/addons/__init__.py | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py index cc3bdc2ce7b..3e062563dd5 100644 --- a/bin/addons/__init__.py +++ b/bin/addons/__init__.py @@ -757,16 +757,19 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs): return has_updates +def _check_module_names(cr, module_names): + mod_names = set(module_names) + if 'base' in mod_names: + # ignore dummy 'all' module + mod_names.remove('all') + cr.execute("SELECT count(id) AS count FROM ir_module_module WHERE name in %s", (tuple(mod_names),)) + if cr.dictfetchone()['count'] != len(mod_names): + # find out what module name(s) are incorrect: + cr.execute("SELECT name FROM ir_module_module") + incorrect_names = mod_names.difference([x['name'] for x in cr.dictfetchall()]) + logging.getLogger('init').warning('invalid module names, ignored: %s', ", ".join(incorrect_names)) + def load_modules(db, force_demo=False, status=None, update_module=False): - - def check_module_name(cr, mods, state): - for mod in mods: - id = modobj.search(cr, 1, ['&', ('state', '=', state), ('name', '=', mod)]) - if id: - getattr(modobj, states[state])(cr, 1, id) - elif mod != 'all': - logger.notifyChannel('init', netsvc.LOG_WARNING, 'module %s: invalid module name!' % (mod)) - if not status: status = {} cr = db.cursor() @@ -795,16 +798,23 @@ def load_modules(db, force_demo=False, status=None, update_module=False): if update_module: modobj = pool.get('ir.module.module') - states = {'installed': 'button_upgrade', 'uninstalled': 'button_install'} logger.notifyChannel('init', netsvc.LOG_INFO, 'updating modules list') if ('base' in tools.config['init']) or ('base' in tools.config['update']): modobj.update_list(cr, 1) + _check_module_names(cr, itertools.chain(tools.config['init'].keys(), tools.config['update'].keys())) + mods = [k for k in tools.config['init'] if tools.config['init'][k]] - check_module_name(cr, mods, 'uninstalled') + if mods: + ids = modobj.search(cr, 1, ['&', ('state', '=', 'uninstalled'), ('name', 'in', mods)]) + if ids: + modobj.button_install(cr, 1, ids) mods = [k for k in tools.config['update'] if tools.config['update'][k]] - check_module_name(cr, mods, 'installed') + if mods: + ids = modobj.search(cr, 1, ['&', ('state', '=', 'installed'), ('name', 'in', mods)]) + if ids: + modobj.button_upgrade(cr, 1, ids) cr.execute("update ir_module_module set state=%s where name=%s", ('installed', 'base')) From 0b314fd3dd6da4ca55993293d350825d55bd9b86 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Tue, 21 Sep 2010 16:25:25 +0200 Subject: [PATCH 007/406] [IMP] addons.init: handle properly empty update/init module spec bzr revid: odo@openerp.com-20100921142525-2vjy7njophpl77bf --- bin/addons/__init__.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py index 3e062563dd5..297cf73c6f4 100644 --- a/bin/addons/__init__.py +++ b/bin/addons/__init__.py @@ -762,12 +762,13 @@ def _check_module_names(cr, module_names): if 'base' in mod_names: # ignore dummy 'all' module mod_names.remove('all') - cr.execute("SELECT count(id) AS count FROM ir_module_module WHERE name in %s", (tuple(mod_names),)) - if cr.dictfetchone()['count'] != len(mod_names): - # find out what module name(s) are incorrect: - cr.execute("SELECT name FROM ir_module_module") - incorrect_names = mod_names.difference([x['name'] for x in cr.dictfetchall()]) - logging.getLogger('init').warning('invalid module names, ignored: %s', ", ".join(incorrect_names)) + if mod_names: + cr.execute("SELECT count(id) AS count FROM ir_module_module WHERE name in %s", (tuple(mod_names),)) + if cr.dictfetchone()['count'] != len(mod_names): + # find out what module name(s) are incorrect: + cr.execute("SELECT name FROM ir_module_module") + incorrect_names = mod_names.difference([x['name'] for x in cr.dictfetchall()]) + logging.getLogger('init').warning('invalid module names, ignored: %s', ", ".join(incorrect_names)) def load_modules(db, force_demo=False, status=None, update_module=False): if not status: From bbc9eba7a0824dafb05832518a4fa3a9117b8b1f Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Tue, 21 Sep 2010 17:34:23 +0200 Subject: [PATCH 008/406] [IMP] netsvc.Agent: Agent.runner thread should be marked daemon to be terminated at server exit (harmlessly) Also set a thread name for the runner thread. bzr revid: odo@openerp.com-20100921153423-053knurknw34qj1r --- bin/netsvc.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/netsvc.py b/bin/netsvc.py index d29aebd92b5..ce9b35d2a5b 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -352,7 +352,12 @@ class Agent(object): time.sleep(1) time.sleep(60) -threading.Thread(target=Agent.runner).start() +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.start() import traceback From 1e9167f9a9cf88cef7bcc898c49ce267764d4d3b Mon Sep 17 00:00:00 2001 From: "Vir (Open ERP)" Date: Wed, 22 Sep 2010 11:09:37 +0530 Subject: [PATCH 009/406] [IMP] hr_* : Usability improvements bzr revid: vir@tinyerp.com-20100922053937-5gah2r12uvewy210 --- addons/hr/hr_department_view.xml | 4 ++-- addons/hr/hr_view.xml | 4 ++-- addons/hr_expense/hr_expense.py | 2 +- addons/hr_expense/hr_expense_view.xml | 4 ++-- addons/hr_holidays/hr_holidays_view.xml | 14 +++++++------- addons/hr_holidays/security/ir.model.access.csv | 1 + addons/hr_recruitment/hr_recruitment.py | 2 +- addons/hr_recruitment/hr_recruitment_view.xml | 4 ++-- addons/hr_timesheet/hr_timesheet_view.xml | 11 ++++++----- .../hr_timesheet_sheet/hr_timesheet_sheet_view.xml | 4 ++-- 10 files changed, 26 insertions(+), 24 deletions(-) diff --git a/addons/hr/hr_department_view.xml b/addons/hr/hr_department_view.xml index ccbd506b7e6..d4f13458f1c 100644 --- a/addons/hr/hr_department_view.xml +++ b/addons/hr/hr_department_view.xml @@ -14,9 +14,9 @@
- + - + diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml index e0efa92056b..83b5b266e5e 100644 --- a/addons/hr/hr_view.xml +++ b/addons/hr/hr_view.xml @@ -99,7 +99,7 @@ search - + @@ -114,7 +114,7 @@ - + diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index 6c2f44dfb8c..4003cded168 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -81,7 +81,7 @@ class hr_expense_expense(osv.osv): 'company_id': fields.many2one('res.company', 'Company', required=True), 'state': fields.selection([ ('draft', 'Draft'), - ('confirm', 'Waiting Approved'), + ('confirm', 'Waiting Approval'), ('accepted', 'Approved'), ('invoiced', 'Invoiced'), ('paid', 'Reimbursed'), diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml index 4fc5b0412f8..79c0d5513f0 100644 --- a/addons/hr_expense/hr_expense_view.xml +++ b/addons/hr_expense/hr_expense_view.xml @@ -77,7 +77,7 @@ - + @@ -99,7 +99,7 @@ -