OCA/server-tools

View on GitHub
shell/cli/shell.py

Summary

Maintainability
A
25 mins
Test Coverage
# -*- 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 <http://www.gnu.org/licenses/>.
#
##############################################################################

from __future__ import print_function
import code
import logging
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="<console>"):
        code.InteractiveConsole.__init__(self, locals, filename)
        try:
            import readline
            import rlcompleter
        except ImportError:
            # pylint: disable=print-used
            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:
                # pylint: disable=print-used
                print('No environment set, use `odoo.py shell -d dbname`'
                      ' to get one.')
            for i in sorted(local_vars):
                # pylint: disable=print-used
                print('%s: %s' % (i, local_vars[i]))
            logging.disable(logging.CRITICAL)
            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)
                    cr.rollback()
            else:
                self.console(local_vars)

    def run(self, args):
        self.init(args)
        self.shell(openerp.tools.config['db_name'])
        return 0