~openerp-dev/openobject-client-web/trunk-bug-714557-vda

« back to all changes in this revision

Viewing changes to openobject/addons.py

  • Committer: Xavier Morel
  • Date: 2011-02-15 09:41:17 UTC
  • Revision ID: xmo@openerp.com-20110215094117-jvmyc8rd5g9rtikz
[IMP] move fetching of web modules to openobject.addons, it's got nothing to do in openerp addon, let alone as a controller (it doesn't control anything anymore)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
import logging
2
 
import os
3
2
import imp
4
3
import itertools
 
4
import operator
 
5
import os
 
6
import shutil
 
7
import tempfile
 
8
from cStringIO import StringIO
5
9
 
6
10
import cherrypy
 
11
 
7
12
import openobject.tools.ast
8
 
from openobject import errors, paths
 
13
import openobject.tools.zip
 
14
from openobject import errors, paths, rpc
9
15
 
10
16
 
11
17
class Graph(dict):
213
219
    load_module_graph(db_name, graph, config)
214
220
 
215
221
    try:
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:
219
224
        new_modules = []
220
225
 
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)
 
238
 
 
239
def has_new_modules():
 
240
    """ Returns whether there are new web modules available for download
 
241
    (brand new or updates)
 
242
 
 
243
    :rtype bool:
 
244
    """
 
245
    return bool([
 
246
        name for (name, version) in rpc.RPCProxy('ir.module.module').list_web()
 
247
        if (not exists(name)
 
248
            or version > get_info(name).get('version', '0')
 
249
            or name not in _loaded[cherrypy.session.get('db')])
 
250
    ])
 
251
 
 
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)
 
258
 
 
259
    addons_to_download = [
 
260
        name for (name, version) in web_modules
 
261
        if (not exists(name)
 
262
            or version > get_info(name).get('version', '0'))
 
263
    ]
 
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)
 
274
 
 
275
        # cleanup any existing addon of the same name
 
276
        module_dir = paths.addons(module['name'])
 
277
        shutil.rmtree(module_dir, ignore_errors=True)
 
278
 
 
279
        shutil.move(os.path.join(temp_dir, 'web'), module_dir)
 
280
        shutil.rmtree(temp_dir)
 
281
 
 
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'],
 
290
        },))
 
291
        descriptor.close()
 
292
    return addons_to_load