From 11801cfbd2a0e4806d417638465dcb7c9ccf4366 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 9 Sep 2014 15:24:13 +0530 Subject: [PATCH 01/25] Don't allow to set 'Allow on Submit' for standard fields. Fixes frappe/erpnext#956 --- .../core/doctype/customize_form/customize_form.py | 5 +++++ .../doctype/customize_form/test_customize_form.py | 14 ++++++++++++++ frappe/patches.txt | 1 + frappe/patches/v4_3/__init__.py | 0 .../v4_3/remove_allow_on_submit_customization.py | 11 +++++++++++ 5 files changed, 31 insertions(+) create mode 100644 frappe/patches/v4_3/__init__.py create mode 100644 frappe/patches/v4_3/remove_allow_on_submit_customization.py diff --git a/frappe/core/doctype/customize_form/customize_form.py b/frappe/core/doctype/customize_form/customize_form.py index 8f9f7f8a9d..04d74eb287 100644 --- a/frappe/core/doctype/customize_form/customize_form.py +++ b/frappe/core/doctype/customize_form/customize_form.py @@ -117,6 +117,11 @@ class CustomizeForm(Document): if property == "fieldtype": self.validate_fieldtype_change(df, meta_df[0].get(property), df.get(property)) + elif property == "allow_on_submit" and df.get(property): + frappe.msgprint(_("Row {0}: Not allowed to enable Allow on Submit for standard fields")\ + .format(df.idx)) + continue + self.make_property_setter(property=property, value=df.get(property), property_type=self.docfield_properties[property], fieldname=df.fieldname) diff --git a/frappe/core/doctype/customize_form/test_customize_form.py b/frappe/core/doctype/customize_form/test_customize_form.py index 7a1e4e6b4d..db4115fb8b 100644 --- a/frappe/core/doctype/customize_form/test_customize_form.py +++ b/frappe/core/doctype/customize_form/test_customize_form.py @@ -159,3 +159,17 @@ class TestCustomizeForm(unittest.TestCase): frappe.local.test_objects["Property Setter"] = [] make_test_records_for_doctype("Property Setter") + + def test_set_allow_on_submit(self): + d = self.get_customize_form("User") + d.get("customize_form_fields", {"fieldname": "first_name"})[0].allow_on_submit = 1 + d.get("customize_form_fields", {"fieldname": "test_custom_field"})[0].allow_on_submit = 1 + d.run_method("save_customization") + + d = self.get_customize_form("User") + + # don't allow for standard fields + self.assertEquals(d.get("customize_form_fields", {"fieldname": "first_name"})[0].allow_on_submit or 0, 0) + + # allow for custom field + self.assertEquals(d.get("customize_form_fields", {"fieldname": "test_custom_field"})[0].allow_on_submit, 1) diff --git a/frappe/patches.txt b/frappe/patches.txt index 6e8c2fa47e..1b9d2f143c 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -54,3 +54,4 @@ execute:frappe.reload_doc('website', 'doctype', 'web_form') #2014-09-04 execute:frappe.reload_doc('website', 'doctype', 'web_form_field') #2014-09-04 frappe.patches.v4_2.refactor_website_routing frappe.patches.v4_2.set_assign_in_doc +frappe.patches.v4_3.remove_allow_on_submit_customization diff --git a/frappe/patches/v4_3/__init__.py b/frappe/patches/v4_3/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/patches/v4_3/remove_allow_on_submit_customization.py b/frappe/patches/v4_3/remove_allow_on_submit_customization.py new file mode 100644 index 0000000000..0e6cd3a11e --- /dev/null +++ b/frappe/patches/v4_3/remove_allow_on_submit_customization.py @@ -0,0 +1,11 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# MIT License. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + for d in frappe.get_list("Property Setter", fields=["name", "doc_type"], + filters={"doctype_or_field": "DocField", "property": "allow_on_submit", "value": "1"}, ignore_permissions=True): + frappe.delete_doc("Property Setter", d.name) + frappe.clear_cache(doctype=d.doc_type) From f032e0fd981e1013221daaf6a56b9e28ec463d69 Mon Sep 17 00:00:00 2001 From: 81552433qqcom <81552433@qq.com> Date: Tue, 9 Sep 2014 19:12:28 +0800 Subject: [PATCH 02/25] Script report name doesn't get translated. --- frappe/public/js/frappe/views/query_report.js | 2 +- frappe/translate.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/views/query_report.js b/frappe/public/js/frappe/views/query_report.js index eadad6e0fb..f0a863e238 100644 --- a/frappe/public/js/frappe/views/query_report.js +++ b/frappe/public/js/frappe/views/query_report.js @@ -326,7 +326,7 @@ frappe.views.QueryReport = Class.extend({ var me = this; var formatter = this.get_formatter(); - this.columns = [{id: "_id", field: "_id", name: "Sr No", width: 60}] + this.columns = [{id: "_id", field: "_id", name: __("Sr No"), width: 60}] .concat($.map(columns, function(c) { if ($.isPlainObject(c)) { var df = c; diff --git a/frappe/translate.py b/frappe/translate.py index 741fe41658..26396a7366 100644 --- a/frappe/translate.py +++ b/frappe/translate.py @@ -223,7 +223,7 @@ def get_messages_from_report(name): frappe.db.get_value("DocType", report.ref_doctype, "module")) if report.query: messages.extend(re.findall('"([^:,^"]*):', report.query)) - messages.append(report.report_name) + messages.append(report.report_name) return clean(messages) def get_messages_from_page_or_report(doctype, name, module=None): From 924d5efd520fa164121440c15faaedef9251581d Mon Sep 17 00:00:00 2001 From: 81552433qqcom <81552433@qq.com> Date: Wed, 10 Sep 2014 11:40:05 +0800 Subject: [PATCH 03/25] query report js "Load Report" translation. --- frappe/public/js/frappe/views/query_report.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/views/query_report.js b/frappe/public/js/frappe/views/query_report.js index f0a863e238..4197905a99 100644 --- a/frappe/public/js/frappe/views/query_report.js +++ b/frappe/public/js/frappe/views/query_report.js @@ -235,7 +235,7 @@ frappe.views.QueryReport = Class.extend({ // Run var me = this; this.waiting = frappe.messages.waiting(this.wrapper.find(".waiting-area").empty().toggle(true), - "Loading Report..."); + __("Loading Report") + "..."); this.wrapper.find(".results").toggle(false); var filters = this.get_values(true); From e09fc93001acacf11cd7ba74d0200a39cf8e46de Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 10 Sep 2014 15:36:02 +0530 Subject: [PATCH 04/25] [fix] File Manager --- frappe/core/doctype/file_data/file_data.py | 5 ++--- frappe/utils/file_manager.py | 12 ++++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/frappe/core/doctype/file_data/file_data.py b/frappe/core/doctype/file_data/file_data.py index ae0971d79e..dd239d3c05 100644 --- a/frappe/core/doctype/file_data/file_data.py +++ b/frappe/core/doctype/file_data/file_data.py @@ -17,7 +17,7 @@ class FileData(Document): def before_insert(self): frappe.local.rollback_observers.append(self) - def on_update(self): + def validate(self): if not getattr(self, "ignore_duplicate_entry_error", False): # check duplicate assignement n_records = frappe.db.sql("""select name from `tabFile Data` @@ -28,8 +28,7 @@ class FileData(Document): self.attached_to_name)) if len(n_records) > 0: self.duplicate_entry = n_records[0][0] - frappe.msgprint(frappe._("Same file has already been attached to the record")) - raise frappe.DuplicateEntryError + frappe.throw(frappe._("Same file has already been attached to the record"), frappe.DuplicateEntryError) def on_trash(self): if self.attached_to_name: diff --git a/frappe/utils/file_manager.py b/frappe/utils/file_manager.py index ba5a854eaf..2fbbb5ab4d 100644 --- a/frappe/utils/file_manager.py +++ b/frappe/utils/file_manager.py @@ -117,12 +117,12 @@ def save_file(fname, content, dt, dn, decode=False): content_type = mimetypes.guess_type(fname)[0] fname = get_file_name(fname, content_hash[-6:]) - method = get_hook_method('write_file', fallback=save_file_on_filesystem) - file_data = get_file_data_from_hash(content_hash) if not file_data: + method = get_hook_method('write_file', fallback=save_file_on_filesystem) file_data = method(fname, content, content_type=content_type) file_data = copy(file_data) + file_data.update({ "doctype": "File Data", "attached_to_doctype": dt, @@ -254,9 +254,9 @@ def get_file_name(fname, optional_suffix): if len(n_records) > 0 or os.path.exists(get_files_path(fname)): f = fname.rsplit('.', 1) if len(f) == 1: - partial, extn = f[0], None - elif len(f) == 2: - partial, extn = f - return '{partial}{suffix}{extn}'.format(partial=partial, extn="."+extn if extn else "", suffix=optional_suffix) + partial, extn = f[0], "" + else: + partial, extn = f[0], "." + f[1] + return '{partial}{suffix}{extn}'.format(partial=partial, extn=extn, suffix=optional_suffix) return fname From f0de7e74e97a85284fb1a30337b74078d44ba840 Mon Sep 17 00:00:00 2001 From: 81552433qqcom <81552433@qq.com> Date: Wed, 10 Sep 2014 18:24:22 +0800 Subject: [PATCH 05/25] translation fix in translate.py --- frappe/public/js/frappe/views/ganttview.js | 2 +- frappe/translate.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/views/ganttview.js b/frappe/public/js/frappe/views/ganttview.js index f6c102db3f..03af1482d4 100644 --- a/frappe/public/js/frappe/views/ganttview.js +++ b/frappe/public/js/frappe/views/ganttview.js @@ -44,7 +44,7 @@ frappe.views.Gantt = Class.extend({ this.appframe.add_module_icon(module) this.appframe.set_views_for(this.doctype, "gantt"); - this.appframe.set_title_right("Refresh", + this.appframe.set_title_right(__("Refresh"), function() { me.refresh(); }, "icon-refresh") this.appframe.add_field({fieldtype:"Date", label:"From", diff --git a/frappe/translate.py b/frappe/translate.py index 26396a7366..f03b02e05f 100644 --- a/frappe/translate.py +++ b/frappe/translate.py @@ -232,6 +232,7 @@ def get_messages_from_page_or_report(doctype, name, module=None): file_path = frappe.get_module_path(module, doctype, name, name) messages = get_messages_from_file(file_path + ".js") messages += get_messages_from_file(file_path + ".html") + messages += get_messages_from_file(file_path + ".py") return clean(messages) From 65ff08e7e960be15939c6b5b97bb3a333e6e3ec1 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 10 Sep 2014 16:55:59 +0530 Subject: [PATCH 06/25] [permissions] Query Report: don't use a doctype for filtering User Permissions, if the column representing this doctype is empty --- frappe/widgets/query_report.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/frappe/widgets/query_report.py b/frappe/widgets/query_report.py index 95b2ce9b64..825b97e7c2 100644 --- a/frappe/widgets/query_report.py +++ b/frappe/widgets/query_report.py @@ -138,7 +138,7 @@ def add_total_row(result, columns): def get_filtered_data(ref_doctype, columns, data): result = [] - linked_doctypes = get_linked_doctypes(columns) + linked_doctypes = get_linked_doctypes(columns, data) match_filters_per_doctype = get_user_match_filters(linked_doctypes, ref_doctype) if match_filters_per_doctype: @@ -183,7 +183,7 @@ def has_match(row, linked_doctypes, doctype_match_filters): return resultant_match -def get_linked_doctypes(columns): +def get_linked_doctypes(columns, data): linked_doctypes = {} for idx, col in enumerate(columns): @@ -197,6 +197,11 @@ def get_linked_doctypes(columns): elif col.get("fieldtype")=="Link" and col.get("options"): linked_doctypes[col["options"]] = col["fieldname"] + # remove doctype if column is empty + for doctype, key in linked_doctypes.items(): + if not any(d[key] for d in data): + del linked_doctypes[doctype] + return linked_doctypes def get_user_match_filters(doctypes, ref_doctype): From 4ff08a52b256ca35abe742c80adb960194733c27 Mon Sep 17 00:00:00 2001 From: 81552433qqcom <81552433@qq.com> Date: Thu, 11 Sep 2014 11:33:42 +0800 Subject: [PATCH 07/25] minor translation fix. --- frappe/public/js/frappe/views/query_report.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/views/query_report.js b/frappe/public/js/frappe/views/query_report.js index 4197905a99..f05c2f146a 100644 --- a/frappe/public/js/frappe/views/query_report.js +++ b/frappe/public/js/frappe/views/query_report.js @@ -50,7 +50,7 @@ frappe.views.QueryReport = Class.extend({


