Property Setters — création et suppression par programme
Property Setters — création et suppression par programme
Un Property Setter change une propriété d'un DocType ou d'un champ (valeur par défaut, champ obligatoire, champ masqué…) sans modifier le JSON du DocType. Personnaliser le formulaire en crée un à chaque modification. Une application peut aussi en créer et en supprimer par programme, par exemple à son installation et à sa désinstallation.
Créer un Property Setter
frappe.make_property_setter crée un Property Setter à partir d'un dictionnaire :
frappe.make_property_setter(
{
"doctype": "ToDo",
"fieldname": "priority",
"property": "default",
"value": "High",
"property_type": "Data",
}
)
| Clé | Rôle |
|---|---|
doctype | DocType cible. Sans doctype, Dodock crée un Property Setter pour chaque DocType qui a ce fieldname |
fieldname | Champ cible |
property | Propriété à changer : default, hidden, reqd, options… |
value | Nouvelle valeur, en texte ("1" pour une case cochée) |
property_type | Type de la propriété (Data, Check, Select…). Sans valeur, Dodock le déduit |
doctype_or_field | DocField par défaut. DocType pour une propriété du DocType lui-même |
row_name | Ligne ciblée, pour une propriété d'une action ou d'un lien du DocType |
Autres paramètres de la fonction : ignore_validate=False, validate_fields_for_doctype=True, is_system_generated=True et module=None (argument nommé).
La fonction ne contrôle pas les permissions. Appelez-la depuis du code de confiance : installation, patch, migration.
Il n'existe pas de fonction de création en masse. Pour plusieurs Property Setters, appelez la fonction dans une boucle.
Supprimer des Property Setters en masse
bulk_delete_property_setters supprime les Property Setters qui correspondent à chaque dictionnaire de la liste :
from frappe.custom.doctype.property_setter.property_setter import bulk_delete_property_setters
bulk_delete_property_setters(
[
{"doctype": "ToDo", "fieldname": "priority", "property": "default"},
{"doctype": "ToDo", "fieldname": "description", "property": "reqd"},
]
)
doctypeetfieldnamesont obligatoires dans chaque dictionnaire. Sinon, Dodock lève une erreur.- Les autres clés sont des filtres sur les champs du Property Setter (
property,value,row_name…). Sansproperty, Dodock supprime tous les Property Setters du champ. - Par défaut, Dodock supprime chaque document avec
delete(), donc avec ses événements. Avecbypass_hooks=True, il supprime les lignes directement en base, puis vide le cache des DocTypes concernés.
La liste peut reprendre les dictionnaires de création : les clés supplémentaires comme value servent alors de filtres.
Pour un seul champ, delete_property_setter(doc_type, property=None, field_name=None, row_name=None) du même module fait la même suppression.
Exemple : installation et désinstallation
Exemple fictif : une application rend le champ Groupe de clients obligatoire, puis retire ce réglage à sa désinstallation.
# mon_app/install.py
import frappe
from frappe.custom.doctype.property_setter.property_setter import bulk_delete_property_setters
PROPERTY_SETTERS = [
{
"doctype": "Customer",
"fieldname": "customer_group",
"property": "reqd",
"value": "1",
"property_type": "Check",
},
]
def after_install():
for property_setter in PROPERTY_SETTERS:
frappe.make_property_setter(property_setter, module="Mon App")
def before_uninstall():
bulk_delete_property_setters(
[{key: ps[key] for key in ("doctype", "fieldname", "property")} for ps in PROPERTY_SETTERS]
)
Déclarez les deux fonctions dans hooks.py : after_install = "mon_app.install.after_install" et before_uninstall = "mon_app.install.before_uninstall".