summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Simonis <christophe@tinyerp.com>2008-07-22 09:53:57 +0200
committerChristophe Simonis <christophe@tinyerp.com>2008-07-22 09:53:57 +0200
commitc5c7c2ef07b346b72eb5a48d6e8cc7a433fba2e8 (patch)
treef4842f20a7ffe586d4768b43dfc7c870d94ce4da
parentbdc48f12a876407d138cfa6db84e04f8e805e312 (diff)
parent4b10e8cea564029614f85623744f56dbd15fb706 (diff)
merge
bzr revid: christophe@tinyerp.com-20080722075357-z9pfuk3qrwph8pbw
-rw-r--r--bin/addons/__init__.py55
-rw-r--r--bin/addons/base/base.sql8
-rw-r--r--bin/addons/base/module/module.py23
-rw-r--r--bin/osv/fields.py1
-rw-r--r--bin/osv/orm.py5
-rw-r--r--bin/osv/osv.py23
-rw-r--r--bin/report/interface.py15
-rw-r--r--bin/report/print_xml.py4
-rw-r--r--bin/tools/graph.py7
-rw-r--r--bin/tools/misc.py82
-rwxr-xr-xsetup.py2
11 files changed, 129 insertions, 96 deletions
diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py
index f1d74009ff5..cefd6859e6c 100644
--- a/bin/addons/__init__.py
+++ b/bin/addons/__init__.py
@@ -45,8 +45,8 @@ logger = netsvc.Logger()
opj = os.path.join
-_ad = opj(tools.config['root_path'], 'addons') # default addons path (base)
-ad = tools.config['addons_path'] # alternate addons path
+_ad = os.path.abspath(opj(tools.config['root_path'], 'addons')) # default addons path (base)
+ad = os.path.abspath(tools.config['addons_path']) # alternate addons path
sys.path.insert(1, _ad)
if ad != _ad:
@@ -131,10 +131,37 @@ class Node(Singleton):
s += '%s`-> %s' % (' ' * depth, c._pprint(depth+1))
return s
-def _get_module_path(module):
- if os.path.exists(opj(ad, module)):
+def get_module_path(module):
+ """Return the path of the given module.
+ """
+
+ if os.path.exists(opj(ad, module)) or os.path.exists(opj(ad, '%s.zip' % module)):
return opj(ad, module)
- return opj(_ad, module)
+
+ if os.path.exists(opj(_ad, module)) or os.path.exists(opj(_ad, '%s.zip' % module)):
+ return opj(_ad, module)
+
+ raise IOError, 'Module not found : %s' % module
+
+def get_module_resource(module, *args):
+ """Return the full path of a resource of the given module.
+
+ @param module: the module
+ @param args: the resource path components
+
+ @return: absolute path to the resource
+ """
+ return opj(get_module_path(module), *args)
+
+def get_modules():
+ """Returns the list of module names
+ """
+
+ module_list = os.listdir(ad)
+ module_names = [os.path.basename(m) for m in module_list]
+ module_list += [m for m in os.listdir(_ad) if m not in module_names]
+
+ return module_list
def create_graph(module_list, force=None):
if not force:
@@ -145,9 +172,9 @@ def create_graph(module_list, force=None):
for module in module_list:
if module[-4:]=='.zip':
module = module[:-4]
- mod_path = _get_module_path(module)
- terp_file = opj(mod_path, '__terp__.py')
- if os.path.isfile(terp_file) or zipfile.is_zipfile(mod_path+'.zip'):
+ mod_path = get_module_path(module)
+ terp_file = get_module_resource(module, '__terp__.py')
+ if os.path.isfile(terp_file) or zipfile.is_zipfile(mod_path):
try:
info = eval(tools.file_open(terp_file).read())
except:
@@ -254,24 +281,20 @@ def load_module_graph(cr, graph, status=None, **kwargs):
cr.commit()
def register_classes():
- module_list = os.listdir(ad)
- module_names = [os.path.basename(m) for m in module_list]
- module_list += [m for m in os.listdir(_ad) if m not in module_names]
-
+ module_list = get_modules()
for package in create_graph(module_list):
m = package.name
logger.notifyChannel('init', netsvc.LOG_INFO, 'addon:%s:registering classes' % m)
sys.stdout.flush()
- mod_path = _get_module_path(m)
- if not os.path.isfile(mod_path + '.zip'):
+ mod_path = get_module_path(m)
+ if not os.path.isfile(mod_path+'.zip'):
# XXX must restrict to only addons paths
imp.load_module(m, *imp.find_module(m))
else:
import zipimport
- mod_path = mod_path + '.zip'
try:
- zimp = zipimport.zipimporter(mod_path)
+ zimp = zipimport.zipimporter(mod_path+'.zip')
zimp.load_module(m)
except zipimport.ZipImportError:
logger.notifyChannel('init', netsvc.LOG_ERROR, 'Couldn\'t find module %s' % m)
diff --git a/bin/addons/base/base.sql b/bin/addons/base/base.sql
index 05696f4dc56..5b0ffb138e4 100644
--- a/bin/addons/base/base.sql
+++ b/bin/addons/base/base.sql
@@ -2,13 +2,6 @@
-- Pure SQL
-------------------------------------------------------------------------
-CREATE TABLE inherit (
- obj_type varchar(128) not null,
- obj_id int not null,
- inst_type varchar(128) not null,
- inst_id int not null
-);
-
-------------------------------------------------------------------------
-- IR dictionary
-------------------------------------------------------------------------
@@ -336,3 +329,4 @@ CREATE TABLE ir_model_data (
res_id integer, primary key(id)
);
+
diff --git a/bin/addons/base/module/module.py b/bin/addons/base/module/module.py
index 0ebb5d9ab79..1ad9a844ea0 100644
--- a/bin/addons/base/module/module.py
+++ b/bin/addons/base/module/module.py
@@ -38,9 +38,7 @@ import release
import zipimport
import wizard
-
-
-
+import addons
ver_regexp = re.compile("^(\\d+)((\\.\\d+)*)([a-z]?)((_(pre|p|beta|alpha|rc)\\d*)*)(-r(\\d+))?$")
suffix_regexp = re.compile("^(alpha|beta|rc|pre|p)(\\d*)$")
@@ -199,7 +197,7 @@ class module(osv.osv):
def get_module_info(self, name):
try:
- f = tools.file_open(os.path.join(tools.config['addons_path'], name, '__terp__.py'))
+ f = tools.file_open(os.path.join(name, '__terp__.py'))
data = f.read()
info = eval(data)
if 'version' in info:
@@ -343,18 +341,17 @@ class module(osv.osv):
filepath = files[lang]
# if filepath does not contain :// we prepend the path of the module
if filepath.find('://') == -1:
- filepath = os.path.join(tools.config['addons_path'], module['name'], filepath)
+ filepath = addons.get_module_resource(module['name'], filepath)
tools.trans_load(filepath, lang)
return True
# update the list of available packages
def update_list(self, cr, uid, context={}):
robj = self.pool.get('ir.module.repository')
- adp = tools.config['addons_path']
res = [0, 0] # [update, add]
# iterate through installed modules and mark them as being so
- for name in os.listdir(adp):
+ for name in addons.get_modules():
mod_name = name
if name[-4:]=='.zip':
mod_name=name[:-4]
@@ -384,20 +381,19 @@ class module(osv.osv):
self._update_category(cr, uid, ids[0], terp.get('category',
'Uncategorized'))
continue
- terp_file = os.path.join(adp, name, '__terp__.py')
- mod_path = os.path.join(adp, name)
+ terp_file = addons.get_module_resource(name, '__terp__.py')
+ mod_path = addons.get_module_path(name)
if os.path.isdir(mod_path) or os.path.islink(mod_path) or zipfile.is_zipfile(mod_path):
terp = self.get_module_info(mod_name)
if not terp or not terp.get('installable', True):
continue
- if not os.path.isfile(os.path.join(adp, mod_name+'.zip')):
+ if not os.path.isfile(mod_path+'.zip'):
import imp
# XXX must restrict to only addons paths
imp.load_module(name, *imp.find_module(mod_name))
else:
import zipimport
- mod_path = os.path.join(adp, mod_name+'.zip')
- zimp = zipimport.zipimporter(mod_path)
+ zimp = zipimport.zipimporter(mod_path+'.zip')
zimp.load_module(mod_name)
id = self.create(cr, uid, {
'name': mod_name,
@@ -472,7 +468,6 @@ class module(osv.osv):
def download(self, cr, uid, ids, download=True, context=None):
res = []
- adp = tools.config['addons_path']
for mod in self.browse(cr, uid, ids, context=context):
if not mod.url:
continue
@@ -486,7 +481,7 @@ class module(osv.osv):
if not download:
continue
zipfile = urllib.urlopen(mod.url).read()
- fname = os.path.join(adp, mod.name+'.zip')
+ fname = addons.get_module_path(mod.name+'.zip')
try:
fp = file(fname, 'wb')
fp.write(zipfile)
diff --git a/bin/osv/fields.py b/bin/osv/fields.py
index 32544bcb9c3..8f6ee185ad8 100644
--- a/bin/osv/fields.py
+++ b/bin/osv/fields.py
@@ -333,7 +333,6 @@ class one2many(_column):
for r in obj.pool.get(self._obj).read(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'):
if r[self._fields_id] in res:
res[r[self._fields_id]].append( r['id'] )
- print 'Ok', res
return res
def set_memory(self, cr, obj, id, field, values, user=None, context=None):
diff --git a/bin/osv/orm.py b/bin/osv/orm.py
index 5b770f51be2..789d2fa27f8 100644
--- a/bin/osv/orm.py
+++ b/bin/osv/orm.py
@@ -1842,10 +1842,6 @@ class orm(orm_template):
_('You try to bypass an access rule (Document type: %s).') % \
self._description)
- cr.execute('delete from inherit ' \
- 'where (obj_type=%s and obj_id in ('+str_d+')) ' \
- 'or (inst_type=%s and inst_id in ('+str_d+'))',
- (self._name,)+tuple(sub_ids)+(self._name,)+tuple(sub_ids))
if d1:
cr.execute('delete from "'+self._table+'" ' \
'where id in ('+str_d+')'+d1, sub_ids+d2)
@@ -2089,7 +2085,6 @@ class orm(orm_template):
upd0 += ','+self._inherits[table]
upd1 += ',%d'
upd2.append(id)
- cr.execute('insert into inherit (obj_type,obj_id,inst_type,inst_id) values (%s,%d,%s,%d)', (table,id,self._name,id_new))
for field in vals:
if self._columns[field]._classic_write:
diff --git a/bin/osv/osv.py b/bin/osv/osv.py
index 49099aa7142..3b948aec5d3 100644
--- a/bin/osv/osv.py
+++ b/bin/osv/osv.py
@@ -68,33 +68,12 @@ class osv_pool(netsvc.Service):
self.exportMethod(self.execute_cr)
def execute_cr(self, cr, uid, obj, method, *args, **kw):
- #
- # TODO: check security level
- #
try:
object = pooler.get_pool(cr.dbname).get(obj)
if not object:
self.abortResponse(1, 'Object Error', 'warning',
'Object %s doesn\'t exist' % str(obj))
- if (not method in getattr(object,'_protected')) and len(args) \
- and args[0] and len(object._inherits):
- types = {obj: args[0]}
- cr.execute('select inst_type,inst_id,obj_id \
- from inherit \
- where obj_type=%s \
- and obj_id in ('+','.join(map(str,args[0]))+')', (obj,))
- for ty,id,id2 in cr.fetchall():
- if not ty in types:
- types[ty]=[]
- types[ty].append(id)
- types[obj].remove(id2)
- for t,ids in types.items():
- if len(ids):
- object_t = pooler.get_pool(cr.dbname).get(t)
- res = getattr(object_t,method)(cr, uid, ids, *args[1:], **kw)
- else:
- res = getattr(object,method)(cr, uid, *args, **kw)
- return res
+ return getattr(object,method)(cr, uid, *args, **kw)
except orm.except_orm, inst:
self.abortResponse(1, inst.name, 'warning', inst.value)
except except_osv, inst:
diff --git a/bin/report/interface.py b/bin/report/interface.py
index 5a5333cf462..63757ad6151 100644
--- a/bin/report/interface.py
+++ b/bin/report/interface.py
@@ -37,6 +37,7 @@ import netsvc
import pooler
import tools
+import addons
import print_xml
import render
import urllib
@@ -121,7 +122,7 @@ class report_rml(report_int):
pos_xml = i.end()
doc = print_xml.document(cr, uid, {}, {})
- tmpl_path = os.path.join(tools.config['root_path'], 'addons/custom/corporate_defaults.xml')
+ tmpl_path = addons.get_module_resource('custom', 'corporate_defaults.xml')
doc.parse(tmpl_path, [uid], 'res.users', context)
corporate_header = doc.xml_get()
doc.close()
@@ -146,16 +147,14 @@ class report_rml(report_int):
return xml
# load XSL (parse it to the XML level)
- styledoc = libxml2.parseDoc(tools.file_open(
- os.path.join(tools.config['root_path'], self.xsl)).read())
- xsl_path, tail = os.path.split(os.path.join(tools.config['root_path'],
- self.xsl))
+ styledoc = libxml2.parseDoc(tools.file_open(self.xsl).read())
+ xsl_path, tail = os.path.split(self.xsl)
for child in styledoc.children:
if child.name == 'import':
if child.hasProp('href'):
- file = child.prop('href')
- child.setProp('href', urllib.quote(str(
- os.path.normpath(os.path.join(xsl_path, file)))))
+ imp_file = child.prop('href')
+ _x, imp_file = tools.file_open(imp_file, subdir=xsl_path, pathinfo=True)
+ child.setProp('href', urllib.quote(str(imp_file)))
#TODO: get all the translation in one query. That means we have to:
# * build a list of items to translate,
diff --git a/bin/report/print_xml.py b/bin/report/print_xml.py
index 2370f5344db..75c700e3927 100644
--- a/bin/report/print_xml.py
+++ b/bin/report/print_xml.py
@@ -353,9 +353,7 @@ class document(object):
if not context:
context={}
# parses the xml template to memory
- self.dom = minidom.parseString(tools.file_open(
- os.path.join(tools.config['root_path'],
- filename)).read())
+ self.dom = minidom.parseString(tools.file_open(filename).read())
# create the xml data from the xml template
self.parse_tree(ids, model, context)
diff --git a/bin/tools/graph.py b/bin/tools/graph.py
index c14a3e2488b..c271726b79c 100644
--- a/bin/tools/graph.py
+++ b/bin/tools/graph.py
@@ -290,11 +290,14 @@ class graph(object):
return self.result
if __name__=='__main__':
- starting_node = ['mrp'] # put here nodes with flow_start=True
- nodes = ['project','account','hr','base','product','mrp','test']
+ starting_node = ['profile'] # put here nodes with flow_start=True
+ nodes = ['project','account','hr','base','product','mrp','test','profile']
transitions = [
+ ('profile','mrp'),
('mrp','project'),
('project','product'),
+ ('mrp','hr'),
+ ('mrp','test'),
('project','account'),
('project','hr'),
('product','base'),
diff --git a/bin/tools/misc.py b/bin/tools/misc.py
index b8f9b61763f..4523c762c0a 100644
--- a/bin/tools/misc.py
+++ b/bin/tools/misc.py
@@ -50,25 +50,23 @@ else:
# initialize a database with base/base.sql
def init_db(cr):
- f = os.path.join(config['addons_path'], 'base/base.sql')
+ import addons
+ f = addons.get_module_resource('base', 'base.sql')
for line in file(f).read().split(';'):
if (len(line)>0) and (not line.isspace()):
cr.execute(line)
cr.commit()
- opj = os.path.join
- ad = config['addons_path']
-
- for i in os.listdir(ad):
- terp_file = opj(ad, i, '__terp__.py')
- mod_path = opj(ad, i)
+ for i in addons.get_modules():
+ terp_file = addons.get_module_resource(i, '__terp__.py')
+ mod_path = addons.get_module_path(i)
info = False
- if os.path.isfile(terp_file) and not os.path.isfile(opj(ad, i+'.zip')):
+ if os.path.isfile(terp_file) and not os.path.isfile(mod_path+'.zip'):
info = eval(file(terp_file).read())
- elif zipfile.is_zipfile(mod_path):
- zfile = zipfile.ZipFile(mod_path)
+ elif zipfile.is_zipfile(mod_path+'.zip'):
+ zfile = zipfile.ZipFile(mod_path+'.zip')
i = os.path.splitext(i)[0]
- info = eval(zfile.read(opj(i, '__terp__.py')))
+ info = eval(zfile.read(os.path.join(i, '__terp__.py')))
if info:
categs = info.get('category', 'Uncategorized').split('/')
p_id = None
@@ -170,12 +168,55 @@ def exec_command_pipe(name, *args):
#file_path_root = os.getcwd()
#file_path_addons = os.path.join(file_path_root, 'addons')
-def file_open(name, mode="r", subdir='addons'):
- """Open a file from the Tiny ERP root, using a subdir folder."""
+def file_open(name, mode="r", subdir='addons', pathinfo=False):
+ """Open a file from the Tiny ERP root, using a subdir folder.
+
+ >>> file_open('hr/report/timesheer.xsl')
+ >>> file_open('addons/hr/report/timesheet.xsl')
+ >>> file_open('../../base/report/rml_template.xsl', subdir='addons/hr/report', pathinfo=True)
+
+ @param name: name of the file
+ @param mode: file open mode
+ @param subdir: subdirectory
+ @param pathinfo: if True returns tupple (fileobject, filepath)
+
+ @return: fileobject if pathinfo is False else (fileobject, filepath)
+ """
+
+ adp = os.path.normcase(os.path.abspath(config['addons_path']))
+ rtp = os.path.normcase(os.path.abspath(config['root_path']))
+
+ if name.replace(os.path.sep, '/').startswith('addons/'):
+ subdir = 'addons'
+ name = name[7:]
+
+ # First try to locate in addons_path
if subdir:
- name = os.path.join(config['root_path'], subdir, name)
+ subdir2 = subdir
+ if subdir2.replace(os.path.sep, '/').startswith('addons/'):
+ subdir2 = subdir2[7:]
+
+ subdir2 = (subdir2 != 'addons' or None) and subdir2
+
+ try:
+ if subdir2:
+ fn = os.path.join(adp, subdir2, name)
+ else:
+ fn = os.path.join(adp, name)
+ fn = os.path.normpath(fn)
+ fo = file_open(fn, mode=mode, subdir=None, pathinfo=pathinfo)
+ if pathinfo:
+ return fo, fn
+ return fo
+ except IOError, e:
+ pass
+
+ if subdir:
+ name = os.path.join(rtp, subdir, name)
else:
- name = os.path.join(config['root_path'], name)
+ name = os.path.join(rtp, name)
+
+ name = os.path.normpath(name)
# Check for a zipfile in the path
head = name
@@ -193,15 +234,22 @@ def file_open(name, mode="r", subdir='addons'):
import StringIO
zfile = zipfile.ZipFile(head+'.zip')
try:
- return StringIO.StringIO(zfile.read(os.path.join(
+ fo = StringIO.StringIO(zfile.read(os.path.join(
os.path.basename(head), zipname).replace(
os.sep, '/')))
+
+ if pathinfo:
+ return fo, name
+ return fo
except:
name2 = os.path.normpath(os.path.join(head + '.zip', zipname))
pass
for i in (name2, name):
if i and os.path.isfile(i):
- return file(i, mode)
+ fo = file(i, mode)
+ if pathinfo:
+ return fo, i
+ return fo
raise IOError, 'File not found : '+str(name)
diff --git a/setup.py b/setup.py
index 607fb28c5c5..2c8923f4f3b 100755
--- a/setup.py
+++ b/setup.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
#!/usr/bin/env python
##############################################################################
#
@@ -26,7 +27,6 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
###############################################################################
-# -*- coding: utf-8 -*-
# setup from TinERP
# taken from straw http://www.nongnu.org/straw/index.html
# taken from gnomolicious http://www.nongnu.org/gnomolicious/