From e2e28edc2e3c6009f116252e2a7af8f591eda5b4 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 09:51:28 +0100 Subject: [PATCH 01/21] [IMP] Remove print statements bzr revid: stephane@tinyerp.com-20081215085128-4bug8e2yq5io3bvp --- bin/netsvc.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/bin/netsvc.py b/bin/netsvc.py index 1ab06841156..b969ee2ff9f 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -263,7 +263,6 @@ class xmlrpc(object): class GenericXMLRPCRequestHandler: def _dispatch(self, method, params): - #print 'TERP-CALL : ',method, params import traceback try: n = self.path.split("/")[-1] @@ -398,8 +397,6 @@ class TinySocketClientThread(threading.Thread): ts.mysend(r) except Exception, e: tb_s = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)) - print e - print tb_s import tools if tools.config['debug_mode']: import pdb From 3ff2adc2e97cf4909be93ce52f6c2acaff2f32f1 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 11:07:09 +0100 Subject: [PATCH 02/21] [IMP] Remove the README of PyChart, because we use the package from the distribution bzr revid: stephane@tinyerp.com-20081215100709-b2hmdi2v7vn3j8zf --- doc/README.pychart | 68 ---------------------------------------------- 1 file changed, 68 deletions(-) delete mode 100644 doc/README.pychart diff --git a/doc/README.pychart b/doc/README.pychart deleted file mode 100644 index 88ae2156810..00000000000 --- a/doc/README.pychart +++ /dev/null @@ -1,68 +0,0 @@ -* What is this package? - -PyChart is a Python library for creating professional quality PS, PDF, -PNG, or SVG charts. It supports line plots, bar plots, range-fill -plots, and pie charts. Because it is based on Python, you can make -the full use of Python's scripting power. - -The PyChart home page is at -http://www.hpl.hp.com/personal/Yasushi_Saito/pychart - -* What you need - -You need Python (http://www.python.org) version 2.2 or later (on -Debian GNU/Linux, you need, python-xml package as well). You also need -Ghostscript (http://www.cs.wisc.edu/~ghost/) to produce PNG -files. - - Pychart used to require Ghostscript during PS and PDF - generation to obtain font metric information, but that's no - longer the case. - -* Platforms supported - -In theory, PyChart works on any platform with Python. In practice, -I've run PyChart on Linux and Win2000. - -* Installation - -Become a root and do: - - # python setup.py install - -Or, you can set PYTHONPATH environment variable before you start -Python. For example (in bash): - -% PYTHONPATH=~/PyChart-1.33/pychart python mumbo.py - -* Documentation - -A detailed documentation is found in doc/pychart. - -* Examples - -All the *.py files in the demos/ directory can be run directly. For -example, - - setenv PYTHONPATH .. - python linetest.py >foo.eps - gs foo.eps - -or - - setenv PYTHONPATH .. - setenv PYCHART_OPTIONS="format=pdf" - python linetest.py >foo.pdf - acroread foo.pdf - -* About the author - -Yasushi Saito (ysaito@hpl.hp.com), a full-time researcher and -part-time hacker. This program is created mainly to serve my personal -needs to write pretty charts for research papers. As such, it is -updated only when I'm writing a paper, which happens about once every -half year or so. - -Anyway, if you have comments, requests, or (even better) -fixes/enhancements, feel free to email me. - From 117907432bfd97355aaa4fb8e1bd5fee1d0e708c Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 11:07:46 +0100 Subject: [PATCH 03/21] [FIX] There was a warning about this file with the sdist target of the setup.py script bzr revid: stephane@tinyerp.com-20081215100746-t1b0s3i0rqiqwk6z --- doc/README.txt => README | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/README.txt => README (100%) diff --git a/doc/README.txt b/README similarity index 100% rename from doc/README.txt rename to README From 7c98dfe5745ed83e4fbc4d01619aa4606b423fd9 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 11:10:13 +0100 Subject: [PATCH 04/21] [FIX] Update the MANIFEST.in to include the rng files and the po files [IMP] Remove the unused code in the setup lp bug: https://launchpad.net/bugs/306039 fixed bzr revid: stephane@tinyerp.com-20081215101013-rug27ding4cf059c --- MANIFEST.in | 5 ++++- setup.py | 18 ++---------------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 9990668f60e..7d853e57b3c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,6 @@ +include README recursive-include doc * recursive-include man * -recursive-include bin *xml *xsl *sql *rml *sxw *csv +recursive-include bin *xml *xsl *sql *rml *sxw *csv *rng +graft bin/addons/ +global-exclude *pyc *~ diff --git a/setup.py b/setup.py index c0459d0864f..125f9e7b2a5 100755 --- a/setup.py +++ b/setup.py @@ -36,10 +36,6 @@ from stat import ST_MODE from distutils.core import setup, Command from distutils.command.install import install -from distutils.command.build import build -from distutils.command.build_scripts import build_scripts -from distutils.command.install_scripts import install_scripts -from distutils.file_util import copy_file if os.name == 'nt': import py2exe @@ -91,7 +87,6 @@ def data_files(): os.chdir('..') for (dp,dn,names) in os.walk('doc'): files.append((dp, map(lambda x: opj(dp, x), names))) - files.append(('.', [(opj('bin', 'import_xml.rng'))])) else: man_directory = opj('share', 'man') files.append((opj(man_directory, 'man1'), ['man/openerp-server.1'])) @@ -104,12 +99,9 @@ def data_files(): openerp_site_packages = opj('lib', 'python%s' % py_short_version, 'site-packages', 'openerp-server') - files.append((openerp_site_packages, [('bin/import_xml.rng')])) - for addon in find_addons(): add_path = addon.replace('.', os.path.sep).replace('openerp-server', 'bin', 1) addon_path = opj('lib', 'python%s' % py_short_version, 'site-packages', add_path.replace('bin', 'openerp-server', 1)) - pathfiles = [] for root, dirs, innerfiles in os.walk(add_path): innerfiles = filter(lambda file: os.path.splitext(file)[1] not in ('.pyc', '.py', '.pyd', '.pyo'), innerfiles) @@ -121,7 +113,7 @@ def data_files(): check_modules() f = file('openerp-server','w') -start_script = """#!/bin/sh\necho "OpenERP Setup - The content of this file is generated at the install stage" """ +start_script = """#!/bin/sh\necho "OpenERP Setup - The content of this file is generated at the install stage\n" """ f.write(start_script) f.close() @@ -177,13 +169,7 @@ setup(name = name, 'openerp-server.workflow'] + \ list(find_addons()), package_dir = {'openerp-server': 'bin'}, - console = [ - { "script" : "bin\\openerp-server.py", - "icon_resources" : [ - (1,"pixmaps\\openerp-icon.ico") - ] - } - ], + console = [ { "script" : "bin\\openerp-server.py", "icon_resources" : [ (1,"pixmaps\\openerp-icon.ico") ] } ], options = options, ) From a0ab07e6796ebf2617a83aa6b9820065a0a04cf2 Mon Sep 17 00:00:00 2001 From: Najlaa Date: Mon, 15 Dec 2008 11:16:11 +0100 Subject: [PATCH 05/21] Few changes in technical guide bzr revid: nel@silver-20081215101611-qocuubmzr9fo7nac --- .../module/report/ir_module_reference.rml | 60 ++++++++++-------- .../module/report/ir_module_reference.sxw | Bin 13249 -> 11183 bytes 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/bin/addons/base/module/report/ir_module_reference.rml b/bin/addons/base/module/report/ir_module_reference.rml index c047e1127b0..14d549e815c 100644 --- a/bin/addons/base/module/report/ir_module_reference.rml +++ b/bin/addons/base/module/report/ir_module_reference.rml @@ -3,6 +3,18 @@ @@ -95,6 +107,7 @@ + @@ -105,37 +118,28 @@ - - - - - - - - - Reference Guide - - - - - - - - - - [[ company.name ]] - - - Introspection report on objects - - - Printed: [[ time.strftime('%y-%m-%d')]] - - - + + + + + + + + Introspection report on objects + + + + + + + + + + +
[[ repeatIn(objects, 'module') ]] diff --git a/bin/addons/base/module/report/ir_module_reference.sxw b/bin/addons/base/module/report/ir_module_reference.sxw index a82a82fb2fdac25030ac53db4943a67f029467bd..f2344339a2a9e98d548cbb9bcea9299ab65de74b 100644 GIT binary patch literal 11183 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 X3esTUzfVK>^*R3p1k}#(yY{~TmQrxP From 3a19d1e4489d8bb77fa222774d0b7835f5787116 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 11:21:30 +0100 Subject: [PATCH 06/21] [FIX] Use the right notation for the version lp bug: https://launchpad.net/bugs/306037 fixed bzr revid: stephane@tinyerp.com-20081215102130-18vev9kgv3agd269 --- bin/release.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/release.py b/bin/release.py index 0930f6214aa..e749e2ab413 100644 --- a/bin/release.py +++ b/bin/release.py @@ -22,8 +22,8 @@ ############################################################################## name = 'openerp-server' -version = '5.0.0-rc1' -major_version = version.rsplit('.', 1)[0] +version = '5.0.0_rc1' +major_version = '5.0' description = 'OpenERP Server' long_desc = '''\ OpenERP is a complete ERP and CRM. The main features are accounting (analytic From 02cddb7861bf5619f4c22cfd1a1c16316d4b5d04 Mon Sep 17 00:00:00 2001 From: Najlaa Date: Mon, 15 Dec 2008 11:23:14 +0100 Subject: [PATCH 07/21] merge bzr revid: nel@silver-20081215102314-q5no573t1zcgkxpu --- bin/addons/gen_graph.sh | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100755 bin/addons/gen_graph.sh diff --git a/bin/addons/gen_graph.sh b/bin/addons/gen_graph.sh deleted file mode 100755 index 5a8682cc501..00000000000 --- a/bin/addons/gen_graph.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -############################################################################## -# -# Copyright (c) 2004-2008 TINY SPRL. (http://tiny.be) -# -# $Id$ -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsability of assessing all potential -# consequences resulting from its eventual inadequacies and bugs -# End users who are looking for a ready-to-use solution with commercial -# garantees and support are strongly adviced to contact a Free Software -# Service Company -# -# This program is Free Software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -############################################################################## - -./module_graph.py $@ | dot -Tpng -o > module_graph.png From 2753fdfdc5fe434cff9f0f7f2a25cb73bba7fe2a Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 11:48:56 +0100 Subject: [PATCH 08/21] [FIX] Remove the print statement bzr revid: stephane@tinyerp.com-20081215104856-jvcb3fr56sbkl145 --- bin/osv/fields.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bin/osv/fields.py b/bin/osv/fields.py index b3ac6164b84..544bd9b3fee 100644 --- a/bin/osv/fields.py +++ b/bin/osv/fields.py @@ -658,7 +658,6 @@ class related(function): return [(self._arg[0], 'in', sarg)] def _fnct_write(self,obj,cr, uid, ids, field_name, values, args, context=None): - print 'Related Write', obj._name if values and field_name: self._field_get2(cr, uid, obj, context) relation = obj._name From 13633b4427d6f7083f6178a24bdf1cac01fb6d4f Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 11:50:29 +0100 Subject: [PATCH 09/21] [FIX] Typo bzr revid: stephane@tinyerp.com-20081215105029-1eifxzmoquf8xv2m --- bin/addons/base/ir/ir.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml index 263f5428718..037afd9a311 100644 --- a/bin/addons/base/ir/ir.xml +++ b/bin/addons/base/ir/ir.xml @@ -1197,7 +1197,8 @@ - From 08b662555dc1996415b4f7726ab1cdeef0ad04c9 Mon Sep 17 00:00:00 2001 From: Jay Vora Date: Mon, 15 Dec 2008 17:15:05 +0530 Subject: [PATCH 10/21] Bugfix:XML records of report and act_window can now be overridden(as can be done with Wizard) bzr revid: jvo@tinyerp.com-20081215114505-87r9p9jesyym0f70 --- bin/tools/convert.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/tools/convert.py b/bin/tools/convert.py index aa24ea03cc2..d76e6ac7a43 100644 --- a/bin/tools/convert.py +++ b/bin/tools/convert.py @@ -284,11 +284,13 @@ form: module.record_id""" % (xml_id,) id = self.pool.get('ir.model.data')._update(cr, self.uid, "ir.actions.report.xml", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) self.idref[xml_id] = int(id) + + if not rec.hasAttribute('menu') or eval(rec.getAttribute('menu')): keyword = str(rec.getAttribute('keyword') or 'client_print_multi') keys = [('action',keyword),('res_model',res['model'])] value = 'ir.actions.report.xml,'+str(id) - replace = rec.hasAttribute('replace') and rec.getAttribute("replace") + replace = rec.hasAttribute('replace') and rec.getAttribute("replace") or True self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, res['name'], [res['model']], value, replace=replace, isobject=True, xml_id=xml_id) return False @@ -421,7 +423,7 @@ form: module.record_id""" % (xml_id,) keyword = 'client_action_relate' keys = [('action', keyword), ('res_model', res_model)] value = 'ir.actions.act_window,'+str(id) - replace = rec.hasAttribute('replace') and rec.getAttribute('replace') + replace = rec.hasAttribute('replace') and rec.getAttribute('replace') or True self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, xml_id, [src_model], value, replace=replace, isobject=True, xml_id=xml_id) # TODO add remove ir.model.data return False From 577e96bb53ae1e538502f3b501ae3b68098d0974 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 12:45:41 +0100 Subject: [PATCH 11/21] [IMP] Remove the unused exception bzr revid: stephane@tinyerp.com-20081215114541-zv3k4sumcxrlqeoc --- bin/addons/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py index 43dd256055c..d1ea52c0a63 100644 --- a/bin/addons/__init__.py +++ b/bin/addons/__init__.py @@ -140,8 +140,6 @@ def get_module_path(module): logger.notifyChannel('init', netsvc.LOG_WARNING, 'module %s: module not found' % (module,)) return False - raise IOError, 'Module not found : %s' % module - def get_module_filetree(module, dir='.'): path = get_module_path(module) From 73736db39d5846809108d77ab019998603e3867f Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 12:48:39 +0100 Subject: [PATCH 12/21] [REF] Clean bzr revid: stephane@tinyerp.com-20081215114839-v3ixe1ktg1xhkd3r --- bin/osv/orm.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/bin/osv/orm.py b/bin/osv/orm.py index 25d2f310b8f..1375794aaf3 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -709,8 +709,7 @@ class orm_template(object): translation_obj = self.pool.get('ir.translation') model_access_obj = self.pool.get('ir.model.access') for parent in self._inherits: - res.update(self.pool.get(parent).fields_get(cr, user, fields, - context)) + res.update(self.pool.get(parent).fields_get(cr, user, fields, context)) for f in self._columns.keys(): if fields and f not in fields: continue @@ -727,12 +726,10 @@ class orm_template(object): and getattr(self._columns[f], arg): res[f][arg] = getattr(self._columns[f], arg) - res_trans = translation_obj._get_source(cr, user, - self._name + ',' + f, 'field', context.get('lang', False) or 'en_US') + res_trans = translation_obj._get_source(cr, user, self._name + ',' + f, 'field', context.get('lang', False) or 'en_US') if res_trans: res[f]['string'] = res_trans - help_trans = translation_obj._get_source(cr, user, - self._name + ',' + f, 'help', context.get('lang', False) or 'en_US') + help_trans = translation_obj._get_source(cr, user, self._name + ',' + f, 'help', context.get('lang', False) or 'en_US') if help_trans: res[f]['help'] = help_trans @@ -744,9 +741,7 @@ class orm_template(object): for (key, val) in sel: val2 = None if val: - val2 = translation_obj._get_source(cr, user, - self._name + ',' + f, 'selection', - context.get('lang', False) or 'en_US', val) + val2 = translation_obj._get_source(cr, user, self._name + ',' + f, 'selection', context.get('lang', False) or 'en_US', val) sel2.append((key, val2 or val)) sel = sel2 res[f]['selection'] = sel From 7b6ed023c0cb54096a7110e923566b77ba7eb39b Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 15 Dec 2008 12:58:01 +0100 Subject: [PATCH 13/21] [FIX] fix with cache key generation lp bug: https://launchpad.net/bugs/307734 fixed bzr revid: christophe@cobalt-20081215115801-3x1ycw64uak5yvdk --- bin/tools/misc.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/bin/tools/misc.py b/bin/tools/misc.py index 8d2a821f5d7..fbdaf44c55b 100644 --- a/bin/tools/misc.py +++ b/bin/tools/misc.py @@ -531,12 +531,14 @@ def is_hashable(h): except TypeError: return False -# -# Use it as a decorator of the function you plan to cache -# Timeout: 0 = no timeout, otherwise in seconds -# class cache(object): + """ + Use it as a decorator of the function you plan to cache + Timeout: 0 = no timeout, otherwise in seconds + """ + def __init__(self, timeout=10000, skiparg=2, multi=None): + assert skiparg >= 2 # at least self and cr self.timeout = timeout self.skiparg = skiparg self.multi = multi @@ -553,9 +555,9 @@ class cache(object): del self.cache[kwargs['clear_keys']] return True - # Update named arguments with positional argument values + # Update named arguments with positional argument values (without self and cr) kwargs2 = kwargs.copy() - kwargs2.update(dict(zip(arg_names, args))) + kwargs2.update(dict(zip(arg_names, args[self.skiparg-2:]))) for k in kwargs2: if isinstance(kwargs2[k], (list, dict, set)): kwargs2[k] = tuple(kwargs2[k]) @@ -577,7 +579,7 @@ class cache(object): # Work out new value, cache it and return it # FIXME Should copy() this value to avoid futur modifications of the cache ? # FIXME What about exceptions ? - result = fn(self2,cr,*args, **kwargs) + result = fn(self2, cr, *args, **kwargs) self.cache[key] = (result, time.time()) return result From 8855ece8fdf21cf7f3280553e4c49a23012264a1 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 13:29:58 +0100 Subject: [PATCH 14/21] [IMP] Load the real modules bzr revid: stephane@tinyerp.com-20081215122958-z9i0mdeydr7wuuh7 --- bin/addons/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py index d1ea52c0a63..fd7889bf268 100644 --- a/bin/addons/__init__.py +++ b/bin/addons/__init__.py @@ -191,7 +191,11 @@ def get_modules(): if name[-4:] == '.zip': name = name[:-4] return name - return map(clean, os.listdir(dir)) + + def is_really_module(name): + name = opj(dir, name) + return os.path.isdir(name) or zipfile.is_zipfile(name) + return map(clean, filter(is_really_module, os.listdir(dir))) return list(set(listdir(ad) + listdir(_ad))) From c0e1fc3452362e4479351a8be040679c879ccc02 Mon Sep 17 00:00:00 2001 From: Mantavya Gajjar Date: Mon, 15 Dec 2008 18:00:34 +0530 Subject: [PATCH 15/21] merginf from the trunk bzr revid: mga@tinyerp.com-20081215123034-1gnqhxeteza8e183 --- bin/addons/base/ir/ir_actions.py | 13 ++----------- bin/netsvc.py | 1 + bin/sql_db.py | 2 +- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/bin/addons/base/ir/ir_actions.py b/bin/addons/base/ir/ir_actions.py index d31a13211a5..78ba0161999 100644 --- a/bin/addons/base/ir/ir_actions.py +++ b/bin/addons/base/ir/ir_actions.py @@ -372,15 +372,6 @@ class actions_server(osv.osv): " or t.act_to = a.wkf_id ") return cr.fetchall() - def on_trigger_obj_id(self, cr, uid, ids, context={}): - cr.execute("select distinct t.signal as key, t.signal as val from wkf w, wkf_activity a, wkf_transition t "\ - " where w.id = a.wkf_id " \ - " and t.act_from = a.wkf_id " \ - " or t.act_to = a.wkf_id " \ - " and w.osv = %s ", ('account.invoice')) - data = cr.fetchall() - return {"values":{'trigger_name':data}} - _name = 'ir.actions.server' _table = 'ir_act_server' _sequence = 'ir_actions_id_seq' @@ -568,7 +559,7 @@ class actions_server(osv.osv): if exp.type == 'equation': obj_pool = self.pool.get(action.model_id.model) obj = obj_pool.browse(cr, uid, context['active_id'], context=context) - expr = eval(euq, {'context':context, 'object': obj}) + expr = eval(euq, {'context':context, 'object': obj, 'time':time}) else: expr = exp.value res[exp.col1.name] = expr @@ -592,7 +583,7 @@ class actions_server(osv.osv): if exp.type == 'equation': obj_pool = self.pool.get(action.model_id.model) obj = obj_pool.browse(cr, uid, context['active_id'], context=context) - expr = eval(euq, {'context':context, 'object': obj}) + expr = eval(euq, {'context':context, 'object': obj, 'time':time}) else: expr = exp.value res[exp.col1.name] = expr diff --git a/bin/netsvc.py b/bin/netsvc.py index b969ee2ff9f..3e73fc88785 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -263,6 +263,7 @@ class xmlrpc(object): class GenericXMLRPCRequestHandler: def _dispatch(self, method, params): + #print 'TERP-CALL : ',method, params import traceback try: n = self.path.split("/")[-1] diff --git a/bin/sql_db.py b/bin/sql_db.py index 08b6a25da79..335a0950c13 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -117,7 +117,7 @@ class Cursor(object): if self.sql_log: now = mdt.now() - + res = self._obj.execute(query, p or None) if self.sql_log: From b1ea2dafc3fca01afc5438af083ef47873ab4456 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 13:36:33 +0100 Subject: [PATCH 16/21] [FIX] Load the zip files lp bug: https://launchpad.net/bugs/306445 fixed bzr revid: stephane@tinyerp.com-20081215123633-ga5d140mv83wvg8c --- bin/addons/base/module/module.py | 43 ++++++++------------------------ 1 file changed, 10 insertions(+), 33 deletions(-) diff --git a/bin/addons/base/module/module.py b/bin/addons/base/module/module.py index 439cf5b57a6..376e80450f9 100644 --- a/bin/addons/base/module/module.py +++ b/bin/addons/base/module/module.py @@ -292,10 +292,7 @@ class module(osv.osv): res = [0, 0] # [update, add] # iterate through installed modules and mark them as being so - for name in addons.get_modules(): - mod_name = name - if name[-4:]=='.zip': - mod_name=name[:-4] + for mod_name in addons.get_modules(): ids = self.search(cr, uid, [('name','=',mod_name)]) if ids: id = ids[0] @@ -304,8 +301,7 @@ class module(osv.osv): if terp.get('installable', True) and mod.state == 'uninstallable': self.write(cr, uid, id, {'state': 'uninstalled'}) if parse_version(terp.get('version', '')) > parse_version(mod.latest_version or ''): - self.write(cr, uid, id, { - 'url': ''}) + self.write(cr, uid, id, { 'url': ''}) res[0] += 1 self.write(cr, uid, id, { 'description': terp.get('description', ''), @@ -314,28 +310,16 @@ class module(osv.osv): 'website': terp.get('website', ''), 'license': terp.get('license', 'GPL-2'), }) - cr.execute('DELETE FROM ir_module_module_dependency\ - WHERE module_id = %s', (id,)) - self._update_dependencies(cr, uid, ids[0], terp.get('depends', - [])) - self._update_category(cr, uid, ids[0], terp.get('category', - 'Uncategorized')) + cr.execute('DELETE FROM ir_module_module_dependency WHERE module_id = %s', (id,)) + self._update_dependencies(cr, uid, ids[0], terp.get('depends', [])) + self._update_category(cr, uid, ids[0], terp.get('category', 'Uncategorized')) continue - terp_file = addons.get_module_resource(name, '__terp__.py') - mod_path = addons.get_module_path(name) - if mod_path and (os.path.isdir(mod_path) or os.path.islink(mod_path) or zipfile.is_zipfile(mod_path)): + mod_path = addons.get_module_path(mod_name) + if mod_path: terp = self.get_module_info(mod_name) if not terp or not terp.get('installable', True): continue - #if not os.path.isfile( mod_path ): - # import imp - # path = imp.find_module(mod_name, [addons.ad, addons._ad]) - # imp.load_module(name, *path) - #else: - # import zipimport - # zimp = zipimport.zipimporter(mod_path) - # zimp.load_module(mod_name) id = self.create(cr, uid, { 'name': mod_name, 'state': 'uninstalled', @@ -349,8 +333,6 @@ class module(osv.osv): self._update_dependencies(cr, uid, id, terp.get('depends', [])) self._update_category(cr, uid, id, terp.get('category', 'Uncategorized')) - #import socket - #socket.setdefaulttimeout(10) for repository in robj.browse(cr, uid, robj.search(cr, uid, [])): try: index_page = urllib.urlopen(repository.url).read() @@ -363,9 +345,7 @@ class module(osv.osv): modules = re.findall(repository.filter, index_page, re.I+re.M) mod_sort = {} for m in modules: - name = m[0] - version = m[1] - extension = m[-1] + name, version, extension = m[0], m[1], m[-1] if version == 'x': # 'x' version was a mistake version = '0' if name in mod_sort: @@ -390,16 +370,13 @@ class module(osv.osv): if installed_version == 'x': # 'x' version was a mistake installed_version = '0' if parse_version(version) > parse_version(installed_version): - self.write(cr, uid, id, { - 'url': url - }) + self.write(cr, uid, id, { 'url': url }) res[0] += 1 published_version = self.read(cr, uid, id, ['published_version'])['published_version'] if published_version == 'x' or not published_version: published_version = '0' if parse_version(version) > parse_version(published_version): - self.write(cr, uid, id, - {'published_version': version}) + self.write(cr, uid, id, {'published_version': version}) return res def download(self, cr, uid, ids, download=True, context=None): From 66a6c4d10a753253c1d123e716d678215bb9cedc Mon Sep 17 00:00:00 2001 From: Mantavya Gajjar Date: Mon, 15 Dec 2008 18:30:08 +0530 Subject: [PATCH 17/21] improvement in the server action bzr revid: mga@tinyerp.com-20081215130008-9aecetcvx93vav2w --- bin/addons/base/ir/ir_actions.py | 5 +++++ bin/netsvc.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/addons/base/ir/ir_actions.py b/bin/addons/base/ir/ir_actions.py index 78ba0161999..d456725bac4 100644 --- a/bin/addons/base/ir/ir_actions.py +++ b/bin/addons/base/ir/ir_actions.py @@ -365,6 +365,11 @@ server_object_lines() # class actions_server(osv.osv): + def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False): + res = super(actions_server, self).fields_view_get(cr, user, view_id, view_type, context, toolbar) + #print 'RES : ',res + return res + def _select_signals(self, cr, uid, context={}): cr.execute("select distinct t.signal as key, t.signal || ' - [ ' || w.osv || ' ] ' as val from wkf w, wkf_activity a, wkf_transition t "\ " where w.id = a.wkf_id " \ diff --git a/bin/netsvc.py b/bin/netsvc.py index 3e73fc88785..73cbdfceeff 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -263,7 +263,7 @@ class xmlrpc(object): class GenericXMLRPCRequestHandler: def _dispatch(self, method, params): - #print 'TERP-CALL : ',method, params +# print 'TERP-CALL : ',method, params import traceback try: n = self.path.split("/")[-1] From d9b561cd5b01e982c00c5c94bc13bf6ad21b140b Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 15 Dec 2008 14:49:06 +0100 Subject: [PATCH 18/21] [FIX] update the module list when upgrading the modules. bzr revid: christophe@cobalt-20081215134906-zvavnfbnb29e0053 --- bin/addons/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py index fd7889bf268..e18213d466f 100644 --- a/bin/addons/__init__.py +++ b/bin/addons/__init__.py @@ -547,9 +547,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False): modobj = pool.get('ir.module.module') logger.notifyChannel('init', netsvc.LOG_INFO, 'updating modules list') - cr.execute("select id from ir_module_module where state in ('to install','to upgrade') and name=%s", ('base',)) - if cr.rowcount: - modobj.update_list(cr, 1) + modobj.update_list(cr, 1) mods = [k for k in tools.config['init'] if tools.config['init'][k]] if mods: From 85c8b304bfbaa715c92b878c0e51d8924f012db9 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 15 Dec 2008 16:08:35 +0100 Subject: [PATCH 19/21] [FIX] fix a stupid bug in database closing method lp bug: https://launchpad.net/bugs/308084 fixed bzr revid: christophe@cobalt-20081215150835-d4rkvaf35m1gbyj6 --- bin/sql_db.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/sql_db.py b/bin/sql_db.py index 335a0950c13..03828a1ee87 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -221,7 +221,7 @@ class PoolManager(object): get = staticmethod(get) def close(db_name): - if db_name is PoolManager._pools: + if db_name in PoolManager._pools: logger.notifyChannel('dbpool', netsvc.LOG_INFO, 'Closing all connections to %s' % (db_name,)) PoolManager._pools[db_name].closeall() del PoolManager._pools[db_name] From 9f9f2ff78e08cd826f09f3f7dab0a80723112bbf Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 16:10:36 +0100 Subject: [PATCH 20/21] bugfix: search: ('id', 'in', 'ids') instead of ('id', '=', 'ids') bzr revid: olt@tinyerp.com-20081215151036-brk5sgbq5o7ci9jk --- bin/report/report_sxw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/report/report_sxw.py b/bin/report/report_sxw.py index ddf0393e910..501dd285f27 100644 --- a/bin/report/report_sxw.py +++ b/bin/report/report_sxw.py @@ -613,7 +613,7 @@ class report_sxw(report_rml): else: ir_menu_report_obj = pool.get('ir.ui.menu') report_menu_ids = ir_menu_report_obj.search(cr, uid, - [('id', '=', ids)], context=context) + [('id', 'in', ids)], context=context) if report_menu_ids: report_name = ir_menu_report_obj.browse(cr, uid, report_menu_ids[0], context=context) From be2a0a76bbd95ce83cc68a10ce25e5b60279a0e6 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 15 Dec 2008 16:36:16 +0100 Subject: [PATCH 21/21] [FIX] the database connectin pool generate at least one connection to ensure earliest that the database is reachable bzr revid: christophe@cobalt-20081215153616-dyb7xj771tzj5de1 --- bin/sql_db.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/sql_db.py b/bin/sql_db.py index 03828a1ee87..3f4e23cc392 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -213,9 +213,9 @@ class PoolManager(object): logger = netsvc.Logger() try: logger.notifyChannel('dbpool', netsvc.LOG_INFO, 'Connecting to %s' % (db_name,)) - PoolManager._pools[db_name] = ConnectionPool(ThreadedConnectionPool(0, PoolManager.maxconn, PoolManager.dsn(db_name)), db_name) + PoolManager._pools[db_name] = ConnectionPool(ThreadedConnectionPool(1, PoolManager.maxconn, PoolManager.dsn(db_name)), db_name) except Exception, e: - logger.notifyChannel('dbpool', netsvc.LOG_CRITICAL, 'Unable to connect to %s: %r' % (db_name, e)) + logger.notifyChannel('dbpool', netsvc.LOG_CRITICAL, 'Unable to connect to %s: %s' % (db_name, e.message)) raise return PoolManager._pools[db_name] get = staticmethod(get)