Tux y OpenERP

Tux y OpenERP
Para obtener información sobre como implantar OpenERP en tu empresa --- contactar con informaticartica@gmail.com ---

martes, 28 de febrero de 2012

Crear entorno de OpenERP 6.1

Al ver que todavía no hay en Launchpad un script bzr_set.py para la nueva release de OpenERP 6.1, me he tomado la libertad de crearme uno propio con lo que tenemos disponible de momento.

Para los que no conozcais el script, ejecutándolo podemos crear en ese directorio toda la estructura de OpenERP, con lo que tendriamos una instancia de OpenERP completa. Lo he modificado de tal manera que además de bajarnos la 6.1 también nos baja la localización española haciendo también todos los enlaces simbólicos. Para los que desarrolleis os facilitará mucho el trabajo.

Ya que no puedo adjuntar archivos en este blog os paso el código tal cual:

#!/usr/bin/python



# Modificado por Juani Ubeda para uso temporal #(http://www.informaticartica.blogspot.com)

__all__ = ['update_openerp']

import os
import shutil
import glob
import bzrlib.builtins
from bzrlib.plugins import launchpad
from bzrlib.branch import Branch
from bzrlib.errors import NotBranchError
from bzrlib.revisionspec import RevisionSpec

def run_cmd(cmdname, *args, **kwargs):
    f = getattr(bzrlib.builtins, 'cmd_' + cmdname)()
    if hasattr(f, '_setup_outf'):
        # old versions of bzr does not have this function  
        # this function must be called to avoid a exception in bzr code
        f._setup_outf()
    return f.run(*args, **kwargs)

_VERSIONS = ('4.2', '5.0', '6.0', '6.1','trunk')
_DEFAULT_VERSION = '6.1'
_EXTRA_ADDONS_MAP = {
    '4.2': '4.2-extra-addons',
    '5.0': 'stable_5.0-extra-addons',
    '6.0': 'extra-6.0',
    '6.1': 'trunk-extra-addons',
}

def update_openerp(dest_dir, version=_DEFAULT_VERSION, lplogin=None, export=False, revision=None, verbose=False):
    """
        if lplogin == None -> make a branch instead of a checkout
        if export == True -> bzr export
        if revision is provided, get the branches at this revision
            more information with:
                $> bzr help revisionspec
    """
    def log(msg):
        if verbose:
            print msg

    if version not in _VERSIONS:
        raise Exception('Unknown version')
    dest_dir = dest_dir or '.'

    branch = lplogin is None
    if branch:
        BASEURL = 'lp:'
    else:
        BASEURL = 'bzr+ssh://%s@bazaar.launchpad.net/' % (lplogin,)

    # map branch URLs according to version
    extraversion = _EXTRA_ADDONS_MAP[version]
    communityversion = 'trunk'
    webversion = version

    bzr_repository = {
        'server': (BASEURL + '~openerp/openobject-server/' + version, True),
        'client': (BASEURL + '~openerp/openobject-client/' + version, True),
        'addons': (BASEURL + '~openerp/openobject-addons/' + version, True),
        'addons-extra': (BASEURL + '~openerp-commiter/openobject-addons/' + extraversion, False),
        'addons-community': (BASEURL + '~openerp-community/openobject-addons/' + communityversion + '-addons-community', False),
        'web': (BASEURL + '~openerp/openerp-web/' + webversion, True),
    'spanish': (BASEURL + '~openerp-spain-team/openerp-spain/' + version, True),
    }

    bzr_links = {
        'addons/*': 'server/openerp/addons/',
    'addons-extra/*': 'server/openerp/addons/',
    'addons-community/*': 'server/openerp/addons/',
    'spanish': 'server/openerp/addons/',
    }

    if branch:
        cmd = {'new': lambda u, l, r: run_cmd('branch', u, l, revision=r),
               'update': lambda u, l, r: run_cmd('pull', u, directory=l, overwrite=True, revision=r),
        }
    else:
        cmd = {'new': lambda u, l, r: run_cmd('checkout', u, l, lightweight=True, revision=r),
               'update': lambda u, l, r: run_cmd('update', l), # no revision option :(
        }
    cmd['export'] = lambda u, l, r: run_cmd('export', l, u, revision=r)

    msg = "%(status)s %(type)s of %(from)s into %(to)s"

    if not os.path.exists(dest_dir):
        os.makedirs(dest_dir)

    for local, (bzrdir, has_tags) in bzr_repository.items():
        local = os.path.join(dest_dir, local)
        typ = ['checkout', 'branch'][branch]
        if export:
            if os.path.exists(local):
                shutil.rmtree(local)
            status = 'export'
            typ = 'sources'
        else:
            try:
                b = Branch.open(local)
                # FIXME check that the current workingDirectory is a branch or a checkout
                status = 'update'
            except NotBranchError:
                status = 'new'
       
        frm = bzrdir
        rev = None
        if revision and (not revision.startswith('tag:') or has_tags):
            frm = '%s (%s)' % (bzrdir, revision)
            rev = RevisionSpec.from_string(revision)

        log(msg % {'status': status, 'type': typ, 'to': local, 'from': frm})
               
        cmd[status](bzrdir, local, rev and [rev] or None)

    # Doing symlinks
    log('(Re)Computing Symbolic links...')
    for src2,dest2 in bzr_links.items():
        src2 = os.path.join(dest_dir, src2)
        dest2 = os.path.join(dest_dir, dest2)
        for src in glob.glob(src2):
            dest = os.path.join(dest2, os.path.basename(src))
            if not os.path.isdir(dest):
                os.symlink(os.path.realpath(src), dest)

    log('='*79)
    log('Sources of OpenERP have been installed. If you develop new features,')
    log('you can get more information on how to contribute to the project here:')
    log('\thttp://test.openobject.com')
    log('='*79)

