Discussion:
[tryton-es] Redefinir valores del campo type en party.identifier
Fernando Sánchez
2017-12-01 06:13:14 UTC
Permalink
Saludos a la comunidad,

En esta oportunidad necesito luces para extender la clase party.identifier
de la versión 4.6
El campo "type" de esta clase es del tipo fields.Selection, que hasta la
version 4.2 obtenía sus valores via la función get_types, así para
extenderlo en mi modulo solo redefinia la función get_types con los valores
que obtenía de una tabla.

type = fields.Selection('get_types', 'Type')

Sucede que en la versión 4.6 ya no se usa get_types sino que se asignan los
valores de manera estática

type = fields.Selection([
(None, ''),
('eu_vat', 'VAT'),
], 'Type')

Me gustaría saber como puedo redefinir los valores de type en mi modulo
personalizado.

Saludos y agradecimiento anticipado.

Fernando Sánchez
Raimon Esteve
2017-12-01 06:44:12 UTC
Permalink
El dia 1 des. 2017 7:13 a. m., "Fernando Sánchez" <***@liberorbis.com> va
escriure:

Saludos a la comunidad,

En esta oportunidad necesito luces para extender la clase party.identifier
de la versión 4.6
El campo "type" de esta clase es del tipo fields.Selection, que hasta la
version 4.2 obtenía sus valores via la función get_types, así para
extenderlo en mi modulo solo redefinia la función get_types con los valores
que obtenía de una tabla.

type = fields.Selection('get_types', 'Type')

Sucede que en la versión 4.6 ya no se usa get_types sino que se asignan los
valores de manera estática

type = fields.Selection([
(None, ''),
('eu_vat', 'VAT'),
], 'Type')

Me gustaría saber como puedo redefinir los valores de type en mi modulo
personalizado.

Saludos y agradecimiento anticipado.


Seria lo mismo en el __setup__ y añadir mas opcions en la llista del
atributo "selectiu" de "cls.type"

Hay muchos modulos que lo hacen para ver un ejemplos.



Fernando Sánchez
Sergi Almacellas Abellana
2017-12-01 08:10:25 UTC
Permalink
Post by Fernando Sánchez
Saludos a la comunidad,
En esta oportunidad necesito luces para extender la clase
party.identifier de la versión 4.6
El campo "type" de esta clase es del tipo fields.Selection, que
hasta la version 4.2 obtenía sus valores via la función get_types,
así para extenderlo en mi modulo solo redefinia la función get_types
con los valores que obtenía de una tabla.
type = fields.Selection('get_types', 'Type')
Sucede que en la versión 4.6 ya no se usa get_types sino que se
asignan los valores de manera estática
    type = fields.Selection([
            (None, ''),
            ('eu_vat', 'VAT'),
            ], 'Type')
Me gustaría saber como puedo redefinir los valores de type en mi
modulo personalizado.
Saludos y agradecimiento anticipado.
Seria lo mismo en el __setup__ y añadir mas opcions en la llista del
atributo "selectiu" de "cls.type"
El attributo es selection. A continuación te dejo un ejemplo:

http://hg.tryton.org/modules/account_payment_stripe/file/199ba42de12c/payment.py#l35

Un saludo,
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Fernando Sánchez
2017-12-01 13:32:03 UTC
Permalink
Gracias Sergi y Raimon por su pronta y clara respuesta.
Ya logre personalizar la selection, pero solo de forma estatica.
Al poblarla dinamicamente con registros de una tabla que contiene los
valores me lanza un error.
Aqui el codigo:

class PartyIdentifier(ModelSQL, ModelView):
'Party Identifier'
__metaclass__ = PoolMeta
__name__ = 'party.identifier'

@classmethod
def __setup__(cls):
super(PartyIdentifier, cls).__setup__()
tiposdocid = cls.get_types()
for tipos in tiposdocid:
if tipos not in cls.type.selection:
cls.type.selection.append(tipos)

