2015-08-21 5 views
12

Ho diversi tipi di organizzazione con una relazione di molti milioni che descrive i tipi che possono essere padre di altri tipi (ad esempio, il reparto può essere padre del sottoreparto e del gruppo di lavoro). NON è una rigida gerarchia (il gruppo di lavoro può essere padre di altri gruppi di lavoro), da qui la grande relazione.Odoo 8: filtro di dominio Many2many

Ho due campi sull'oggetto organization_type: allowed_parent_type_ids e l'inverso allowed_children_type_ids.

Ora voglio limitare il campo del tipo di organizzazione sul mio oggetto organizzazione a seconda del suo genitore, quindi un figlio di un "reparto" può solo selezionare i tipi di organizzazione consentiti per essere figli dei reparti e così via.

A mio avviso forma, ho provato:

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

Ho anche provato a mettere un settore correlato con tipi consentiti sul mio oggetto l'organizzazione, ma finisce sempre con un messaggio di errore. Il mio ultimo tentativo è stato:

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

Questo dà un messaggio di errore:

TypeError: not all arguments converted during string formatting 

Il cliente in realtà va a prendere un oggetto JSON come "allowed_type_ids" = [0,1,2] e se sostituisco allowed_type_ids nell'espressione dominio con [0,1,2] non ci sono errori e ottengo i tre tipi di organizzazione nella mia selezione ...

+1

Prova a utilizzare domain = "[('id', 'in', allowed_children_ids [0] [2])]" –

risposta

7

Prova questo:

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

Mentre allowed_children_ids è un set di record, allowed_children_ids.ids è un elenco di ID di tali record.

È inoltre possibile avvicinarsi dall'altra parte. Questo dovrebbe funzionare ed essere più veloce evento:

<field 
    name="organization_type_id" 
    domain="[('allowed_parent_type_ids', '=', parent_id.organization_type_id)]" 
    /> 
+1

Non riuscivo a far funzionare la prima soluzione (avevo provato qualcosa di simile), ma la seconda approccio ha funzionato. Ho usato "in" come operatore. Non sembra logico avere "id in id", ma funziona ... – cgs

2

EDIT: Questo trucco non funziona più in 9.0 e 10.0, anche al momento ho postato il messaggio se il codebase vudù è stato fino ad oggi vedere https://github.com/odoo/odoo/issues/16072 per maggiori dettagli.

Per un'alternativa puoi provare a modulo web_domain_field. Attualmente è qui: https://github.com/OCA/web/pull/567


Ex risposta:

Per avere un dominio su un Many2many troverete una buona risposta da Olivier Dony sulla FAQ vudù: https://www.odoo.com/fr_FR/forum/aide-1/question/complex-many2many-domains-in-views-41777#answer_41784

In breve, è necessario indicare i valori corretti in quanto il valore Many2many è un elenco di tuple come [(6, 0, ids)].

Quindi è necessario creare un dominio come questo per confrontare gli ID:

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

Attenzione, questo potrebbe non funzionare su vudù 9,0 nel caso in cui il campo many2many è vuoto.

+1

Credo che hai ment allowed_type_ids [0] [2] (2 invece di 6 nelle ultime parentesi)? - E forse dovrebbe essere "allowed_type_ids e allowed_type_ids [0] [2]" per assicurarsi che l'elenco sia valido. Ad ogni modo, piccolo e semplice trucco. ;-) – cgs

+0

@cgs In effetti hai ragione, l'ho risolto – Yannick

+0

Sai se è cambiato di recente? Giuro che questo ha funzionato per me fino all'ultimo paio di giorni. Ora tutto a un tratto quando visualizzo l'output dal server a mio avviso, il mio campo personalizzato many2many non mostra 'x_my_field: [[6, 0, [id1, id2]]' come in passato. Ora mostra semplicemente una serie di ID, o qualche volta mostra una serie di altri molti molti comandi, come [[5], [1, id1, {}], [1, id2, {}]] '. Qualcosa è cambiato? Sto usando Odoo 10 Saas. – flyingL123

Problemi correlati