J'essaie d'implémenter une classe abstraite sur OpenERP 6. Mais je n'en ai aucune idée. Par exemple. J'ai des classes "a" et "b". La classe "b" hérite de "a" (voir le code ci-dessous)

class a(osv.osv):
    _name = 'a'
    _columns = {
            'state': fields.selection(A_WORKFLOWS, 'State', readonly=True)
        }

# create an object
a()

class b(osv.osv):
    _name = 'b'
    _inherit='a'
    _columns = {
            'name' : fields.char('Name', size=64, required=True)
        }

# create an object
b()

Lorsque je mets à niveau le module "une" classe générée dans la base de données. Je n'en veux pas. Je veux utiliser la classe "a" comme la classe abstraite dans OpenERP.

1
Zeck 1 déc. 2011 à 05:40

5 réponses

Meilleure réponse

À partir d'OpenERP 6.1 (la prochaine version), openerp.osv.orm fournit une classe AbstractModel. Avant cela, il était possible de réaliser ce que vous vouliez en utilisant un osv_memory comme classe de base.

1
noteed 2 déc. 2011 à 09:05

Selon ma connaissance, dans openerp il n'y a pas de concept spécifique pour la classe abstraite sauf le concept de "classe de base abstraite" en python.

Dans le code openerp si vous archivez le fichier "orm.py". il existe certaines des méthodes avec l'exception "Not Impemented" ou "raise NotImplementedError", qui peuvent être considérées comme des méthodes abstraites, tout comme le code python.

Donc, fondamentalement, vous devez utiliser le concept python pour openerp.

Vous pouvez implémenter la classe de base abstraite par deux méthodes différentes:

Un:

En utilisant "abc"

Deux:

En utilisant l'exception "NotImplementedError"

class AbstractC(object):
    """abstract base class"""

    def abcMethod(self):
        raise NotImplementedError( "Not implemented in base class, overwite the same method in child class" )
0
Yajushi 1 déc. 2011 à 12:09

Depuis OpenERP 6.1, nous avons AbstractModel class.Sp, vous pouvez hériter votre classe d'Orm et faire est Abstract. Pour la version précédente comme noteed, vous pouvez utiliser l'objet osv_memory qui est une option très élégante que vous pouvez avoir.

Ou Dans les deux cas, vous pouvez créer un objet de formulaire hérité de classe python, puis vous pouvez hériter votre objet de la classe d'objet osv + et son choix. par exemple.

class AbstractClass(object):
    def a():pass
    def b():pass

class RealClass(osv.osv, AbstractClass):
    def a():pass
    def b():pass

Pendant que vous héritez, veuillez prendre soin de mro et d'autres règles d'héritage.

Merci.

0
ifixthat 16 mai 2012 à 09:28

J'irais de l'avant avec la solution que vous avez présentée. Il a l'inconvénient de créer la table a dans la base de données, mais à mon avis, cela n'a pas d'importance car il ne prendra pas d'espace de stockage, car le modèle a ne sera pas rempli de données.

Vous pouvez également essayer une alternative: déclarer les colonnes communes de la classe a uniquement dans les modèles hérités (b dans votre exemple). Ceci est utilisé dans les modules officiels en utilisant deux techniques différentes: vérifiez dans le module crm, le modèle crm_lead, qui hérite du crm_case en style python et mail_thread en style OpenERP.

2
Daniel Reis 1 déc. 2011 à 15:01

Si vous voulez que la classe b hérite d'un, vous devez le faire

class b(a):
0
c0m4 1 déc. 2011 à 08:22
8335548