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
+ :param module: module name
+ :param list(str) args: resource path components within module
- @return: absolute path to the resource
+ :rtype: str
+ :return: absolute path to the resource
TODO name it get_resource_path
TODO make it available inside on osv object (self.get_resource_path)
"""
- a = get_module_path(module)
- if not a: return False
- resource_path = opj(a, *args)
- if zipfile.is_zipfile( a +'.zip') :
- zip = zipfile.ZipFile( a + ".zip")
+ mod_path = get_module_path(module)
+ if not mod_path: return False
+ resource_path = opj(mod_path, *args)
+ if os.path.isdir(mod_path):
+ # the module is a directory - ignore zip behavior
+ if os.path.exists(resource_path):
+ return resource_path
+ elif zipfile.is_zipfile(mod_path + '.zip'):
+ zip = zipfile.ZipFile( mod_path + ".zip")
files = ['/'.join(f.split('/')[1:]) for f in zip.namelist()]
resource_path = '/'.join(args)
if resource_path in files:
- return opj(a, resource_path)
- elif os.path.exists(resource_path):
- return resource_path
+ return opj(mod_path, resource_path)
return False
def get_module_icon(module):
name = os.path.normpath(name)
- # Check for a zipfile in the path
+ # Give higher priority to module directories, which is
+ # a more common case than zipped modules.
+ if os.path.isfile(name):
+ fo = file(name, mode)
+ if pathinfo:
+ return fo, name
+ return fo
+
+ # Support for loading modules in zipped form.
+ # This will not work for zipped modules that are sitting
+ # outside of known addons paths.
head = name
zipname = False
- name2 = False
+ # FIXME: implement chrooting inside addons paths and fix
+ # for incorrect path_info behavior. Work in progress by
+ # Florent X linked to bug 928376
while True:
head, tail = os.path.split(head)
if not tail:
return fo, name
return fo
except Exception:
- name2 = os.path.normpath(os.path.join(head + '.zip', zipname))
pass
- for i in (name2, name):
- if i and os.path.isfile(i):
- fo = file(i, mode)
- if pathinfo:
- return fo, i
- return fo
+
if os.path.splitext(name)[1] == '.rml':
raise IOError, 'Report %s doesn\'t exist or deleted : ' %str(name)
raise IOError, 'File not found : %s' % name