[FIX] website_forum: fixed controller creating a new forum tha was crashing.
[odoo/odoo.git] / openerpcommand / common.py
1 """
2 Define a few common arguments for server-side command-line tools.
3 """
4 import argparse
5 import os
6 try:
7     from setproctitle import setproctitle
8 except ImportError:
9     setproctitle = lambda x: None
10 import sys
11
12 def add_addons_argument(parser):
13     """
14     Add a common --addons argument to a parser.
15     """
16     parser.add_argument('--addons', metavar='ADDONS',
17         **required_or_default('ADDONS',
18                               'colon-separated list of paths to addons'))
19 def set_addons(args):
20     """
21     Turn args.addons into a list instead of a column-separated strings.
22     Set openerp.toools.config accordingly.
23     """
24     import openerp.tools.config
25     config = openerp.tools.config
26
27     assert hasattr(args, 'addons')
28     if args.addons:
29         args.addons = args.addons.split(':')
30     else:
31         args.addons = []
32
33     config['addons_path'] = ','.join(args.addons)
34
35 def get_addons_from_paths(paths, exclude):
36     """
37     Build a list of available modules from a list of addons paths.
38     """
39     exclude = exclude or []
40     module_names = []
41     for p in paths:
42         if os.path.exists(p):
43             names = [n for n in os.listdir(p) if os.path.isfile(os.path.join(p, n, '__openerp__.py')) and not n.startswith('.') and n not in exclude]
44             names = filter(lambda a: os.path.isdir(os.path.join(p, a)), names)
45             names = filter(lambda a: os.path.exists(os.path.join(p, a, '__openerp__.py')), names)
46             module_names.extend(names)
47         else:
48             print "The addons path `%s` doesn't exist." % p
49             sys.exit(1)
50     return module_names
51
52 def required_or_default(name, h):
53     """
54     Helper to define `argparse` arguments. If the name is the environment,
55     the argument is optional and draw its value from the environment if not
56     supplied on the command-line. If it is not in the environment, make it
57     a mandatory argument.
58     """
59     if os.environ.get('OPENERP_' + name.upper()):
60         d = {'default': os.environ['OPENERP_' + name.upper()]}
61     else:
62         d = {'required': True}
63     d['help'] = h + '. The environment variable OPENERP_' + \
64                 name.upper() + ' can be used instead.'
65     return d
66
67 class Command(object):
68     """
69     Base class to create command-line tools. It must be inherited and the
70     run() method overriden.
71     """
72
73     command_name = 'stand-alone'
74
75     def __init__(self, subparsers=None):
76         if subparsers:
77             self.parser = parser = subparsers.add_parser(self.command_name,
78                 description=self.__class__.__doc__)
79         else:
80             self.parser = parser = argparse.ArgumentParser(
81                 description=self.__class__.__doc__)
82
83         parser.add_argument('-d', '--database', metavar='DATABASE',
84             **required_or_default('DATABASE', 'the database to connect to'))
85         parser.add_argument('-u', '--user', metavar='USER',
86             **required_or_default('USER', 'the user login or ID. When using '
87             'RPC, providing an ID avoid the login() step'))
88         parser.add_argument('-p', '--password', metavar='PASSWORD',
89             **required_or_default('PASSWORD', 'the user password')) # TODO read it from the command line or from file.
90
91         parser.set_defaults(run=self.run_with_args)
92
93     def run_with_args(self, args):
94         self.args = args
95         self.run()
96
97     def run(self):
98         print 'Stub Command.run().'
99
100     @classmethod
101     def stand_alone(cls):
102         """
103         A single Command object is a complete command-line program. See
104         `openerp-command/stand-alone` for an example.
105         """
106         command = cls()
107         args = command.parser.parse_args()
108         args.run(args)