From a4b99cd7b4af05dcc1ff50913fb6bb3c9974b881 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Fri, 10 Dec 2021 17:21:19 +0530 Subject: [PATCH] feat: Zip files --- frappe/core/doctype/file/file.py | 28 +++++++++++++++++++ .../public/js/frappe/views/file/file_view.js | 9 ++++++ 2 files changed, 37 insertions(+) diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index af9c8a48fa..91090bdd77 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -569,6 +569,24 @@ class File(Document): frappe.local.rollback_observers.append(self) self.save() + @staticmethod + def zip_files(files): + from six import string_types + + zip_file = io.BytesIO() + zf = zipfile.ZipFile(zip_file, "w", zipfile.ZIP_DEFLATED) + for _file in files: + if isinstance(_file, string_types): + _file = frappe.get_doc("File", _file) + if not isinstance(_file, File): + continue + if _file.is_folder: + continue + zf.writestr(_file.file_name, _file.get_content()) + zf.close() + return zip_file.getvalue() + + def on_doctype_update(): frappe.db.add_index("File", ["attached_to_doctype", "attached_to_name"]) @@ -612,6 +630,16 @@ def move_file(file_list, new_parent, old_parent): frappe.get_doc("File", old_parent).save() frappe.get_doc("File", new_parent).save() + +@frappe.whitelist() +def zip_files(files): + files = frappe.parse_json(files) + zipped_files = File.zip_files(files) + frappe.response["filename"] = "files.zip" + frappe.response["filecontent"] = zipped_files + frappe.response["type"] = "download" + + def setup_folder_path(filename, new_parent): file = frappe.get_doc("File", filename) file.folder = new_parent diff --git a/frappe/public/js/frappe/views/file/file_view.js b/frappe/public/js/frappe/views/file/file_view.js index 11204bb660..b351ce6109 100644 --- a/frappe/public/js/frappe/views/file/file_view.js +++ b/frappe/public/js/frappe/views/file/file_view.js @@ -169,6 +169,15 @@ frappe.views.FileView = class FileView extends frappe.views.ListView { frappe.file_manager.paste(this.current_folder) ) .hide(); + + this.page.add_actions_menu_item(__('Export as zip'), () => { + let docnames = this.get_checked_items(true); + if (docnames.length) { + open_url_post('/api/method/frappe.core.doctype.file.file.zip_files', { + files: JSON.stringify(docnames) + }); + } + }); } set_fields() {