Add wizard to proteus

This commit is contained in:
Cédric Krier
2010-10-19 22:17:21 +02:00
parent f3bfb6b262
commit 573d02b6a9
3 changed files with 131 additions and 21 deletions
+68
View File
@@ -552,3 +552,71 @@ class Model(object):
res = getattr(self._proxy, 'on_change_with_%s' % field)(args,
context)
self._set_on_change(field, res)
class Wizard(object):
'Wizard class for Tryton wizards'
def __init__(self, name, models=None, config=None, context=None):
if models:
assert isinstance(models, ModelList)
super(Wizard, self).__init__()
self.name = name
self.state = None
self.states = ['init']
self.form = None
self._config = config or proteus.config.get_config()
self._context = context or {}
self._proxy = self._config.get_proxy(name, type='wizard')
self.id = self._proxy.create(self._config.context)
if models:
self.datas = {
'model': models[0].__class__.__name__,
'id': models[0].id,
'ids': [model.id for model in models]
}
else:
self.datas = {}
self.execute('init')
def execute(self, state):
assert state in self.states
if 'form' not in self.datas:
self.datas['form'] = {}
if self.form:
self.datas['form'].update(self.form._get_values())
self.state = state
while self.state != 'end':
ctx = self._context.copy()
ctx.update(self._config.context)
ctx['active_id'] = self.datas.get('id')
ctx['active_ids'] = self.datas.get('ids')
res = self._proxy.execute(self.id, self.datas, self.state, ctx)
if not res:
break
if 'datas' in res:
self.datas['form'] = res['datas']
elif res['type'] == 'form':
self.datas['form'] = {}
if res['type'] == 'form':
self.states = [x[0] for x in res['state']]
# XXX set context
self.form = Model.get(res['object'])()
self.form._default_set(self.datas['form'])
return
elif res['type'] == 'action':
# TODO run action
self.state = res['state']
elif res['type'] == 'print':
# TODO run print
self.state = res['state']
if self.state == 'end':
self._proxy.delete(self.id, self._config.context)
+22 -21
View File
@@ -51,14 +51,14 @@ class _TrytondMethod(object):
def __init__(self, name, model, config):
super(_TrytondMethod, self).__init__()
self._name = name
self._model = model
self._object = model
self._config = config
def __call__(self, *args):
from trytond.cache import Cache
from trytond.transaction import Transaction
assert self._name in self._model._rpc
assert self._name in self._object._rpc
with Transaction().start(self._config.database_name,
self._config.user) as transaction:
@@ -69,8 +69,8 @@ class _TrytondMethod(object):
transaction.timestamp = context['_timestamp']
del context['_timestamp']
transaction.context = context
res = getattr(self._model, self._name)(*args)
if self._model._rpc[self._name]:
res = getattr(self._object, self._name)(*args)
if self._object._rpc[self._name]:
transaction.cursor.commit()
Cache.resets(self._config.database_name)
return res
@@ -78,15 +78,15 @@ class _TrytondMethod(object):
class TrytondProxy(object):
'Proxy for function call for trytond'
def __init__(self, name, config):
def __init__(self, name, config, type='model'):
super(TrytondProxy, self).__init__()
self._config = config
self._model = config.pool.get(name)
self._object = config.pool.get(name, type=type)
__init__.__doc__ = object.__init__.__doc__
def __getattr__(self, name):
'Return attribute value'
return _TrytondMethod(name, self._model, self._config)
return _TrytondMethod(name, self._object, self._config)
class TrytondConfig(Config):
@@ -140,14 +140,14 @@ class TrytondConfig(Config):
self.database_name, self._user, self.database_type)
__repr__.__doc__ = object.__repr__.__doc__
def get_proxy(self, name):
def get_proxy(self, name, type='model'):
'Return Proxy class'
return TrytondProxy(name, self)
return TrytondProxy(name, self, type=type)
def get_proxy_methods(self, name):
def get_proxy_methods(self, name, type='model'):
'Return list of methods'
proxy = self.get_proxy(name)
return [x for x in proxy._model._rpc]
proxy = self.get_proxy(name, type=type)
return [x for x in proxy._object._rpc]
def set_trytond(database_name, user='admin', database_type='postgresql',
language='en_US', password=''):
@@ -160,15 +160,15 @@ def set_trytond(database_name, user='admin', database_type='postgresql',
class XmlrpcProxy(object):
'Proxy for function call for XML-RPC'
def __init__(self, name, config):
def __init__(self, name, config, type='model'):
super(XmlrpcProxy, self).__init__()
self._config = config
self._model = getattr(config.server, 'model.%s' % name)
self._object = getattr(config.server, '%s.%s' % (type, name))
__init__.__doc__ = object.__init__.__doc__
def __getattr__(self, name):
'Return attribute value'
return getattr(self._model, name)
return getattr(self._object, name)
class XmlrpcConfig(Config):
'Configuration for XML-RPC'
@@ -185,16 +185,17 @@ class XmlrpcConfig(Config):
return "proteus.config.XmlrpcConfig('%s')" % self.url
__repr__.__doc__ = object.__repr__.__doc__
def get_proxy(self, name):
def get_proxy(self, name, type='model'):
'Return Proxy class'
return XmlrpcProxy(name, self)
return XmlrpcProxy(name, self, type=type)
def get_proxy_methods(self, name):
def get_proxy_methods(self, name, type='model'):
'Return list of methods'
return [x[len('model.%s' % name) + 1:]
object_ = '%s.%s' % (type, name)
return [x[len(object_) + 1:]
for x in self.server.system.listMethods()
if x.startswith('model.%s' % name)
and '.' not in x[len('model.%s' % name) + 1:]]
if x.startswith(object_)
and '.' not in x[len(object_) + 1:]]
def set_xmlrpc(url):
'Set XML-RPC as backend'
+41
View File
@@ -0,0 +1,41 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from unittest import TestCase
from proteus import config, Wizard, Model
class TestWizard(TestCase):
def setUp(self):
config.set_trytond(':memory:', database_type='sqlite')
def test_translation_clean(self):
translation_clean = Wizard('ir.translation.clean')
self.assertEqual(translation_clean.form.__class__.__name__,
'ir.translation.clean.init')
translation_clean.execute('start')
def test_translation_export(self):
translation_export = Wizard('ir.translation.export')
translation_export.form.lang = 'en_US'
translation_export.form.module = 'ir'
translation_export.execute('start')
self.assert_(translation_export.form.file)
translation_export.execute('end')
def test_user_config(self):
User = Model.get('res.user')
user_config = Wizard('res.user.config')
user_config.execute('user')
user_config.form.name = 'Foo'
user_config.form.login = 'foo'
user_config.execute('add')
self.assertEqual(user_config.form.name, None)
self.assertEqual(user_config.form.login, None)
user_config.form.name = 'Bar'
user_config.form.login = 'bar'
user_config.execute('end')
self.assert_(User.find([('name', '=', 'Foo')]))
self.assertFalse(User.find([('name', '=', 'Bar')]))