\ '+__('For comparative filters, start with')+' ">" or "<", e.g. >5 or >01-02-2012\
'+__('For ranges')+' ('+__('values and dates')+') use ":", \ - e.g. "5:10" (to filter values between 5 & 10)

\ + e.g. "5:10" (' + __("to filter values between 5 & 10") + '

\ ').appendTo(this.wrapper); this.make_toolbar(); From 29521e5dda3945cfb2e7c736e4dff2a7a20c70e7 Mon Sep 17 00:00:00 2001 From: 81552433qqcom <81552433@qq.com> Date: Thu, 11 Sep 2014 16:18:01 +0800 Subject: [PATCH 08/25] Description translation added. --- frappe/public/js/frappe/views/query_report.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/views/query_report.js b/frappe/public/js/frappe/views/query_report.js index f05c2f146a..f4339ae148 100644 --- a/frappe/public/js/frappe/views/query_report.js +++ b/frappe/public/js/frappe/views/query_report.js @@ -50,7 +50,7 @@ frappe.views.QueryReport = Class.extend({


\ '+__('For comparative filters, start with')+' ">" or "<", e.g. >5 or >01-02-2012\
'+__('For ranges')+' ('+__('values and dates')+') use ":", \ - e.g. "5:10" (' + __("to filter values between 5 & 10") + '

\ + e.g. "5:10" (' + __("to filter values between 5 & 10") + ')

\ ').appendTo(this.wrapper); this.make_toolbar(); From 5c2f81ecb67ad0e22a0965c027c607192e22e4b2 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 11 Sep 2014 14:43:30 +0530 Subject: [PATCH 09/25] Corrected spelling --- frappe/hooks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index d0b51a5da0..4e00dfd5da 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -1,7 +1,7 @@ app_name = "frappe" app_title = "Frappe Framework" app_publisher = "Web Notes Technologies Pvt. Ltd." -app_description = "Full Stack Web Application Framwork in Python" +app_description = "Full Stack Web Application Framework in Python" app_icon = "assets/frappe/images/frappe.svg" app_version = "4.3.0" app_color = "#3498db" From 53af736435c998a6a2c2925dfd6c09c315f0e029 Mon Sep 17 00:00:00 2001 From: 81552433qqcom <81552433@qq.com> Date: Thu, 11 Sep 2014 17:22:54 +0800 Subject: [PATCH 10/25] translation for message when click save. --- frappe/public/js/frappe/form/save.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/form/save.js b/frappe/public/js/frappe/form/save.js index 098e5b44f5..9325fd4883 100644 --- a/frappe/public/js/frappe/form/save.js +++ b/frappe/public/js/frappe/form/save.js @@ -74,7 +74,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) { if(df.reqd && !frappe.model.has_value(doc.doctype, doc.name, df.fieldname)) { has_errors = true; - error_fields[error_fields.length] = df.label; + error_fields[error_fields.length] = __(df.label); // scroll to field if(!me.scroll_set) { @@ -91,8 +91,8 @@ frappe.ui.form.save = function(frm, action, callback, btn) { }); if(error_fields.length) msgprint(__('Mandatory fields required in {0}', [(doc.parenttype - ? (frappe.meta.docfield_map[doc.parenttype][doc.parentfield].label + ' (Table)') - : doc.doctype)]) + '\n' + error_fields.join('\n')); + ? (__(frappe.meta.docfield_map[doc.parenttype][doc.parentfield].label) + ' ('+ __("Table") + ')') + : __(doc.doctype))]) + '\n' + error_fields.join('\n')); }); return !has_errors; From 993d0ae57ad71658d886f003cca7e58021a4ca93 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 11 Sep 2014 15:22:05 +0530 Subject: [PATCH 11/25] Apply user restrictions in query report only if rows exists --- frappe/widgets/query_report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/widgets/query_report.py b/frappe/widgets/query_report.py index 825b97e7c2..dbeb93d13b 100644 --- a/frappe/widgets/query_report.py +++ b/frappe/widgets/query_report.py @@ -86,7 +86,7 @@ def run(report_name, filters=()): method_name = get_report_module_dotted_path(module, report.name) + ".execute" columns, result = frappe.get_attr(method_name)(frappe._dict(filters)) - if report.apply_user_permissions: + if report.apply_user_permissions and result: result = get_filtered_data(report.ref_doctype, columns, result) if cint(report.add_total_row) and result: From 134669cb40409bda2a5c2bc695c853eb8c6f99f6 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 11 Sep 2014 15:23:53 +0530 Subject: [PATCH 12/25] [minor] fix in query report linked doctype --- frappe/widgets/query_report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/widgets/query_report.py b/frappe/widgets/query_report.py index dbeb93d13b..e7e82f95ee 100644 --- a/frappe/widgets/query_report.py +++ b/frappe/widgets/query_report.py @@ -199,7 +199,7 @@ def get_linked_doctypes(columns, data): # remove doctype if column is empty for doctype, key in linked_doctypes.items(): - if not any(d[key] for d in data): + if not any(d[key] for d in data if d): del linked_doctypes[doctype] return linked_doctypes From 2849da71adb020748b2db1712094e4f4ef9d4864 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 11 Sep 2014 16:11:53 +0530 Subject: [PATCH 13/25] [fix] notification count deletion deadlock --- .../doctype/notification_count/notification_count.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/frappe/core/doctype/notification_count/notification_count.py b/frappe/core/doctype/notification_count/notification_count.py index 28bd0e2ea6..fbb8ae4718 100644 --- a/frappe/core/doctype/notification_count/notification_count.py +++ b/frappe/core/doctype/notification_count/notification_count.py @@ -89,7 +89,15 @@ def clear_notifications(user=None): def delete_notification_count_for(doctype): if frappe.flags.in_import: return - frappe.db.sql("""delete from `tabNotification Count` where for_doctype = %s""", (doctype,)) + + try: + frappe.db.sql("""delete from `tabNotification Count` where for_doctype = %s""", (doctype,)) + + except MySQLdb.OperationalError, e: + if e.args[0] != 1213: + raise + + logger.error("Deadlock") def clear_doctype_notifications(doc, method=None, *args, **kwargs): if frappe.flags.in_import: From 0d2d47131e2d248f2d039d766dff10e1cd2a4275 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 11 Sep 2014 16:21:00 +0530 Subject: [PATCH 14/25] [fix] Don't show Tags for single type form --- frappe/public/js/frappe/form/footer.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frappe/public/js/frappe/form/footer.js b/frappe/public/js/frappe/form/footer.js index 0c06abd652..8948319d0a 100644 --- a/frappe/public/js/frappe/form/footer.js +++ b/frappe/public/js/frappe/form/footer.js @@ -55,6 +55,11 @@ frappe.ui.form.Footer = Class.extend({ }, make_tags: function() { + if (this.frm.meta.issingle) { + this.wrapper.find(".form-tags").toggle(false); + return; + } + this.frm.tags = new frappe.ui.TagEditor({ parent: this.wrapper.find(".tag-area"), frm: this.frm, From 92c040dfe2878dbda97589a2729dfbd898ad7f63 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 12 Sep 2014 12:02:19 +0530 Subject: [PATCH 15/25] Query report fixes for translated columns --- frappe/public/js/frappe/views/query_report.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/views/query_report.js b/frappe/public/js/frappe/views/query_report.js index e63d589818..065b325ee0 100644 --- a/frappe/public/js/frappe/views/query_report.js +++ b/frappe/public/js/frappe/views/query_report.js @@ -148,10 +148,7 @@ frappe.views.QueryReport = Class.extend({ var data = []; // get filtered data for (var i=0, l=me.dataView.getLength(); i Date: Thu, 11 Sep 2014 18:08:12 +0530 Subject: [PATCH 16/25] [fix] ToDo list assigned to avatar --- frappe/core/doctype/todo/todo_list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/todo/todo_list.html b/frappe/core/doctype/todo/todo_list.html index 18b9dea848..20692806ee 100644 --- a/frappe/core/doctype/todo/todo_list.html +++ b/frappe/core/doctype/todo/todo_list.html @@ -23,7 +23,7 @@
- {%= frappe.avatar(doc.assigned_to) %} + {%= frappe.avatar(doc.owner) %}
From d6e1bb090d098a0a06c1fd08a2a03322d7d171f5 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 12 Sep 2014 11:25:17 +0530 Subject: [PATCH 17/25] [minor] refresh tags in form footer --- frappe/public/js/frappe/form/footer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/footer.js b/frappe/public/js/frappe/form/footer.js index 8948319d0a..817509a4f6 100644 --- a/frappe/public/js/frappe/form/footer.js +++ b/frappe/public/js/frappe/form/footer.js @@ -91,7 +91,7 @@ frappe.ui.form.Footer = Class.extend({ this.frm.attachments.refresh(); this.frm.comments.refresh(); this.frm.assign_to.refresh(); - this.frm.tags.refresh(); + this.frm.tags && this.frm.tags.refresh(); } }, }); From 35fd8d99f7a909ddd79193d0b2fd846a7dea0798 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 12 Sep 2014 14:17:48 +0530 Subject: [PATCH 18/25] Added factory.js and minor fixes for loading Single DocTypes --- frappe/model/document.py | 7 ++++- frappe/public/build.json | 1 + frappe/public/js/frappe/views/container.js | 31 ------------------- frappe/public/js/frappe/views/factory.js | 36 ++++++++++++++++++++++ 4 files changed, 43 insertions(+), 32 deletions(-) create mode 100644 frappe/public/js/frappe/views/factory.js diff --git a/frappe/model/document.py b/frappe/model/document.py index 0993c19008..8449afe181 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -80,7 +80,12 @@ class Document(BaseDocument): def load_from_db(self): if not getattr(self, "_metaclass", False) and self.meta.issingle: - self.update(frappe.db.get_singles_dict(self.doctype)) + single_doc = frappe.db.get_singles_dict(self.doctype) + if not single_doc: + single_doc = frappe.new_doc(self.doctype).as_dict() + single_doc["name"] = self.doctype + + self.update(single_doc) self.init_valid_columns() self._fix_numeric_types() diff --git a/frappe/public/build.json b/frappe/public/build.json index 6c4b1acf11..f79dd07d7b 100644 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -107,6 +107,7 @@ "public/js/frappe/ui/tags.js", "public/js/frappe/views/container.js", + "public/js/frappe/views/factory.js", "public/js/frappe/views/pageview.js", "public/js/frappe/views/doclistview.js", "public/js/frappe/views/sidebar_stats.js", diff --git a/frappe/public/js/frappe/views/container.js b/frappe/public/js/frappe/views/container.js index b391097e6a..363692a7e3 100644 --- a/frappe/public/js/frappe/views/container.js +++ b/frappe/public/js/frappe/views/container.js @@ -73,34 +73,3 @@ frappe.views.Container = Class.extend({ return this.page; } }); - -frappe.views.Factory = Class.extend({ - init: function(opts) { - $.extend(this, opts); - }, - show: function() { - var page_name = frappe.get_route_str(), - me = this; - if(frappe.pages[page_name]) { - frappe.container.change_to(frappe.pages[page_name]); - } else { - var route = frappe.get_route(); - if(route[1]) { - me.make(route); - } else { - frappe.show_not_found(route); - } - } - }, - make_page: function(double_column) { - var page_name = frappe.get_route_str(), - page = frappe.container.add_page(page_name); - - frappe.ui.make_app_page({ - parent: page, - single_column: !double_column - }); - frappe.container.change_to(page_name); - return page; - } -}) diff --git a/frappe/public/js/frappe/views/factory.js b/frappe/public/js/frappe/views/factory.js new file mode 100644 index 0000000000..73fa87ba11 --- /dev/null +++ b/frappe/public/js/frappe/views/factory.js @@ -0,0 +1,36 @@ +// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +// MIT License. See license.txt + +frappe.provide('frappe.pages'); +frappe.provide('frappe.views'); + +frappe.views.Factory = Class.extend({ + init: function(opts) { + $.extend(this, opts); + }, + show: function() { + var page_name = frappe.get_route_str(), + me = this; + if(frappe.pages[page_name] && page_name.indexOf("Form/")===-1) { + frappe.container.change_to(frappe.pages[page_name]); + } else { + var route = frappe.get_route(); + if(route[1]) { + me.make(route); + } else { + frappe.show_not_found(route); + } + } + }, + make_page: function(double_column) { + var page_name = frappe.get_route_str(), + page = frappe.container.add_page(page_name); + + frappe.ui.make_app_page({ + parent: page, + single_column: !double_column + }); + frappe.container.change_to(page_name); + return page; + } +}); From daaf55f0479fa2b6aa5c4167eb147b5c8696dd87 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 12 Sep 2014 14:39:25 +0530 Subject: [PATCH 19/25] [fix] create new --- frappe/model/create_new.py | 2 +- frappe/model/document.py | 1 + frappe/public/js/frappe/model/create_new.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frappe/model/create_new.py b/frappe/model/create_new.py index aa4f4983ee..2b92a99b38 100644 --- a/frappe/model/create_new.py +++ b/frappe/model/create_new.py @@ -89,5 +89,5 @@ def get_default_value(df, defaults, user_permissions, parent_doc): elif df.fieldtype == "Time": return nowtime() - elif (df.fieldtype == "Select" and df.options and df.options != "[Select]"): + elif (df.fieldtype == "Select" and df.options and df.options not in ("[Select]", "Loading...")): return df.options.split("\n")[0] diff --git a/frappe/model/document.py b/frappe/model/document.py index 8449afe181..0097d392d6 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -84,6 +84,7 @@ class Document(BaseDocument): if not single_doc: single_doc = frappe.new_doc(self.doctype).as_dict() single_doc["name"] = self.doctype + del single_doc["__islocal"] self.update(single_doc) self.init_valid_columns() diff --git a/frappe/public/js/frappe/model/create_new.js b/frappe/public/js/frappe/model/create_new.js index 19fe0487de..5a63ca3dfa 100644 --- a/frappe/public/js/frappe/model/create_new.js +++ b/frappe/public/js/frappe/model/create_new.js @@ -66,7 +66,7 @@ $.extend(frappe.model, { doc[f.fieldname] = v; updated.push(f.fieldname); } else if(f.fieldtype == "Select" && f.options - && f.options!="[Select]") { + && !in_list(["[Select]", "Loading..."], f.options)) { doc[f.fieldname] = f.options.split("\n")[0]; } } From ebcbd989a039cd8a02f70f2787e937be32fff0f0 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 12 Sep 2014 17:00:23 +0530 Subject: [PATCH 20/25] minor fix --- frappe/model/delete_doc.py | 2 +- frappe/model/rename_doc.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py index a0d56f31f0..eda985b30c 100644 --- a/frappe/model/delete_doc.py +++ b/frappe/model/delete_doc.py @@ -140,7 +140,7 @@ def check_if_doc_is_dynamically_linked(doc): if frappe.get_meta(df.parent).issingle: # dynamic link in single doc - refdoc = frappe.get_singles_dict(df.parent) + refdoc = frappe.db.get_singles_dict(df.parent) if refdoc.get(df.options)==doc.doctype and refdoc.get(df.fieldname)==doc.name: frappe.throw(_("Cannot delete or cancel because {0} {1} is linked with {2} {3}").format(doc.doctype, doc.name, df.parent, ""), frappe.LinkExistsError) diff --git a/frappe/model/rename_doc.py b/frappe/model/rename_doc.py index f3d0a961f4..a4a8b73c09 100644 --- a/frappe/model/rename_doc.py +++ b/frappe/model/rename_doc.py @@ -299,7 +299,7 @@ def rename_dynamic_links(doctype, old, new): # dynamic link in single, just one value to check if frappe.get_meta(df.parent).issingle: - refdoc = frappe.get_singles_dict(df.parent) + refdoc = frappe.db.get_singles_dict(df.parent) if refdoc.get(df.options)==doctype and refdoc.get(df.fieldname)==old: frappe.db.sql("""update tabSingles set value=%s where From b201bae900e0074aa0e9bf83e3ad00a4df8e4e59 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 15 Sep 2014 12:51:01 +0530 Subject: [PATCH 21/25] [minor] copy_doc ignore_no_copy --- frappe/__init__.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 24dbb5030c..88bfbb7ddc 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -549,9 +549,15 @@ def import_doc(path, ignore_links=False, ignore_insert=False, insert=False): from frappe.core.page.data_import_tool import data_import_tool data_import_tool.import_doc(path, ignore_links=ignore_links, ignore_insert=ignore_insert, insert=insert) -def copy_doc(doc): +def copy_doc(doc, ignore_no_copy=True): """ No_copy fields also get copied.""" import copy + + def remove_no_copy_fields(d): + for df in d.meta.get("fields", {"no_copy": 1}): + if hasattr(d, df.fieldname): + d.set(df.fieldname, None) + if not isinstance(doc, dict): d = doc.as_dict() else: @@ -564,12 +570,18 @@ def copy_doc(doc): newdoc.creation = None newdoc.amended_from = None newdoc.amendment_date = None + if not ignore_no_copy: + remove_no_copy_fields(newdoc) + for d in newdoc.get_all_children(): d.name = None d.parent = None d.set("__islocal", 1) d.owner = None d.creation = None + if not ignore_no_copy: + remove_no_copy_fields(d) + return newdoc def compare(val1, condition, val2): From 140a299daffbaf06e1854d967d85bde46f80c317 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 15 Sep 2014 16:26:01 +0530 Subject: [PATCH 22/25] [hotfix] mysqldb encoders for UnicodeWithAttrs of markdown2 --- frappe/database.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/database.py b/frappe/database.py index 4f72cfdf6c..d40bf90cb8 100644 --- a/frappe/database.py +++ b/frappe/database.py @@ -6,6 +6,7 @@ from __future__ import unicode_literals import MySQLdb +from markdown2 import UnicodeWithAttrs import warnings import datetime import frappe @@ -48,6 +49,7 @@ class Database: use_unicode=True, charset='utf8') self._conn.converter[246]=float self._conn.converter[12]=get_datetime + self._conn.encoders[UnicodeWithAttrs] = self._conn.encoders[unicode] self._cursor = self._conn.cursor() if self.user != 'root': From be93bbc76a988dac1452b0b26f879204d95603e1 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 16 Sep 2014 15:08:27 +0530 Subject: [PATCH 23/25] [minor] clear _website_pages in clear_web --- frappe/website/render.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/website/render.py b/frappe/website/render.py index 17c9af9398..a3f01d56e6 100644 --- a/frappe/website/render.py +++ b/frappe/website/render.py @@ -171,6 +171,7 @@ def clear_cache(path=None): else: clear_sitemap() frappe.clear_cache("Guest") + frappe.cache().delete_value("_website_pages") clear_permissions() for method in frappe.get_hooks("website_clear_cache"): From 777ae6d15d7d87b8e2c83a2212db6b117b2a8ab3 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 16 Sep 2014 15:21:20 +0530 Subject: [PATCH 24/25] Update CONTRIBUTING.md --- CONTRIBUTING.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a29e0badee..ef9d094d93 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,9 @@ # Contributing to Frappe / ERPNext +### Update 16-Sep-14 + +Please send pull requests to branch v5.0 + ## Reporting issues We only accept issues that are bug reports or feature requests. Bugs must be isolated and reproducible problems. Please read the following guidelines before opening any issue. From d65aea390f63cc60830b8c9fd4ecff5d4bfa8d5a Mon Sep 17 00:00:00 2001 From: Pratik Vyas Date: Tue, 16 Sep 2014 16:26:25 +0600 Subject: [PATCH 25/25] bumped to version 4.4.0 --- frappe/__version__.py | 2 +- frappe/hooks.py | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/__version__.py b/frappe/__version__.py index 111dc9172a..ecdb1cef9e 100644 --- a/frappe/__version__.py +++ b/frappe/__version__.py @@ -1 +1 @@ -__version__ = "4.3.0" +__version__ = "4.4.0" diff --git a/frappe/hooks.py b/frappe/hooks.py index 4e00dfd5da..deddf426e8 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -3,7 +3,7 @@ app_title = "Frappe Framework" app_publisher = "Web Notes Technologies Pvt. Ltd." app_description = "Full Stack Web Application Framework in Python" app_icon = "assets/frappe/images/frappe.svg" -app_version = "4.3.0" +app_version = "4.4.0" app_color = "#3498db" app_email = "support@frappe.io" diff --git a/setup.py b/setup.py index 877718f0a6..a99b55fc12 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import setup, find_packages import os -version = "4.3.0" +version = "4.4.0" with open("requirements.txt", "r") as f: install_requires = f.readlines()