Ces conventions sont adaptées des Contribution Guidelines du framework Frappe. Dokos étant basé sur Frappe/ERPNext, nous suivons les mêmes standards pour assurer la cohérence et faciliter les contributions croisées.
Le code source de Dokos est disponible sur GitLab.
Tous les textes affichés à l'utilisateur doivent être traduisibles:
_("texte")__("texte")frappe.msgprint(_("Facture {0} soumise").format(self.name))
frappe.msgprint(__("Facture {0} créée", [doc.name]));
Les fonctions ne devraient pas dépasser 10 lignes de code. Une fonction plus longue indique généralement qu'elle fait trop de choses.
Utilisez des tabs (caractères de tabulation), pas des espaces. C'est la convention historique de Frappe.
Les chaînes multi-lignes et expressions doivent être indentées de façon cohérente:
D = frappe.qb.DocType("Accounting Dimension")
query = frappe.qb.from_(D).select(D.label, D.fieldname, D.document_type).where(D.disabled == 0).run(as_dict=1)
Dimension = frappe.qb.DocType("Accounting Dimension")
query = (
frappe.qb.from_(Dimension)
.select(
Dimension.label,
Dimension.fieldname,
Dimension.document_type,
)
.where(Dimension.disabled == 0)
)
results = query.run(as_dict=1)
La fonction appelante doit être placée en haut, les fonctions appelées en dessous:
def fa():
fb()
fc()
def fb():
pass
def fc():
pass
Évitez de regrouper plusieurs conditions sur une seule ligne. Séparez-les pour améliorer la lisibilité.
Toute la logique métier doit être implémentée côté serveur (Python). Lors des appels REST API, seul le code Python s'exécute. Le JavaScript est réservé à l'amélioration de l'expérience utilisateur.
Le code doit être auto-explicatif, mais les commentaires expliquant le pourquoi sont essentiels. Chaque méthode devrait avoir une brève explication de son but.
Évitez ces APIs obsolètes:
cur_frm - Utilisez le paramètre frm des handlers$c_obj() - Utilisez frappe.call()get_query - Utilisez set_queryadd_fetch - Utilisez les Link fields avec fetch_fromfrappe.db.sql() est proscrit sur Dokos. Utilisez le Query Builder (frappe.qb) ou les méthodes ORM.# RECOMMANDÉ - Query Builder
from frappe.query_builder import DocType
User = DocType('User')
query = (
frappe.qb.from_(User)
.select(User.name, User.email)
.where(User.name == user)
)
result = query.run(as_dict=True)
# RECOMMANDÉ - Méthodes ORM (cas simples)
frappe.get_all('User',
fields=['name', 'email'],
filters={'name': user}
)
frappe.get_value('User', user, ['name', 'email'])
Avantages du Query Builder :
Les méthodes whitelistées acceptant des dictionnaires peuvent contourner les permissions. Ajoutez des vérifications explicites:
@frappe.whitelist()
def create_document(values: dict):
frappe.only_for('System User')
if values['doctype'] not in ('ToDo', 'Note', 'Task'):
frappe.throw(_('Type de document invalide'))
doc = frappe.get_doc(values).insert()
return doc
eval() et exec()frappe.safe_eval ou frappe.utils.safe_exec.safe_execNe permettez jamais aux utilisateurs de contrôler les chemins de fichiers. Utilisez l'API du DocType "File".
frappe.get_doc() ne vérifie PAS les permissions par défautfrappe.get_list() à frappe.get_all() pour appliquer les permissions@frappe.whitelist()
def get_document(doctype: str, name: str):
doc = frappe.get_doc(doctype, name)
doc.check_permission("read")
return doc
Utilisez les annotations de type pour validation automatique:
@frappe.whitelist()
def get_user(name: str):
doc = frappe.get_doc("User", name)
doc.check_permission("read")
return doc
Adapté de Pull Request Checklist - Frappe/ERPNext
develop - À utiliser par défaut. Les corrections seront backportés sur la branche principale au cas par cas.vX-dev- À utiliser pour une publication dans une version mineur.vX-fix - Uniquement si le correctif n'est pas applicable en develop (e.g. rupture de rétro-comptabilité).Format Conventional Commits: type(scope): description
| Type | Description |
|---|---|
feat | Nouvelle fonctionnalité |
fix | Correction de bug |
docs | Documentation uniquement |
refactor | Refactoring sans changement fonctionnel |
test | Ajout ou modification de tests |
ruff, prettier, eslint)N'incluez pas de changements automatisés (linters de masse, corrections IA non revues) sans validation manuelle.
Ces conventions sont dérivées de la documentation officielle Frappe/ERPNext:
Pour contribuer à Dokos: GitLab Dokos