IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Odoo (ex-OpenERP) Discussion :

Récupérer la valeur d'un champ d'un autre modèle [V10]


Sujet :

Odoo (ex-OpenERP)

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2018
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2018
    Messages : 95
    Points : 79
    Points
    79
    Par défaut Récupérer la valeur d'un champ d'un autre modèle
    Bonjour,

    Voici du code :

    Model cible :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class SchoolYears(models.Model):
     
        _name = "ecole.partner.school.years"
        _rec_name = "school_years"  # POUR ASSIGNER PAR DEFAUT UN AUTRE CHAMP AUTRE QUE NAME
        _order = 'id desc'
     
        school_years = fields.Char(string='School year', required=True, copy=False)
        year_begin_date = fields.Date(string='Start date', required=True, copy=False)
        year_end_date = fields.Date(string='End date', required=True, copy=False)
        default_school_year = fields.Boolean(string='Current school year', copy=False)
        period_school_year = fields.Boolean(string='Registration period', copy=False)
        active = fields.Boolean(default=True)

    Champs ciblé : -> year_begin_date = fields.Date(string='Start date', required=True, copy=False)


    Modèle où je souhaite accéder aux champs :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class ResPartnerSchool(models.Model):
     
        _name = 'ecole.partner.school'
        _order = 'id desc'
     
        @api.multi
        def _get_begin_date(self):
            domain = [('period_school_year', '=', False), ('default_school_year', '=', True)]
            begin_date_id = self.env['ecole.partner.school.years'].search(domain, limit=1).year_begin_date
            begin_date = fields.Date.from_string(begin_date_id)
            date_j = datetime.date.today()
            if begin_date_id:
                if begin_date > date_j:
                    return begin_date_id
                else:
                    return date_j
    ...
        school_year_id = fields.Many2one(string='Period',
                                         ondelete='SET NULL',
                                         comodel_name="ecole.partner.school.years",
                                         default=_get_period_year)
        school_registration = fields.Date(string='Beginning',
                                          copy=False,
                                          default=_get_begin_date)
    ...

    Voici la vue :

    Nom : Capture.PNG
Affichages : 1892
Taille : 4,6 Ko

    Je souhaite récupérer la bonne date de début d'année scolaire liée à school_years qui est de type char et qui est un Many2one dans le modèle ecole.partner.school.
    Je sais qu'il y a plusieurs façon de faire, notamment avec un related. Sauf que j'ai une fonction qui me permet de récupérer la date du jour en date de début d'année scolaire lorsqu'on est en plein dans une période scolaire.
    Actuellement ma fonction est écrit en "dure" -> c'est ce qu'on voie dans la variable "domain". Et je ne souhaite pas utiliser related dans mon champs school_registration.

    Avez vous une idée pour récupérer la bonne date de début quand on choisi une année scolaire ?


    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 168
    Points : 254
    Points
    254
    Par défaut
    À priori un api.onchange sur le premier champ devrait permettre de fixer la second sans difficulté.
    La fonction serait de fait adaptée à la sélection, et calculée au moment du choix.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2018
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2018
    Messages : 95
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    Merci pour ta réponse. Mais je n'arrive pas à construire cette fonction.

    Voici ce que j'ai fait pour le moment.

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        @api.onchange('school_year_id')
        def _change_begin_date(self):
            if self.school_year_id:
                self.school_registration =

    Peux-tu m'aider sur la construction de la fonction sans me donner la réponse bien sûr ? ^^

    Mon raisonnement est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Si j'ai une période scolaire:
       ma date de début d'année scolaire = (aller chercher le champs "year_begin_date" dans la table ecole.partner.school.years)
    Mais comment aller le chercher ...

    Cordialement

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 168
    Points : 254
    Points
    254
    Par défaut
    Je vais avoir du mal à aider sans donner la réponse pour le coup.. Ceci devrait fonctionner :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        @api.onchange('school_year_id')
        def _change_begin_date(self):
            if self.school_year_id:
                self.school_registration = self.school_year_id.year_begin_date

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2018
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2018
    Messages : 95
    Points : 79
    Points
    79
    Par défaut
    Oui c'est logique, puisqu'on a un champs Many2one alors je pouvais me baser sur ce champs -> "school_year_id"

    J'avance, mais il me reste un petit soucis. Voici mon code qui fonctionne

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        @api.onchange('school_year_id')
        def _change_begin_date(self):
            if self.school_year_id:
                begin_date_id = self.school_year_id.year_begin_date
                begin_date = fields.Date.from_string(begin_date_id)
                date_j = datetime.date.today()
                if begin_date > date_j:
                    self.school_registration = begin_date_id
                    self.half_pension_begin_date = begin_date_id
                    self.nursery_begin_date = begin_date_id
                else:
                    self.school_registration = date_j
                    self.half_pension_begin_date = date_j
                    self.nursery_begin_date = date_j

    Cependant, j'ai 3 dates qui se basent sur le même champs. Lors d'une inscription, si je modifie manuellement une date, par exemple nursery_begin_date, il n'y a pas de soucis.
    Par contre, si je décide de modifier ma période via le champs school_year_id, et comme j'utilise le décorateur onchange(), ma date se modifie. Or, je voudrais que le fait de choisir la période, la date de nursery_begin_date ne se modifie pas.
    Peut t'on bloquer le onchange lorsqu'il y a modification ?

    Cordialement

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 168
    Points : 254
    Points
    254
    Par défaut
    Tu définis les conditions du changement. Tu peux formuler en Python que si la date a déjà été fixée, le changement n'est pas appliqué. Par exemple :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
        @api.onchange('school_year_id')
        def _change_begin_date(self):
            if self.school_year_id:
                begin_date_id = self.school_year_id.year_begin_date
                begin_date = fields.Date.from_string(begin_date_id)
                date_j = datetime.date.today()
                if begin_date > date_j:
                    self.school_registration = begin_date_id
                    self.half_pension_begin_date = begin_date_id
                    if not self.nursery_begin_date:
                        self.nursery_begin_date = begin_date_id
                else:
                    self.school_registration = date_j
                    self.half_pension_begin_date = date_j
                    if not self.nursery_begin_date:
                        self.nursery_begin_date = date_j

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2018
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2018
    Messages : 95
    Points : 79
    Points
    79
    Par défaut
    Merci beaucoup, ça fonctionne parfaitement et je comprends la logique !
    Il me manque plus qu'a faire de même pour la date de fin d'année scolaire





    Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [V10] Récupérer la valeur d'un enregistrement actif
    Par KevinH dans le forum Odoo (ex-OpenERP)
    Réponses: 4
    Dernier message: 30/08/2018, 09h45
  2. [V10] Récupérer les valeurs de champ dans un calcul de champ de relation
    Par KevinH dans le forum Odoo (ex-OpenERP)
    Réponses: 4
    Dernier message: 28/08/2018, 09h42
  3. [V10] Récupérer les valeurs du même enregistrement à partir d'un champ
    Par KevinH dans le forum Odoo (ex-OpenERP)
    Réponses: 2
    Dernier message: 21/08/2018, 13h08
  4. Récupérer une valeur dans un champ d'une autre table
    Par Kareg dans le forum Modélisation
    Réponses: 15
    Dernier message: 24/10/2007, 14h16
  5. Réponses: 3
    Dernier message: 11/10/2007, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo