Discussion:
[tryton-es] Intentando modificar el módulo analytic_product 3.4 a 3.8
Luis Martinez
2016-09-10 16:56:17 UTC
Permalink
Buenas tardes, estoy tratando de modificar el módulo analytic_product de la
versión 3.4, que ya he utilizado anteriormente, para que funcione en la
versión 3.8, al ejecutarlo previo a hacer cualquier modificación me arroja
el siguiente error:

Traceback (most recent call last):
File "/home//trytond/protocols/dispatcher.py", line 167, in dispatch
result = rpc.result(meth(inst, *c_args, **c_kwargs))
File "/home//trytond/model/modelview.py", line 649, in on_change
method()
File "/home//trytond/model/modelview.py", line 84, in wrapper
result = func(self, *args, **kwargs)
File "/home//trytond/model/fields/field.py", line 89, in wrapper
return func(self, *args, **kwargs)
File "/home//trytond/modules/sale_pos/sale.py", line 292, in
on_change_product
super(SaleLine, self).on_change_product()
File "/home//trytond/model/modelview.py", line 84, in wrapper
result = func(self, *args, **kwargs)
File "/home//trytond/model/fields/field.py", line 89, in wrapper
return func(self, *args, **kwargs)
File "/home//trytond/modules/analytic_product/product.py", line 260, in
on_change_product
res[key] = account.id
TypeError: 'sale.line' object does not support item assignment

Esta es la parte del código donde está arrojándome el error:

class AnalyticProductMixin:
@fields.depends('product')
def on_change_product(self):
try:
res = super(AnalyticProductMixin, self).on_change_product()
except:
res = {}

if self.product and self.product.analytic_accounts:
for account in self.product.analytic_accounts.accounts:
key = 'analytic_account_%d' % account.root.id
res[key] = account.id
return res

Haciendo un poco de debugeo lo que puedo notar al correr este código en la
versión 3.4 es que "res" trae la siguiente información:

{'unit_digits': 2, 'description': u'MELOXICAM 15MG C/10 TAB',
'gross_unit_price': Decimal('10.00'), 'taxes': [5],
'gross_unit_price_wo_round': Decimal('10.0000'), 'discount': Decimal('0'),
'amount': Decimal('10.00'), 'unit_price': Decimal('10.0000'), 'cost_price':
Decimal('5.00'), 'unit': 46, 'unit.rec_name': u'CAJA C/10'}

Incluso despues de asignar el res[key] = account.id veo que también ya le
agregó el valor

{'unit_digits': 2, 'description': u'MELOXICAM 15MG C/10 TAB',
'gross_unit_price': Decimal('10.00'), 'taxes': [5],
'gross_unit_price_wo_round': Decimal('10.0000'), 'discount': Decimal('0'),
'amount': Decimal('10.00'), 'unit_price': Decimal('10.0000'),
'analytic_account_1': 8, 'cost_price': Decimal('5.00'), 'unit': 46,
'unit.rec_name': u'CAJA C/10'}

Mientras que ahora al correrlo en la versión 3.8 "res" trae la siguiente
información:

sale.line,-1

Supongo que esta es la razón, alguna idea de que debo de ajustar o
considerar para poderle asignar el valor de la cuenta analítica que trae
asignada el producto?

De antemano gracias
Sergi Almacellas Abellana
2016-09-12 08:02:27 UTC
Permalink
Buenas tardes, estoy tratando de modificar el módulo analytic_product de
la versión 3.4, que ya he utilizado anteriormente, para que funcione en
la versión 3.8, al ejecutarlo previo a hacer cualquier modificación me
File "/home//trytond/protocols/dispatcher.py", line 167, in dispatch
result = rpc.result(meth(inst, *c_args, **c_kwargs))
File "/home//trytond/model/modelview.py", line 649, in on_change
method()
File "/home//trytond/model/modelview.py", line 84, in wrapper
result = func(self, *args, **kwargs)
File "/home//trytond/model/fields/field.py", line 89, in wrapper
return func(self, *args, **kwargs)
File "/home//trytond/modules/sale_pos/sale.py", line 292, in
on_change_product
super(SaleLine, self).on_change_product()
File "/home//trytond/model/modelview.py", line 84, in wrapper
result = func(self, *args, **kwargs)
File "/home//trytond/model/fields/field.py", line 89, in wrapper
return func(self, *args, **kwargs)
File "/home//trytond/modules/analytic_product/product.py", line 260,
in on_change_product
res[key] = account.id
TypeError: 'sale.line' object does not support item assignment
@fields.depends('product')
res = super(AnalyticProductMixin, self).on_change_product()
res = {}
key = 'analytic_account_%d' % account.root.id
res[key] = account.id
return res
A partir de la versión 3.6 los métodos on_change no deben devolver
ninguna información sino que deben assignar directamente los attributos.
Es un cambio necessario para que el módulo funcione en nuevas versiones.

