diff --git a/shell/README.md b/shell/README.md new file mode 100644 index 000000000..bc908d8ba --- /dev/null +++ b/shell/README.md @@ -0,0 +1,22 @@ +Makes available in Odoo 8 the `shell` server command available for Odoo 9. + +To have this feature available this module just need to be in the +addons path. To use it, in a terminal window run: + + $ ./odoo.py shell -d + +This will initialize a server instance and then jump into a Pyhton +interactive shell, with full access to the Odoo API. + +Example session: + + >>> self + res.users(1,) + >>> self.name + u'Administrator' + >>> self._name + 'res.users' + >>> self.env + + >>> self.env['res.partner'].search([('name', 'like', 'Ag')]) + res.partner(7, 51) diff --git a/shell/__init__.py b/shell/__init__.py new file mode 100644 index 000000000..8956315a3 --- /dev/null +++ b/shell/__init__.py @@ -0,0 +1 @@ +from .cli import shell diff --git a/shell/__openerp__.py b/shell/__openerp__.py new file mode 100644 index 000000000..bc8b78852 --- /dev/null +++ b/shell/__openerp__.py @@ -0,0 +1,6 @@ +{ + 'name': 'Shell command backport', + 'summary': 'Backport of the v9 shell CLI command.', + 'author': 'Daniel Reis', + 'version': '1.0', +} diff --git a/shell/cli/__init__.py b/shell/cli/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/shell/cli/shell.py b/shell/cli/shell.py new file mode 100644 index 000000000..632afc304 --- /dev/null +++ b/shell/cli/shell.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from __future__ import print_function +import code +import os +import signal +import sys + +import openerp +from openerp.api import Environment +from openerp.cli import Command + + +def raise_keyboard_interrupt(*a): + raise KeyboardInterrupt() + + +class Console(code.InteractiveConsole): + def __init__(self, locals=None, filename=""): + code.InteractiveConsole.__init__(self, locals, filename) + try: + import readline + import rlcompleter + except ImportError: + print('readline or rlcompleter not available,' + ' autocomplete disabled.') + else: + readline.set_completer(rlcompleter.Completer(locals).complete) + readline.parse_and_bind("tab: complete") + + +class Shell(Command): + """Start odoo in an interactive shell""" + def init(self, args): + openerp.tools.config.parse_config(args) + openerp.cli.server.report_configuration() + openerp.service.server.start(preload=[], stop=True) + signal.signal(signal.SIGINT, raise_keyboard_interrupt) + + def console(self, local_vars): + if not os.isatty(sys.stdin.fileno()): + exec sys.stdin in local_vars + else: + if 'env' not in local_vars: + print('No environment set, use `odoo.py shell -d dbname`' + ' to get one.') + for i in sorted(local_vars): + print('%s: %s' % (i, local_vars[i])) + Console(locals=local_vars).interact() + + def shell(self, dbname): + local_vars = { + 'openerp': openerp + } + with Environment.manage(): + if dbname: + registry = openerp.modules.registry.RegistryManager.get(dbname) + with registry.cursor() as cr: + uid = openerp.SUPERUSER_ID + ctx = Environment(cr, uid, {})['res.users'].context_get() + env = Environment(cr, uid, ctx) + local_vars['env'] = env + local_vars['self'] = env.user + self.console(local_vars) + else: + self.console(local_vars) + + def run(self, args): + self.init(args) + self.shell(openerp.tools.config['db_name']) + return 0