Forward port of branch 7.0 up to rev 8abd003
[odoo/odoo.git] / openerpcommand / model.py
1 """
2 Display information about a given model.
3 """
4 import os
5 import sys
6 import textwrap
7
8 def run(args):
9     assert args.database
10     assert args.model
11     import openerp
12     openerp.tools.config['log_level'] = 100
13     openerp.netsvc.init_logger()
14     registry = openerp.modules.registry.RegistryManager.get(
15         args.database, update_module=False)
16     model = registry[args.model]
17     longest_k = 1
18     longest_string = 1
19     columns = model._columns
20
21     if args.field and args.field not in columns:
22         print "No such field."
23         sys.exit(1)
24         
25     if args.field:
26         columns = { args.field: columns[args.field] }
27     else:
28         print "Fields (model `%s`, database `%s`):" % (args.model, args.database)
29
30     for k, v in columns.items():
31         longest_k = len(k) if longest_k < len(k) else longest_k
32         longest_string = len(v.string) \
33             if longest_string < len(v.string) else longest_string
34     for k, v in sorted(columns.items()):
35         attr = []
36         if v.required:
37             attr.append("Required")
38         if v.readonly:
39             attr.append("Read-only")
40         attr = '/'.join(attr)
41         attr = '(' + attr + ')' if attr else attr
42         if args.verbose:
43             print v.string, '-- ' + k + ', ' + v._type, attr
44         else:
45             print k.ljust(longest_k + 2), v._type, attr
46         if args.verbose and v.help:
47             print textwrap.fill(v.help, initial_indent='    ', subsequent_indent='    ')
48
49 def add_parser(subparsers):
50     parser = subparsers.add_parser('model',
51         description='Display information about a given model for an existing database.')
52     parser.add_argument('-d', '--database', metavar='DATABASE', required=True,
53         help='the database to connect to')
54     parser.add_argument('-m', '--model', metavar='MODEL', required=True,
55         help='the model for which information should be displayed')
56     parser.add_argument('-v', '--verbose', action='store_true',
57         help='display more information')
58     parser.add_argument('-f', '--field', metavar='FIELD',
59         help='display information only for this particular field')
60
61     parser.set_defaults(run=run)