138 lines
4.3 KiB
Python
138 lines
4.3 KiB
Python
|
"""
|
||
|
Define a few common arguments for client-side command-line tools.
|
||
|
"""
|
||
|
import os
|
||
|
import sys
|
||
|
import time
|
||
|
import xmlrpclib
|
||
|
|
||
|
import common
|
||
|
|
||
|
class Client(common.Command):
|
||
|
"""
|
||
|
Base class for XML-RPC command-line clients. It must be inherited and the
|
||
|
work() method overriden.
|
||
|
"""
|
||
|
|
||
|
def __init__(self, subparsers=None):
|
||
|
super(Client, self).__init__(subparsers)
|
||
|
required_or_default = common.required_or_default
|
||
|
self.parser.add_argument('-H', '--host', metavar='HOST',
|
||
|
**required_or_default('HOST', 'the server host'))
|
||
|
self.parser.add_argument('-P', '--port', metavar='PORT',
|
||
|
**required_or_default('PORT', 'the server port'))
|
||
|
|
||
|
def execute(self, *args):
|
||
|
return self.object_proxy.execute(self.database, self.uid, self.password, *args)
|
||
|
|
||
|
def initialize(self):
|
||
|
self.host = self.args.host
|
||
|
self.port = int(self.args.port)
|
||
|
self.database = self.args.database
|
||
|
self.user = self.args.user
|
||
|
self.password = self.args.password
|
||
|
|
||
|
self.url = 'http://%s:%d/xmlrpc/' % (self.host, self.port)
|
||
|
self.common_proxy = xmlrpclib.ServerProxy(self.url + 'common')
|
||
|
self.object_proxy = xmlrpclib.ServerProxy(self.url + 'object')
|
||
|
|
||
|
try:
|
||
|
self.uid = int(self.user)
|
||
|
except ValueError, e:
|
||
|
self.uid = self.common_proxy.login(self.database, self.user, self.password)
|
||
|
|
||
|
def run(self, *args):
|
||
|
self.initialize()
|
||
|
self.work(*args)
|
||
|
|
||
|
def work(self, *args):
|
||
|
pass
|
||
|
|
||
|
class Open(Client):
|
||
|
"""Get the web client's URL to view a specific model."""
|
||
|
|
||
|
command_name = 'open'
|
||
|
|
||
|
def __init__(self, subparsers=None):
|
||
|
super(Open, self).__init__(subparsers)
|
||
|
self.parser.add_argument('-m', '--model', metavar='MODEL',
|
||
|
required=True, help='the view type')
|
||
|
self.parser.add_argument('-v', '--view-mode', metavar='VIEWMODE',
|
||
|
default='tree', help='the view mode')
|
||
|
|
||
|
def work(self):
|
||
|
ids = self.execute('ir.actions.act_window', 'search', [
|
||
|
('res_model', '=', self.args.model),
|
||
|
('view_mode', 'like', self.args.view_mode),
|
||
|
])
|
||
|
xs = self.execute('ir.actions.act_window', 'read', ids, [])
|
||
|
for x in xs:
|
||
|
print x['id'], x['name']
|
||
|
d = {}
|
||
|
d['host'] = self.host
|
||
|
d['port'] = self.port
|
||
|
d['action_id'] = x['id']
|
||
|
print " http://%(host)s:%(port)s/web/webclient/home#action_id=%(action_id)s" % d
|
||
|
|
||
|
class Show(Client):
|
||
|
"""Display a record."""
|
||
|
|
||
|
command_name = 'show'
|
||
|
|
||
|
def __init__(self, subparsers=None):
|
||
|
super(Show, self).__init__(subparsers)
|
||
|
self.parser.add_argument('-m', '--model', metavar='MODEL',
|
||
|
required=True, help='the model')
|
||
|
self.parser.add_argument('-i', '--id', metavar='RECORDID',
|
||
|
required=True, help='the record id')
|
||
|
|
||
|
def work(self):
|
||
|
xs = self.execute(self.args.model, 'read', [self.args.id], [])
|
||
|
if xs:
|
||
|
x = xs[0]
|
||
|
print x['name']
|
||
|
else:
|
||
|
print "Record not found."
|
||
|
|
||
|
class ConsumeNothing(Client):
|
||
|
"""Call test.limits.model.consume_nothing()."""
|
||
|
|
||
|
command_name = 'consume-nothing'
|
||
|
|
||
|
def work(self):
|
||
|
xs = self.execute('test.limits.model', 'consume_nothing')
|
||
|
|
||
|
class ConsumeMemory(Client):
|
||
|
"""Call test.limits.model.consume_memory()."""
|
||
|
|
||
|
command_name = 'consume-memory'
|
||
|
|
||
|
def __init__(self, subparsers=None):
|
||
|
super(ConsumeMemory, self).__init__(subparsers)
|
||
|
self.parser.add_argument('--size', metavar='SIZE',
|
||
|
required=True, help='size of the list to allocate')
|
||
|
|
||
|
def work(self):
|
||
|
xs = self.execute('test.limits.model', 'consume_memory', int(self.args.size))
|
||
|
|
||
|
class LeakMemory(ConsumeMemory):
|
||
|
"""Call test.limits.model.leak_memory()."""
|
||
|
|
||
|
command_name = 'leak-memory'
|
||
|
|
||
|
def work(self):
|
||
|
xs = self.execute('test.limits.model', 'leak_memory', int(self.args.size))
|
||
|
|
||
|
class ConsumeCPU(Client):
|
||
|
"""Call test.limits.model.consume_cpu_time()."""
|
||
|
|
||
|
command_name = 'consume-cpu'
|
||
|
|
||
|
def __init__(self, subparsers=None):
|
||
|
super(ConsumeCPU, self).__init__(subparsers)
|
||
|
self.parser.add_argument('--seconds', metavar='INT',
|
||
|
required=True, help='how much CPU time to consume')
|
||
|
|
||
|
def work(self):
|
||
|
xs = self.execute('test.limits.model', 'consume_cpu_time', int(self.args.seconds))
|