8
from cStringIO import StringIO
7
12
import openobject.tools.ast
8
from openobject import errors, paths
13
import openobject.tools.zip
14
from openobject import errors, paths, rpc
213
219
load_module_graph(db_name, graph, config)
216
obj = pooler.get_pool().get_controller("/openerp/modules")
217
new_modules = obj.get_new_modules()
222
new_modules = get_new_modules()
218
223
except errors.AuthenticationError:
230
235
"Can not write to the addons directory '%s', "
231
236
"will not be able to download web modules" % paths.addons(),
232
237
"WARNING", severity=logging.WARNING)
239
def has_new_modules():
240
""" Returns whether there are new web modules available for download
241
(brand new or updates)
246
name for (name, version) in rpc.RPCProxy('ir.module.module').list_web()
248
or version > get_info(name).get('version', '0')
249
or name not in _loaded[cherrypy.session.get('db')])
252
def get_new_modules():
253
if not writeable: return []
254
modules = rpc.RPCProxy('ir.module.module')
255
web_modules = modules.list_web()
256
if not web_modules: return []
257
addons_to_load = map(operator.itemgetter(0), web_modules)
259
addons_to_download = [
260
name for (name, version) in web_modules
262
or version > get_info(name).get('version', '0'))
264
# avoid querying for 0 addons if we have everything already
265
if not addons_to_download: return addons_to_load
266
web_payload = modules.get_web(addons_to_download)
267
for module in web_payload:
268
# Due to the way zip_directory works on the server, we get a toplevel
269
# dir called "web" for our addon, rather than having it named
270
# "the right way". Dump to temp directory and move to right name.
271
temp_dir = tempfile.mkdtemp()
272
openobject.tools.zip.extract_zip_file(
273
StringIO(module['content'].decode('base64')), temp_dir)
275
# cleanup any existing addon of the same name
276
module_dir = paths.addons(module['name'])
277
shutil.rmtree(module_dir, ignore_errors=True)
279
shutil.move(os.path.join(temp_dir, 'web'), module_dir)
280
shutil.rmtree(temp_dir)
282
dependencies = map(lambda u: u.encode('utf-8'), module['depends'])
283
descriptor = open(os.path.join(module_dir, '__openerp__.py'), 'wb')
284
descriptor.write('# -*- coding: utf-8 -*-\n')
285
descriptor.write("%s" % ({
286
'name': module['name'].encode('utf-8'),
287
'version': module['version'].encode('utf-8'),
288
# addons depend at least of openerp
289
'depends': dependencies or ['openerp'],
292
return addons_to_load