Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérez des valeurs calculés dans un champs xml

Odoo 10 - XML - Python

    22 mai 2019 à 9:27:26

    Bonjour, 

    je fais suite à mon programme Python et j'essaie de récupérer que les enregistrements trouvés via des fonctions Python.

    Voici mes fonctions :

        @api.onchange('partner_id')
        def get_foyer(self):
            if self.partner_id:
                actually_partner_id = self.partner_id.name
                if actually_partner_id:
                    records_foyer_id = self.env['horanet.relation.foyer'].search([('partner_id', '=', actually_partner_id)],
                                                                                 order="id desc")
                    for rec in records_foyer_id:
                        self.foyer_id = rec.id
    
        @api.onchange('foyer_id')
        def get_responsibles_members_foyer(self):
            if self.foyer_id:
                actually_foyer = self.foyer_id.foyer_id
                if actually_foyer:
                    domain = [('foyer_id', '=', actually_foyer.id)]
                    records_foyer_id = self.env['horanet.relation.foyer'].search(domain)
                    for rec in records_foyer_id:
                        print " " + rec.partner_id.name
                        if rec.partner_id:
                            domain_partner = [('foyer_id', '=', self.foyer_id.foyer_id.id),
                                              ('is_responsible', '=', True)]
                            records_partner_id = self.env['horanet.relation.foyer'].search(domain_partner)
                            for rec_partner in records_partner_id:
                                if rec_partner.partner_id:
                                    self.school_responsible_partner1 = rec_partner.partner_id.id


    Ces fonctions servent a deux choses : 

    -> remplir automatiquement le champs foyer_id (récupération d'un foyer)
    -> remplir automatiquement le champs school_responsible_partner1 (récupération du membre responsable de ce foyer)

    Jusque là aucun problème. 

    Cependant, quand je déroule mes 2 champs many2one, je récupère tous les foyers ou bien tous les membres de n'importe quel foyer.
    Avez vous une idée pour ne voir que les enregistrements qui m'intéressent ? 

    Attention, une même personne peut avoir 2 foyers donc je dois pouvoir choisir l'un des deux. 

    J'ai entendu parler que ça pouvait se passer en xml. Mais de quelle manière ? 

    Merci

    -
    Edité par KévinH 22 mai 2019 à 9:28:16

    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2019 à 10:51:39

      Avant de répondre à ta question, une petite chose : les boucles for sont inutiles

                  for rec in records_foyer_id:
                      self.foyer_id = rec.id

      Je comprends que tu ne veux récupérer que le premier résultat (car tu inverse l'ordre), mais il y a beaucoup plus simple.

      Au choix entre les lignes 1 et 2 :

      self.foyer_id = self.env["horanet.relation.foyer"].search([("partner_id", "=", actually_partner_id)], limit=1)
      self.foyer_id = self.env["horanet.relation.foyer"].search([("partner_id", "=", actually_partner_id)])[:1]  # [:1] au lieu de [0] pour éviter un IndexError si search retourne un recordset vide

      Cette ligne me semble bizarre aussi :

      actually_partner_id = self.partner_id.name

      Pourquoi name ? Le partner_id du modèle horanet n'est pas un Many2one ?

      Maintenant pour répondre à ta question, il est possible oui de définir un domaine au niveau du xml. En supposant que partner_id de horanet soit un many2one :

      <field name="foyer_id" domain="[('partner_id', '=', partner_id)]"/>

      Ça marche si partner_id (celui de self) est présent dans le formulaire.

      Si on veut des règles plus complexes qu'un domain, on peut aussi surcharger la méthode name_search. C'est elle qui détermine les éléments à afficher dans la droplist. Elle doit retourner un recordset.

      Voir ici : https://github.com/odoo/odoo/blob/10.0/odoo/models.py#L1576

      • Partager sur Facebook
      • Partager sur Twitter
        22 mai 2019 à 12:05:08

        Effectivement en le limitant a 1 le code fonctionne et pour cette ligne : 

        actually_partner_id = self.partner_id.name 

        ça fonctionne quand même après je ne sais pourquoi parce que mon partner_id est un many2one du modèle res.partner. J'ai changé pour : 

        actually_partner_id = self.partner_id.id


        Mais mon search ne trouve rien !

        J'ai simplifié mon code : 

        # Récupère le foyer en fonction du partner choisi
            @api.onchange('partner_id')
            def get_foyer(self):
                if self.partner_id:
                    actually_partner_id = self.partner_id.name
                    if actually_partner_id:
                        record_foyer_id = self.foyer_id.search([('partner_id', '=', actually_partner_id)], limit=1)
                        self.foyer_id = record_foyer_id.id
                        self.half_pension_foyer_id = record_foyer_id.id
                        self.nursery_foyer_id = record_foyer_id.id

        à savoir que foyer_id est un Many2one qui pointe vers horanet.relation.foyer

        Il me manque plus qu'a trouvé le bon domaine xml pour récupérer tous les membres du foyers au niveau du champs school_responsible_partner1 et non tous les partner de la base res.partner

        Merci :)

        • Partager sur Facebook
        • Partager sur Twitter
          22 mai 2019 à 13:51:36

          Je viens de vérifier effectivement utiliser partner_id.name fonctionne, en fait ça cherche dans la colonne name au lieu la colonne id.

          Chercher sur l'id devrait être plus fiable, si dans ton cas ça ne retourne rien, ça veut probablement dire que tu as deux partenaires avec le même nom.

          • Partager sur Facebook
          • Partager sur Twitter
            22 mai 2019 à 14:01:31

            Oui. 

            Par contre j'ai vraiment du mal à filtrer que les membres du foyer choisi :/ C'est surement parce que je travaille sur 2 modèle différent. 

            foyer_id -> horanet.relation.foyer (il y a un champs partner_id donc pour le prremier pas de soucis)
            school_responsible_partner1 -> res.partner

            -
            Edité par KévinH 22 mai 2019 à 14:02:38

            • Partager sur Facebook
            • Partager sur Twitter
              22 mai 2019 à 14:21:50

              Les membres du foyer c'est quoi comme champ ? Un many2many ?
              • Partager sur Facebook
              • Partager sur Twitter
                22 mai 2019 à 14:35:17

                Non c'est un many2One qui pointe vers le modèle res.partner

                EDIT : 

                Voila ce que j'essaie mais sans succès : 

                <field name="school_responsible_partner1" domain="[('partner_id.foyer_id_rel.foyer_id','=',foyer_id)]" />
                



                -
                Edité par KévinH 22 mai 2019 à 14:57:32

                • Partager sur Facebook
                • Partager sur Twitter
                  22 mai 2019 à 15:22:21

                  C'est un champs qu'il y a dans la table res_partner qui pointe vers horanet.relation.foyer mais il n'est pas dans mon modèle il est directement écrit dans la table res.partner via un héritage de modèle.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 mai 2019 à 15:30:41

                    As-tu essayé ça ?

                    <field name="school_responsible_partner1" domain="[('foyer_id_rel.foyer_id','=',foyer_id)]" />



                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 mai 2019 à 15:42:13

                      Je n'ai pas d'erreur mais je n'ai plus de Partner quand je déroule mon champs Many2One ^^

                      C'est surement parce le champs est vide dans la base (la colonne est vide)

                      -
                      Edité par KévinH 22 mai 2019 à 15:43:43

                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 mai 2019 à 16:42:54

                        Le domain agit comme un filtre donc c'est peut-être normal qu'il n'y ait plus rien...
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Récupérez des valeurs calculés dans un champs xml

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown