2017-10-12 21 views
1

Ich benutze odoo 10e. Was ich tun möchte, ist i-Domäne Kriterien innerhalb fields_view_get MethodeOdoo - Wie setze ich einen Domain Filter vom Backend

@api.model 
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): 
    res = super(Customer, self).fields_view_get(
     view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu) 
    doc = etree.XML(res['arch']) 
    if view_type == 'tree': 
     if self.env.user.partner_id.parent_id.id is False: 
      id = self.env.user.id 
     else: 
      id = self.env.user.partner_id.parent_id.id 
     doc.attrib['domain'] = "[('custodians','='," + str(id) + ")]" 

    for node_form in doc.xpath("//tree"): 
     node_form.attrib['duplicate'] = '0' 
     res['arch'] = etree.tostring(doc) 
    for node_form in doc.xpath("//form"): 
     node_form.attrib['duplicate'] = '0' 
     res['arch'] = etree.tostring(doc) 
    return res 

dies einstellen wollen, was ich versucht habe. Aber es funktioniert nicht. Sie können sehen, warum ich Domäne vom Backend einstellen möchte, weil ich user_id basierend auf Bedingung setzen muss.

Bitte lassen Sie mich wissen, wenn ich falsch mache oder gibt es einen besseren Weg.

bearbeiten

Ich habe Custodians definierten Felder als

custodians = fields.Many2one('res.users', string="Custodian", domain=[('groups_id', 'in', [12])], 
          readonly=[('readonly_custodian', '=', True)]) 

tatsächlich folgen, wann immer ein loggedin Benutzer eine Customer Datensätze erstellen wir ihn als Depot gesetzt für diesen Customer und alles, was ich tun möchte, Wenn der Benutzer sich erneut anmeldet, sollte er in der Lage sein, seine und seine Eltern zu sehen.

+0

Sie sollten nur selten brauchen 'fields_get' außer Kraft zu setzen. Was genau willst du erreichen? – travisw

+0

Ich möchte Domänenfilter in der Strukturansicht dynamisch vom Back-End hinzufügen. So dass ich Condition-basierte Domain-Filter – Ancient

+0

haben kann alles unter diesem Check sehen "if view_type == 'tree".Dies ist die Bedingung, die ich in der Domäne – Ancient

Antwort

2

Es scheint, als ob Sie dies erreichen könnten Verhalten durch Ändern der domain auf der action, die Ihre Baumansicht lädt.

Es gibt zwei Möglichkeiten, wie Window Actions definiert werden kann, aber in jedem Fall ist der wichtige Teil der domain Wert.

Alte Antwort:

Erster Weg:

<act_window id="..." 
      name="..." 
      ... 
      domain="[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]"/> 

Zweiter Weg:

<record id="..." model="ir.actions.act_window"> 
    <field name="domain">[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]</field> 
</record> 

EDIT:

Da es scheint user im domain nicht zugänglich ist, ich denke, das könnte funktionieren:

Record Rule

<record id="view_ir_rule_restrict_custodians" model="ir.rule"> 
    <field name="name">Restrict Users to see only their Custodians</field> 
    <field name="model_id" ref="model_res_partner"/> 
    <!-- Should this be `... or user.partner_id.id`? --> 
    <field name="domain_force">[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]</field> 
</record> 

Hinweis: Dies ist eine globale Regel, so dass Sie mit Nachdruck möchten, um es zu entfernen für einige Gruppen (wie Manager)

<record id="view_ir_rule_unrestrict_custodians_managers" model="ir.rule"> 
    <field name="name">Un-Restrict Managers to see any Custodians</field> 
    <field name="model_id" ref="model_res_partner"/> 
    <field name="domain_force">[(1, '=', 1)]</field> 
    <field name="groups" eval="[(4, ref('base.group_sale_manager'))]"/> 
</record> 

EDIT 2:

Wie wir im Chat gefunden, die Domain speziell auf Ihre Frage lautet:

[('custodians','in',user.partner_id.parent_id and [(user.partner_id.parent_id.id),user.partner_id.id] or [user.partner_id.id])] 
+0

erreichen möchte, ich denke, 'Benutzer' ist nicht in der Domäne verfügbar. Lassen Sie mich es überprüfen – Ancient

+0

Ja, wie ich sagte Benutzerobjekt ist nicht verfügbar, siehe ich habe diesen Fehler' Uncaught Error: NameError: Name 'Benutzer' ist nicht definiert ' – Ancient

+0

@Ancient Können Sie es als 'uid' anstelle von' user' versuchen? Ich denke, es ist nur eine ganze Zahl, kein Objekt, also wirst du wahrscheinlich immer noch einen Fehler haben. Wenn Sie ein einfaches '[('custodians', '=', uid)]' verwenden können, sollten Sie in der Lage sein, eine andere Route zu wählen. Lassen Sie mich wissen, ob es mit uid funktioniert, und ich werde meine Antwort aktualisieren. – travisw

Verwandte Themen