@classmethod
def get_types(cls):
#return [('0', 'Otros tipos de documentos'),('6', 'RUC'),('1',
'DNI'),('4', 'C. EXT.'),('7', 'Pasaporte'),('A',u'Cédula Diplomática de
Identidad'),]
pool = Pool()
Type = pool.get('sunat.tipodocid')
types = Type.search([('active','=','True')])
return [(x.code, x.name) for x in types]

El trace del error:
Traceback (most recent call last):
File "/home/nando/.virtualenvs/liberorbis46/bin/trytond-admin", line 21,
in <module>
admin.run(options)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/admin.py",
line 54, in run
installdeps=options.installdeps)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/pool.py",
line 155, in init
lang=lang, installdeps=installdeps)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/__init__.py",
line 462, in load_modules
_load_modules(update)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/__init__.py",
line 432, in _load_modules
load_module_graph(graph, pool, update, lang)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/__init__.py",
line 229, in load_module_graph
pool.setup(classes)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/pool.py",
line 227, in setup
cls.__setup__()
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/liberorbis_peru_loc/party.py",
line 66, in __setup__
tiposdocid = cls.get_types()
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/liberorbis_peru_loc/party.py",
line 76, in get_types
types = Type.search([('active','=','True')])
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/model/modelsql.py",
line 1128, in search
tables, expression = cls.search_domain(domain)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/model/modelsql.py",
line 1286, in search_domain
domain = cls._search_domain_active(domain, active_test=active_test)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/model/modelstorage.py",
line 407, in _search_domain_active
if not ('active' in cls._fields
AttributeError: type object 'sunat.tipodocid' has no attribute '_fields'

Agradecer las posibles respuestas otra vez.

Fernando



El viernes, 1 de diciembre de 2017, 3:10:28 (UTC-5), Sergi Almacellas
<javascript:>
Post by Fernando Sánchez
Saludos a la comunidad,
En esta oportunidad necesito luces para extender la clase
party.identifier de la versión 4.6
El campo "type" de esta clase es del tipo fields.Selection, que
hasta la version 4.2 obtenía sus valores via la función get_types,
así para extenderlo en mi modulo solo redefinia la función get_types
con los valores que obtenía de una tabla.
type = fields.Selection('get_types', 'Type')
Sucede que en la versión 4.6 ya no se usa get_types sino que se
asignan los valores de manera estática
type = fields.Selection([
(None, ''),
('eu_vat', 'VAT'),
], 'Type')
Me gustaría saber como puedo redefinir los valores de type en mi
modulo personalizado.
Saludos y agradecimiento anticipado.
Seria lo mismo en el __setup__ y añadir mas opcions en la llista del
atributo "selectiu" de "cls.type"
http://hg.tryton.org/modules/account_payment_stripe/file/199ba42de12c/payment.py#l35
Un saludo,
--
Sergi Almacellas Abellana
www.koolpi.com
Karla Stenger
2017-12-04 15:10:55 UTC
Permalink
Post by Fernando Sánchez
Gracias Sergi y Raimon por su pronta y clara respuesta.
Ya logre personalizar la selection, pero solo de forma estatica.
Al poblarla dinamicamente con registros de una tabla que contiene los
valores me lanza un error.
class
​​
'Party Identifier'
__metaclass__ = PoolMeta
__name__ =
​​
'party.identifier'
@classmethod
super(PartyIdentifier, cls).__setup__()
tiposdocid = cls.get_types()
cls.type.selection.append(tipos)
@classmethod
#return [('0', 'Otros tipos de documentos'),('6', 'RUC'),('1',
'DNI'),('4', 'C. EXT.'),('7', 'Pasaporte'),('A',u'Cédula Diplomática de
Identidad'),]
pool = Pool()
Type = pool.get('sunat.tipodocid')
types = Type.search([('active','=','True')])
return [(x.code, x.name) for x in types]
File "/home/nando/.virtualenvs/liberorbis46/bin/trytond-admin", line
21, in <module>
admin.run(options)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/
python2.7/site-packages/trytond/admin.py", line 54, in run
installdeps=options.installdeps)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/
python2.7/site-packages/trytond/pool.py", line 155, in init
lang=lang, installdeps=installdeps)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/
python2.7/site-packages/trytond/modules/__init__.py", line 462, in
load_modules
_load_modules(update)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/
python2.7/site-packages/trytond/modules/__init__.py", line 432, in
_load_modules
load_module_graph(graph, pool, update, lang)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/
python2.7/site-packages/trytond/modules/__init__.py", line 229, in
load_module_graph
pool.setup(classes)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/
python2.7/site-packages/trytond/pool.py", line 227, in setup
cls.__setup__()
File "/home/nando/.virtualenvs/liberorbis46/local/lib/
python2.7/site-packages/trytond/modules/liberorbis_peru_loc/party.py",
line 66, in __setup__
tiposdocid = cls.get_types()
File "/home/nando/.virtualenvs/liberorbis46/local/lib/
python2.7/site-packages/trytond/modules/liberorbis_peru_loc/party.py",
line 76, in get_types
types = Type.search([('active','=','True')])
File "/home/nando/.virtualenvs/liberorbis46/local/lib/
python2.7/site-packages/trytond/model/modelsql.py", line 1128, in search
tables, expression = cls.search_domain(domain)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/
python2.7/site-packages/trytond/model/modelsql.py", line 1286, in
search_domain
domain = cls._search_domain_active(domain, active_test=active_test)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/
python2.7/site-packages/trytond/model/modelstorage.py", line 407, in
_search_domain_active
if not ('active' in cls._fields
AttributeError: type object
​​
'sunat.tipodocid' has no attribute '_fields'
​Hola Fernando,
no sé, pero si fuera tú, revisaría el orden en el cual se registran las
clases en el Pool en __init__.py y me aseguraría que la clase
​'sunat.tipodocid' se registre antes que ​PartyIdentifier.
​
​Saludos,
Karla.​
--
-------------------------
Karla Mª Stenger Sábat
***@gmail.com
Fernando Sánchez
2017-12-04 16:28:45 UTC
Permalink
Hola Karla

Gracias por tu respuesta,

Probé haciendo lo que indicas, pero sigue igual.

Por alguna razón no se esta remplazando _fields con la lista de campos
de la tabla sunat_tipodocid al llamar al método search.

Aquí la definición de tipodocid:

class TipoDocId(ModelSQL, ModelView):
    'Tipo de documento de identidad sunat'
    __name__ = 'sunat.tipodocid'

    code = fields.Char(u'Código Tipo Documento Identidad', size=1,
help=u'Tipo Documento Identidad - SUNAT: Tabla 02')
    name = fields.Char(u'Documento de Identidad', size=50, help=u'Nombre
del Documento')
    active = fields.Boolean(u'Activo',help=u'Estado del registro')

Aquí el __init__.py

def register():
    Pool.register(
        Party,
        Address,
        Template,
        Product,
        TipoCdp,
        TipoMdp,
        TipoExisteSUNAT,
        Bank,
        *TipoDocId,*
        AduanaId,
        OperaStock,
        CatalogoExiste,
        Company,
        ExportPLEStart,
        ExportPLEResult,
        PaymentType,
        Currency,
        Rate,
        TraerTCStart,
        TraerTCResult,
        FiscalYear,
        Sale,
        Purchase,
        *PartyIdentifier, *           
        module='liberorbis_peru_loc', type_='model')
    Pool.register(
        ExportPLE,
        TraerTC,
        module='liberorbis_peru_loc', type_='wizard')

Seguiré dándole vueltas al asunto, si se te ocurre algo mas bienvenidos
los aportes.

Gracias otra vez.

Fernando
El 1 de diciembre de 2017, 10:32, Fernando Sánchez
Gracias Sergi y Raimon por su pronta y clara respuesta.
Ya logre personalizar la selection, pero solo de forma estatica.
Al poblarla dinamicamente con registros de una tabla que contiene
los valores me lanza un error.
class
​​
    'Party Identifier'
    __metaclass__ = PoolMeta
    __name__ =
​​
'party.identifier'
   
        super(PartyIdentifier, cls).__setup__()
        tiposdocid = cls.get_types()
                cls.type.selection.append(tipos)
   
        #return [('0', 'Otros tipos de documentos'),('6',
'RUC'),('1', 'DNI'),('4', 'C. EXT.'),('7',
'Pasaporte'),('A',u'Cédula Diplomática de Identidad'),]
        pool = Pool()
        Type = pool.get('sunat.tipodocid')
        types = Type.search([('active','=','True')])
        return [(x.code, x.name <http://x.name>) for x in types]
  File "/home/nando/.virtualenvs/liberorbis46/bin/trytond-admin",
line 21, in <module>
    admin.run(options)
  File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/admin.py",
line 54, in run
    installdeps=options.installdeps)
  File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/pool.py",
line 155, in init
    lang=lang, installdeps=installdeps)
  File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/__init__.py",
