119 lines
2.9 KiB
Python
119 lines
2.9 KiB
Python
import json
|
|
|
|
import frappe
|
|
from frappe.core.doctype.file.file import File, setup_folder_path
|
|
from frappe.utils import cint, cstr
|
|
|
|
|
|
@frappe.whitelist()
|
|
def unzip_file(name: str):
|
|
"""Unzip the given file and make file records for each of the extracted files"""
|
|
file: File = frappe.get_doc("File", name)
|
|
return file.unzip()
|
|
|
|
|
|
@frappe.whitelist()
|
|
def get_attached_images(doctype: str, names: list[str]) -> frappe._dict:
|
|
"""get list of image urls attached in form
|
|
returns {name: ['image.jpg', 'image.png']}"""
|
|
|
|
if isinstance(names, str):
|
|
names = json.loads(names)
|
|
|
|
img_urls = frappe.db.get_list(
|
|
"File",
|
|
filters={
|
|
"attached_to_doctype": doctype,
|
|
"attached_to_name": ("in", names),
|
|
"is_folder": 0,
|
|
},
|
|
fields=["file_url", "attached_to_name as docname"],
|
|
)
|
|
|
|
out = frappe._dict()
|
|
for i in img_urls:
|
|
out[i.docname] = out.get(i.docname, [])
|
|
out[i.docname].append(i.file_url)
|
|
|
|
return out
|
|
|
|
|
|
@frappe.whitelist()
|
|
def get_files_in_folder(folder: str, start: int = 0, page_length: int = 20) -> dict:
|
|
attachment_folder = frappe.db.get_value(
|
|
"File",
|
|
"Home/Attachments",
|
|
["name", "file_name", "file_url", "is_folder", "modified"],
|
|
as_dict=1,
|
|
)
|
|
|
|
files = frappe.get_list(
|
|
"File",
|
|
{"folder": folder},
|
|
["name", "file_name", "file_url", "is_folder", "modified"],
|
|
start=start,
|
|
page_length=page_length + 1,
|
|
)
|
|
|
|
if folder == "Home" and attachment_folder not in files:
|
|
files.insert(0, attachment_folder)
|
|
|
|
return {"files": files[:page_length], "has_more": len(files) > page_length}
|
|
|
|
|
|
@frappe.whitelist()
|
|
def get_files_by_search_text(text: str) -> list[dict]:
|
|
if not text:
|
|
return []
|
|
|
|
text = "%" + cstr(text).lower() + "%"
|
|
return frappe.get_list(
|
|
"File",
|
|
fields=["name", "file_name", "file_url", "is_folder", "modified"],
|
|
filters={"is_folder": False},
|
|
or_filters={
|
|
"file_name": ("like", text),
|
|
"file_url": text,
|
|
"name": ("like", text),
|
|
},
|
|
order_by="modified desc",
|
|
limit=20,
|
|
)
|
|
|
|
|
|
@frappe.whitelist(allow_guest=True)
|
|
def get_max_file_size() -> int:
|
|
return cint(frappe.conf.get("max_file_size")) or 10485760
|
|
|
|
|
|
@frappe.whitelist()
|
|
def create_new_folder(file_name: str, folder: str) -> File:
|
|
"""create new folder under current parent folder"""
|
|
file = frappe.new_doc("File")
|
|
file.file_name = file_name
|
|
file.is_folder = 1
|
|
file.folder = folder
|
|
file.insert(ignore_if_duplicate=True)
|
|
return file
|
|
|
|
|
|
@frappe.whitelist()
|
|
def move_file(file_list: list[File | dict] | str, new_parent: str, old_parent: str) -> None:
|
|
if isinstance(file_list, str):
|
|
file_list = json.loads(file_list)
|
|
|
|
# will check for permission on each file & update parent
|
|
for file_obj in file_list:
|
|
setup_folder_path(file_obj.get("name"), new_parent)
|
|
|
|
# recalculate sizes
|
|
frappe.get_doc("File", old_parent).save()
|
|
frappe.get_doc("File", new_parent).save()
|
|
|
|
|
|
@frappe.whitelist()
|
|
def zip_files(files: str):
|
|
files = frappe.parse_json(files)
|
|
frappe.response["filename"] = "files.zip"
|
|
frappe.response["filecontent"] = File.zip_files(files)
|
|
frappe.response["type"] = "download"
|