Personnalisations

Supprimer des champs personnalisés par code

Apprenez à utiliser la fonction delete_custom_fields pour supprimer programmatiquement des champs personnalisés dans vos applications Dokos.

Supprimer des champs personnalisés par code

Lorsque vous développez une application personnalisée sur Dokos, il est courant d'ajouter des champs personnalisés via des fichiers de configuration (custom_fields). Dokos propose désormais une fonction dédiée pour supprimer ces champs par code, utile lors de migrations, de mises à jour de modules ou de nettoyages de données.

La fonction delete_custom_fields

La fonction delete_custom_fields est disponible dans le module frappe.custom.doctype.custom_field.custom_field. Elle permet de supprimer un ou plusieurs champs personnalisés associés à des types de formulaires spécifiques.

Utilisation réservée aux développeurs

Cette fonction est destinée aux développeurs qui construisent ou maintiennent des applications sur Dodock/Dokos. Elle ne s'utilise pas depuis l'interface utilisateur.

Syntaxe

from frappe.custom.doctype.custom_field.custom_field import delete_custom_fields

delete_custom_fields(custom_fields, ignore_if_not_exists=True)

Paramètres

ParamètreTypeDescription
custom_fieldsdictDictionnaire associant un nom de DocType à une liste de définitions de champs (chaque définition doit contenir au minimum la clé fieldname)
ignore_if_not_existsboolSi True (valeur par défaut), aucune erreur n'est levée si le champ n'existe pas. Si False, une exception est déclenchée pour tout champ manquant.

Exemples d'utilisation

Supprimer un champ personnalisé sur un seul DocType

from frappe.custom.doctype.custom_field.custom_field import delete_custom_fields

delete_custom_fields({
    "Customer": [
        {"fieldname": "custom_loyalty_tier"}
    ]
})

Dans cet exemple, le champ custom_loyalty_tier est supprimé du DocType Customer. Si le champ n'existe pas, aucune erreur n'est levée (comportement par défaut).

Supprimer plusieurs champs sur plusieurs DocTypes

from frappe.custom.doctype.custom_field.custom_field import delete_custom_fields

delete_custom_fields({
    "Customer": [
        {"fieldname": "custom_loyalty_tier"},
        {"fieldname": "custom_account_manager"}
    ],
    "Sales Invoice": [
        {"fieldname": "custom_campaign_code"}
    ]
})

Forcer l'erreur si un champ est absent

from frappe.custom.doctype.custom_field.custom_field import delete_custom_fields

delete_custom_fields(
    {
        "Supplier": [
            {"fieldname": "custom_supplier_category"}
        ]
    },
    ignore_if_not_exists=False
)

Avec ignore_if_not_exists=False, une exception est levée si custom_supplier_category n'existe pas sur Supplier. Utile pour s'assurer qu'une migration s'exécute dans un contexte précis.

Cas d'usage typiques

  • Migration de module : lors de la refonte d'un module, supprimer les anciens champs devenus obsolètes sans intervention manuelle en base.
  • Patch de mise à jour : dans un fichier patches.txt, appeler delete_custom_fields pour nettoyer les résidus d'une ancienne version.
  • Tests automatisés : créer puis supprimer des champs personnalisés dans des tests pour garantir la reproductibilité.

Comportement technique

  • Après suppression, le cache Frappe est automatiquement vidé pour que les modifications soient immédiatement prises en compte.
  • La fonction utilise le système de hooks Frappe par défaut ; il est possible de contourner les hooks en passant les arguments appropriés si besoin dans des contextes avancés.
  • La suppression est définitive : les données éventuellement stockées dans ces champs sont perdues si elles ne sont pas sauvegardées ailleurs.
Attention aux données : supprimer un champ personnalisé supprime également sa définition en base. Si des documents existants contiennent des valeurs dans ce champ, ces valeurs ne seront plus accessibles après suppression. Prévoyez une migration des données si nécessaire.