Documentation Frappe Framework

Frappe Framework

DocTypes virtuels

Un DocType virtuel n’a pas de table en base de données : son contrôleur définit lui-même la source des données. Cette page explique le principe et montre un contrôleur d’exemple.

3 min de lectureMis à jour le Source : docs.frappe.io

Qu’est-ce qu’un DocType virtuel

Le DocType virtuel (Virtual DocType) est une extension du DocType qui permet aux développeurs de créer des DocTypes avec une source de données et un contrôleur personnalisés. L’objectif est de définir des DocTypes dans le système sans créer de table en base de données, tout en profitant de l’interface, des API de ressources (resource APIs) et de la gestion des rôles et permissions du framework.

Côté interface, un DocType virtuel fonctionne exactement comme un DocType normal et l’utilisateur final ne voit aucune différence. Le développeur, lui, garde la main sur la source des données : une API externe, une base de données secondaire, des fichiers JSON ou CSV, etc. Il devient ainsi possible de brancher d’autres moteurs de base de données que MariaDB et Postgres.

À retenir

Les appels frappe.db.* ne fonctionnent qu’avec la connexion à la base de données du site. Vous devez implémenter vos propres méthodes pour interroger directement le stockage utilisé par le DocType virtuel.

À retenir

Fonctionnalité ajoutée dans la version 13.

Créer un DocType virtuel

Pour créer un DocType virtuel, cochez simplement la case Virtual DocType lors de la création du DocType.

Créer un contrôleur personnalisé

À titre d’exemple, le contrôleur suivant utilise un fichier JSON comme source de données du DocType :

python
class VirtualDoctype(Document):
    """This is a virtual doctype controller for demo purposes.

 - It uses a single JSON file on disk as "backend".
 - Key is docname and value is the document itself.

 Example:
 {
 "doc1": {"name": "doc1", ...}
 "doc2": {"name": "doc2", ...}
 }
 """

    DATA_FILE = "data_file.json"

 @staticmethod
    def get_current_data() -> dict[str, dict]:
        """Read data from disk"""
        if not os.path.exists(VirtualDoctype.DATA_FILE):
            return {}

        with open(VirtualDoctype.DATA_FILE) as f:
            return json.load(f)

 @staticmethod
    def update_data(data: dict[str, dict]) -> None:
        """Flush updated data to disk"""
        with open(VirtualDoctype.DATA_FILE, "w+") as data_file:
            json.dump(data, data_file)

    def db_insert(self, *args, **kwargs):
        d = self.get_valid_dict(convert_dates_to_str=True)

        data = self.get_current_data()
        data[d.name] = d

        self.update_data(data)

    def load_from_db(self):
        data = self.get_current_data()
        d = data.get(self.name)
        super(Document, self).__init__(d)

    def db_update(self, *args, **kwargs):
        # For this example insert and update are same operation,
        # it might be different for you.
        self.db_insert(*args, **kwargs)

    def delete(self):
        data = self.get_current_data()
        data.pop(self.name, None)
        self.update_data(data)

 @staticmethod
    def get_list(args):
        data = VirtualDoctype.get_current_data()
        return [frappe._dict(doc) for name, doc in data.items()]

 @staticmethod
    def get_count(args):
        data = VirtualDoctype.get_current_data()
        return len(data)

 @staticmethod
    def get_stats(args):
        return {}

Les exigences de l’interface et leur explication sont décrites dans le fichier d’interface du dépôt Frappe. Pour intégrer d’autres sources de données à un DocType virtuel, vous devez ajouter au contrôleur les méthodes qui définissent l’accès aux données.

Résultat

L’interface des DocTypes virtuels reste inchangée : le formulaire s’affiche comme pour tout autre DocType.

Toutes les méthodes /api/resource définies par le framework sont compatibles avec les DocTypes virtuels.

Pages liées

DocTypes virtuels Frappe : source de données personnalisée | ERPNext Lab