web-dev-qa-db-fra.com

Odoo 8: filtre de domaine Many2many

J'ai plusieurs types d'organisation avec une relation many2many décrivant les types qui peuvent être parent à d'autres types (par exemple, le département peut être parent à sous-département et groupe de travail). Ce n'est PAS une hiérarchie stricte (le groupe de travail peut être le parent d'autres groupes de travail), d'où la relation many2many.

J'ai deux champs sur mon objet organization_type: allowed_parent_type_ids et l'inverse allowed_children_type_ids.

Maintenant, je veux restreindre le champ de type d'organisation sur mon objet d'organisation en fonction de son parent, de sorte qu'un enfant d'un "département" ne puisse sélectionner que les types d'organisation autorisés à être des enfants de départements, etc.

Dans ma vue formulaire, j'ai essayé:

<field
    name="organization_type_id"
    domain="[('id', 'in', parent_id.organization_type_id.allowed_children_ids)]"
    />

J'ai également essayé de mettre un champ associé avec des types autorisés sur mon objet d'organisation, mais je me retrouve toujours avec un message d'erreur. Ma dernière tentative a été:

domain=[('id', 'in', allowed_type_ids)]

Cela donne un message d'erreur:

TypeError: not all arguments converted during string formatting

Le client récupère en fait un objet JSON comme "allowed_type_ids" = [0,1,2] et si je remplace allowed_type_ids dans l'expression de domaine par [0,1,2] il n'y a pas d'erreur et j'obtiens les trois types d'organisation dans ma sélection ...

15
cgs

Essaye ça:

<field
    name="organization_type_id"
    domain="[('id', 'in', parent_id.organization_type_id.allowed_children_ids.ids)]"
    />

Tandis que allowed_children_ids est un ensemble d'enregistrements, allowed_children_ids.ids est une liste des identifiants de ces enregistrements.

Vous pouvez également aborder cela de l'autre côté. Cela devrait fonctionner et être plus rapide:

<field
    name="organization_type_id"
    domain="[('allowed_parent_type_ids', '=', parent_id.organization_type_id)]"
    />
8
Ludwik Trammer

EDIT: Cette astuce ne fonctionne plus en 9.0 et 10.0 même au moment où j'ai posté le message si votre base de code Odoo était à jour voir https://github.com/odoo/odoo/issues/16072 pour plus de détails.

Pour une alternative, vous pouvez essayer le module web_domain_field. Il est actuellement ici: https://github.com/OCA/web/pull/567


Ancienne réponse:

Pour avoir un domaine sur un Many2many, vous trouverez une bonne réponse d'Olivier Dony sur la FAQ Odoo: https://www.odoo.com/fr_FR/forum/aide-1/question/complex-many2many-domains -en-vues-41777 # answer_41784

En bref, vous devez adresser les valeurs correctes car la valeur Many2many est une liste de Tuple comme [(6, 0, ids)].

Vous devez donc créer un domaine comme celui-ci pour comparer les identifiants:

domain=[('id', 'in', allowed_type_ids[0][2])]

Attention, cela peut ne pas fonctionner sur Odoo 9.0 dans le cas où votre champ many2many est vide.

5
Yannick