line 462, in load_modules
    _load_modules(update)
  File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/__init__.py",
line 432, in _load_modules
    load_module_graph(graph, pool, update, lang)
  File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/__init__.py",
line 229, in load_module_graph
    pool.setup(classes)
  File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/pool.py",
line 227, in setup
    cls.__setup__()
  File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/liberorbis_peru_loc/party.py",
line 66, in __setup__
    tiposdocid = cls.get_types()
  File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/liberorbis_peru_loc/party.py",
line 76, in get_types
    types = Type.search([('active','=','True')])
  File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/model/modelsql.py",
line 1128, in search
    tables, expression = cls.search_domain(domain)
  File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/model/modelsql.py",
line 1286, in search_domain
    domain = cls._search_domain_active(domain,
active_test=active_test)
  File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/model/modelstorage.py",
line 407, in _search_domain_active
    if not ('active' in cls._fields
AttributeError: type object
​​
'sunat.tipodocid' has no attribute '_fields'
​Hola Fernando,
no sé, pero si fuera tú, revisaría el orden en el cual se registran
las clases en el Pool en __init__.py y me aseguraría que la clase
​'sunat.tipodocid' se registre antes que ​PartyIdentifier.
​
​Saludos,
Karla.​
--
-------------------------
Karla  Mª  Stenger  Sábat
Karla Stenger
2017-12-05 17:52:43 UTC
Permalink
Post by Fernando Sánchez
Hola Karla
Gracias por tu respuesta,
Probé haciendo lo que indicas, pero sigue igual.
Por alguna razón no se esta remplazando _fields con la lista de campos de
la tabla sunat_tipodocid al llamar al método search.
​Investigué un poco más, y encontré que el campo _fields se agrega al
modelo en la funcion __post_setup__ [1] por lo que si la llamas desde
__setup__ es de esperar que no exista.

Entiendo que esto es, o bien una limitación para la funcion __setup__ que
no te permite filtrar por el campo 'active' o bien un bug.


Podrías por ejemplo eliminar el filtro para ver si así te funciona, quizás
considerar si es realmente necesario en este caso.


O quizás alguien que lo entienda mejor te pueda dar otro consejo de como
manejarlo.
Por ejemplo, me pregunto si usar __post_setup__ en tu caso ayudaría.
​


Saludos,
Karla.​

​[1]​ - http://hg.tryton.org/trytond/file/4.6/trytond/model/model.py#l56
​
Post by Fernando Sánchez
'Tipo de documento de identidad sunat'
__name__ = 'sunat.tipodocid'
code = fields.Char(u'Código Tipo Documento Identidad', size=1,
help=u'Tipo Documento Identidad - SUNAT: Tabla 02')
name = fields.Char(u'Documento de Identidad', size=50, help=u'Nombre
del Documento')
active = fields.Boolean(u'Activo',help=u'Estado del registro')
Aquí el __init__.py
Pool.register(
Party,
Address,
Template,
Product,
TipoCdp,
TipoMdp,
TipoExisteSUNAT,
Bank,
*TipoDocId,*
AduanaId,
OperaStock,
CatalogoExiste,
Company,
ExportPLEStart,
ExportPLEResult,
PaymentType,
Currency,
Rate,
TraerTCStart,
TraerTCResult,
FiscalYear,
Sale,
Purchase,
*PartyIdentifier, *
module='liberorbis_peru_loc', type_='model')
Pool.register(
ExportPLE,
TraerTC,
module='liberorbis_peru_loc', type_='wizard')
Seguiré dándole vueltas al asunto, si se te ocurre algo mas bienvenidos
los aportes.
Gracias otra vez.
Fernando
Post by Fernando Sánchez
Gracias Sergi y Raimon por su pronta y clara respuesta.
Ya logre personalizar la selection, pero solo de forma estatica.
Al poblarla dinamicamente con registros de una tabla que contiene los
valores me lanza un error.
class
​​
'Party Identifier'
__metaclass__ = PoolMeta
__name__ =
​​
'party.identifier'
@classmethod
super(PartyIdentifier, cls).__setup__()
tiposdocid = cls.get_types()
cls.type.selection.append(tipos)
@classmethod
#return [('0', 'Otros tipos de documentos'),('6', 'RUC'),('1',
'DNI'),('4', 'C. EXT.'),('7', 'Pasaporte'),('A',u'Cédula Diplomática de
Identidad'),]
pool = Pool()
Type = pool.get('sunat.tipodocid')
types = Type.search([('active','=','True')])
return [(x.code, x.name) for x in types]
File "/home/nando/.virtualenvs/liberorbis46/bin/trytond-admin", line
21, in <module>
admin.run(options)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/
site-packages/trytond/admin.py", line 54, in run
installdeps=options.installdeps)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/
site-packages/trytond/pool.py", line 155, in init
lang=lang, installdeps=installdeps)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/
site-packages/trytond/modules/__init__.py", line 462, in load_modules
_load_modules(update)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/
site-packages/trytond/modules/__init__.py", line 432, in _load_modules
load_module_graph(graph, pool, update, lang)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/
site-packages/trytond/modules/__init__.py", line 229, in
load_module_graph
pool.setup(classes)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/
site-packages/trytond/pool.py", line 227, in setup
cls.__setup__()
File "/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/
site-packages/trytond/modules/liberorbis_peru_loc/party.py", line 66, in
__setup__
tiposdocid = cls.get_types()
File "/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/
site-packages/trytond/modules/liberorbis_peru_loc/party.py", line 76, in
get_types
types = Type.search([('active','=','True')])
File "/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/
site-packages/trytond/model/modelsql.py", line 1128, in search
tables, expression = cls.search_domain(domain)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/
site-packages/trytond/model/modelsql.py", line 1286, in search_domain
domain = cls._search_domain_active(domain, active_test=active_test)
File "/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/
site-packages/trytond/model/modelstorage.py", line 407, in
_search_domain_active
if not ('active' in cls._fields
AttributeError: type object
​​
'sunat.tipodocid' has no attribute '_fields'
​Hola Fernando,
no sé, pero si fuera tú, revisaría el orden en el cual se registran las
clases en el Pool en __init__.py y me aseguraría que la clase
​'sunat.tipodocid' se registre antes que ​PartyIdentifier.
​
​Saludos,
Karla.​
--
-------------------------
Karla Mª Stenger Sábat
--
-------------------------
Karla Mª Stenger Sábat
***@gmail.com
Fernando Sánchez
2017-12-06 15:27:07 UTC
Permalink
Hola Karla, gracias otra vez por tomarte el tiempo para investigar.
También probé el search sin condición "docums = Docum.search([])" y ocurre
el error igualmente.
Es un caso para analizar mas en profundidad, seguiré buscando la solución.
Si alguien tiene algo mas que agregar estaré agradecido.

Saludos

Fernando
Post by Karla Stenger
Post by Fernando Sánchez
Hola Karla
Gracias por tu respuesta,
Probé haciendo lo que indicas, pero sigue igual.
Por alguna razón no se esta remplazando _fields con la lista de campos de
la tabla sunat_tipodocid al llamar al método search.
​Investigué un poco más, y encontré que el campo _fields se agrega al
modelo en la funcion __post_setup__ [1] por lo que si la llamas desde
__setup__ es de esperar que no exista.
Entiendo que esto es, o bien una limitación para la funcion __setup__ que
no te permite filtrar por el campo 'active' o bien un bug.
Podrías por ejemplo eliminar el filtro para ver si así te funciona, quizás
considerar si es realmente necesario en este caso.
O quizás alguien que lo entienda mejor te pueda dar otro consejo de como
manejarlo.
Por ejemplo, me pregunto si usar __post_setup__ en tu caso ayudaría.
​
Saludos,
Karla.​
​[1]​ - http://hg.tryton.org/trytond/file/4.6/trytond/model/model.py#l56
​
Post by Fernando Sánchez
'Tipo de documento de identidad sunat'
__name__ = 'sunat.tipodocid'
code = fields.Char(u'Código Tipo Documento Identidad', size=1,
help=u'Tipo Documento Identidad - SUNAT: Tabla 02')
name = fields.Char(u'Documento de Identidad', size=50, help=u'Nombre
del Documento')
active = fields.Boolean(u'Activo',help=u'Estado del registro')
Aquí el __init__.py
Pool.register(
Party,
Address,
Template,
Product,
TipoCdp,
TipoMdp,
TipoExisteSUNAT,
Bank,
*TipoDocId,*
AduanaId,
OperaStock,
CatalogoExiste,
Company,
ExportPLEStart,
ExportPLEResult,
PaymentType,
Currency,
Rate,
TraerTCStart,
TraerTCResult,
FiscalYear,
Sale,
Purchase,
*PartyIdentifier, *
module='liberorbis_peru_loc', type_='model')
Pool.register(
ExportPLE,
TraerTC,
module='liberorbis_peru_loc', type_='wizard')
Seguiré dándole vueltas al asunto, si se te ocurre algo mas bienvenidos
los aportes.
Gracias otra vez.
Fernando
Post by Fernando Sánchez
Gracias Sergi y Raimon por su pronta y clara respuesta.
Ya logre personalizar la selection, pero solo de forma estatica.
Al poblarla dinamicamente con registros de una tabla que contiene los
valores me lanza un error.
class
​​
'Party Identifier'
__metaclass__ = PoolMeta
__name__ =
​​
'party.identifier'
@classmethod
super(PartyIdentifier, cls).__setup__()
tiposdocid = cls.get_types()
cls.type.selection.append(tipos)
@classmethod
#return [('0', 'Otros tipos de documentos'),('6', 'RUC'),('1',
'DNI'),('4', 'C. EXT.'),('7', 'Pasaporte'),('A',u'Cédula Diplomática de
Identidad'),]
pool = Pool()
Type = pool.get('sunat.tipodocid')
types = Type.search([('active','=','True')])
return [(x.code, x.name) for x in types]
File "/home/nando/.virtualenvs/liberorbis46/bin/trytond-admin", line
21, in <module>
admin.run(options)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/admin.py",
line 54, in run
installdeps=options.installdeps)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/pool.py",
line 155, in init
lang=lang, installdeps=installdeps)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/__init__.py",
line 462, in load_modules
_load_modules(update)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/__init__.py",
line 432, in _load_modules
load_module_graph(graph, pool, update, lang)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/__init__.py",
line 229, in load_module_graph
pool.setup(classes)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/pool.py",
line 227, in setup
cls.__setup__()
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/liberorbis_peru_loc/party.py",
line 66, in __setup__
tiposdocid = cls.get_types()
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/modules/liberorbis_peru_loc/party.py",
line 76, in get_types
types = Type.search([('active','=','True')])
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/model/modelsql.py",
line 1128, in search
tables, expression = cls.search_domain(domain)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/model/modelsql.py",
line 1286, in search_domain
domain = cls._search_domain_active(domain, active_test=active_test)
File
"/home/nando/.virtualenvs/liberorbis46/local/lib/python2.7/site-packages/trytond/model/modelstorage.py",
line 407, in _search_domain_active
if not ('active' in cls._fields
AttributeError: type object
​​
'sunat.tipodocid' has no attribute '_fields'
​Hola Fernando,
no sé, pero si fuera tú, revisaría el orden en el cual se registran las
clases en el Pool en __init__.py y me aseguraría que la clase
​'sunat.tipodocid' se registre antes que ​PartyIdentifier.
​
​Saludos,
Karla.​
--
-------------------------
Karla Mª Stenger Sábat
--
-------------------------
Karla Mª Stenger Sábat
Sergi Almacellas Abellana
2017-12-07 08:55:59 UTC
Permalink
Post by Fernando Sánchez
Hola Karla, gracias otra vez por tomarte el tiempo para investigar.
También probé el search sin condición "docums = Docum.search([])" y
ocurre el error igualmente.
Seguramente el problema venga dado porqué al momento de inicializar la
base de datos la tabla a la que estas accediendo no existe.
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Sergi Almacellas Abellana
2017-12-07 08:52:02 UTC
Permalink
Post by Fernando Sánchez
Hola Karla
Gracias por tu respuesta,
Probé haciendo lo que indicas, pero sigue igual.
Por alguna razón no se esta remplazando _fields con la lista de
campos de la tabla sunat_tipodocid al llamar al método search.
​ Investigué un poco más, y encontré que el campo _fields se agrega al
modelo en la funcion __post_setup__ [1] por lo que si la llamas desde
__setup__ es de esperar que no exista.
Si no recuerdo mal, esta hecho a posta, ya que el __post__setup__ se
llama solo cuando se han "cargado" los campos y su definicion. Esto es
para permitir modificar los campos en el __setup__.
Post by Fernando Sánchez
Entiendo que esto es, o bien una limitación para la funcion __setup__
que no te permite filtrar por el campo 'active' o bien un bug.
Podrías por ejemplo eliminar el filtro para ver si así te funciona,
quizás considerar si es realmente necesario en este caso.
O quizás alguien que lo entienda mejor te pueda dar otro consejo de como
manejarlo.
 Por ejemplo, me pregunto si usar __post_setup__ en tu caso ayudaría.
No deberías sobreeescribir el __post_setup__.

En este caso, supongo que lo mas facil es no definir los valores en una
tabla a parte, sinó añadir los valores directamente a la lista.

Un saludo,
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Fernando Sánchez
2017-12-07 10:59:20 UTC
Permalink
Hola Sergi

Hasta la versión 4.2 la definición del campo type en la clase
PartyIdentifier era así
<http://hg.tryton.org/modules/party/file/4.2/party.py#l253>:

*type = fields.Selection('get_types', 'Type')*


Usaba el método 'get_types' para poblar la lista y el usuario seleccione,
yo sobrescribí este método y obtenía los valores de una tabla sin ningún
problema.

Desde la 4.4 se cambió a
<http://hg.tryton.org/modules/party/file/4.4/party.py#l301>:


*type** = fields.Selection([**
(None, ''),
('eu_vat', 'VAT'),
*

*], 'Type')*


A mi modesto entender la definición de la 4.2 fue mejor pues te permitía
evitar el HARDCODE de los tipos de identificación.
Sería interesante saber cual fue la razón por la que se hizo el cambio,
pues hasta donde se ve, en la 4.2 tienes mayor flexibilidad.

Saludos

Fernando



El jueves, 7 de diciembre de 2017, 3:52:05 (UTC-5), Sergi Almacellas
<javascript:>
Post by Fernando Sánchez
Hola Karla
Gracias por tu respuesta,
Probé haciendo lo que indicas, pero sigue igual.
Por alguna razón no se esta remplazando _fields con la lista de
campos de la tabla sunat_tipodocid al llamar al método search.
​ Investigué un poco más, y encontré que el campo _fields se agrega al
modelo en la funcion __post_setup__ [1] por lo que si la llamas desde
__setup__ es de esperar que no exista.
Si no recuerdo mal, esta hecho a posta, ya que el __post__setup__ se
llama solo cuando se han "cargado" los campos y su definicion. Esto es
para permitir modificar los campos en el __setup__.
Post by Fernando Sánchez
Entiendo que esto es, o bien una limitación para la funcion __setup__
que no te permite filtrar por el campo 'active' o bien un bug.
Podrías por ejemplo eliminar el filtro para ver si así te funciona,
quizás considerar si es realmente necesario en este caso.
O quizás alguien que lo entienda mejor te pueda dar otro consejo de como
manejarlo.
Por ejemplo, me pregunto si usar __post_setup__ en tu caso ayudaría.
No deberías sobreeescribir el __post_setup__.
En este caso, supongo que lo mas facil es no definir los valores en una
tabla a parte, sinó añadir los valores directamente a la lista.
Un saludo,
--
Sergi Almacellas Abellana
www.koolpi.com
Sergi Almacellas Abellana
2017-12-07 12:25:19 UTC
Permalink
Post by Fernando Sánchez
Hola Sergi
Hasta la versión 4.2 la definición del campo type en la clase
PartyIdentifier era así
*type = fields.Selection('get_types', 'Type')*
Usaba el método 'get_types' para poblar la lista y el usuario
seleccione, yo sobrescribí este método y obtenía los valores de una
tabla sin ningún problema. >
Desde la 4.4 se cambió a
*type**= fields.Selection([**(None, ''), ('eu_vat', 'VAT'), *
*], 'Type')*
A mi modesto entender la definición de la 4.2 fue mejor pues te permitía
evitar el HARDCODE de los tipos de identificación.
De hecho, los tipos de identificación deben ser estáticos. No entiendo
porqué necesitas almazenar-los en una tabla.
Post by Fernando Sánchez
Sería interesante saber cual fue la razón por la que se hizo el cambio,
pues hasta donde se ve, en la 4.2 tienes mayor flexibilidad.
Aquí tienes la issue donde se discutió:

https://bugs.tryton.org/issue6374
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Fernando Sánchez
2017-12-07 12:47:04 UTC
Permalink
Bueno, es cuestión de perspectivas.

En el Perú de acuerdo a la entidad tributaria SUNAT existen estos tipos
de identificadores que deben ser manejados en todo software de gestión
comercial, es así que en la localización peruana de Tryton y GNU Health
lo manejamos en una tabla:

*_TABLA 2: TIPO DE DOCUMENTO DE IDENTIDAD_* *_
_*


*N°* *DESCRIPCIÓN*
0 OTROS TIPOS DE DOCUMENTOS
1 DOCUMENTO NACIONAL DE IDENTIDAD (DNI)
4 CARNET DE EXTRANJERIA
6 REGISTRO ÚNICO DE CONTRIBUYENTES
7 PASAPORTE


Y creemos que a futuro se pueden agregar o eliminar algún tipo, al
margen que el "OTROS TIPOS DE DOCUMENTOS" podría sugerir que no, pero no
queda otra entonces que el HARDCODE.

Saludos

Fernando
Post by Fernando Sánchez
Hola Sergi
Hasta la versión 4.2 la definición del campo type en la clase
PartyIdentifier era así
*type = fields.Selection('get_types', 'Type')*
Usaba el método 'get_types' para poblar la lista y el usuario
seleccione, yo sobrescribí este método y obtenía los valores de una
tabla sin ningún problema. >
Desde la 4.4 se cambió a
*type**= fields.Selection([**(None, ''), ('eu_vat', 'VAT'), *
*], 'Type')*
A mi modesto entender la definición de la 4.2 fue mejor pues te
permitía evitar el HARDCODE de los tipos de identificación.
De hecho, los tipos de identificación deben ser estáticos. No entiendo
porqué necesitas almazenar-los en una tabla.
Post by Fernando Sánchez
Sería interesante saber cual fue la razón por la que se hizo el
cambio, pues hasta donde se ve, en la 4.2 tienes mayor flexibilidad.
https://bugs.tryton.org/issue6374
Sergi Almacellas Abellana
2017-12-07 12:54:45 UTC
Permalink
Bueno, es cuestión de perspectivas.
En el Perú de acuerdo a la entidad tributaria SUNAT existen estos tipos
de identificadores que deben ser manejados en todo software de gestión
comercial, es así que en la localización peruana de Tryton y GNU Health
*_TABLA 2: TIPO DE DOCUMENTO DE IDENTIDAD_* *_
_*
*N°* *DESCRIPCIÓN*
0 OTROS TIPOS DE DOCUMENTOS
1 DOCUMENTO NACIONAL DE IDENTIDAD (DNI)
4 CARNET DE EXTRANJERIA
6 REGISTRO ÚNICO DE CONTRIBUYENTES
7 PASAPORTE
Y creemos que a futuro se pueden agregar o eliminar algún tipo, al
margen que el "OTROS TIPOS DE DOCUMENTOS" podría sugerir que no, pero no
queda otra entonces que el HARDCODE.
puedes utilizar pe_ como prefixo en tu localización e incluir el código
de la tabla luego.

No entiendo el problema que le ves en que sea HARDCODE. Es mas fàcil de
mantener en el código que no ir añadiendo registros en listas de la base
de datos. Imáginate que tienes 20 clientes con este módulo, en caso de
añadir un nuevo tipo que vas prefieres hacer?

1. Hacer un insert en cada base de datos para añadir el registro
2. Actualizar el código del módulo y olvidarte de tocar la base de datos

Un saludo,
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Fernando Sánchez
2017-12-07 15:01:16 UTC
Permalink
Ninguna de las 2 opciones, mas bien agregaría una:

3.- Me olvido del tema agregando un formulario de mantenimiento donde el
usuario administrador del sistema agregue o quite registros sin
participación del programador, tal como lo tengo hecho para la versión
4.2. Me parece mas económico.

Un Saludo
Post by Sergi Almacellas Abellana
Bueno, es cuestión de perspectivas.
En el Perú de acuerdo a la entidad tributaria SUNAT existen estos
tipos de identificadores que deben ser manejados en todo software de
gestión comercial, es así que en la localización peruana de Tryton y
*_TABLA 2: TIPO DE DOCUMENTO DE IDENTIDAD_*     *_
_*
    
*N°*     *DESCRIPCIÓN*
0     OTROS TIPOS DE DOCUMENTOS
1     DOCUMENTO NACIONAL DE IDENTIDAD (DNI)
4     CARNET DE EXTRANJERIA
6     REGISTRO ÚNICO DE CONTRIBUYENTES
7     PASAPORTE
Y creemos que a futuro se pueden agregar o eliminar algún tipo, al
margen que el "OTROS TIPOS DE DOCUMENTOS" podría sugerir que no, pero
no queda otra entonces que el HARDCODE.
puedes utilizar pe_ como prefixo en tu localización e incluir el
código de la tabla luego.
No entiendo el problema que le ves en que sea HARDCODE. Es mas fàcil
de mantener en el código que no ir añadiendo registros en listas de la
base de datos. Imáginate que tienes 20 clientes con este módulo, en
caso de añadir un nuevo tipo que vas prefieres hacer?
1. Hacer un insert en cada base de datos para añadir el registro
2. Actualizar el código del módulo y olvidarte de tocar la base de datos
Un saludo,
Sergi Almacellas Abellana
2017-12-07 15:03:03 UTC
Permalink
Post by Fernando Sánchez
3.- Me olvido del tema agregando un formulario de mantenimiento donde el
usuario administrador del sistema agregue o quite registros sin
participación del programador, tal como lo tengo hecho para la versión
4.2. Me parece mas económico.
Entonces si administras 30 sistemas, deberas ir uno por una a cada
formulario y crear el registro.

A parte que tienes que crear las vistas y las opciones de menú, para una
información que es estàtica.

Ami me parece complicar-lo un poco demasiado.
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Fernando Sánchez
2017-12-07 15:43:21 UTC
Permalink
No Sergi, creo no nos estamos entendiendo.

Los formularios que existen en Tryton como Party o Products, son para
ser usados por los usuarios finales, eso mismo hago para esta tabla de
tipos de documentos de identidad, no es que yo tenga que ir actualizando
en cada compañía implementada cuando necesiten registrar un producto o
un party.

Yo implemento el sistema, sera el usuario administrador de cada sistema
dentro de cada compañía, el que se encargue de mantener actualizado esta
tabla en caso se agregue o quite algún tipo de documento, evitando que
se tenga que hacer la actualización vía código fuente. Eso es todo.

Un Saludo
Post by Sergi Almacellas Abellana
Post by Fernando Sánchez
3.- Me olvido del tema agregando un formulario de mantenimiento donde el
usuario administrador del sistema agregue o quite registros sin
participación del programador, tal como lo tengo hecho para la versión
4.2. Me parece mas económico.
Entonces si administras 30 sistemas, deberas ir uno por una a cada
formulario y crear el registro.
A parte que tienes que crear las vistas y las opciones de menú, para
una información que es estàtica.
Ami me parece complicar-lo un poco demasiado.
Sergi Almacellas Abellana
2017-12-07 15:44:56 UTC
Permalink
Post by Fernando Sánchez
No Sergi, creo no nos estamos entendiendo.
Los formularios que existen en Tryton como Party o Products, son para
ser usados por los usuarios finales, eso mismo hago para esta tabla de
tipos de documentos de identidad, no es que yo tenga que ir actualizando
en cada compañía implementada cuando necesiten registrar un producto o
un party.
Yo implemento el sistema, sera el usuario administrador de cada sistema
dentro de cada compañía, el que se encargue de mantener actualizado esta
tabla en caso se agregue o quite algún tipo de documento, evitando que
se tenga que hacer la actualización vía código fuente. Eso es todo.
Si yo te entiendo perfectamente. Simplemente digo, que es más fàcil de
gestionar via código fuente.

Pero si lo quieres hacer de otra forma, adelante!


Saludos,
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Guillem Barba Domingo
2017-12-12 08:59:41 UTC
Permalink
El 7 dic. 2017 15:44, "Sergi Almacellas Abellana" <***@koolpi.com>
escribió:

El 07/12/17 a les 16:43, Fernando Sánchez ha escrit:

No Sergi, creo no nos estamos entendiendo.
Post by Fernando Sánchez
Los formularios que existen en Tryton como Party o Products, son para
ser usados por los usuarios finales, eso mismo hago para esta tabla de
tipos de documentos de identidad, no es que yo tenga que ir actualizando
en cada compañía implementada cuando necesiten registrar un producto o
un party.
Yo implemento el sistema, sera el usuario administrador de cada sistema
dentro de cada compañía, el que se encargue de mantener actualizado esta
tabla en caso se agregue o quite algún tipo de documento, evitando que
se tenga que hacer la actualización vía código fuente. Eso es todo.
Si yo te entiendo perfectamente. Simplemente digo, que es más fàcil de
gestionar via código fuente.

Pero si lo quieres hacer de otra forma, adelante!


Hola Fernando,
tu punto de vista es válido.

Seguramente detrás de la decisión del cambio hay dos consideraciones:
a) la "aparición" de un nuevo tipo de documento de identificación (que es
una cuestión normativa) no es algo que pase de la noche a la mañana y, al
ser normativo, justificaría una actualización del software
a.1) toda localización se mantiene actualizada
b) tener valores más estáticos hace más válido que en algún módulo se haga
algo como:
if type == "VAT":
something
Que si las opciones del tutor son manejadas por el usuario esto sería muy
mala idea.

Dicho esto, seguramente se podría haber solucionado definiendo los tipos
"predefinidos" desde un XML (que Tryton protege que el usuario pueda
cambiarlos) como se hace (si no recuerdo mal) para tipos de
impuestos/cuentas.

Pero tal vez tienes una solución, que pasa por modificar el campo.
No puedes redefinir un campo existente (se ignorará), pero creo que sí que
puedes hacer en el setup:
cls.type.options = "get_types"
(El atributo "options" no es correcto, pero lo digo de memoria u hace
tiempo que no programo Tryton).
Para mantener compatibilidad, el get_types debería devolver los valores
definidos estáticamente + tu tabla.

Esto es más un hack que una solución, pero si no te sirve mantener los
tipos disponibles como parte del código tal vez te sirve.

Salut,
Guillem

Loading...