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 :

Création de module pour Odoo


Sujet :

Odoo (ex-OpenERP)

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Points : 32
    Points
    32
    Par défaut Création de module pour Odoo
    Bonjour,

    Je développe actuellement un petit module pour Odoo (OpenERP v7) afin de m'entraîner, et j'ai quelques questions :

    ___________________________________________
    - La base de donnée de mon module contient 2 clés étrangères (many2one) : partner_id et invoice_id

    Ce que j'aimerai faire c'est que quand on clique sur une ligne de ma vue tree, cela nous emmène vers la facture concerné.

    Est-ce possible ? Si oui comment s'il vous plaît ?

    ___________________________________________
    - Pour tester j'ai insérer une ligne dans ma table avec un partner_id et un invoice_id

    Quand il me l'affiche dans ma treeview, dans la colonne Partner j'ai le nom du partenaire, et dans Invoice il me met : Facture fournisseur (étant donné que c'est un fournisseur)

    C'est parfait, mais comment Odoo sélectionne se texte ? Comment le modifier ?

    ___________________________________________
    - J'aimerai aussi ajouté des colonnes qui seront en relation avec des champs de la table account_invoice, en fonction de l'invoice id (comme le montant par exemple), comment puis-je réaliser cela s'il vous plaît ?

    Merci d'avance,

    Cordialement.

  2. #2
    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
    Bonjour,
    J'ai déjà créé ce genre de truc.
    Il te faut une fonction dans le code Python de ton module + un bouton dans ton treeview

    La fonction dans le PY :
    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
    	def go_invoice(self, cr, uid, ids, context=None):
    		context = context or {}
     
    		invoice_id = self.read(cr, uid, ids[0], ['invoice_id'])['invoice_id']
    		if invoice_id:
    			return {
    				'type': 'ir.actions.act_window',
    				'name': 'Invoice',
    				'res_model': 'mon.model',
    				'res_id': invoice_id[0],
    				'view_type': 'form',
    				'view_mode': 'form',
    				'nodestroy': True,
    			}
     
    		return False

    Et dans le XML tu rajoutes un bouton dans les champs:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <button name="go_invoice" string="" type="object" icon="gtk-go-forward" help="See invoice"/>

    Le treeview complet :
    Code xml : 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
            <record id="mon_tree_view" model="ir.ui.view">
                <field name="name">mon.tree.view</field>
                <field name="model">mon.model</field>
                <field name="arch" type="xml">        
                    <tree string="Mon treeview" 
                          edit="false" 
                          create="false" 
                          delete="false" 
                          colors="red:state == 'todo';orange:state == 'draft';navy:state == 'invoiced'" 
                          version="7.0">  
                        <field name="company_id" />
                        <field name="statement_year"/>
                        <field name="statement_month"/>    
                        <field name="amount_untaxed"/>
                        <field name="invoice_id" class="oe_link"/>
                        <field name="state"/>
                        <button name="go_invoice" string="" type="object" icon="gtk-go-forward" help="See in voice"/>
                    </tree>
                </field>
            </record>

    C'est un exemple tiré d'un de mes modules, donc il te faudra l'adapter pour ton cas.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    Bonjour N1bus,

    Merci bien de ta réponse.

    Tout d'abord j'ai une erreur (qui n'apparaît que quand j'inclus le bouton dans mon xml) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error: QWeb2 - template['TreeView']: Runtime Error: TypeError: dict.field.attrs.modifiers is undefined
    Que cela veut-il dire ? Et que dois-je modifier pour résoudre cela ?

    Ensuite j'aimerai savoir quelque chose concernant le self.read que tu utilises :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    invoice_id = self.read(cr, uid, ids[0], ['invoice_id'])['invoice_id']

    A quoi correspond le ids[0] ? Et le ['invoice_id'] après la parenthèse ?

    Merci d'avance,

  4. #4
    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
    Pour l'erreur Qweb2 : tu as un attribut dans le treeview qui n'est pas valide.
    Copie/colle le code XML de ta vue ici pour voir.

    Pour le self.read()

    Si tu fais un premier treeview dans lequel apparait l'invoice_id (et que tu cliques sur la fleche pour aller à la facture)
    Tu as donc rajouté un champ invoice_id dans ton module.

    si tu déclares ton module comme ceci :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class mon_module(osv.Module):
        _name = 'mon.module'
     
        _columns = {
            'name': fields  ....... ,
            'champ2':fields ..... ,
            'invoice_id': fields.many2one('account.invoice', 'Invoice'),
        }

    Tu rajoutes ensuite la fonction go_invoice() :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    def go_invoice(self, cr, uid, ids, context=None):
    ids = c'est un tableau qui contient les ID des objets auquels tu appliques cette fonction (tu peux donc en théorie appliquer cette fonction a plusieurs enregistrements en une seule fois = 1ere colonne avec les cases à cocher dans les Treeviews).
    Pour récupérer le premier enregistrement tu écris ids[0]


    La fonction read() :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    invoice_id = self.read(cr, uid, ids[0], ['invoice_id'])['invoice_id']
    On doit passer le nom des champs à "lire" en paramètre à la fonction read(): le résultat sera un tableau qui contiendra les valeurs des champs.

    on pourrait écrire :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    result = self.read(cr, uid, ids[0], ['champ1', 'champ2', 'champ3'])

    ici result contiendrait la valeur des 3 champs (c'est un tableau)
    On pourrait alors récupérer les valeurs comme ceci par exemple :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    valeur1 = result['champ1']
    valeur2 = result['champ2']
    valeur3 = result['champ3']

    Mais comme on ne lit qu'un seul champ, on peut directement lire la valeur du tableau comme ceci (en une seule ligne) :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur1 = self.read(cr, uid, ids[0], ['champ1'])['champ1']

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par N1bus Voir le message
    Pour l'erreur Qweb2 : tu as un attribut dans le treeview qui n'est pas valide.
    Copie/colle le code XML de ta vue ici pour voir.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <record model="ir.ui.view" id="module_tree">
    	<field name="name">module.tree</field>
    	<field name="model">module</field>
    	<field name="arch" type="xml">
    		<tree string="Invoices" create="false" delete="false" edit="false">
    			<field name="partner_id" groups="base.group_user"/>
    			<field name="invoice_id"/>
    			<button name="look_invoice" string="" icon="gtk-go-forward" help="See invoice" type="object"/>
    		</tree>
    	</field>
    </record>

    Citation Envoyé par N1bus Voir le message
    Pour le self.read()

    Si tu fais un premier treeview dans lequel apparait l'invoice_id (et que tu cliques sur la fleche pour aller à la facture)
    Tu as donc rajouté un champ invoice_id dans ton module.

    si tu déclares ton module comme ceci :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class mon_module(osv.Module):
        _name = 'mon.module'
     
        _columns = {
            'name': fields  ....... ,
            'champ2':fields ..... ,
            'invoice_id': fields.many2one('account.invoice', 'Invoice'),
        }

    Tu rajoutes ensuite la fonction go_invoice() :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    def go_invoice(self, cr, uid, ids, context=None):
    ids = c'est un tableau qui contient les ID des objets auquels tu appliques cette fonction (tu peux donc en théorie appliquer cette fonction a plusieurs enregistrements en une seule fois = 1ere colonne avec les cases à cocher dans les Treeviews).
    Pour récupérer le premier enregistrement tu écris ids[0]

    Donc si je comprend bien, si j'ai plusieurs id (donc champ many2one) dans ma treeview, ids contiendra la liste des ids de la ligne sélectionné, dans l'ordre de ma treeview ?

    Citation Envoyé par N1bus Voir le message
    La fonction read() :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    invoice_id = self.read(cr, uid, ids[0], ['invoice_id'])['invoice_id']
    On doit passer le nom des champs à "lire" en paramètre à la fonction read(): le résultat sera un tableau qui contiendra les valeurs des champs.

    on pourrait écrire :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    result = self.read(cr, uid, ids[0], ['champ1', 'champ2', 'champ3'])

    ici result contiendrait la valeur des 3 champs (c'est un tableau)
    On pourrait alors récupérer les valeurs comme ceci par exemple :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    valeur1 = result['champ1']
    valeur2 = result['champ2']
    valeur3 = result['champ3']

    Mais comme on ne lit qu'un seul champ, on peut directement lire la valeur du tableau comme ceci (en une seule ligne) :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur1 = self.read(cr, uid, ids[0], ['champ1'])['champ1']
    D'accord ! J'ai tout compris, merci

  6. #6
    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
    Donc si je comprend bien, si j'ai plusieurs id (donc champ many2one) dans ma treeview, ids contiendra la liste des ids de la ligne sélectionné, dans l'ordre de ma treeview ?
    Ce n'est pas tout à fait ça :

    Quand tu affiches une vue Treeview, chaque ligne correspond à 1 enregistrement . l'ID est caché et fourni par l'ORM en interne.
    Si tu sélectionnes plusieurs enregistrements (tu coches les cases) et que tu cliques sur "Imprimer" , tu envoies à la fonction "imprimer" les ID des enregistrements sélectionnés . Les ID sont alors passés dans le tableau ids, comme défini dans la déclaration de la fonction. Et la fonction "Imprimer" s'exécutera autant de fois que tu as passé d'ID.

    On aurait pu déclarer la fonction comme ceci :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def ma_fonction(self, cr, uid, les_ids_selectionnes, context=None):
    ...
    Dans ce cas, les ID des enregistrements sélectionnés seraient dans le tableau les_ids_selectionnes[]. Cela n'a rien à voir avec les champs many2one, etc...
    Le Treeview pourrait d'ailleurs ne contenir aucun champs many2one.

    Par convention dans OpenERP, ids = tableau des ID des enregistrements sélectionnés (ou passés à une fonction), uid = id de l'utilisateur courant, etc....

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par N1bus Voir le message
    Ce n'est pas tout à fait ça :

    Quand tu affiches une vue Treeview, chaque ligne correspond à 1 enregistrement . l'ID est caché et fourni par l'ORM en interne.
    Si tu sélectionnes plusieurs enregistrements (tu coches les cases) et que tu cliques sur "Imprimer" , tu envoies à la fonction "imprimer" les ID des enregistrements sélectionnés . Les ID sont alors passés dans le tableau ids, comme défini dans la déclaration de la fonction. Et la fonction "Imprimer" s'exécutera autant de fois que tu as passé d'ID.

    On aurait pu déclarer la fonction comme ceci :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def ma_fonction(self, cr, uid, les_ids_selectionnes, context=None):
    ...
    Dans ce cas, les ID des enregistrements sélectionnés seraient dans le tableau les_ids_selectionnes[]. Cela n'a rien à voir avec les champs many2one, etc...
    Le Treeview pourrait d'ailleurs ne contenir aucun champs many2one.

    Par convention dans OpenERP, ids = tableau des ID des enregistrements sélectionnés (ou passés à une fonction), uid = id de l'utilisateur courant, etc....
    Donc c'est un tableau des ids qui est passé en paramètre et ce tableau contient tout les ids présent dans les lignes sélectionnés ?

    Pour les champs many2one, cela veut dire que je ne peux pas sélectionné un id, qui est à la base un champ many2one, pour faire une requête sql sur la table concerné ?

    Mais ce tableau récupère-t-il les ids dans l'ordre ?

    Par exemple mes champs dans ma treeview :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <field name="partner_id" groups="base.group_user"/>
    <field name="invoice_id"/>

    Le tableau d'ids sera comme sa : ids[0] = partner_id, ids[1] = invoice_id etc en fonction des lignes ?

    Et pour mon erreur XML tu as pu trouvé l'erreur ou pas ?

  8. #8
    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
    Le tableau d'ids sera comme sa : ids[0] = partner_id, ids[1] = invoice_id etc en fonction des lignes ?
    Non, ce n'est pas ça.

    Quand tu affiches ton treeview, tu affiches les enregistrements comme ceci (c'est un exemple) :

    ID | name | Partner_id | invoice_id | ....
    1 | reg 1 | (5 , 'jean paul') | (43, 'facture FC312') | ...
    2 | reg 2 | (44 , 'bernard') | (125, 'facture FC44') | ...
    3 | reg 3 | (612 , 'gerard') | (200, 'facture FC523') | ...
    Tu t'aperçois que openERP récupère pour les champs many2one l'ID + le champ 'name'. Ceci lui permet de t'afficher le nom, mais ça permettra ensuite de retrouver l'enregistrement dans la table correspondante puisque on aura également son id. Ce sont des fonctions natives de l'ORM qui gèrent l'affichage des vues qui permettent ça.

    Maintenant, imagine que dans ce treeview, tu selectionnes le 1er et le 3eme enregistrement, tu verras alors apparaitre le menu secondaire en haut du tableau. Si tu cliques sur "Supprimer", tu vas envoyer à la fonction unlink() du module les ID des enregistrements à supprimer. Ici ce sera 1 et 3.

    C'est comme si on appelait unlink de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.unlink(cr, uid, [1,3], context=context)

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par N1bus Voir le message
    Non, ce n'est pas ça.

    Quand tu affiches ton treeview, tu affiches les enregistrements comme ceci (c'est un exemple) :



    Tu t'aperçois que openERP récupère pour les champs many2one l'ID + le champ 'name'. Ceci lui permet de t'afficher le nom, mais ça permettra ensuite de retrouver l'enregistrement dans la table correspondante puisque on aura également son id. Ce sont des fonctions natives de l'ORM qui gèrent l'affichage des vues qui permettent ça.

    Maintenant, imagine que dans ce treeview, tu selectionnes le 1er et le 3eme enregistrement, tu verras alors apparaitre le menu secondaire en haut du tableau. Si tu cliques sur "Supprimer", tu vas envoyer à la fonction unlink() du module les ID des enregistrements à supprimer. Ici ce sera 1 et 3.

    C'est comme si on appelait unlink de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.unlink(cr, uid, [1,3], context=context)
    Okk !! J'ai compris maintenant. Les ids sont ceux des lignes a "Supprimer" (dans le cas de la suppression) dans la base de données ?!

    Et pour mon erreur XML, tu as trouvé ou pas ?

  10. #10
    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
    Pour ton Treeview

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <record model="ir.ui.view" id="module_tree">
    	<field name="name">module.tree</field>
    	<field name="model">module</field>
    	<field name="arch" type="xml">
    		<tree string="Invoices" create="false" delete="false" edit="false">
    			<field name="partner_id" groups="base.group_user"/>
    			<field name="invoice_id"/>
    			<button name="look_invoice" string="" icon="gtk-go-forward" help="See invoice" type="object"/>
    		</tree>
    	</field>
    </record>

    Tu as mis <field name="model">module</field>, cela veut dire que tu appliques cette vue au modèle "module" , cela correspond en principe à une table de la BD ou une table en mémoire.

    Comment as tu déclaré ta classe ?
    Model = le nom de la table déclarée dans la classe.

    Par exemple :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class mon_module_kilesuper(osv.Model):
        _name = 'ma.table.kilesuperossi'
     
        _columns = {}
    Donc tu créeras une vue comme ceci :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <record model="ir.ui.view" id="mon_module_kilesuper_tree_view">
    	<field name="name">mon.module.kilesuper.tree.view</field>
    	<field name="model">ma.table.kilesuperossi</field>
    	<field name="arch" type="xml">
    		<tree string="Invoices" create="false" delete="false" edit="false">
    			<field name="partner_id" groups="base.group_user"/>
    			<field name="invoice_id"/>
    			<button name="look_invoice" string="" icon="gtk-go-forward" help="See invoice" type="object"/>
    		</tree>
    	</field>
    </record>

    Quelques astuces que j'utilise pour pouvoir retrouver les éléments dans un XML :
    • Nommer une vue en mixant le nom du modèle + le type de vue
    • Pour le champ ID = nom_du_model_tree_view, nom_du_model_search_view, nom_du_model_form_view, nom_du_model_kanban_view
    • Pour le champ name = mettre le même texte que l'id en remplaçant les underscore par le point
    • Pour une action = action_nom_du_model + type de vue : action_nom_du_model_form_view
    • Pour un menu = menu_nom_de_laction : menu_action_nom_du_model_form_view

    J'utilise ce système qui me permet de retrouver un élément d'une vue. C'est assez pratique quand tu as un XML de plusieurs centaines de lignes et que tu utilises les fonctions de recherche dans le texte.

    J'applique également ces règles de nommage dans les .py ou les .js qui peuvent rapidement faire plusieurs milliers de lignes.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par N1bus Voir le message
    Pour ton Treeview

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <record model="ir.ui.view" id="module_tree">
    	<field name="name">module.tree</field>
    	<field name="model">module</field>
    	<field name="arch" type="xml">
    		<tree string="Invoices" create="false" delete="false" edit="false">
    			<field name="partner_id" groups="base.group_user"/>
    			<field name="invoice_id"/>
    			<button name="look_invoice" string="" icon="gtk-go-forward" help="See invoice" type="object"/>
    		</tree>
    	</field>
    </record>

    Tu as mis <field name="model">module</field>, cela veut dire que tu appliques cette vue au modèle "module" , cela correspond en principe à une table de la BD ou une table en mémoire.

    Comment as tu déclaré ta classe ?
    Model = le nom de la table déclarée dans la classe.

    Par exemple :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class mon_module_kilesuper(osv.Model):
        _name = 'ma.table.kilesuperossi'
     
        _columns = {}
    Donc tu créeras une vue comme ceci :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <record model="ir.ui.view" id="mon_module_kilesuper_tree_view">
    	<field name="name">mon.module.kilesuper.tree.view</field>
    	<field name="model">ma.table.kilesuperossi</field>
    	<field name="arch" type="xml">
    		<tree string="Invoices" create="false" delete="false" edit="false">
    			<field name="partner_id" groups="base.group_user"/>
    			<field name="invoice_id"/>
    			<button name="look_invoice" string="" icon="gtk-go-forward" help="See invoice" type="object"/>
    		</tree>
    	</field>
    </record>
    J'ai déclaré ma classe comme dans des tutoriels d'Odoo :
    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
    26
    27
    28
    29
    30
     
    import time
     
    import openerp
    from openerp.osv import osv, fields
    from openerp.tools.translate import _
     
    class module(osv.Model):
    	_name = 'module'
    	_description = 'Module module'
    	_columns = {
    		'partner_id' : fields.many2one('res.partner','Partner',required=True),
    		'invoice_id' : fields.many2one('account.invoice','Invoice',required=True),	
    	}
     
    	def look_invoice(self,cr,uid,ids,context=None):
    		context = context or {}
     
    		invoice_id = self.read(cr,uid, ids[0], ['invoice_id'])['invoice_id']
    		if invoice_id:
    			return {
    				'type': 'ir.actions.act_window',
    				'name': 'Invoice',
    				'res_model': 'module',
    				'res_id': invoice_id[0]
    				'view_type': 'form',
    				'view_mode': 'form',
    				'nodestroty': True,
    			}
    		return False

    Citation Envoyé par N1bus Voir le message
    Quelques astuces que j'utilise pour pouvoir retrouver les éléments dans un XML :
    • Nommer une vue en mixant le nom du modèle + le type de vue
    • Pour le champ ID = nom_du_model_tree_view, nom_du_model_search_view, nom_du_model_form_view, nom_du_model_kanban_view
    • Pour le champ name = mettre le même texte que l'id en remplaçant les underscore par le point
    • Pour une action = action_nom_du_model + type de vue : action_nom_du_model_form_view
    • Pour un menu = menu_nom_de_laction : menu_action_nom_du_model_form_view

    J'utilise ce système qui me permet de retrouver un élément d'une vue. C'est assez pratique quand tu as un XML de plusieurs centaines de lignes et que tu utilises les fonctions de recherche dans le texte.

    J'applique également ces règles de nommage dans les .py ou les .js qui peuvent rapidement faire plusieurs milliers de lignes.
    Je note, merci

Discussions similaires

  1. [Joomla!] Création d'un module pour un composant déjà existant : récupération de données
    Par sphere369 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 28/08/2009, 18h50
  2. Création de directives pour un module Apache
    Par kakibend dans le forum Apache
    Réponses: 6
    Dernier message: 10/01/2008, 17h57
  3. Exclure la création d'unreport pour un sous module
    Par romaintaz dans le forum Maven
    Réponses: 5
    Dernier message: 27/08/2007, 15h23
  4. [RECHERCHE] un module pour developer une interface graphique
    Par romtrash dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 10/03/2005, 15h46

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