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 :

Filtrer les données d'une liste déroulante en fonction d'une autre liste déroulante


Sujet :

Odoo (ex-OpenERP)

  1. #1
    Membre du Club
    Homme Profil pro
    Informaticien de gestion
    Inscrit en
    Avril 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien de gestion

    Informations forums :
    Inscription : Avril 2011
    Messages : 63
    Points : 40
    Points
    40
    Par défaut Filtrer les données d'une liste déroulante en fonction d'une autre liste déroulante
    Bonjour,

    Ici je ne sais pas comment m'y prendre.

    Mon but est de faire participer des contacts à des "groupes" (la dénomination n'est pas encore définie). Ces "groupes" se compose d'un groupe, d'un sous-groupe, d'une année à laquelle s'est déroulée le "groupe" et évidemment des participants (les contacts).

    Pour cela j'ai crée des tables groupe et sous-groupe auxquelles on peut ajouter des enregistrements. La tables groupe à un champs en plus permettant de lier des sous-groupes à un groupe.

    Pour finir j'ai une table "partner_group" qui sert à lier toutes ces informations.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class partner_group(osv.osv):
    	_name = 'partner.group'
    	_columns = {
    		'name': fields.many2one('my.group', 'name', 'Groupe', required=True),
    		'partner_subgroup': fields.many2one('my.subgroup', 'name', 'Sous-groupe', required=True),
    		'year': fields.char('Année', size=128, required=True),
    		'participant': fields.many2many('res.partner', 'participate', 'partner_group_id', 'res_partner_id', 'Participant(s)', required=False),
    	}
    Le formulaire de la table en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <record model="ir.ui.view" id="view_partner_group_form">
    	<field name="name">partner.group.form</field>
    	<field name="model">partner.group</field>
    	<field name="arch" type="xml">
    		<form string="Groupe de contact">
    			<group col="4">
    				<field name="name" widget="selection" />
    				<field name="partner_subgroup" widget="selection"/>
    				<field name="year" />
    				<field name="participant" widget="many2many_tags" />
    			</group>
    		</form>
    	</field>
    </record>
    Tous cela fonctionne bien. Ce que j'aimerai maintenant c'est faire en sorte que lorsque l'on sélectionne un groupe dans la liste déroulante seule les sous-groupes qui lui sont liés apparaissent.

    Des pistes pour m'aider ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Points : 97
    Points
    97
    Par défaut
    Bonjour,

    normalement tu devrais t'en sortir en ajoutant une fonction sur la ligne de ton xml au niveau de ton objet déroulant de départ en passant en paramètre
    le name. Et dans ta fonction tu recherches ( avec un search ) l'ensemble des sous-groupes liés à ce name et tu retournes les valeurs trouvées dans
    partner_subgroup .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <field name="name" widget="selection" on_change="onchange_name(name)"/>
    En espérant d'avoir mis sur la piste.

  3. #3
    Membre du Club
    Homme Profil pro
    Informaticien de gestion
    Inscrit en
    Avril 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien de gestion

    Informations forums :
    Inscription : Avril 2011
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Merci pour ton aide benoxy . Effectivement ça m'a donné une idée de comment m'y prendre.

    J'ai crée la fonction "onchange_name" dans ma classe "partner_group" et j'ai fait des essais pour essayer de comprendre. Malgré ça je ne trouve pas le moyen de retrouver mes sous-groupes lié au name passé en paramètre.
    Et aussi comment mettre les valeurs retournées par la fonction search dans partner_subgroup ?

    Mes tables groupe/sous-groupe sont faites de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class my_group(osv.osv):
    	_name = 'my.group'
    	_columns = {
    		'name': fields.char('Groupe', size=128, required=True),
    		'subgroup': fields.many2many('my.subgroup', 'rel_group_subgroup', 'my_group_id', 'my_subgroup_id', 'Sous-groupe(s)', required=False),
    	}
    	
    class my_subgroup(osv.osv):
    	_name = 'my.subgroup'
    	_columns = {
    		'name': fields.char('Sous-groupe', size=128, required=True),
    	}

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Points : 97
    Points
    97
    Par défaut
    Il faut que le code ressemble à ceci après le ids_group=obj.search()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            reads = self.read(cr, uid, ids_group, ['name','parent_id'], context=context)
            res = []
            for record in reads:
                name = record['name']
                if record['parent_id']:
                    name = record['parent_id'][1]+' / '+name
                res.append((record['id'], name))
            return res

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il me semble que c'est impossible de faire cela avec des fields.many2one avec widget='selection' car les options présentes dans les widget selection sont chargées en même temps que la vue.

    il faut donc utiliser des fields.many2one (sans widget='selection') avec des on_change qui filtre les autres fields.many2one.

  6. #6
    Membre du Club
    Homme Profil pro
    Informaticien de gestion
    Inscrit en
    Avril 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien de gestion

    Informations forums :
    Inscription : Avril 2011
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    @benoxy
    Je n'arrive pas à retrouver les sous-groupes liés au name passé en paramètre. Les informations de liaison entre mes groupes et mes sous-groupes se trouve dans une tables de liaison rel_group_subgroup crée avec la relation many2many entre my.group et my.subgroup et je ne vois pas comment y accéder avec search().

    Si je comprend bien, la fonction read(), en lui donnant les ids retourné par search(), peut aller me rechercher d'autre informations liées aux ids ? Mais pourquoi self.read() ?

    Bref, j'ai du mal à comprendre ce code. Tu voudrais bien m'expliquer ?

    @qtheuret
    C'est ce que l'on essai de faire ici non ? Mettre un on_change dans le champ "name" pour qu'il filtre les résultats du champ "partner_subgroup". Ce que tu veut dire c'est qu'il faut simplement enlever le widget="selection" ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Onimanta Voir le message
    @qtheuret
    C'est ce que l'on essai de faire ici non ? Mettre un on_change dans le champ "name" pour qu'il filtre les résultats du champ "partner_subgroup". Ce que tu veut dire c'est qu'il faut simplement enlever le widget="selection" ?
    En effet, c'est que tu essaies de faire. Cependant, le contenu des listes déroulantes (widget selection) ne peut pas (il me semble) être mis à jour dynamiquement.
    Cela devrait fonctionner si tu enlèves le widget=selection et que tu ajoutes un domain avec le filtre que tu veux. Par contre, avec cette technique, tu n'auras plus de listes déroulantes !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Points : 97
    Points
    97
    Par défaut
    il me semblait que l'on pouvait mettre à jour une liste déroulante en fonction d'une sélection d'une autre liste.
    Exemple les villes d'un Region:

    xml vous avez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <div class="address_format">
    	<field name="praamedical_city" placeholder="Ville" style="width: 40%%" on_change="onchange_city(praamedical_city)"/>
    	<field name="state_id" class="oe_no_button" placeholder="Region" style="width: 37%%" options='{"no_open": True}' on_change="onchange_state(state_id)"/>
    	<field name="praamedical_zip" placeholder="Code Postal" style="width: 20%%" on_change="onchange_zip(praamedical_zip)"/>
                                    </div>
    py vous devez avoir ceci :
    Code : 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    ......
    'praamedical_zip': fields.many2one("praamedical.zip","Code Postal", size=5),
    'praamedical_city': fields.many2one("praamedical.city","Ville", size=128),
    'state_id': fields.many2one("res.country.state", 'Région'),
    'country_id': fields.many2one('res.country', 'Pays'),
    }
    
    
        def onchange_state(self, cr, uid, ids, state_id, context=None):
            values = {}
            if state_id:
                objnext = self.pool.get('res.country.state').browse(cr, uid, state_id, context)
                values.update({
                    #'praamedical_zip' : objnext.state_city_ids.code_postal_name_ids and objnext.state_city_ids.code_postal_name_ids.id or False,
                    'country_id' : objnext.country_id and objnext.country_id.id or False,
                })
                
            return {'value':values}
            
        def onchange_city(self, cr, uid, ids, praamedical_city, context=None):
            values = {}
            if praamedical_city:
                print(praamedical_city)
                objcity = self.pool.get('praamedical.city').browse(cr, uid, praamedical_city, context=context)
                values.update({
                    #'praamedical_zip' : objcity.code_postal_name_ids and objcity.code_postal_name_ids.id or False,
                    'country_id' : objcity.state_city_id.country_id and objcity.state_city_id.country_id.id or False,
                    'state_id' : objcity.state_city_id and objcity.state_city_id.id or False,
                })
            print(values)
            return {'value' : values}
    
        def onchange_zip(self, cr, uid, ids, praamedical_zip, context=None):
            values = {}
            if not praamedical_zip:
                return values
            objZip = self.pool.get('praamedical.zip').browse(cr, uid, praamedical_zip, context=context)
            values.update({
                'praamedical_city' : objZip.city_zip_id and objZip.city_zip_id.id or False,
                'country_id' : objZip.city_zip_id.state_city_id.country_id and objZip.city_zip_id.state_city_id.country_id.id or False,
                'state_id' : objZip.city_zip_id.state_city_id and objZip.city_zip_id.state_city_id.id or False,
            })
            return {'value' : values}
    En esperant que cela t'aidera.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par benoxy Voir le message
    il me semblait que l'on pouvait mettre à jour une liste déroulante en fonction d'une sélection d'une autre liste.
    Oui, mais il me semble que dans ton code, à aucun moment, tu n'utilises widget='selection'.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Points : 97
    Points
    97
    Par défaut
    Effectivement

  11. #11
    Membre du Club
    Homme Profil pro
    Informaticien de gestion
    Inscrit en
    Avril 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien de gestion

    Informations forums :
    Inscription : Avril 2011
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Enfaite si on ne précise pas widget='selection' dans le XML, OpenERP met une liste déroulante par défaut pour les champs many2one (l'apparence de la flèche pour dérouler la liste est un peu différente mais ça reste une liste déroulante). Peut être qu'il suffit de ne pas mettre widget='selection'.. J'essaierai avec et sans widget='selection' si j'arrive à faire ce que je veux.

    Tu arriverai à m'expliquer à quoi sert le values.update() dans ton code ? Pas moyen de trouver d'explication de cette fonction sur le net. Et aussi je ne comprend pas ou vont se retrouver tes valeurs après avoir fait "return {'value':values}".

    Et, par hasard, quelqu'un ne connaitrait pas l'emplacement des fonctions comme read(), write(), browse(), etc. dans les fichier pyhton d'OpenERP ? Pour avoir accès au docstring.

    Merci pour votre aide

  12. #12
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Citation Envoyé par Onimanta Voir le message
    Et, par hasard, quelqu'un ne connaitrait pas l'emplacement des fonctions comme read(), write(), browse(), etc. dans les fichier pyhton d'OpenERP ? Pour avoir accès au docstring.

    Merci pour votre aide

    Heu, de mémoire comme ça (je ne suis pas au bureau) , regarde dans orm.py à la racine d'openERP ou fields.py

    Genre sur Debian :
    /usr/share/pyshared/openerp/osv/orm.py
    ou
    /usr/share/pyshared/openerp/osv/fields.py

  13. #13
    Membre du Club
    Homme Profil pro
    Informaticien de gestion
    Inscrit en
    Avril 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien de gestion

    Informations forums :
    Inscription : Avril 2011
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Bonne mémoire merci.

    Par contre il n'y rien sur la fonction update

  14. #14
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    De mémoire toujours, je crois qu'il n'y a pas de fonction update(). C'est la fonction write() qui le fait (je crois me souvenir)

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    values est un dictionnaire..

    quand tu fais values.update( new_dict), il met a jour values avec le contenue de new_dict

    ex:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    values = {'test':123}
    values.update({'final':456})

    values egal maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'test':123,'final':456}
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    values.update({'final':456,'test':456})
    values egal maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'test':456,'final':456}
    Pour ce qui est des sélections en fonction d'une autre sélection c'est tout simple


    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <field name="country_id"/>
    <field name="state_id" domain="[('country_id','=',country_id)]"/>

    Bref si je choisis canada, le many2one state_id affichera que les states du canada.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <field name="A" domain="[('B','=',C)]"/>

    A = Champs many2one a filtrer
    B = est un champs dans la table référencer par A
    C = est un champs afficher dans le formulaire que A (donc même table)

    j’espère que c'est assez clair, des fois j'ai de la difficulté a me comprendre moi même

    ****** NE PAS UTILISER LE WIDGET SELECTION ******

  16. #16
    Membre du Club
    Homme Profil pro
    Informaticien de gestion
    Inscrit en
    Avril 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien de gestion

    Informations forums :
    Inscription : Avril 2011
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Enfaite ont est passé à une autre solution, c'est pourquoi je n'ai plus continué sur cette piste.

    Perso' j'ai bien compris les explications. Merci beaucoup.

  17. #17
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 28
    Points
    28
    Par défaut Besoin d'aide pour le même sujet
    Si tu as eu une autre solution STP partage je boucle dessus depuis plusieurs jours.
    Toutes les solution proposées j'ai essayé sans succès.

  18. #18
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Darksb Voir le message
    values est un dictionnaire..

    quand tu fais values.update( new_dict), il met a jour values avec le contenue de new_dict

    ex:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    values = {'test':123}
    values.update({'final':456})

    values egal maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'test':123,'final':456}
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    values.update({'final':456,'test':456})
    values egal maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'test':456,'final':456}
    Pour ce qui est des sélections en fonction d'une autre sélection c'est tout simple

    Darksb
    lorsque je fais
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <field name="country_id"/>
    <field name="state_id" domain="[('country_id','=',country_id)]"/>
    je n'ai que les state du premier country quelqu'en la selection.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <field name="country_id"/>
    <field name="state_id" domain="[('country_id','=',country_id)]"/>

    Bref si je choisis canada, le many2one state_id affichera que les states du canada.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <field name="A" domain="[('B','=',C)]"/>

    A = Champs many2one a filtrer
    B = est un champs dans la table référencer par A
    C = est un champs afficher dans le formulaire que A (donc même table)

    j’espère que c'est assez clair, des fois j'ai de la difficulté a me comprendre moi même

    ****** NE PAS UTILISER LE WIDGET SELECTION ******

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

Discussions similaires

  1. [AC-2007] Filtrer les données d'une requête en passant par VBA
    Par Oliv'83 dans le forum VBA Access
    Réponses: 6
    Dernier message: 27/04/2011, 12h07
  2. [SP-2007] Filtrer les données d'une liste sharepoint
    Par tabtita dans le forum SharePoint
    Réponses: 6
    Dernier message: 14/04/2011, 09h17
  3. Filtrer les données d'une classe
    Par Mapokko dans le forum Excel
    Réponses: 10
    Dernier message: 12/12/2008, 10h57
  4. Filtrer les données d'une classe
    Par Mapokko dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/11/2008, 11h26
  5. [JTABLE]trier et filtrer les données d'une jTable
    Par mehdi82 dans le forum Composants
    Réponses: 4
    Dernier message: 15/12/2005, 17h59

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