Deberias hechar un vistazo a la categoria migración[1] de disccuss para
ver los cambios que se necessitan hacer en los módulos para adaptarlos a
nuevas versiones.

Si vas a migrar de la 3.4 a la 3.8, debes aplicar los cambios de 3.4 a
3.6 y de 3.6 a 3.8.

De todos modos, ya que vas a migrar modulos a nuevas versiones estaria
bien que migrases a la última versión estable. En este caso 4.0


Un saludo,

[1] https://discuss.tryton.org/c/migration
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Luciano Rossi
2016-09-10 17:18:39 UTC
Permalink
Buenas tardes, estoy tratando de modificar el módulo analytic_product
de la
versión 3.4, que ya he utilizado anteriormente, para que funcione en
la
versión 3.8, al ejecutarlo previo a hacer cualquier modificación me
arroja
File "/home//trytond/protocols/dispatcher.py", line 167, in dispatch
result = rpc.result(meth(inst, *c_args, **c_kwargs))
File "/home//trytond/model/modelview.py", line 649, in on_change
method()
File "/home//trytond/model/modelview.py", line 84, in wrapper
result = func(self, *args, **kwargs)
File "/home//trytond/model/fields/field.py", line 89, in wrapper
return func(self, *args, **kwargs)
File "/home//trytond/modules/sale_pos/sale.py", line 292, in
on_change_product
super(SaleLine, self).on_change_product()
File "/home//trytond/model/modelview.py", line 84, in wrapper
result = func(self, *args, **kwargs)
File "/home//trytond/model/fields/field.py", line 89, in wrapper
return func(self, *args, **kwargs)
File "/home//trytond/modules/analytic_product/product.py", line 260, in
on_change_product
res[key] = account.id
TypeError: 'sale.line' object does not support item assignment
@fields.depends('product')
res = super(AnalyticProductMixin, self).on_change_product()
res = {}
key = 'analytic_account_%d' % account.root.id
res[key] = account.id
return res
La api de on_change cambió en la v3.6

Fijate acá:

https://discuss.tryton.org/t/migration-from-3-4-to-3-6/17

[PY] New API for on_change: the instance is modified instead of returning a dictionary.
Example: http://hg.tryton.org/modules/party/rev/3be0dbb6bf947

Saludos!
Haciendo un poco de debugeo lo que puedo notar al correr este código en
la
{'unit_digits': 2, 'description': u'MELOXICAM 15MG C/10 TAB',
'gross_unit_price': Decimal('10.00'), 'taxes': [5],
Decimal('0'),
'amount': Decimal('10.00'), 'unit_price': Decimal('10.0000'),
Decimal('5.00'), 'unit': 46, 'unit.rec_name': u'CAJA C/10'}
Incluso despues de asignar el res[key] = account.id veo que también ya
le
agregó el valor
{'unit_digits': 2, 'description': u'MELOXICAM 15MG C/10 TAB',
'gross_unit_price': Decimal('10.00'), 'taxes': [5],
Decimal('0'),
'amount': Decimal('10.00'), 'unit_price': Decimal('10.0000'),
'analytic_account_1': 8, 'cost_price': Decimal('5.00'), 'unit': 46,
'unit.rec_name': u'CAJA C/10'}
Mientras que ahora al correrlo en la versión 3.8 "res" trae la
siguiente
sale.line,-1
Supongo que esta es la razón, alguna idea de que debo de ajustar o
considerar para poderle asignar el valor de la cuenta analítica que
trae
asignada el producto?
De antemano gracias
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.
Loading...