Frappe Framework
Script serveur (Server Script)
Un script serveur est du Python limité, déclenché par un événement ou par une URL. Seul un System Manager le crée, et le bench doit l’autoriser.
Activation
Depuis la version 15, les scripts serveur sont désactivés par défaut, pour la sécurité des bench partagés.
bench set-config -g server_script_enabled trueEn auto-hébergement, la même clé se pose sur le site : bench --site site1.local set-config server_script_enabled true. Sur Frappe Cloud, la source dit qu’il faut un bench privé : les bench publics partagés n’autorisent pas ces scripts. Le rôle doit être System Manager. L’API utilisable est dans API de script.
Créer
Dans l’AwesomeBar, « New Server Script ». Choisissez Document Event ou API, puis le type de document et l’événement, ou le nom de méthode, puis le script.
Événements : Before Insert, After Insert, Before Validate, Before Save, After Save, Before Submit, After Submit, Before Cancel, After Cancel, Before Delete, After Delete, Before Save (Submitted Document), After Save (Submitted Document), Before Print.
API
Le type API expose une méthode. Le nom vient du champ API Method, préfixé par /api/method. delete-note répond à /api/method/delete-note et à frappe.call("delete-note"). Allow Guest ouvre aux invités. La réponse se pose dans frappe.response["message"]. Enable Rate Limit limite le nombre d’appels dans une fenêtre, par adresse IP.
RestrictedPython ne laisse passer que des méthodes sûres, listées par l’API de script.
Depuis la version 13, un script sert de bibliothèque interne : le premier pose frappe.flags.my_key, le second lit run_script("script_1").get("my_key"). Le bouton Compare Versions compare deux versions.
Exemples
Avant enregistrement, si « test » est dans doc.description, le statut passe à Closed. Si « validate » y est, frappe.ValidationError est levée. Après enregistrement, si doc.allocted_to est vrai, un ToDo est inséré avec owner égal à doc.allocated_to et la description égale au sujet. L’API test_method répond hello.
Point d’attention
La condition publiée teste allocted_to, tandis que le propriétaire lit allocated_to. Sans server_script_enabled, le document ne s’exécute pas. Le script n’a pas tout Python : seulement ce que RestrictedPython autorise.
