frappe-core-utils について
Frappe 開発者が Python と JavaScript のユーティリティ関数を調べるためのリファレンスです。日付、数値、文字列、検証などの API を用途別に整理し、バージョン差や典型的なアンチパターンも示します。
主な機能
- 01用途別の Python ユーティリティ一覧
- 02日付と時刻の API を整理
- 03数値、通貨、文字列関数を掲載
- 04JavaScript ユーティリティを参照
- 05v14、v15、v16 の関数差を比較
- 06標準ライブラリとの使い分けとアンチパターンを説明
活用シーン
- 01日付や金額の書式設定関数を探す
- 02入力変換やデータ検証を行う
- 03Server Script で利用可能な関数を選ぶ
- 04標準ライブラリ関数の誤用を確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ impertio-studio/ frappe_claude_skill_package --skill frappe-core-utilsインストール後、Claude Code で/frappe-core-utilsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/anti-patterns.mddate-time-functions.mdjavascript-utilities.mdnumber-money-functions.mdstring-validation-functions.md詳細
Frappe ユーティリティ関数
クイックリファレンス:Python
| 用途 | 関数 | 戻り値 |
|---|---|---|
| 現在の日付 | nowdate() / today() | datetime.date |
| 現在の日時 | now_datetime() | datetime.datetime |
| 日付文字列を解析 | getdate(str) | datetime.date |
| 日時文字列を解析 | get_datetime(str) | datetime.datetime |
| 日数を加算 | add_days(date, n) | datetime.date |
| 月数を加算 | add_months(date, n) | datetime.date |
| 日付の差 | date_diff(end, start) | int(日数) |
| ユーザー向けにフォーマット | format_date(dt) | str(ユーザーのロケール) |
| 相対時間 | pretty_date(dt) | str(「2 hours ago」) |
| 安全な浮動小数点数 | flt(val, precision) | float |
| 安全な整数 | cint(val) | int |
| 安全な文字列 | cstr(val) | str |
| 安全な真偽値 | sbool(val) | bool |
| 安全な除算 | safe_div(a, b) | float [v15+] |
| 金額のフォーマット | fmt_money(amt, currency) | str |
| 金額を文字で表記 | money_in_words(amt, cur) | str |
| HTML を除去 | strip_html(text) | str |
| リストを文章に変換 | comma_and(items) | str(「a, b, and c」) |
| メールアドレスを検証 | validate_email_address(e) | str または "" |
| URL を検証 | validate_url(url) | bool |
| JSON を解析 | parse_json(s) | Any |
| ファイルのパス | get_files_path(is_private) | str |
| サイトのパス | get_site_path(*parts) | str |
| 重複のないリスト | unique(seq) | list |
| ハッシュ | generate_hash(s, length) | str |
すべてのインポート:コントローラー/ホワイトリスト登録されたメソッドでは、
from frappe.utils import nowdate, flt, ...を使用します。 Server Scripts では、frappe.utils.nowdate()を直接使用してください。インポート文は使用できません。
判断ツリー:「どの関数を使えばよいですか?」
Need a date/time value?
├─ Current date → nowdate() or today()
├─ Current datetime → now_datetime()
├─ Parse a string → getdate() or get_datetime()
├─ Add/subtract time → add_days(), add_months(), add_to_date()
├─ Difference → date_diff() (days), month_diff(), time_diff_in_seconds()
├─ Period boundary → get_first_day(), get_last_day(), get_quarter_start()
└─ Display to user → format_date(), format_datetime(), pretty_date()
Need a number?
├─ Convert safely → flt(), cint(), cstr(), sbool()
├─ Round → rounded() (banker's rounding)
├─ Safe divide → safe_div(a, b, default=0) [v15+]
├─ Format money → fmt_money(amount, currency)
└─ Money to words → money_in_words(amount, currency)
Need string processing?
├─ HTML → strip_html(), escape_html(), is_html()
├─ Join list → comma_and(), comma_or(), comma_sep()
├─ Markdown ↔ HTML → to_markdown(), md_to_html()
└─ Mask sensitive → mask_string(input, show_first=4) [v16+]
Need validation?
├─ Email → validate_email_address(email, throw=False)
├─ URL → validate_url(url, valid_schemes=["https"])
├─ Phone → validate_phone_number(phone, throw=False)
├─ JSON → validate_json_string(s)
└─ IBAN → validate_iban(iban) [v16+]
Need file/path?
├─ Public files → get_files_path()
├─ Private files → get_files_path(is_private=True)
├─ Site directory → get_site_path("private", "backups")
├─ Bench root → get_bench_path()
└─ File size → get_file_size(path, format=True)
重大なアンチパターン
frappe.utils にある場合は、Python 標準ライブラリを絶対に使用しないでください
| 絶対に使用しない(標準ライブラリ) | 必ず使用する(frappe.utils) | 理由 |
|---|---|---|
datetime.datetime.now() | now_datetime() | システムのタイムゾーンを無視します |
datetime.date.today() | nowdate() | システムのタイムゾーンを無視します |
float(val) | flt(val, precision) | None/空の場合にエラーになります |
int(val) | cint(val) | None/空の場合にエラーになります |
round(val, 2) | rounded(val, 2) | 丸め処理に一貫性がありません |
val1 / val2 | safe_div(val1, val2) | ZeroDivisionError [v15+] |
json.loads(s) | parse_json(s) | None/空の場合にエラーになります |
json.dumps(obj) | frappe.as_json(obj) | シリアライズに一貫性がありません |
"{:,.2f}".format(a) | fmt_money(a, currency) | ロケール/通貨を無視します |
os.path.join(...) | get_site_path(...) | マルチテナンシーに対応できません |
", ".join(items) | comma_and(items) | 「and」のローカライズに対応していません |
dt.strftime(fmt) | format_date(dt) | ユーザー設定を無視します |
re.sub(r'<.*?>', '', h) | strip_html(h) | エッジケースに対応できません |
Server Script サンドボックス
# ❌ NEVER in Server Scripts
from frappe.utils import nowdate, flt
import json
# ✅ ALWAYS in Server Scripts (no imports allowed)
today = frappe.utils.nowdate()
amount = frappe.utils.flt(doc.amount, 2)
data = frappe.parse_json(doc.json_field)
JavaScript クイックリファレンス
| 用途 | 関数 |
|---|---|
| HTML をエスケープ | frappe.utils.escape_html(txt) |
| HTML をテキストに変換 | frappe.utils.html2text(html) |
| HTML かどうかを確認 | frappe.utils.is_html(txt) |
| JSON を解析 | frappe.utils.parse_json(str) |
| URL を検証 | frappe.utils.is_url(txt) |
| タイトルケースに変換 | frappe.utils.to_title_case(str) |
| 「and」で結合 | frappe.utils.comma_and(list) |
| 重複のない配列 | frappe.utils.unique(list) |
| クリップボードにコピー | frappe.utils.copy_to_clipboard(txt) |
| 要素までスクロール | frappe.utils.scroll_to(el) |
| モバイルかどうか | frappe.utils.is_mobile() |
| スロットル | frappe.utils.throttle(fn, delay) |
| デバウンス | frappe.utils.debounce(fn, delay) |
| 値をフォーマット | frappe.format(value, df, options, doc) |
| 期間を表示 | frappe.utils.get_formatted_duration(secs) |
バージョンの違い
| 機能 | v14 | v15 | v16 |
|---|---|---|---|
safe_div() | -- | 追加 | あり |
duration_to_seconds() | -- | 追加 | あり |
guess_date_format() | -- | 追加 | あり |
validate_duration_format() | -- | 追加 | あり |
mask_string() | -- | -- | 追加 |
validate_iban() | -- | -- | 追加 |
validate_name() | -- | -- | 追加 |
safe_json_loads() | -- | -- | 追加 |
groupby_metric() | -- | -- | 追加 |
| コア関数 | あり | あり | あり |
リファレンスファイル
- 日付/時刻関数 — シグネチャを含む日付/時刻 API の全一覧
- 数値・金額関数 — flt、fmt_money、丸め処理
- 文字列・検証関数 — HTML、join、検証
- JavaScript ユーティリティ — クライアント側の frappe.utils.*
- アンチパターン — 標準ライブラリと frappe.utils の比較
コメント
Markdown 対応