#
# Testing bzr send
#

if __name__ == '__main__':
    import optparse
    description = """Tool that allows you to get the last sources of openerp on launchpad.
It downloads all branches, and create symlinks for addons in the server. By
default, it loads the latest stable version.
"""
    parser = optparse.OptionParser(description=description,
                                   usage="%prog [options] [directory]")
    parser.add_option('--checkout', dest='lplogin', help="Specify the launchpad login to make a checkout instead of a branch")
    parser.add_option('--export', dest='export', help='Make an export of the sources, instead of branches', action='store_true', default=False)
    parser.add_option('-v', dest="version", default=_DEFAULT_VERSION, type="choice", choices=_VERSIONS, help="Specify the version to take (trunk, 4.2, 5.0, 6.0)")
    parser.add_option('-r', dest="revision", default=None, help="Specify the revision to take. (useful to take a specific TAG or to specify a DATE)")
    parser.add_option('-q', '--quiet', dest='quiet', help='Suppress the output', action='store_true', default=False)
    opt, args = parser.parse_args()
    dest_dir = args and args[0] or '.'
    update_openerp(dest_dir, opt.version, opt.lplogin, opt.export, opt.revision, not opt.quiet)

Espero que os sea de utilidad, el uso es simple:

- Copias este código en un archivo de texto y lo llamais por ejemplo bzr_set.py
- Lo copiais a un directorio donde querais tener la instancia de OpenERP 6.1
- Lo ejecutais con la orden : python bzr_set.py
- Esperais un ratito a que termine. (Os dará una serie de Warnings, si quereis evitarlos descargad de Launchpad el script y la carpeta y archivo ocultos que lo acompañan y reemplazais el script por el mío)

Para arrancar openerp seguid los siguientes pasos:

- entrar en la carpeta server : cd server
- arrancar el servidor : ./openerp-server --addons-path=openerp/addons/,../web/addons --load=web
- escribir en el navegador : http://localhost:8069
- a disfrutar ........ ;)

Cada vez que lo ejecuteis os actualizará los directorios con lo último de cada rama.

Saludos ,
Juani

