From edbbf4b46496e7ba494d135adaea23649b45dfb5 Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Mon, 15 Jan 2018 18:10:53 +0530 Subject: [PATCH 1/3] add the field attach_to_field in the file (#4823) --- frappe/core/doctype/file/file.json | 32 +++++++++++++++++++++++++++++- frappe/core/doctype/file/file.py | 18 +++++++++++++---- frappe/utils/file_manager.py | 18 ++++++++++------- 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/frappe/core/doctype/file/file.json b/frappe/core/doctype/file/file.json index d3275e6968..e1be754a67 100644 --- a/frappe/core/doctype/file/file.json +++ b/frappe/core/doctype/file/file.json @@ -520,6 +520,36 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "attached_to_field", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Attached To Field", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -653,7 +683,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-10-27 13:27:43.882914", + "modified": "2018-01-15 03:41:23.876072", "modified_by": "Administrator", "module": "Core", "name": "File", diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index 03701e5ba0..1c6a0edceb 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -75,8 +75,8 @@ class File(NestedSet): self.set_folder_size() if frappe.db.exists('File', {'name': self.name, 'is_folder': 0}): + old_file_url = self.file_url if not self.is_folder and (self.is_private != self.db_get('is_private')): - old_file_url = self.file_url private_files = frappe.get_site_path('private', 'files') public_files = frappe.get_site_path('public', 'files') @@ -92,10 +92,20 @@ class File(NestedSet): self.file_url = "/private/files/{0}".format(self.file_name) + # update documents image url with new file url - if self.attached_to_doctype and self.attached_to_name and \ - frappe.db.get_value(self.attached_to_doctype, self.attached_to_name, "image") == old_file_url: - frappe.db.set_value(self.attached_to_doctype, self.attached_to_name, "image", self.file_url) + if self.attached_to_doctype and self.attached_to_name: + if not self.attached_to_field: + field_name = None + reference_dict = frappe.get_doc(self.attached_to_doctype, self.attached_to_name).as_dict() + for key, value in reference_dict.items(): + if value == old_file_url: + field_name = key + break + self.attached_to_field = field_name + if self.attached_to_field: + frappe.db.set_value(self.attached_to_doctype, self.attached_to_name, self.attached_to_field, self.file_url) + def set_folder_size(self): """Set folder size if folder""" diff --git a/frappe/utils/file_manager.py b/frappe/utils/file_manager.py index 48fdc82179..a62f04eb10 100644 --- a/frappe/utils/file_manager.py +++ b/frappe/utils/file_manager.py @@ -24,6 +24,7 @@ def upload(): # get record details dt = frappe.form_dict.doctype dn = frappe.form_dict.docname + df = frappe.form_dict.docfield file_url = frappe.form_dict.file_url filename = frappe.form_dict.filename frappe.form_dict.is_private = cint(frappe.form_dict.is_private) @@ -53,30 +54,31 @@ def upload(): "comment": comment.as_dict() if comment else {} } -def get_file_doc(dt=None, dn=None, folder=None, is_private=None): +def get_file_doc(dt=None, dn=None, folder=None, is_private=None, df=None): '''returns File object (Document) from given parameters or form_dict''' r = frappe.form_dict if dt is None: dt = r.doctype if dn is None: dn = r.docname + if df is None: df = r.docfield if folder is None: folder = r.folder if is_private is None: is_private = r.is_private if r.filedata: - file_doc = save_uploaded(dt, dn, folder, is_private) + file_doc = save_uploaded(dt, dn, folder, is_private, df) elif r.file_url: - file_doc = save_url(r.file_url, r.filename, dt, dn, folder, is_private) + file_doc = save_url(r.file_url, r.filename, dt, dn, folder, is_private, df) return file_doc -def save_uploaded(dt, dn, folder, is_private): +def save_uploaded(dt, dn, folder, is_private, df=None): fname, content = get_uploaded_content() if content: - return save_file(fname, content, dt, dn, folder, is_private=is_private); + return save_file(fname, content, dt, dn, folder, is_private=is_private, df=df); else: raise Exception -def save_url(file_url, filename, dt, dn, folder, is_private): +def save_url(file_url, filename, dt, dn, folder, is_private, df=None): # if not (file_url.startswith("http://") or file_url.startswith("https://")): # frappe.msgprint("URL must start with 'http://' or 'https://'") # return None, None @@ -89,6 +91,7 @@ def save_url(file_url, filename, dt, dn, folder, is_private): "file_name": filename, "attached_to_doctype": dt, "attached_to_name": dn, + "attached_to_field": df, "folder": folder, "is_private": is_private }) @@ -111,7 +114,7 @@ def get_uploaded_content(): frappe.msgprint(_('No file attached')) return None, None -def save_file(fname, content, dt, dn, folder=None, decode=False, is_private=0): +def save_file(fname, content, dt, dn, folder=None, decode=False, is_private=0, df=None): if decode: if isinstance(content, text_type): content = content.encode("utf-8") @@ -136,6 +139,7 @@ def save_file(fname, content, dt, dn, folder=None, decode=False, is_private=0): "doctype": "File", "attached_to_doctype": dt, "attached_to_name": dn, + "attached_to_field": df, "folder": folder, "file_size": file_size, "content_hash": content_hash, From 25451759fe81db75cc9e7f5068658c7ac82750a2 Mon Sep 17 00:00:00 2001 From: tundebabzy Date: Mon, 15 Jan 2018 13:42:03 +0100 Subject: [PATCH 2/3] `add_dropdown_item` should only add unique labels (#4818) * do not allow add_menu_button duplicate items * JSDOC documentation --- frappe/public/js/frappe/ui/page.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/frappe/public/js/frappe/ui/page.js b/frappe/public/js/frappe/ui/page.js index bf969f1566..728e9a6034 100644 --- a/frappe/public/js/frappe/ui/page.js +++ b/frappe/public/js/frappe/ui/page.js @@ -247,12 +247,27 @@ frappe.ui.Page = Class.extend({ //-- Generic --// + /* + * Add label to given drop down menu. If label, is already contained in the drop + * down menu, it will be ignored. + * @param {string} label - Text for the drop down menu + * @param {function} click - function to be called when `label` is clicked + * @param {Boolean} standard + * @param {object} parent - DOM object representing the parent of the drop down item lists + */ add_dropdown_item: function(label, click, standard, parent) { + const is_already_added = () => { + let found_lists = $(parent).find('li > a.grey-link:contains(' + label + ')'); + return found_lists.length > 0; + } + parent.parent().removeClass("hide"); var $li = $('
  • '+ label +'
  • '), $link = $li.find("a").on("click", click); + if (is_already_added()) return; + if(standard===true) { $li.appendTo(parent); } else { From ca554764a52f9fa6012c36d87037b9cfd80f06a7 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Mon, 15 Jan 2018 18:56:51 +0600 Subject: [PATCH 3/3] bumped to version 10.0.10 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index e89515951f..6e397647dc 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template, get_email_from_template -__version__ = '10.0.9' +__version__ = '10.0.10' __title__ = "Frappe Framework" local = Local()