إليك مشاركة مدونة تتضمن النص الذي قدمته:
قد تكون إدارة كميات كبيرة من البيانات في أي نظام أمرًا صعبًا، خاصة عندما يتعلق الأمر بحذف السجلات بكفاءة. في Frappe، يمكننا التعامل مع هذا السيناريو عن طريق تخصيص عرض القائمة وحذف السجلات على دفعات لتجنب التحميل الزائد على الخادم.
في هذا المنشور، سنستكشف كيفية إعداد الحذف الدفعي لمستندات "رسائل WhatsApp" باستخدام رمز مخصص داخل Frappe.
عند التعامل مع آلاف السجلات أو أكثر، فإن محاولة حذفها جميعًا مرة واحدة يمكن أن يؤدي إلى إجهاد الخادم الخاص بك، مما يتسبب في انتهاء المهلات أو بطء الأداء. تسمح لنا المعالجة المجمعة بتقسيم المهمة إلى أجزاء أصغر يمكن التحكم فيها، مما يقلل الحمل على الخادم ويضمن تجربة مستخدم أكثر سلاسة.
أولاً، سنقوم بتعديل عرض القائمة لنوع مستند "رسالة 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(); } ); }); } };
يضيف الجزء الذي تم التعليق عليه من الكود زرًا يسمى "حذف جميع المستندات" إلى عرض القائمة. بمجرد النقر عليه، فإنه يطالب المستخدم بالتأكيد قبل البدء في عملية الحذف. يمكنك إلغاء التعليق على هذا الجزء من التعليمات البرمجية لتمكين الزر في بيئتك.
جوهر هذه العملية هو وظيفة الحذف_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 } } }); }
جلب المستندات:
تبدأ الوظيفة بجلب مجموعة من مستندات رسائل WhatsApp، مع التحكم في حجم الدفعة بواسطة معلمة Batch_size (الافتراضي هو 2000).
حذف المستندات:
بالنسبة لكل مستند يتم جلبه، يستدعي البرنامج النصي الأسلوب frappe.client.delete لحذف المستند. بعد كل عملية حذف ناجحة، يظهر إشعار للمستخدم.
التجميع العودي:
بمجرد معالجة الدفعة، تتوقف الوظيفة مؤقتًا لمدة ثانيتين قبل جلب الدفعة التالية وحذفها. يساعد هذا التأخير على منع التحميل الزائد على الخادم.
انتهاء:
عندما لا يكون هناك المزيد من المستندات لحذفها، يتم عرض رسالة للمستخدم، ويتم تحديث عرض القائمة لتعكس التغييرات.
يعد هذا البرنامج النصي حلاً بسيطًا ولكنه فعال لحذف كميات كبيرة من البيانات في Frappe. من خلال تقسيم عملية الحذف إلى دفعات أصغر يمكن التحكم فيها، فإننا نتجنب التحميل الزائد على الخادم ونضمن سير العملية بسلاسة. يمكنك تعديل حجم الدفعة والتأخير لتناسب احتياجاتك، اعتمادًا على حجم البيانات وسعة الخادم.
لا تتردد في دمج هذا البرنامج النصي في تطبيق Frappe الخاص بك لتسهيل حذف رسائل WhatsApp أو أي نوع آخر من المستندات.
إليك شرحًا تفصيليًا للكود مع تضمين الكود نفسه:
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."
استيراد frappe : يؤدي هذا إلى استيراد وحدة frappe، التي تعد جوهر إطار عمل Frappe، مما يسمح لك بالوصول إلى وظائف قاعدة البيانات والخادم.
@frappe.whitelist(): يتيح هذا الديكور إمكانية الوصول إلى وظيفةحذف_all_docs عبر واجهة برمجة تطبيقات Frappe ويمكن استدعاؤها من التطبيقات أو البرامج النصية الخارجية.
defحذف_all_docs(doctype):: تم تعريف الوظيفة لقبول معلمة واحدة:
docs = frappe.get_all(doctype): يؤدي هذا إلى جلب كافة المستندات الخاصة بنوع المستند المحدد وتخزينها في متغير المستندات. ستتضمن كل وثيقة يتم إرجاعها اسم الوثيقة، والذي سيتم استخدامه للحذف.
بالنسبة للمستند في المستندات: : تتكرر الوظيفة خلال كل مستند في قائمة المستندات.
frappe.delete_doc(doctype, doc.name, force=1): داخل الحلقة، يتم حذف كل مستند عن طريق تحديد نوع المستند واسم المستند. تضمن الوسيطة force=1 حذف المستند بالقوة، وتجاوز قواعد التحقق من الصحة وعمليات التحقق إذا لزم الأمر.
frappe.db.commit(): بمجرد حذف جميع المستندات، يتم تنفيذ تغييرات قاعدة البيانات، مما يجعل عمليات الحذف دائمة.
return f"تم حذف جميع المستندات من {doctype}.": بعد حذف جميع المستندات، يتم إرجاع رسالة نجاح، تشير إلى نجاح العملية.
هذه الوظيفة مفيدة عندما تحتاج إلى حذف جميع المستندات من نوع مستند معين في تطبيق Frappe.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3