Skip to content

Commit 86a0c66

Browse files
committed
fix(edi-import): support link & library files, too
1 parent e16533c commit 86a0c66

File tree

4 files changed

+47
-20
lines changed

4 files changed

+47
-20
lines changed

erpnext/edi/doctype/code_list/code_list.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,10 @@ def get_code_for(self, doctype: str, name: str):
6060
return code[0][0] if code else None
6161

6262
def import_genericode(
63-
self, file_path, code_column, title_column=None, description_column=None, filters=None
63+
self, file_name, code_column, title_column=None, description_column=None, filters=None
6464
):
6565
"""Import genericode file and create Common Code entries"""
66+
file_path = frappe.utils.file_manager.get_file_path(file_name)
6667
parser = etree.XMLParser(remove_blank_text=True)
6768
tree = etree.parse(file_path, parser=parser)
6869
root = tree.getroot()
@@ -82,7 +83,7 @@ def import_genericode(
8283
self.save()
8384

8485
common_codes = CommonCode.import_genericode(
85-
file_path, self.name, code_column, title_column, description_column, filters
86+
file_name, self.name, code_column, title_column, description_column, filters
8687
)
8788

8889
# Bulk insert common codes

erpnext/edi/doctype/code_list/code_list_import.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ erpnext.edi.import_genericode = function (listview_or_form) {
1111
doctype: doctype,
1212
docname: docname,
1313
allow_toggle_private: false,
14+
allow_take_photo: false,
1415
on_success: function (_file_doc, r) {
1516
listview_or_form.refresh();
1617
show_column_selection_dialog(r.message);
@@ -109,7 +110,7 @@ function show_column_selection_dialog(context) {
109110
method: "erpnext.edi.doctype.code_list.code_list_import.process_genericode_import",
110111
args: {
111112
code_list_name: context.code_list,
112-
file_path: context.file_path,
113+
file: context.file,
113114
code_column: values.code_column,
114115
title_column: values.title_column,
115116
description_column: values.description_column,

erpnext/edi/doctype/code_list/code_list_import.py

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,41 @@
11
import json
22

33
import frappe
4+
import requests
45
from frappe import _
56
from frappe.utils.file_manager import save_file
67
from lxml import etree
78

9+
URL_PREFIXES = ("http://", "https://")
10+
811

912
@frappe.whitelist()
1013
def import_genericode():
1114
doctype = frappe.form_dict.doctype
1215
docname = frappe.form_dict.docname
13-
14-
# Parse the uploaded file content
16+
content = frappe.local.uploaded_file
17+
18+
# recover the content, if it's a link
19+
if (file_url := frappe.local.uploaded_file_url) and file_url.startswith(URL_PREFIXES):
20+
try:
21+
# If it's a URL, fetch the content first
22+
response = requests.get(frappe.local.uploaded_file_url)
23+
response.raise_for_status() # Raise an exception for bad status codes
24+
frappe.local.uploaded_file = content = response.content
25+
frappe.local.uploaded_filename = frappe.local.uploaded_file_url.split("/")[-1]
26+
frappe.local.uploaded_file_url = None
27+
except Exception as e:
28+
frappe.throw(f"<pre>{e!s}</pre>", title=_("Fetching Error"))
29+
30+
if file_url := frappe.local.uploaded_file_url:
31+
file_path = frappe.utils.file_manager.get_file_path(file_url)
32+
with open(file_path.encode(), mode="rb") as f:
33+
content = f.read()
34+
35+
# Parse the xml content
1536
parser = etree.XMLParser(remove_blank_text=True)
1637
try:
17-
root = etree.fromstring(frappe.local.uploaded_file, parser=parser)
38+
root = etree.fromstring(content, parser=parser)
1839
except Exception as e:
1940
frappe.throw(f"<pre>{e!s}</pre>", title=_("Parsing Error"))
2041

@@ -31,23 +52,26 @@ def import_genericode():
3152
code_list.name = name
3253
code_list.insert(ignore_permissions=True)
3354

34-
# Save the file using save_file utility
35-
file_doc = save_file(
36-
fname=frappe.local.uploaded_filename,
37-
content=frappe.local.uploaded_file,
38-
dt="Code List",
39-
dn=code_list.name,
40-
folder="Home/Attachments",
41-
is_private=1,
42-
)
43-
file_path = file_doc.get_full_path()
55+
# Attach the file and provide a recoverable identifier
56+
file_doc = frappe.get_doc(
57+
{
58+
"doctype": "File",
59+
"attached_to_doctype": "Code List",
60+
"attached_to_name": code_list.name,
61+
"folder": "Home/Attachments",
62+
"file_name": frappe.local.uploaded_filename,
63+
"file_url": frappe.local.uploaded_file_url,
64+
"is_private": 1,
65+
"content": content,
66+
}
67+
).save(ignore_permissions=True)
4468

4569
# Get available columns and example values
4670
columns, example_values, filterable_columns = get_genericode_columns_and_examples(root)
4771

4872
return {
4973
"code_list": code_list.name,
50-
"file_path": file_path,
74+
"file": file_doc.name,
5175
"columns": columns,
5276
"example_values": example_values,
5377
"filterable_columns": filterable_columns,
@@ -56,11 +80,11 @@ def import_genericode():
5680

5781
@frappe.whitelist()
5882
def process_genericode_import(
59-
code_list_name, file_path, code_column, title_column=None, description_column=None, filters=None
83+
code_list_name, file, code_column, title_column=None, description_column=None, filters=None
6084
):
6185
code_list = frappe.get_doc("Code List", code_list_name)
6286
return code_list.import_genericode(
63-
file_path, code_column, title_column, description_column, filters and json.loads(filters)
87+
file, code_column, title_column, description_column, filters and json.loads(filters)
6488
)
6589

6690

erpnext/edi/doctype/common_code/common_code.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ def validate_distinct_references(self):
6262

6363
@staticmethod
6464
def import_genericode(
65-
file_path, list_name, code_column, title_column=None, description_column=None, filters=None
65+
file_name, list_name, code_column, title_column=None, description_column=None, filters=None
6666
):
67+
file_path = frappe.utils.file_manager.get_file_path(file_name)
6768
parser = etree.XMLParser(remove_blank_text=True)
6869
tree = etree.parse(file_path, parser=parser)
6970
root = tree.getroot()

0 commit comments

Comments
 (0)