4 comentarios:

  1. Al arrancar da este mensaje
    ----
    new branch of lp:~openerp-commiter/openobject-addons/trunk-extra-addons into ./addons-extra
    /usr/lib/python2.6/dist-packages/Crypto/Util/randpool.py:40: RandomPool_DeprecationWarning: This application uses RandomPool, which is BROKEN in older releases. See http://www.pycrypto.org/randpool-broken
    RandomPool_DeprecationWarning)
    ----
    ¿sabes a qué es debido?

    Luego en la rama de spanish da este warning
    -------
    /usr/lib/python2.6/dist-packages/bzrlib/lockable_files.py:61: UserWarning: 'LockableFiles()' was gc'd while locked
    warnings.warn("%r was gc'd while locked" % self.repr)
    /usr/lib/python2.6/dist-packages/bzrlib/lockable_files.py:61: UserWarning: 'LockableFiles()' was gc'd while locked
    warnings.warn("%r was gc'd while locked" % self.repr)
    -------
    ¿tiene importancia?
    Un saludo y gracias por todo Juani !!

    ResponderEliminar
  2. Buenas Carlos, gracias por tus comentarios, hace ilusión ver que los demás te siguen. En principio comentarte que desconozco ese primer error que muestras pero me da la sensación de que deberías actualizar las librerías python y en concreto la de crypto.
    En el segundo caso no pasa nada, te descargará el contenido de launchpad sin problemas.

    ResponderEliminar
  3. Un apunte (otro), a la hora de hacer los enlaces el script, puede que nos deje una versión de un módulo que está en addons-extra en vez de en addons (que son los oficiales) y tendríamos una versión del módulo "menos oficial", dependiendo el orden en el que hagamos los enlaces y si machacamos los ya creados o no.

    ¿sabes si el script a la hora de realizar los enlaces (symlink) mantiene el directorio si es que existe o lo machaca ?? Vamos si hace los enlaces con "ln -s" o con "ln -sf".
    Yo he mirado y según el orden del script:

    bzr_links = {
    'addons/*': 'server/openerp/addons/',
    'addons-extra/*': 'server/openerp/addons/',
    'addons-community/*': 'server/openerp/addons/',
    'spanish': 'server/openerp/addons/',
    }

    primero haría los enlaces a addons, luego a addons-extra, ....
    Yo he comprobado que si existe la carpeta "edi" de addons ya creada, NO hace un enlace a la carpeta "edi" de addons-extra, por lo que parece que los enlaces (si es que existen) NO los machaca.

    Un saludo Juani (y claro que te seguimos ..., aquí estaremos dando guerra)

    ResponderEliminar
  4. Al volver a ejecutar el script para actualizar, me ha dado este error:
    root@ERP:/opt/openerp/61# python bzr_set.py
    update branch of lp:~openerp-commiter/openobject-addons/trunk-extra-addons into ./addons-extra
    /usr/lib/python2.6/dist-packages/Crypto/Util/randpool.py:40: RandomPool_DeprecationWarning: This application uses RandomPool, which is BROKEN in older releases. See http://www.pycrypto.org/randpool-broken
    RandomPool_DeprecationWarning)
    Enter passphrase for key '/root/.ssh/id_rsa':
    Traceback (most recent call last):
    File "bzr_set.py", line 152, in
    update_openerp(dest_dir, opt.version, opt.lplogin, opt.export, opt.revision, not opt.quiet)
    File "bzr_set.py", line 115, in update_openerp
    cmd[status](bzrdir, local, rev and [rev] or None)
    File "bzr_set.py", line 78, in
    'update': lambda u, l, r: run_cmd('pull', u, directory=l, overwrite=True, revision=r),
    File "bzr_set.py", line 21, in run_cmd
    return f.run(*args, **kwargs)
    File "/usr/lib/python2.6/dist-packages/bzrlib/builtins.py", line 1004, in run
    branch_to.lock_write()
    File "/usr/lib/python2.6/dist-packages/bzrlib/branch.py", line 2144, in lock_write
    return self.control_files.lock_write(token=token)
    File "/usr/lib/python2.6/dist-packages/bzrlib/lockable_files.py", line 193, in lock_write
    token_from_lock = self._lock.lock_write(token=token)
    File "/usr/lib/python2.6/dist-packages/bzrlib/lockdir.py", line 600, in lock_write
    return self.wait_lock()
    File "/usr/lib/python2.6/dist-packages/bzrlib/lockdir.py", line 568, in wait_lock
    raise LockContention(self)
    bzrlib.errors.LockContention: Could not acquire lock "LockDir(file:///opt/openerp/61/addons-extra/.bzr/branch/lock)":

    Solución:
    he borrado el contenido del directorio /opt/openerp/61/addons-extra/.bzr/branch/lock, lo he vuelto a lanzar y sin problemas

    Por si a alguien más le ocurre ;-)

    ResponderEliminar