「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > フラッペ内のすべてのDoctypeデータを削除するクライアントスクリプトの書き方

フラッペ内のすべてのDoctypeデータを削除するクライアントスクリプトの書き方

2024 年 11 月 8 日に公開
ブラウズ:581

how to write client script for delete doctype all data in frappe

あなたが提供したスクリプトを組み込んだブログ投稿は次のとおりです:


Frappeを使用してWhatsAppメッセージを一括削除する

どのシステムでも大量のデータを管理することは、特にレコードを効率的に削除する場合に困難になることがあります。 Frappe では、サーバーの過負荷を避けるために、リスト ビューをカスタマイズし、レコードをバッチで削除することで、このシナリオに対処できます。

この投稿では、Frappe 内のカスタム コードを使用して「WhatsApp メッセージ」ドキュメントの一括削除を設定する方法を説明します。

なぜ一括削除なのか?

数千以上のレコードを扱う場合、すべてを一度に削除しようとするとサーバーに負担がかかり、タイムアウトやパフォーマンスの低下が発生する可能性があります。バッチ処理により、タスクをより小さく管理しやすいチャンクに分割できるため、サーバーの負荷が軽減され、よりスムーズなユーザー エクスペリエンスが保証されます。

リストビューのカスタマイズ

まず、「WhatsApp メッセージ」Doctype のリスト ビューを変更して、一括削除用のボタンを追加します。このボタンは、すべての WhatsApp メッセージをバッチで削除するプロセスをトリガーします。

リスト ビューをカスタマイズするコードは次のとおりです:

frappe.listview_settings['WhatsApp Message'] = {
    onload: function(listview) {
        // Add a custom button in the list view
        // Uncomment this section to enable the button
         listview.page.add_inner_button(__('Delete All Docs'), function() {
            // Confirm before proceeding with the deletion
             frappe.confirm(
                 'Are you sure you want to delete all Whatsapp messages?',
                 function() {
                     Start the batch deletion process
                     delete_in_batches();
                 }
             );
         });
    }
};

コードのコメントアウトされた部分により、「すべてのドキュメントを削除」というラベルのボタンがリスト ビューに追加されます。クリックすると、削除プロセスを開始する前にユーザーに確認を求められます。コードのこの部分のコメントを解除すると、環境内でボタンを有効にできます。

一括削除機能

このプロセスの中核は、delete_in_batches 関数です。この関数は、ドキュメントのバッチを取得し、それらを 1 つずつ削除してから、サーバーに負荷がかからないよう、遅延して次のバッチに進みます。

バッチ削除の完全なコードは次のとおりです:

function delete_in_batches(batch_size = 2000) {
    // Step 1: Fetch a batch of documents to be deleted
    frappe.call({
        method: "frappe.client.get_list",
        args: {
            doctype: "WhatsApp Message",  // Your target doctype
            fields: ["name"],  // Fetch only the 'name' field (docnames)
            limit: batch_size  // Process in batches of 2000
        },
        callback: function(response) {
            let docs = response.message;

            if (docs && docs.length > 0) {
                // Step 2: Loop through each document in the batch and delete it
                docs.forEach(function(doc, index) {
                    frappe.call({
                        method: "frappe.client.delete",
                        args: {
                            doctype: "WhatsApp Message",  // Ensure this is correct
                            name: doc.name
                        },
                        callback: function(r) {
                            if (!r.exc) {
                                frappe.show_alert({
                                    message: `Document ${doc.name} deleted`,
                                    indicator: 'green'
                                });
                            }
                        }
                    });
                });

                // Step 3: Delay the next batch to prevent server overload
                setTimeout(function() {
                    delete_in_batches(batch_size);  // Recursive call to delete the next batch
                }, 2000);  // 2-second delay between batches
            } else {
                // No more documents to delete
                frappe.msgprint("All WhatsApp messages have been deleted.");
                frappe.listview.refresh();  // Refresh the list view once the process completes
            }
        }
    });
}

