11import json
22
33import frappe
4+ import requests
45from frappe import _
56from frappe .utils .file_manager import save_file
67from lxml import etree
78
9+ URL_PREFIXES = ("http://" , "https://" )
10+
811
912@frappe .whitelist ()
1013def 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 ()
5882def 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
0 commit comments