"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > cómo escribir un script de cliente para eliminar el tipo de documento todos los datos en frappe

cómo escribir un script de cliente para eliminar el tipo de documento todos los datos en frappe

Publicado el 2024-11-08
Navegar:102

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

Aquí hay una publicación de blog que incorpora el script que proporcionaste:


Eliminar mensajes de WhatsApp en lotes usando Frappe

Administrar grandes cantidades de datos en cualquier sistema puede ser un desafío, especialmente cuando se trata de eliminar registros de manera eficiente. En Frappe, podemos manejar este escenario personalizando la vista de lista y eliminando registros en lotes para evitar sobrecargar el servidor.

En esta publicación, exploraremos cómo configurar la eliminación por lotes de documentos de "Mensajes de WhatsApp" usando un código personalizado dentro de Frappe.

¿Por qué eliminar por lotes?

Cuando se trata de miles o más registros, intentar eliminarlos todos a la vez puede sobrecargar el servidor, provocando tiempos de espera o un rendimiento lento. El procesamiento por lotes nos permite dividir la tarea en partes más pequeñas y manejables, lo que reduce la carga en el servidor y garantiza una experiencia de usuario más fluida.

Personalizando la vista de lista

Primero, modificaremos la vista de lista del tipo de documento "Mensaje de WhatsApp" para agregar un botón para la eliminación por lotes. Este botón activará el proceso de eliminación de todos los mensajes de WhatsApp en lotes.

Aquí está el código para personalizar la vista de lista:

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();
                 }
             );
         });
    }
};

La parte comentada del código agrega un botón denominado "Eliminar todos los documentos" a la vista de lista. Una vez que se hace clic, solicita confirmación al usuario antes de iniciar el proceso de eliminación. Puede descomentar esta parte del código para habilitar el botón en su entorno.

La función de eliminación por lotes

El núcleo de este proceso es la función delete_in_batches. Esta función recupera un lote de documentos, los elimina uno por uno y luego pasa al siguiente lote con un retraso, lo que garantiza que el servidor no se sobrecargue.

Aquí está el código completo para la eliminación por lotes:

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
            }
        }
    });
}

Cómo funciona:

  1. Obteniendo documentos:

    La función comienza recuperando un lote de documentos de mensajes de WhatsApp, con el tamaño del lote controlado por el parámetro tamaño_lote (el valor predeterminado es 2000).

  2. Eliminar documentos:

    Para cada documento recuperado, el script llama al método frappe.client.delete para eliminar el documento. Después de cada eliminación exitosa, se muestra una notificación al usuario.

  3. Loteo recursivo:

    Una vez que se procesa un lote, la función se detiene durante 2 segundos antes de buscar y eliminar el siguiente lote. Este retraso ayuda a evitar la sobrecarga del servidor.

  4. Terminación:

    Cuando no hay más documentos para eliminar, se muestra un mensaje al usuario y la vista de lista se actualiza para reflejar los cambios.

Conclusión:

Este script es una solución simple pero efectiva para eliminar por lotes grandes cantidades de datos en Frappe. Al dividir el proceso de eliminación en lotes más pequeños y manejables, evitamos sobrecargar el servidor y garantizamos que la operación se ejecute sin problemas. Puede modificar el tamaño del lote y el retraso para adaptarlo a sus necesidades, según el volumen de datos y la capacidad del servidor.

Siéntete libre de integrar este script en tu propia aplicación Frappe para agilizar la eliminación de mensajes de WhatsApp o cualquier otro tipo de documento.

Después de escribir el script del cliente, escriba esta lógica en el script del servidor, seleccione en el tipo de script del servidor API y escriba este código en el script.

Aquí hay una explicación detallada del código con el código en sí incluido:

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."

Desglose del código:

  1. importar frappe: Esto importa el módulo frappe, que es el núcleo del marco Frappe, permitiéndole acceder a las funcionalidades de la base de datos y del servidor.

  2. @frappe.whitelist(): Este decorador permite que la función delete_all_docs sea accesible a través de la API de Frappe y se pueda llamar desde aplicaciones o scripts externos.

  3. def delete_all_docs(tipo de documento):: La función está definida para aceptar un parámetro:

    • tipo de documento: el tipo de documento (p. ej., "Empleado", "Cliente") del cual se eliminarán todos los registros.
  4. docs = frappe.get_all(doctype): Esto recupera todos los documentos del tipo de documento especificado y los almacena en la variable docs. Cada documento devuelto incluirá el nombre del documento, que se utiliza para la eliminación.

  5. para documento en documentos:: la función recorre cada documento en la lista de documentos.

  6. frappe.delete_doc(doctype, doc.name, force=1): Dentro del bucle, cada documento se elimina especificando el doctype y el doc.name. El argumento force=1 garantiza que el documento se elimine por la fuerza, omitiendo las reglas de validación y las comprobaciones si es necesario.

  7. frappe.db.commit(): Una vez que se eliminan todos los documentos, los cambios en la base de datos se confirman, lo que hace que las eliminaciones sean permanentes.

  8. return f"Todos los documentos de {doctype} han sido eliminados.": Después de eliminar todos los documentos, se devuelve un mensaje de éxito, indicando que la operación fue exitosa.

Esta función es útil cuando necesitas eliminar todos los documentos de un tipo de documento en particular en una aplicación Frappe.

Declaración de liberación Este artículo se reproduce en: https://dev.to/04anilr/how-to-write-client-script-for-delete-doctype-all-data-in-frappe-18e0?1 Si hay alguna infracción, por favor contacto Study_golang@163 .comeliminar
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3