仕組み:

  1. ドキュメントをフェッチしています:

    この関数は、WhatsApp メッセージ ドキュメントのバッチを取得することから始まります。バッチのサイズは、batch_size パラメーターによって制御されます (デフォルトは 2000)。

  2. ドキュメントの削除:

    フェッチされたドキュメントごとに、スクリプトは frappe.client.delete メソッドを呼び出してドキュメントを削除します。削除が成功するたびに、ユーザーに通知が表示されます。

  3. 再帰的バッチ処理:

    バッチが処理されると、関数は 2 秒間一時停止してから、次のバッチを取得して削除します。この遅延は、サーバーの過負荷を防ぐのに役立ちます。

  4. 完了:

    削除するドキュメントがなくなると、ユーザーにメッセージが表示され、リスト ビューが更新されて変更が反映されます。

結論:

このスクリプトは、Frappe の大量のデータを一括削除するためのシンプルかつ効果的なソリューションです。削除プロセスを小さく管理しやすいバッチに分割することで、サーバーの過負荷を回避し、操作がスムーズに実行されるようにします。データの量とサーバーの容量に応じて、ニーズに合わせてバッチ サイズと遅延を変更できます。

このスクリプトを独自の Frappe アプリケーションに自由に統合して、WhatsApp メッセージやその他の種類のドキュメントの削除を効率化できます。

クライアントスクリプトを書いた後、このロジックをサーバースクリプトに記述し、サーバースクリプトタイプAPIで選択し、このコードをスクリプトに記述します

コード自体を含むコードの詳細な説明は次のとおりです:

import frappe

@frappe.whitelist()
def delete_all_docs(doctype):
    # Get all documents of the specified doctype
    docs = frappe.get_all(doctype)

    # Loop through each document in the list
    for doc in docs:
        # Delete the document using its name and the provided doctype
        frappe.delete_doc(doctype, doc.name, force=1)

    # Commit the changes to the database to make deletions permanent
    frappe.db.commit()

    # Return a confirmation message
    return f"All documents from {doctype} have been deleted."

コードの内訳:

  1. import frappe: これにより、Frappe フレームワークのコアである frappe モジュールがインポートされ、データベースおよびサーバーの機能にアクセスできるようになります。

  2. @frappe.whitelist(): このデコレーターにより、関数 delete_all_docs が Frappe の API 経由でアクセス可能になり、外部アプリケーションまたはスクリプトから呼び出せるようになります。

  3. def delete_all_docs(doctype):: 関数は 1 つのパラメーターを受け入れるように定義されています:

    • doctype: すべてのレコードが削除されるドキュメントのタイプ (「従業員」、「顧客」など)。
  4. docs = frappe.get_all(doctype): これは、指定された doctype のすべてのドキュメントをフェッチし、docs 変数に保存します。返される各ドキュメントには、削除に使用されるドキュメント名が含まれます。

  5. for doc in docs:: この関数は、リスト docs.

  6. 内の各ドキュメントをループします。
  7. frappe.delete_doc(doctype, doc.name,force=1): ループ内で、doctype と doc.name を指定して各ドキュメントを削除します。 Force=1 引数を指定すると、必要に応じて検証ルールやチェックがバイパスされ、ドキュメントが強制的に削除されます。

  8. frappe.db.commit(): すべてのドキュメントが削除されると、データベースの変更がコミットされ、削除が永続的になります。

  9. return f"{doctype} のドキュメントはすべて削除されました。": すべてのドキュメントが削除されると、操作が成功したことを示す成功メッセージが返されます。

この関数は、Frappe アプリケーションの特定の doctype からすべてのドキュメントを削除する必要がある場合に便利です。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/04anilr/how-to-write-client-script-for-delete-doctype-all-data-in-frappe-18e0?1 侵害がある場合は、 Study_golang@163 .comdelete に連絡してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3