Partage
  • Partager sur Facebook
  • Partager sur Twitter

Surcharge d'une méthode Python

Odoo 10 - Python

    20 mai 2019 à 16:40:00

    Bonjour, 

    J'ai une question. J'ai une fonction qui est appelé par surcharge de la méthode write(). 
    J'ai une autre fonction qui n'a rien à voir mais elle modifie des champs. 

    Sauf que forcément, elle appelle la méthode write qui appelle la fonction première... 

    Il y a t'il un moyen pour que la méthode write ne sois pas appelé lorsque certains champs sont touchés ? 

    Voici mon code : 

    Méthode write () : 

    # Appel cette méthode quand on modifie un enregistrement
        @api.multi
        def write(self, vals):
            result = super(ResPartnerSchool, self).write(vals)
            self.no_duplicate_school_dates()
            if not self.env.context.get('tracking_disable'):
                self.smart_synchronization()
            return result

    Méthode smart_synchronization() : 

        @api.multi
        def smart_synchronization(self):
            for record in self:
                if record.school_statut == "valid":
                    record.create_compte_in_smart()
                    if record.school_send_onde and record.school_date_status == fields.Date.today():
                        record.prepare_files_for_onde()



    La méthode prépare_files_to_ONDE est donc appelé quand je fais appel à cette méthode : 

    # Méthode CRON pour fermetures contrats à une date saisie par l'agent
        @api.model
        def run_close_old_contracts(self):
            _logger.info("CRON Called for to verify closed dates contracts")
            today = fields.Date.today()
            domain = ['|', '|', ("half_pension_unsubscribe", "=", True),
                                ("nursery_morning_unsubscribe", "=", True),
                                ("nursery_evening_unsubscribe", "=", True)]
            for contract in self.search(domain):
                vals = {}
                if contract.school_registration >= today <= contract.school_end_date:
                    if contract.half_pension_unsubscribe \
                            and contract.half_pension_unsubscribe_date <= today \
                            and contract.half_pension_status == "2":
                        vals["half_pension_status"] = "3"
                        _logger.info("Contract half pension closed for : " + contract.partner_id.name)
                    if contract.nursery_morning_unsubscribe \
                            and contract.nursery_morning_unsubscribe_date <= today \
                            and contract.nursery_status_morning == "2":
                        vals["nursery_status_morning"] = "3"
                        _logger.info("Contract nursery morning closed for : " + contract.partner_id.name)
                    if contract.nursery_evening_unsubscribe \
                            and contract.nursery_evening_unsubscribe_date <= today \
                            and contract.nursery_status_evening == "2":
                        vals["nursery_status_evening"] = "3"
                        _logger.info("Contract nursery evening closed for : " + contract.partner_id.name)
                    if vals:
                        contract.write(vals)


    C'est donc à ce niveau que mes méthodes de la méthodes write() sont appelés. Avez vous une idée ? 

    Merci 

    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2019 à 16:56:23

      Si tu appelle write dans un write tu aura une erreur de récursion.

      Il y a probablement une meilleure stratégie. Peux-tu expliquer l'objectif ?

      • Partager sur Facebook
      • Partager sur Twitter
        20 mai 2019 à 17:20:20

        Mon objectif est de ne pas appeler la fonction prepare_files_for_onde() quand je suis dans la fonction run_close_old_contracts()

        • Partager sur Facebook
        • Partager sur Twitter
          20 mai 2019 à 17:51:37

          Et la fonction create_compte_in_smart, doit-elle être appelée ?

          À quoi servent ces fonctions :  create_compte et prepare_files ?

          -
          Edité par thelinekioubeur 20 mai 2019 à 17:52:10

          • Partager sur Facebook
          • Partager sur Twitter
            21 mai 2019 à 8:58:45

            Oui la fonction create_compte_in_smart doit être appelée mais pas la seconde fonction. 

            Ce sont des fonctions qui appellent des WebServices afin de remplir la bases de données de plusieurs logiciels métiers. 

            Cordialement

            • Partager sur Facebook
            • Partager sur Twitter
              21 mai 2019 à 9:28:44

              Il suffit de passer une information dans le contexte pour faire le blocage que tu veux.
              • Partager sur Facebook
              • Partager sur Twitter
                22 mai 2019 à 17:22:02

                Tu as un exemple sur l'utilisation du contexte ? 

                Parce qu'on peut le rajouter en xml, en python. Je suis un peu perdu. Il y a aussi du with_context() est ce que je pourrai avoir un résumé de ces différentes façon de les appelés ? des exemples ? 

                Sur internet, je ne trouve pas de sujet claires ... 

                Merci thelinekioubeur

                • Partager sur Facebook
                • Partager sur Twitter
                  22 mai 2019 à 19:00:54

                  Dans ce cas précis l'idée c'est ça :

                  # Méthode CRON pour fermetures contrats à une date saisie par l'agent
                  @api.model
                  def run_close_old_contracts(self):
                      self = self.with_context(avoid_prepare_file=True)
                      ...  # reste de la méthode
                  @api.jsaipakoi
                  def prepare_files_for_onde(self):
                      if self._context.get("avoid_prepare_file"):
                          return
                      ...  # reste de la méthode

                  Pour trouver des choses sur google avec Odoo il faut chercher en anglais. Et puis bien sûr la doc est là aussi.

                  Et lire les modules natifs de Odoo c'est très formateur aussi. Genre avec ton IDE tu lances une recherche avec le mot clé "with_context" dans tous les fichiers python du code source de Odoo et puis tu lis quelques résultats...

                  -
                  Edité par thelinekioubeur 22 mai 2019 à 19:02:37

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 mai 2019 à 8:49:31

                    Merci je vais regarder. ?

                    Cordialement

                    Qu'est ce que : avoid_prepare_file ?

                    Cordialement

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 mai 2019 à 9:59:07

                      Une valeur que l'on passe dans le contexte. Le contexte est un dictionnaire, on peut écrire ça comme autre chose.

                      self.with_context(best_pokemon="leveinard")


                      Derrière ça utilise juste dict :

                      >>> dict({'lang': 'fr_FR', 'tz': 'Europe/Paris', 'uid': 1}, best_pokemon="leveinard")
                      {'lang': 'fr_FR', 'tz': 'Europe/Paris', 'uid': 1, 'best_pokemon': 'leveinard'}


                      Lire le code source ça permet de le comprendre :

                          def with_context(self, *args, **kwargs):
                              """ with_context([context][, **overrides]) -> records
                      
                              Returns a new version of this recordset attached to an extended
                              context.
                      
                              The extended context is either the provided ``context`` in which
                              ``overrides`` are merged or the *current* context in which
                              ``overrides`` are merged e.g.::
                      
                                  # current context is {'key1': True}
                                  r2 = records.with_context({}, key2=True)
                                  # -> r2._context is {'key2': True}
                                  r2 = records.with_context(key2=True)
                                  # -> r2._context is {'key1': True, 'key2': True}
                      
                              .. note:
                      
                                  The returned recordset has the same prefetch object as ``self``.
                              """
                              context = dict(args[0] if args else self._context, **kwargs)
                              return self.with_env(self.env(context=context))



                      -
                      Edité par thelinekioubeur 23 mai 2019 à 10:08:33

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Surcharge d'une méthode Python

                      × 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