Skip to content

Commit

Permalink
fix(edi-import): support link & library files, too
Browse files Browse the repository at this point in the history
  • Loading branch information
blaggacao committed Oct 1, 2024
1 parent e16533c commit 94bd743
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 20 deletions.
5 changes: 3 additions & 2 deletions erpnext/edi/doctype/code_list/code_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,10 @@ def get_code_for(self, doctype: str, name: str):
return code[0][0] if code else None

def import_genericode(
self, file_path, code_column, title_column=None, description_column=None, filters=None
self, file_name, code_column, title_column=None, description_column=None, filters=None
):
"""Import genericode file and create Common Code entries"""
file_path = frappe.utils.file_manager.get_file_path(file_name)
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse(file_path, parser=parser)
root = tree.getroot()
Expand All @@ -82,7 +83,7 @@ def import_genericode(
self.save()

common_codes = CommonCode.import_genericode(
file_path, self.name, code_column, title_column, description_column, filters
file_name, self.name, code_column, title_column, description_column, filters
)

# Bulk insert common codes
Expand Down
3 changes: 2 additions & 1 deletion erpnext/edi/doctype/code_list/code_list_import.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ erpnext.edi.import_genericode = function (listview_or_form) {
doctype: doctype,
docname: docname,
allow_toggle_private: false,
allow_take_photo: false,
on_success: function (_file_doc, r) {
listview_or_form.refresh();
show_column_selection_dialog(r.message);
Expand Down Expand Up @@ -109,7 +110,7 @@ function show_column_selection_dialog(context) {
method: "erpnext.edi.doctype.code_list.code_list_import.process_genericode_import",
args: {
code_list_name: context.code_list,
file_path: context.file_path,
file: context.file,
code_column: values.code_column,
title_column: values.title_column,
description_column: values.description_column,
Expand Down
56 changes: 40 additions & 16 deletions erpnext/edi/doctype/code_list/code_list_import.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,41 @@
import json

import frappe
import requests
from frappe import _
from frappe.utils.file_manager import save_file
from lxml import etree

URL_PREFIXES = ("http://", "https://")


@frappe.whitelist()
def import_genericode():
doctype = frappe.form_dict.doctype
docname = frappe.form_dict.docname

# Parse the uploaded file content
content = frappe.local.uploaded_file

# recover the content, if it's a link
if (file_url := frappe.local.uploaded_file_url) and file_url.startswith(URL_PREFIXES):
try:
# If it's a URL, fetch the content and make it a local file (for durable audit)
response = requests.get(frappe.local.uploaded_file_url)
response.raise_for_status()
frappe.local.uploaded_file = content = response.content
frappe.local.uploaded_filename = frappe.local.uploaded_file_url.split("/")[-1]
frappe.local.uploaded_file_url = None
except Exception as e:
frappe.throw(f"<pre>{e!s}</pre>", title=_("Fetching Error"))

if file_url := frappe.local.uploaded_file_url:
file_path = frappe.utils.file_manager.get_file_path(file_url)
with open(file_path.encode(), mode="rb") as f:
content = f.read()

# Parse the xml content
parser = etree.XMLParser(remove_blank_text=True)
try:
root = etree.fromstring(frappe.local.uploaded_file, parser=parser)
root = etree.fromstring(content, parser=parser)
except Exception as e:
frappe.throw(f"<pre>{e!s}</pre>", title=_("Parsing Error"))

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

# Save the file using save_file utility
file_doc = save_file(
fname=frappe.local.uploaded_filename,
content=frappe.local.uploaded_file,
dt="Code List",
dn=code_list.name,
folder="Home/Attachments",
is_private=1,
)
file_path = file_doc.get_full_path()
# Attach the file and provide a recoverable identifier
file_doc = frappe.get_doc(
{
"doctype": "File",
"attached_to_doctype": "Code List",
"attached_to_name": code_list.name,
"folder": "Home/Attachments",
"file_name": frappe.local.uploaded_filename,
"file_url": frappe.local.uploaded_file_url,
"is_private": 1,
"content": content,
}
).save(ignore_permissions=True)

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

return {
"code_list": code_list.name,
"file_path": file_path,
"file": file_doc.name,
"columns": columns,
"example_values": example_values,
"filterable_columns": filterable_columns,
Expand All @@ -56,11 +80,11 @@ def import_genericode():

@frappe.whitelist()
def process_genericode_import(
code_list_name, file_path, code_column, title_column=None, description_column=None, filters=None
code_list_name, file, code_column, title_column=None, description_column=None, filters=None
):
code_list = frappe.get_doc("Code List", code_list_name)
return code_list.import_genericode(
file_path, code_column, title_column, description_column, filters and json.loads(filters)
file, code_column, title_column, description_column, filters and json.loads(filters)
)


Expand Down
3 changes: 2 additions & 1 deletion erpnext/edi/doctype/common_code/common_code.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,9 @@ def validate_distinct_references(self):

@staticmethod
def import_genericode(
file_path, list_name, code_column, title_column=None, description_column=None, filters=None
file_name, list_name, code_column, title_column=None, description_column=None, filters=None
):
file_path = frappe.utils.file_manager.get_file_path(file_name)
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse(file_path, parser=parser)
root = tree.getroot()
Expand Down

0 comments on commit 94bd743

Please sign in to comment.