2017-04-06 3 views
1

Ich gebe eine dynamische Domäne von einer Serveraktion in Odoo mit dem folgenden Code zurück. Bitte beachten Sie, dass ich eine gehostete Version von Odoo online nutze, also mache ich das über die Odoo UI. Aktionen werden zurückgegeben durch action = {...} Zuordnung:Eine dynamische Domäne in der Odoo Server-Aktion neu abstimmen

action = { 
    'domain': { 
     'route_id': [('id', 'in', record.x_all_route_ids.ids)] 
    } 
} 

Dieser Server Aktion wird ausgelöst, wenn die product_id Feldänderungen für eine sales.order.line. Wenn ich beim Anzeigen eines Kundenauftrags die Produkt-ID für eine der Auftragspositionen ändert, wird die Domäne für das Feld route_id wie erwartet aktualisiert.

Die Domäne wird jedoch für alle Felder route_id in der Zeilenstrukturansicht der Verkaufsaufträge geändert. Mit anderen Worten, wenn es drei Zeilen in der Reihenfolge gibt und ich die product_id für eine von ihnen ändere, möchte ich, dass die Domäne nur für das route_id-Feld dieser Zeile geändert wird, nicht für jedes route_id-Feld in der Verkaufsreihenfolge.

Ist das, was ich sehe das erwartete Verhalten, und gibt es einen Weg, um zu erreichen, was ich stattdessen will? Hier

ist die Rechenmethode für die x_all_route_ids Feld:

for record in self: 
    routes = record.product_id.x_all_route_ids 

    if not record.product_id.x_is_preorder_active: 
     # If the product has no stock, only keep routes that do not require stock 
     if record.product_id.x_sellable_qty <= 0: 
      routes = routes.filtered(lambda r: r.x_needs_available_inventory == False) 

     # If a vendor is unavailable, remove it's route from the list 
     for info in record.product_id.seller_ids: 
      if not info.x_is_active: 
       route = self.env['stock.location.route'].search([('x_is_vendor_dropship_route','=', True), ('x_vendor_id', '=', info.name.id)]) 
       routes = routes - route 

    record['x_available_routes'] = [(6, False, routes.ids)] 

Und hier ist der Code für die Erweiterung Ansicht:

<data> 
    <xpath expr="//field[@name='order_line']/tree/field[@name='route_id']" position="before"> 
     <field name="x_available_routes" invisible="1"/> 
    </xpath> 
    <xpath expr="//field[@name='order_line']/tree/field[@name='route_id']" position="attributes"> 
     <attribute name="domain">[('id', 'in', x_available_routes[0][2])]</attribute> 
    </xpath> 

Antwort

0

In Odoo können Sie direkt Werte zuweisen.

record.x_available_routes = routes.ids

for record in self: 
    routes = record.product_id.x_all_route_ids 
    if not record.product_id.x_is_preorder_active: 
     # If the product has no stock, only keep routes that do not require stock 
     if record.product_id.x_sellable_qty <= 0: 
      routes = routes.filtered(lambda r: r.x_needs_available_inventory == False) 

     # If a vendor is unavailable, remove it's route from the list 
     for info in record.product_id.seller_ids: 
      if not info.x_is_active: 
       route = self.env['stock.location.route'].search([('x_is_vendor_dropship_route','=', True), ('x_vendor_id', '=', info.name.id)]) 
       routes = routes - route 

    record.x_available_routes=routes.ids 

In xml sollten Sie folgenden Code verwenden.

<xpath expr="//field[@name='order_line']/tree/field[@name='route_id']" position="attributes"> 
    <attribute name="domain">[('route_id', 'in', x_available_routes[0][2])]</attribute> 
</xpath> 
+0

Ich glaube nicht, dass Sie Domänen auf diese Weise schreiben können. Das Attribut '.ids' ist auf dem Client nicht vorhanden. Von dem, was ich gesehen habe, müßten Sie folgendes machen: '' weil die Client speichert das Feld im 'write' Format. Zum Beispiel: '[[6, falsch, [1,2,3]]'. Ich habe diese Methode ursprünglich verwendet, aber beim ersten Hinzufügen einer neuen SO-Zeile und beim Versuch, das Dropdown-Menü route_id zu öffnen, wird ein Fehler angezeigt. Nur nach dem Speichern der Zeile würde es korrekt funktionieren. – flyingL123

+0

Was ist "Zeile" in Ihrem Code? Die Linie ist nirgendwo in der Ansicht definiert. Ich bin auch nicht in der Lage, die Syntax in Ihrem ersten Beispiel zu erhalten. Wenn ich auf das Feld klicke, um das Drop-Down-Menü route_id zu öffnen, erhalte ich einen Fehler: 'Uncaught Error: Expected"] ", habe" (name) "' – flyingL123

+0

Ich habe meine Antwortzeile bearbeitet, dh Sie haben eine Bestellposition. Kannst du es nochmal versuchen ? –

Verwandte Themen