__table__() returns None for _name attribute

Greetings everyone,

Actually I’m using the trytond version 7.6, I found a possible bug in trytond. I was working and I encountered this error message when I opening a Many2One relation to party:

Traceback (most recent call last):
  File "/site-packages/trytond/wsgi.py", line 97, in dispatch_request
    return endpoint(request, **request.view_args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/site-packages/trytond/protocols/dispatcher.py", line 44, in rpc
    return methods.get(request.rpc_method, _dispatch)(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/site-packages/trytond/wsgi.py", line 77, in wrapper
    return func(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/site-packages/trytond/protocols/wrappers.py", line 206, in wrapper
    result = func(request, pool, *args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/site-packages/trytond/protocols/dispatcher.py", line 216, in _dispatch
    result = rpc.result(meth(*c_args, **c_kwargs))
                        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/site-packages/trytond/model/modelsql.py", line 1252, in read
    getter_results = field.get(
                     ^^^^^^^^^^
  File "/site-packages/trytond/model/fields/function.py", line 27, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/site-packages/trytond/transaction.py", line 63, in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/site-packages/trytond/model/fields/function.py", line 174, in get
    return dict((name, call(name)) for name in names)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/site-packages/trytond/model/fields/function.py", line 174, in <genexpr>
    return dict((name, call(name)) for name in names)
                       ^^^^^^^^^^
  File "/site-packages/trytond/model/fields/function.py", line 136, in call
    return {
           ^
  File "/site-packages/trytond/model/fields/function.py", line 137, in <dictcomp>
    r.id: convert(method(r, name), name) for r in records}
                  ^^^^^^^^^^^^^^^
  File "/site-packages/trytond/model/fields/field.py", line 124, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/site-packages/trytond/modules/speco/party.py", line 232, in get_family_member
    cursor.execute(str(family_members_query), (self.id, ))
  File "/site-packages/trytond/backend/postgresql/database.py", line 78, in execute
    cursor.execute(self, sql, args)
psycopg2.errors.SyntaxError: syntax error at or near "AS"
LINE 1: SELECT "a"."state" AS "state" FROM  AS "a" WHERE ("a"."party...
                                            ^

I reviewed my custom function get_family_member and next to get the table of model the attribute _name of table is beening None.

Any change from last upgrade of tyrtond to declare models?, Anyone can help me?

This is my custom method:

    @fields.depends('family_members')
    def get_family_member(self, name=None):
        def is_active(member_tuple):
            state = member_tuple[0]
            return state != 'excluded'

        family_members = FamilyMembers.__table__()

        cursor = Transaction().connection.cursor()

        family_members_query = family_members.select(
            family_members.state.as_('state'),
            where=family_members.party == Literal('?')
        )

        cursor.execute(str(family_members_query), (self.id, ))

        family_members_tuples = [record for record in cursor]

        all_are_active = all(
            is_active(member) for member in family_members_tuples)

        if not all_are_active or not family_members_tuples:
            return False
        return True

Next to do



    @fields.depends('family_members')
    def get_family_member(self, name=None):
        def is_active(member_tuple):
            state = member_tuple[0]
            return state != 'excluded'

        family_members = FamilyMembers.__table__()

        family_members._name = 'speco_family_members'
        cursor = Transaction().connection.cursor()

        family_members_query = family_members.select(
            family_members.state.as_('state'),
            where=family_members.party == Literal('?')
        )

        cursor.execute(str(family_members_query), (self.id, ))

        family_members_tuples = [record for record in cursor]

        all_are_active = all(
            is_active(member) for member in family_members_tuples)

        if not all_are_active or not family_members_tuples:
            return False
        return True

The problem is fixed.

Thanks for all

You must always get the class from the pool and never from the declaration in the module.

You should set the value directly as:

        family_members_query = family_members.select(
            family_members.state.as_('state'),
            where=family_members.party == self.id
        )

You should never call str on the query.
The proper way is to use:

cursor.execute(*family_members_query)
1 Like

Thank you for your answer, this is the problem.

This topic was automatically closed 24 hours after the last reply. New replies are no longer allowed.