"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > frappe의 모든 데이터 문서 유형을 삭제하기 위한 클라이언트 스크립트를 작성하는 방법

frappe의 모든 데이터 문서 유형을 삭제하기 위한 클라이언트 스크립트를 작성하는 방법

2024-11-08에 게시됨
검색:959

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

제공하신 스크립트가 포함된 블로그 게시물은 다음과 같습니다.


Frappe를 사용하여 WhatsApp 메시지를 일괄 삭제하기

모든 시스템에서 대량의 데이터를 관리하는 것은 어려울 수 있으며, 특히 기록을 효율적으로 삭제하는 경우 더욱 그렇습니다. Frappe에서는 서버 과부하를 방지하기 위해 목록 보기를 사용자 정의하고 일괄적으로 기록을 삭제하여 이 시나리오를 처리할 수 있습니다.

이 게시물에서는 Frappe 내에서 사용자 정의 코드를 사용하여 "WhatsApp 메시지" 문서의 일괄 삭제를 설정하는 방법을 살펴보겠습니다.

일괄 삭제를 수행하는 이유는 무엇입니까?

수천 개 이상의 레코드를 처리할 때 한꺼번에 삭제하려고 하면 서버에 부담을 주어 시간 초과나 성능 저하가 발생할 수 있습니다. 일괄 처리를 통해 작업을 더 작고 관리 가능한 덩어리로 나누어 서버의 로드를 줄이고 보다 원활한 사용자 경험을 보장할 수 있습니다.

목록 보기 사용자 정의

먼저 "WhatsApp 메시지" 문서 유형의 목록 보기를 수정하여 일괄 삭제를 위한 버튼을 추가하겠습니다. 이 버튼은 모든 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 함수입니다. 이 기능은 문서를 일괄적으로 가져와서 하나씩 삭제한 후 서버가 과부하되지 않도록 지연하면서 다음 일괄 처리를 진행합니다.

일괄 삭제를 위한 전체 코드는 다음과 같습니다.

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. 문서 가져오는 중:

    이 함수는 일괄 처리 크기 매개변수(기본값은 2000)로 제어되는 일괄 처리 크기를 사용하여 WhatsApp 메시지 문서 일괄 처리를 가져오는 것으로 시작됩니다.

  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):: 이 함수는 하나의 매개변수를 허용하도록 정의됩니다:

    • doctype: 모든 기록이 삭제될 문서 유형(예: "직원", "고객")입니다.
  4. docs = frappe.get_all(doctype): 지정된 doctype의 모든 문서를 가져와 docs 변수에 저장합니다. 반환된 각 문서에는 삭제에 사용되는 문서 이름이 포함됩니다.

  5. for doc in docs:: 이 함수는 목록 문서의 각 문서를 반복합니다.

  6. frappe.delete_doc(doctype, doc.name, force=1): 루프 내에서 doctype과 doc.name을 지정하여 각 문서가 삭제됩니다. force=1 인수는 유효성 검사 규칙을 우회하고 필요한 경우 확인하여 문서가 강제로 삭제되도록 보장합니다.

  7. frappe.db.commit(): 모든 문서가 삭제되면 데이터베이스 변경 사항이 커밋되어 삭제 내용이 영구적으로 적용됩니다.

  8. return f"{doctype}의 모든 문서가 삭제되었습니다.": 모든 문서가 삭제된 후 작업이 성공했음을 나타내는 성공 메시지가 반환됩니다.

이 기능은 Frappe 애플리케이션의 특정 문서 유형에서 모든 문서를 삭제해야 할 때 유용합니다.

릴리스 선언문 이 기사는 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