Frappe Framework
Surcharger la requête d’un champ Link par script
Un script client remplace la requête standard d’un lien. On filtre sur place, ou on appelle une méthode qui renvoie les lignes proposées.
Deux formes
Depuis un script client (Client Script), set_query surcharge la requête standard d’un champ Lien (Link). Pour un champ du document : set_query(field_name, options_function). Pour un champ de table enfant : set_query(field_name, child_table_name, options_function).
Filtres
Au chargement d’un rapprochement bancaire (Bank Reconciliation), le compte bancaire peut se limiter à un dictionnaire : account_type Bank et group_or_ledger Ledger. Une forme plus précise est une liste de conditions, ici sur Bank Account : type égal à Bank, et group_or_ledger différent de Group.
Autre méthode
query nomme une méthode serveur. L’exemple, sur item_code de la table items, appelle erpnext.controllers.queries.item_query. Le filtre dépend de enquiry_type : is_service_item si c’est Maintenance, sinon is_sales_item.
La méthode personnalisée renvoie une liste pour l’autocomplétion. Plusieurs colonnes peuvent accompagner chaque ligne. Signature :
def custom_query(doctype, txt, searchfield, start, page_len, filters):
...L’exemple lead_query cherche des prospects (Lead) non convertis : docstatus inférieur à 2, statut différent de Converted, texte cherché dans la clé de recherche, le nom et la société. Le tri privilégie les correspondances en début de chaîne. La requête est limitée par start et page_len.
Attention
@frappe.whitelist() expose la méthode au client. @frappe.validate_and_sanitize_search_inputs valide et assainit les entrées venues de l’API ou du client, pour éviter une injection SQL.
D’autres exemples sont dans erpnext/controllers/queries.py du dépôt ERPNext.
Point d’attention
Sans les deux décorateurs, la méthode n’est ni appelable depuis le client ni protégée comme la source l’exige. Le second argument de set_query, quand il est une chaîne, est le nom de la table enfant, pas un filtre.
