Reviewers: ,


Please review this at http://codereview.tryton.org/395004/

Affected files:
  M proteus/__init__.py
  M proteus/config.py
  M proteus/tests/test_model.py


Index: proteus/__init__.py
===================================================================

--- a/proteus/__init__.py
+++ b/proteus/__init__.py
@@ -260,7 +260,7 @@
         for record in value_list:
             if record.id > 0:
                 if record._changed:
-                    value.append(('write', record.id, record._get_values(
+                    value.append(('write', [record.id], record._get_values(
                         fields=record._changed)))
                 value[0][1].append(record.id)
             else:
@@ -607,7 +607,7 @@
                 return
             values = self._get_values(fields=self._changed)
             context['_timestamp'] = self._get_timestamp()
-            self._proxy.write(self.id, values, context)
+            self._proxy.write([self.id], values, context)
         self.reload()

     def delete(self):
@@ -615,7 +615,7 @@
         if self.id > 0:
             context = self._config.context
             context['_timestamp'] = self._get_timestamp()
-            return self._proxy.delete(self.id, context)
+            return self._proxy.delete([self.id], context)
         self.reload()
         return True

@@ -654,8 +654,8 @@
                     if y['loading'] == 'eager']
         if not self._fields:
             fields.append('_timestamp')
-        self._values.update(self._proxy.read(self.id, fields,
-            self._config.context))
+        self._values.update(self._proxy.read([self.id], fields,
+            self._config.context)[0])
         for field in fields:
             if (field in self._fields
                     and self._fields[field]['type'] == 'float'
@@ -793,8 +793,8 @@
values.update(self._on_change_args(definition['on_change_with']))
         if to_change:
             context = self._config.context
- result = getattr(self._proxy, 'on_change_with')(list(to_change),
-                values, context)
+            result = getattr(self._proxy, 'on_change_with')(values,
+                list(to_change), context)
             for field, value in result.items():
                 self._on_change_set(field, value)
         for field in later:

Index: proteus/config.py
===================================================================

--- a/proteus/config.py
+++ b/proteus/config.py
@@ -101,28 +101,35 @@
     def __call__(self, *args):
         from trytond.cache import Cache
         from trytond.transaction import Transaction
+        from trytond.rpc import RPC

-        if self._name in self._object._rpc:
-            readonly = not self._object._rpc[self._name]
+        if self._name in self._object.__rpc__:
+            rpc = self._object.__rpc__[self._name]
         elif self._name in getattr(self._object, '_buttons', {}):
-            readonly = False
+            rpc = RPC(readonly=False, instantiate=0)
         else:
             raise TypeError('%s is not callable' % self._name)

         with Transaction().start(self._config.database_name,
-                self._config.user, readonly=readonly) as transaction:
+                self._config.user, readonly=rpc.readonly) as transaction:
             Cache.clean(self._config.database_name)
-            args = list(args)
-            context = args.pop()
-            if '_timestamp' in context:
-                transaction.timestamp = context['_timestamp']
-                del context['_timestamp']
-            transaction.context = context
-            res = getattr(self._object, self._name)(*args)
-            if not readonly:
+            args, kwargs, transaction.context, transaction.timestamp = \
+                rpc.convert(self._object, *args)
+            meth = getattr(self._object, self._name)
+            if not hasattr(meth, 'im_self') or meth.im_self:
+                result = rpc.result(meth(*args, **kwargs))
+            else:
+                assert rpc.instantiate == 0
+                inst = args.pop(0)
+                if hasattr(inst, self._name):
+                    result = rpc.result(meth(inst, *args, **kwargs))
+                else:
+                    result = [rpc.result(meth(i, *args, **kwargs))
+                        for i in inst]
+            if not rpc.readonly:
                 transaction.cursor.commit()
         Cache.resets(self._config.database_name)
-        return res
+        return result


 class TrytondProxy(object):
@@ -149,7 +156,6 @@
         CONFIG.update_etc(config_file)
         if database_type is not None:
             CONFIG['db_type'] = database_type
-        from trytond.modules import register_classes
         from trytond.pool import Pool
         from trytond.backend import Database
         from trytond.protocols.dispatcher import create
@@ -165,7 +171,7 @@
         self._user = user
         self.config_file = config_file

-        register_classes()
+        Pool.start()

         database = Database().connect()
         cursor = database.cursor()
@@ -187,7 +193,7 @@
             transaction.context = self.context
             self.user = user_obj.search([
                 ('login', '=', user),
-                ], limit=1)[0]
+                ], limit=1)[0].id
             with transaction.set_user(self.user):
                 self._context = user_obj.get_preferences(context_only=True)
         Cache.resets(database_name)
@@ -219,7 +225,7 @@
     def get_proxy_methods(self, name, type='model'):
         'Return list of methods'
         proxy = self.get_proxy(name, type=type)
-        methods = [x for x in proxy._object._rpc]
+        methods = [x for x in proxy._object.__rpc__]
         if hasattr(proxy._object, '_buttons'):
             methods += [x for x in proxy._object._buttons]
         return methods

Index: proteus/tests/test_model.py
===================================================================

--- a/proteus/tests/test_model.py
+++ b/proteus/tests/test_model.py
@@ -276,7 +276,7 @@
         test.name = 'Test delete'
         test.login = 'test delete'
         test.save()
-        self.assert_(test.delete())
+        test.delete()

     def test_on_change(self):
         Trigger = Model.get('ir.trigger')



--
[email protected] mailing list

Reply via email to