Aquí hay una publicación de blog que incorpora el script que proporcionaste:
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.
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.
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.
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 } } }); }
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).
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.
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.
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.
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.
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."
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.
@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.
def delete_all_docs(tipo de documento):: La función está definida para aceptar un parámetro:
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.
para documento en documentos:: la función recorre cada documento en la lista de documentos.
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.
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.
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.
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