diff --git a/frappe/core/page/data_import_tool/importer.py b/frappe/core/page/data_import_tool/importer.py index 14606b023e..372d8dd66f 100644 --- a/frappe/core/page/data_import_tool/importer.py +++ b/frappe/core/page/data_import_tool/importer.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals, print_function +import requests import frappe, json import frappe.permissions import frappe.async @@ -11,8 +12,9 @@ from frappe import _ from frappe.utils.csvutils import getlink from frappe.utils.dateutils import parse_date +from frappe.utils.file_manager import save_url -from frappe.utils import cint, cstr, flt, getdate, get_datetime +from frappe.utils import cint, cstr, flt, getdate, get_datetime, get_url from frappe.core.page.data_import_tool.data_import_tool import get_data_keys @frappe.whitelist() @@ -126,6 +128,10 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, d[fieldname] = get_datetime(_date + " " + _time) else: d[fieldname] = None + + elif fieldtype in ("Image", "Attach Image", "Attach"): + # added file to attachments list + attachments.append(d[fieldname]) except IndexError: pass @@ -164,6 +170,40 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, if not doc.modified_by in users: doc.modified_by = frappe.session.user + def is_valid_url(url): + is_valid = False + if url.startswith("/files") or url.startswith("/private/files"): + url = get_url(url) + + try: + r = requests.get(url) + is_valid = True if r.status_code == 200 else False + except Exception: + pass + + return is_valid + + def attach_file_to_doc(doctype, docname, file_url): + # check if attachment is already available + # check if the attachement link is relative or not + if not file_url: + return + if not is_valid_url(file_url): + return + + files = frappe.db.sql("""Select name from `tabFile` where attached_to_doctype='{doctype}' and + attached_to_name='{docname}' and (file_url='{file_url}' or thumbnail_url='{file_url}')""".format( + doctype=doctype, + docname=docname, + file_url=file_url + )) + + if files: + # file is already attached + return + + file = save_url(file_url, None, doctype, docname, "Home/Attachments", 0) + # header if not rows: rows = read_csv_content_from_uploaded_file(ignore_encoding_errors) @@ -175,6 +215,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, doctypes = [] column_idx_to_fieldname = {} column_idx_to_fieldtype = {} + attachments = [] if submit_after_import and not cint(frappe.db.get_value("DocType", doctype, "is_submittable")): @@ -265,6 +306,10 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, log('Inserted row (#%d) %s' % (row_idx + 1, as_link(doc.doctype, doc.name))) else: log('Ignored row (#%d) %s' % (row_idx + 1, row[1])) + if attachments: + # check file url and create a File document + for file_url in attachments: + attach_file_to_doc(doc.doctype, doc.name, file_url) if submit_after_import: doc.submit() log('Submitted row (#%d) %s' % (row_idx + 1, as_link(doc.doctype, doc.name)))