Polymorphisme

Le polymorphisme permet de fournir une structure d’héritage à nos modèles.

Duplication

Le polymorphisme permet de factoriser les déclarations d’attributs. La classe Node (et la table sql correspondante) stocke par exemple la date de création.

Requêtes

Grâce au polymorphisme, on peut effectuer des requêtes sur plusieurs modèles simultanément

Node.query().filter(Node.name=="Nom que l'on cherche")

Cette requête va permettre de requêter (et donc de trier/filtrer) tous les noeuds enfants de Node. Pour filtrer par type il faut utiliser un filtre sur la clé de polymorphisme

Node.query().filter(Node.type_.in_(['invoice', 'cancelinvoice',
'internalinvoice']))

Pour requêrir les attributs spécifiques aux modèles enfants en une seule requête il est possible d’utiliser la méthode with_polymorphic

Node.query().with_polymorphic([Invoice, CancelInvoice])

NB : cela ne filtre pas sur le type de Node !!

Relations

Grâce à cette technique d’héritage, on peut configurer des relations moins typées.

Par exemple, les fichiers peuvent être lié à des dossiers, des devis, des factures et des avoirs, mais ce sont des modèles différents. Compte tenu qu’ils héritent tous de Node, on a configuré une relation générique de Node à Node, qui nous permet de lier les Nodes entre eux, indifféremment de leur type. On peut donc lier un fichier à un dossier, mais on pourrait, grâce à cette même relation, attacher un fichier à une activité.

Implémentation

Aujourd’hui, plusieurs arbres polymorphiques sont implémentés dans enDI, celui-ci est le prinicipal :

Node

/ |

/ |

/ |

Task File Event

/ |

Estimation Invoice CancelInvoice Activity

Autres implémentations:

  • Les types de frais (BaseExpenseType, ExpenseType, ExpenseTelType, ExpenseKmType)

  • Les frais (BaseExpenseLine, ExpenseLine, ExpenseTelLine, ExpenseKmLine)