Aqui está uma postagem do blog que incorpora o script que você forneceu:
Gerenciar grandes quantidades de dados em qualquer sistema pode ser desafiador, especialmente quando se trata de exclusão eficiente de registros. No Frappe, podemos lidar com esse cenário customizando a visualização da lista e excluindo registros em lotes para evitar sobrecarregar o servidor.
Nesta postagem, exploraremos como configurar a exclusão em lote de documentos "Mensagens do WhatsApp" usando código personalizado no Frappe.
Ao lidar com milhares ou mais registros, tentar excluí-los todos de uma vez pode sobrecarregar seu servidor, causando tempos limite ou desempenho lento. O processamento em lote nos permite dividir a tarefa em partes menores e gerenciáveis, reduzindo a carga no servidor e garantindo uma experiência de usuário mais tranquila.
Primeiro, modificaremos a visualização de lista do tipo de documento "Mensagem do WhatsApp" para adicionar um botão para exclusão em lote. Este botão irá acionar o processo de exclusão de todas as mensagens do WhatsApp em lotes.
Aqui está o código para personalizar a visualização 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(); } ); }); } };
A parte comentada do código adiciona um botão chamado "Excluir todos os documentos" à visualização de lista. Uma vez clicado, ele solicita confirmação do usuário antes de iniciar o processo de exclusão. Você pode descomentar esta parte do código para ativar o botão em seu ambiente.
O núcleo deste processo é a função delete_in_batches. Esta função busca um lote de documentos, exclui-os um por um e, em seguida, prossegue para o próximo lote com atraso, garantindo que o servidor não fique sobrecarregado.
Aqui está o código completo para exclusão em lote:
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 } } }); }
Buscando documentos:
A função começa buscando um lote de documentos de mensagens do WhatsApp, com o tamanho do lote controlado pelo parâmetro batch_size (o padrão é 2000).
Excluindo documentos:
Para cada documento obtido, o script chama o método frappe.client.delete para excluir o documento. Após cada exclusão bem-sucedida, uma notificação é mostrada ao usuário.
Lote recursivo:
Depois que um lote é processado, a função faz uma pausa de 2 segundos antes de buscar e excluir o próximo lote. Esse atraso ajuda a evitar a sobrecarga do servidor.
Conclusão:
Quando não houver mais documentos para excluir, uma mensagem será exibida ao usuário e a exibição da lista será atualizada para refletir as alterações.
Este script é uma solução simples, mas eficaz para exclusão em lote de grandes quantidades de dados no Frappe. Ao dividir o processo de exclusão em lotes menores e gerenciáveis, evitamos sobrecarregar o servidor e garantimos que a operação ocorra sem problemas. Você pode modificar o tamanho do lote e o atraso para atender às suas necessidades, dependendo do volume de dados e da capacidade do servidor.
Sinta-se à vontade para integrar este script ao seu próprio aplicativo Frappe para agilizar a exclusão de mensagens do WhatsApp ou qualquer outro tipo de documento.
Aqui está uma explicação detalhada do código com o próprio código incluído:
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."
import frappe: Importa o módulo frappe, que é o núcleo do framework Frappe, permitindo que você acesse funcionalidades de banco de dados e servidor.
@frappe.whitelist(): Este decorador permite que a função delete_all_docs seja acessível via API do Frappe e possa ser chamada a partir de aplicativos ou scripts externos.
def delete_all_docs(doctype):: A função é definida para aceitar um parâmetro:
docs = frappe.get_all(doctype): Isso busca todos os documentos do tipo de documento especificado e os armazena na variável docs. Cada documento retornado incluirá o nome do documento, que será usado para exclusão.
for doc in docs:: A função percorre cada documento na lista de documentos.
frappe.delete_doc(doctype, doc.name, force=1): Dentro do loop, cada documento é excluído especificando o doctype e o doc.name. O argumento force=1 garante que o documento seja excluído à força, ignorando regras de validação e verificações, se necessário.
frappe.db.commit(): Depois que todos os documentos forem excluídos, as alterações do banco de dados serão confirmadas, tornando as exclusões permanentes.
return f"Todos os documentos de {doctype} foram excluídos.": Depois que todos os documentos forem excluídos, uma mensagem de sucesso será retornada, indicando que a operação foi bem-sucedida.
Esta função é útil quando você precisa excluir todos os documentos de um determinado doctype em uma aplicação Frappe.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3