Les Property Setters permettent de modifier le comportement de champs existants (valeur par défaut, obligatoire, masqué…) sans toucher au code source du formulaire. Ils sont couramment utilisés dans les applications custom pour adapter l'interface à un contexte métier spécifique.
Frappe/Dodock fournit deux fonctions pour créer des Property Setters par programmation :
frappe.make_property_setter — crée un seul Property Setterfrappe.make_property_setters — crée plusieurs Property Setters en une seule foisUsage typique dans un fichier setup.py ou install.py d'une application :
import frappe
PROPERTY_SETTERS = [
{
"doctype": "Todo",
"fieldname": "status",
"property": "default",
"property_type": "Data",
"value": "Required",
},
{
"doctype": "Todo",
"fieldname": "priority",
"property": "hidden",
"property_type": "Check",
"value": "1",
},
]
def setup():
frappe.make_property_setters(PROPERTY_SETTERS)
Depuis la version incluant cette amélioration, une fonction symétrique est disponible pour supprimer des Property Setters en utilisant la même structure de données que lors de la création. Cela simplifie la maintenance des fichiers uninstall.py.
from frappe.custom.doctype.property_setter.property_setter import delete_property_setters
PROPERTY_SETTERS = [
{
"doctype": "Todo",
"fieldname": "status",
"property": "default",
"property_type": "Data",
"value": "Required",
},
{
"doctype": "Todo",
"fieldname": "priority",
"property": "hidden",
"property_type": "Check",
"value": "1",
},
]
def uninstall():
delete_property_setters(PROPERTY_SETTERS)
La fonction delete_property_setters accepte une liste de dictionnaires. Les clés suivantes sont reconnues pour identifier le Property Setter à supprimer :
| Clé | Obligatoire | Description |
|---|---|---|
doctype | ✅ | Type de document cible (ex. "Todo") |
fieldname | ✅ | Nom du champ concerné |
property | ✅ | Propriété modifiée (ex. "default", "hidden") |
property_type | ✅ | Type de la propriété (ex. "Data", "Check") |
value | — | Valeur (non utilisée pour l'identification lors de la suppression) |
Note : Les champs
doctype,fieldname,propertyetproperty_typesont requis. Une exception est levée si l'un d'eux est manquant.
Une application custom suit généralement ce cycle :
Exemple de structure cohérente :
# mon_app/setup/install.py
from frappe.custom.doctype.property_setter.property_setter import make_property_setter
import frappe
PROPERTY_SETTERS = [
{
"doctype": "Customer",
"fieldname": "customer_group",
"property": "default",
"property_type": "Data",
"value": "Particulier",
},
]
def after_install():
frappe.make_property_setters(PROPERTY_SETTERS)
# mon_app/setup/uninstall.py
from frappe.custom.doctype.property_setter.property_setter import delete_property_setters
def before_uninstall():
delete_property_setters(PROPERTY_SETTERS)
delete_property_setters est atomique : soit tous les Property Setters sont supprimés, soit une exception est levée si les champs requis sont manquants.