From 7855fad59324f3996b9d5d89721d14ba2892ab37 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 24 Feb 2011 13:18:30 +0100 Subject: [PATCH 01/87] [FIX] setup.py: use the new openerp module. - python setup.py build seems to work (it produces the same result as before). - the install seems not good: code and data are duplicated in both site-packages and dist-packages. (This was already true before.) - The bin/openerp-server is not good yet. bzr revid: vmt@openerp.com-20110224121830-hte18v9zzvel5zb5 --- MANIFEST.in | 23 +++++++++++------------ setup.py | 30 ++++++++++++++---------------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index ac545d3d8d4..1c615eb97b0 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,17 +1,16 @@ -include rpminstall_sh.txt +include rpminstall_sh.txt # TODO do we need this file ? include README -include MANIFEST.in +include MANIFEST.in # TODO do we really need this three files ? include setup.nsi include setup.cfg -include bin/import_xml.rng -include bin/server.cert -include bin/server.pkey -include bin/gpl.txt +#include openerp/server.cert +#include openerp/server.pkey +#include openerp/gpl.txt include man/openerp-server.1 include man/openerp_serverrc.5 -recursive-include pixmaps * -recursive-include win32 * -recursive-include doc * -recursive-include bin *xml *xsl *sql *rml *sxw *csv *rng -graft bin/addons -global-exclude *pyc *~ +recursive-include pixmaps *bmp *ico *png +recursive-include win32 *.py *.bat +recursive-include openerp *css *csv *html *png *po *pot +recursive-include openerp *rml *rng *sql *sxw *xml *xsl *yml +graft doc +global-exclude *pyc *~ # Exclude possible garbage from previous graft. diff --git a/setup.py b/setup.py index 00667bcdf96..de2ad54eb70 100755 --- a/setup.py +++ b/setup.py @@ -42,9 +42,7 @@ if os.name == 'nt': import py2exe has_py2exe = True -sys.path.append(join(os.path.abspath(os.path.dirname(__file__)), "bin")) - -execfile(join('bin', 'release.py')) +execfile(join('openerp', 'release.py')) if 'bdist_rpm' in sys.argv: version = version.split('-')[0] @@ -85,7 +83,7 @@ if sys.version_info < (2, 6): os.walk = walk_followlinks def find_addons(): - for root, _, names in os.walk(join('bin', 'addons'), followlinks=True): + for root, _, names in os.walk(join('openerp', 'addons'), followlinks=True): if '__openerp__.py' in names or '__terp__.py' in names: yield basename(root), root #look for extra modules @@ -111,9 +109,9 @@ def data_files(): '''Build list of data files to be installed''' files = [] if os.name == 'nt': - os.chdir('bin') + os.chdir('openerp') for (dp, dn, names) in os.walk('addons'): - files.append((dp, map(lambda x: join('bin', dp, x), names))) + files.append((dp, map(lambda x: join('openerp', dp, x), names))) os.chdir('..') #for root, _, names in os.walk(join('bin','addons')): # files.append((root, [join(root, name) for name in names])) @@ -121,7 +119,7 @@ def data_files(): files.append((root, [join(root, name) for name in names])) #for root, _, names in os.walk('pixmaps'): # files.append((root, [join(root, name) for name in names])) - files.append(('.', [join('bin', 'import_xml.rng'),])) + files.append(('.', [join('openerp', 'import_xml.rng'),])) else: man_directory = join('share', 'man') files.append((join(man_directory, 'man1'), ['man/openerp-server.1'])) @@ -134,9 +132,9 @@ def data_files(): files.append((join(doc_directory, 'migrate', '3.4.0-4.0.0'), filter(isfile, glob.glob('doc/migrate/3.4.0-4.0.0/*')))) - openerp_site_packages = join(get_python_lib(prefix=''), 'openerp-server') + openerp_site_packages = join(get_python_lib(prefix=''), 'openerp') - files.append((openerp_site_packages, [join('bin', 'import_xml.rng'),])) + files.append((openerp_site_packages, [join('openerp', 'import_xml.rng'),])) if sys.version_info[0:2] == (2,5): files.append((openerp_site_packages, [ join('python25-compat','BaseHTTPServer.py'), @@ -144,7 +142,7 @@ def data_files(): join('python25-compat','SocketServer.py')])) for addonname, add_path in find_addons(): - addon_path = join(get_python_lib(prefix=''), 'openerp-server','addons', addonname) + addon_path = join(get_python_lib(prefix=''), 'openerp','addons', addonname) for root, dirs, innerfiles in os.walk(add_path): innerfiles = filter(lambda fil: os.path.splitext(fil)[1] not in ('.pyc', '.pyd', '.pyo'), innerfiles) if innerfiles: @@ -163,16 +161,16 @@ exit 1 f.close() def find_package_dirs(): - package_dirs = {'openerp-server': 'bin'} + package_dirs = {'openerp': 'openerp'} for mod, path in find_addons(): - package_dirs['openerp-server.addons.' + mod] = path + package_dirs['openerp.addons.' + mod] = path return package_dirs class openerp_server_install(install): def run(self): - # create startup script + # create startup script TODO not correct since the openerp lib was made start_script = "#!/bin/sh\ncd %s\nexec %s ./openerp-server.py $@\n"\ - % (join(self.install_libbase, "openerp-server"), sys.executable) + % (join(self.install_libbase, "openerp"), sys.executable) # write script f = open('openerp-server', 'w') f.write(start_script) @@ -214,7 +212,7 @@ setup(name = name, }, scripts = ['openerp-server'], packages = [ - '.'.join(['openerp-server'] + package.split('.')[1:]) + '.'.join(['openerp'] + package.split('.')[1:]) for package in find_packages() ], include_package_data = True, @@ -224,7 +222,7 @@ setup(name = name, package_dir = find_package_dirs(), console = [ { - "script": join("bin", "openerp-server.py"), + "script": "openerp-server.py", "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))] } ], From 44b392ef0996b2cb077b02cfec5ff21ead7476af Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 24 Feb 2011 15:26:59 +0100 Subject: [PATCH 02/87] [FIX] setup.py: easy_install seems to work. - the generated bin/openerp-server.py seems to work. - I would like to remove the data_files() call as it seems redundant with MANIFEST.in. - Same for find_package_dirs(). - I have to check first how the build on windows work (as it includes different files than on unix). bzr revid: vmt@openerp.com-20110224142659-r2wbm9f8tkldgwe6 --- setup.py | 46 ++++++++-------------------------------------- 1 file changed, 8 insertions(+), 38 deletions(-) diff --git a/setup.py b/setup.py index de2ad54eb70..c9008920fa9 100755 --- a/setup.py +++ b/setup.py @@ -34,7 +34,6 @@ import glob from pprint import pprint as pp from setuptools import setup, find_packages -from setuptools.command.install import install from distutils.sysconfig import get_python_lib has_py2exe = False @@ -152,33 +151,12 @@ def data_files(): return files -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': 'openerp'} for mod, path in find_addons(): package_dirs['openerp.addons.' + mod] = path return package_dirs -class openerp_server_install(install): - def run(self): - # create startup script TODO not correct since the openerp lib was made - start_script = "#!/bin/sh\ncd %s\nexec %s ./openerp-server.py $@\n"\ - % (join(self.install_libbase, "openerp"), sys.executable) - # write script - f = open('openerp-server', 'w') - f.write(start_script) - f.close() - install.run(self) - - - options = { "py2exe": { "compressed": 1, @@ -197,6 +175,10 @@ options = { } } +#import pprint +#def setup(**args): +# pprint.pprint(args) + setup(name = name, version = version, description = description, @@ -207,32 +189,20 @@ setup(name = name, classifiers = filter(None, classifiers.split("\n")), license = license, data_files = data_files(), - cmdclass = { - 'install' : openerp_server_install, - }, - scripts = ['openerp-server'], - packages = [ - '.'.join(['openerp'] + package.split('.')[1:]) - for package in find_packages() - ], + scripts = ['openerp-server.py'], + packages = find_packages(), include_package_data = True, package_data = { '': ['*.yml', '*.xml', '*.po', '*.pot', '*.csv'], }, package_dir = find_package_dirs(), - console = [ - { - "script": "openerp-server.py", - "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))] - } - ], options = options, install_requires = [ - 'lxml', + 'lxml==2.1.5', # we require the same version as caldav 'mako', 'python-dateutil', 'psycopg2', - 'pychart', + 'pychart', # if not available from pypi, an alternate site is http://home.gna.org/pychart/ 'pydot', 'pytz', 'reportlab', From 43690eb21f88759f76f591247f43cf6aa548e611 Mon Sep 17 00:00:00 2001 From: "aag (OpenERP)" Date: Tue, 1 Mar 2011 12:52:41 +0530 Subject: [PATCH 03/87] [IMP] REWORK-SERVERSIDE :Improvement Config wiz , ON SERVER SIDE bzr revid: aag@tinyerp.co.in-20110301072241-a8s1iialq6xeot23 --- openerp/addons/base/ir/ir.xml | 2 +- openerp/addons/base/ir/ir_actions.py | 4 +-- .../wizard/base_module_configuration_view.xml | 2 +- .../addons/base/res/partner/partner_view.xml | 4 ++- openerp/addons/base/res/res_config.py | 31 +------------------ 5 files changed, 8 insertions(+), 35 deletions(-) diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index a7e9922331b..d1917a4a52f 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -1908,7 +1908,7 @@ search - + diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 7a07ca40ef8..1d73ad70171 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -794,14 +794,14 @@ class ir_actions_todo(osv.osv): 'sequence': fields.integer('Sequence'), 'state': fields.selection(TODO_STATES, string='State', required=True), 'name':fields.char('Name', size=64), - 'restart': fields.selection([('onskip','On Skip'),('always','Always'),('never','Never')],'Restart',required=True), + 'restart': fields.selection([('on_trigger','On Trigger'),('always','Always'),('never','Never')],'Restart',required=True), 'groups_id':fields.many2many('res.groups', 'res_groups_action_rel', 'uid', 'gid', 'Groups'), 'note':fields.text('Text', translate=True), } _defaults={ 'state': 'open', 'sequence': 10, - 'restart': 'onskip', + 'restart': 'on_trigger', } _order="sequence,name,id" diff --git a/openerp/addons/base/module/wizard/base_module_configuration_view.xml b/openerp/addons/base/module/wizard/base_module_configuration_view.xml index f8abf1e2732..be86145a156 100644 --- a/openerp/addons/base/module/wizard/base_module_configuration_view.xml +++ b/openerp/addons/base/module/wizard/base_module_configuration_view.xml @@ -24,7 +24,7 @@ action = obj.start() - diff --git a/openerp/addons/base/res/partner/partner_view.xml b/openerp/addons/base/res/partner/partner_view.xml index 9d46404132c..e32e73deedb 100644 --- a/openerp/addons/base/res/partner/partner_view.xml +++ b/openerp/addons/base/res/partner/partner_view.xml @@ -3,7 +3,9 @@ + web_icon_hover="data/sales-hover.png" + groups="base.group_sale_salesman,base.group_sale_salesman"/> + diff --git a/openerp/addons/base/res/res_config.py b/openerp/addons/base/res/res_config.py index 3f8c6f20b8d..2f0b5c44509 100644 --- a/openerp/addons/base/res/res_config.py +++ b/openerp/addons/base/res/res_config.py @@ -120,7 +120,7 @@ class res_config_configurable(osv.osv_memory): def start(self, cr, uid, ids, context=None): ids2 = self.pool.get('ir.actions.todo').search(cr, uid, [], context=context) for todo in self.pool.get('ir.actions.todo').browse(cr, uid, ids2, context=context): - if (todo.restart=='always') or (todo.restart=='onskip' and (todo.state in ('skip','cancel'))): + if (todo.restart=='always') or (todo.restart=='on_trigger' and (todo.state in ('skip','cancel'))): todo.write({'state':'open'}) return self.next(cr, uid, ids, context) @@ -355,35 +355,6 @@ class res_config_installer(osv.osv_memory): return (base | hooks_results | additionals) - set( map(attrgetter('name'), self._already_installed(cr, uid, context))) - def default_get(self, cr, uid, fields_list, context=None): - ''' If an addon is already installed, check it by default - ''' - defaults = super(res_config_installer, self).default_get( - cr, uid, fields_list, context=context) - - return dict(defaults, - **dict.fromkeys( - map(attrgetter('name'), - self._already_installed(cr, uid, context=context)), - True)) - - def fields_get(self, cr, uid, fields=None, context=None, write_access=True): - """ If an addon is already installed, set it to readonly as - res.config.installer doesn't handle uninstallations of already - installed addons - """ - fields = super(res_config_installer, self).fields_get( - cr, uid, fields, context, write_access) - - for module in self._already_installed(cr, uid, context=context): - if module.name not in fields: - continue - fields[module.name].update( - readonly=True, - help= ustr(fields[module.name].get('help', '')) + - _('\n\nThis addon is already installed on your system')) - return fields - def execute(self, cr, uid, ids, context=None): modules = self.pool.get('ir.module.module') to_install = list(self.modules_to_install( From 73378da514dd636ddafcd6ca4d552ae9db637efe Mon Sep 17 00:00:00 2001 From: sus Date: Tue, 1 Mar 2011 13:10:35 +0530 Subject: [PATCH 04/87] [IMP] : Improvement in server(module.py file) bzr revid: sus@sus-desktop-20110301074035-7fx0v3gv8889slbb --- openerp/addons/__init__.py | 2 +- openerp/addons/base/module/module.py | 58 ++++++++++++++----- openerp/addons/base/module/module_view.xml | 2 +- .../base/module/wizard/base_module_upgrade.py | 31 ---------- .../wizard/base_module_upgrade_view.xml | 16 ++--- openerp/addons/base/res/res_user.py | 1 - 6 files changed, 50 insertions(+), 60 deletions(-) diff --git a/openerp/addons/__init__.py b/openerp/addons/__init__.py index af080724136..ee6cd5eba49 100644 --- a/openerp/addons/__init__.py +++ b/openerp/addons/__init__.py @@ -843,7 +843,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False): if 'base' in tools.config['update'] or 'all' in tools.config['update']: cr.execute("update ir_module_module set state=%s where name=%s and state=%s", ('to upgrade', 'base', 'installed')) - # STEP 1: LOAD BASE (must be done before module dependencies can be computed for later steps) + # STEP 1: LOAD BASE (must be done before module dependencies can be computed for later steps) graph = create_graph(cr, ['base'], force) if not graph: logger.notifyChannel('init', netsvc.LOG_CRITICAL, 'module base cannot be loaded! (hint: verify addons-path)') diff --git a/openerp/addons/base/module/module.py b/openerp/addons/base/module/module.py index 2e276433e63..fd701ba353e 100644 --- a/openerp/addons/base/module/module.py +++ b/openerp/addons/base/module/module.py @@ -200,6 +200,7 @@ class module(osv.osv): def _name_uniq_msg(self, cr, uid, ids, context=None): return _('The name of the module must be unique !') + def _certificate_uniq_msg(self, cr, uid, ids, context=None): return _('The certificate ID of the module must be unique !') @@ -285,8 +286,41 @@ class module(osv.osv): demo = demo or mdemo return demo + def upgrade(self, cr, uid, ids, context=None): + mod_obj = self.pool.get('ir.module.module') + ids = mod_obj.search(cr, uid, [('state', 'in', ['to upgrade', 'to remove', 'to install'])]) + unmet_packages = [] + mod_dep_obj = self.pool.get('ir.module.module.dependency') + for mod in mod_obj.browse(cr, uid, ids, context=context): + depends_mod_ids = mod_dep_obj.search(cr, uid, [('module_id', '=', mod.id)], context=context) + for dep_mod in mod_dep_obj.browse(cr, uid, depends_mod_ids): + if dep_mod.state in ('unknown','uninstalled'): + unmet_packages.append(dep_mod.name) + if len(unmet_packages): + raise osv.except_osv(_('Unmet dependency !'), _('Following modules are not installed or unknown: %s') % ('\n\n' + '\n'.join(unmet_packages))) + mod_obj.download(cr, uid, ids, context=context) + cr.commit() + _db, pool = pooler.restart_pool(cr.dbname, update_module=True) + return True + def button_install(self, cr, uid, ids, context=None): - return self.state_update(cr, uid, ids, 'to install', ['uninstalled'], context) + self.state_update(cr, uid, ids, 'to install', ['uninstalled'], context) + self.upgrade(cr, uid, ids, context=context) + data_obj = self.pool.get('ir.model.data') + id2 = data_obj._get_id(cr, uid, 'base', 'view_base_module_upgrade_install') + if id2: + id2 = data_obj.browse(cr, uid, id2, context=context).res_id + return { + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'base.module.upgrade', + 'views': [(id2, 'form')], + 'view_id': False, + 'type': 'ir.actions.act_window', + 'target': 'new', + 'nodestroy':True, + } + def button_install_cancel(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state': 'uninstalled', 'demo':False}) @@ -305,49 +339,41 @@ class module(osv.osv): res = cr.fetchall() if res: raise orm.except_orm(_('Error'), _('Some installed modules depend on the module you plan to Uninstall :\n %s') % '\n'.join(map(lambda x: '\t%s: %s' % (x[0], x[1]), res))) + self.write(cr, uid, ids, {'state': 'to remove'}) + self.upgrade(cr, uid, ids, context=context) return True def button_uninstall_cancel(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state': 'installed'}) return True + def button_upgrade(self, cr, uid, ids, context=None): depobj = self.pool.get('ir.module.module.dependency') todo = self.browse(cr, uid, ids, context=context) self.update_list(cr, uid) - i = 0 while i -