Développeurs

Property Setters — création et suppression par programme

Créer des Property Setters avec frappe.make_property_setter et les supprimer en masse avec bulk_delete_property_setters dans une application.

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
doctypeDocType cible. Sans doctype, Dodock crée un Property Setter pour chaque DocType qui a ce fieldname
fieldnameChamp cible
propertyPropriété à changer : default, hidden, reqd, options…
valueNouvelle valeur, en texte ("1" pour une case cochée)
property_typeType de la propriété (Data, Check, Select…). Sans valeur, Dodock le déduit
doctype_or_fieldDocField par défaut. DocType pour une propriété du DocType lui-même
row_nameLigne 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"},
    ]
)
  • doctype et fieldname sont 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…). Sans property, Dodock supprime tous les Property Setters du champ.
  • Par défaut, Dodock supprime chaque document avec delete(), donc avec ses événements. Avec bypass_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".