diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index c6d5b65c52..06b1e863b1 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -27,6 +27,7 @@ class User(Document): self.add_system_manager_role() self.check_enable_disable() self.update_gravatar() + self.ensure_unique_roles() self.remove_all_roles_for_guest() if self.language == "Loading...": self.language = None @@ -255,6 +256,14 @@ class User(Document): if self.name == "Guest": self.set("user_roles", list(set(d for d in self.get("user_roles") if d.role == "Guest"))) + def ensure_unique_roles(self): + exists = [] + for i, d in enumerate(self.get("user_roles")): + if (not d.role) or (d.role in exists): + self.get("user_roles").remove(d) + else: + exists.append(d.role) + @frappe.whitelist() def get_languages(): from frappe.translate import get_lang_dict diff --git a/frappe/core/doctype/userrole/userrole.json b/frappe/core/doctype/userrole/userrole.json index fb9094cb33..b0f5f373ed 100644 --- a/frappe/core/doctype/userrole/userrole.json +++ b/frappe/core/doctype/userrole/userrole.json @@ -1,7 +1,7 @@ { "allow_copy": 0, "autoname": "UR.#####", - "creation": "2013-02-06 11:30:13.000000", + "creation": "2013-02-06 11:30:13", "docstatus": 0, "doctype": "DocType", "fields": [ @@ -16,7 +16,7 @@ "options": "Role", "permlevel": 0, "print_width": "200px", - "reqd": 0, + "reqd": 1, "search_index": 0, "width": "200px" } @@ -26,10 +26,11 @@ "idx": 1, "issingle": 0, "istable": 1, - "modified": "2013-12-20 19:21:54.000000", + "modified": "2014-06-17 06:56:28.816283", "modified_by": "Administrator", "module": "Core", "name": "UserRole", "owner": "Administrator", + "permissions": [], "read_only": 0 } \ No newline at end of file diff --git a/frappe/core/page/data_import_tool/importer.py b/frappe/core/page/data_import_tool/importer.py index 36034b01bf..2e8e0609e0 100644 --- a/frappe/core/page/data_import_tool/importer.py +++ b/frappe/core/page/data_import_tool/importer.py @@ -172,8 +172,12 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, overwrite = params.get('overwrite') # delete child rows (if parenttype) - if parenttype and overwrite: - delete_child_rows(data, doctype) + parentfield = None + if parenttype: + parentfield = get_parent_field(doctype, parenttype) + + if overwrite: + delete_child_rows(data, doctype) ret = [] error = False @@ -188,13 +192,12 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, doc = get_doc(row_idx) try: frappe.local.message_log = [] - if doc.get("parentfield"): - parent = frappe.get_doc(doc["parenttype"], doc["parentfield"]) - parent.append(doc) + if parentfield: + parent = frappe.get_doc(parenttype, doc["parent"]) + doc = parent.append(parentfield, doc) parent.save() ret.append('Inserted row for %s at #%s' % (getlink(parenttype, doc.parent), unicode(doc.idx))) - else: if overwrite and frappe.db.exists(doctype, doc["name"]): original = frappe.get_doc(doctype, doc["name"]) diff --git a/frappe/public/js/frappe/views/query_report.js b/frappe/public/js/frappe/views/query_report.js index 3575f5c07b..cdb3f67d19 100644 --- a/frappe/public/js/frappe/views/query_report.js +++ b/frappe/public/js/frappe/views/query_report.js @@ -142,8 +142,18 @@ frappe.views.QueryReport = Class.extend({ } if(df.get_query) f.get_query = df.get_query; + + // run report on change + f.$input.on("change", function() { + me.trigger_refresh(); + }); } }); + + // hide appframe form if no filters + var $filters = this.appframe.parent.find('.appframe-form .filters'); + this.appframe.parent.find('.appframe-form').toggle($filters.length ? true : false); + this.set_route_filters() this.set_filters_by_name(); }, @@ -175,10 +185,7 @@ frappe.views.QueryReport = Class.extend({ this.waiting = frappe.messages.waiting(this.wrapper.find(".waiting-area").empty().toggle(true), "Loading Report..."); this.wrapper.find(".results").toggle(false); - var filters = {}; - $.each(this.filters || [], function(i, f) { - filters[f.df.fieldname] = f.get_parsed_value(); - }) + var filters = this.get_values(true); return frappe.call({ method: "frappe.widgets.query_report.run", type: "GET", @@ -194,7 +201,23 @@ frappe.views.QueryReport = Class.extend({ return this.report_ajax; }, - get_values: function() { + trigger_refresh: function() { + var me = this; + var filters = me.get_values(); + + // check if required filters are not missing + var missing = false; + $.each(me.filters, function(k, _f) { + if (_f.df.reqd && !filters[_f.df.fieldname]) { + missing = true; + return; + } + }); + if (!missing) { + me.refresh(); + } + }, + get_values: function(raise) { var filters = {}; var mandatory_fields = []; $.each(this.filters || [], function(i, f) { @@ -203,7 +226,7 @@ frappe.views.QueryReport = Class.extend({ if(f.df.reqd && !v) mandatory_fields.push(f.df.label); if(v) filters[f.df.fieldname] = v; }) - if(mandatory_fields.length) { + if(raise && mandatory_fields.length) { frappe.throw(__("Mandatory filters required:\n") + __(mandatory_fields.join("\n"))); } return filters diff --git a/frappe/tests/test_data_import.py b/frappe/tests/test_data_import.py index e5cccc9789..7633a52621 100644 --- a/frappe/tests/test_data_import.py +++ b/frappe/tests/test_data_import.py @@ -46,6 +46,32 @@ class TestDataImport(unittest.TestCase): importer.upload(content, overwrite=True) self.assertTrue(frappe.db.get_value("Blog Category", "test-category", "title"), "New Title") + def test_import_only_children(self): + user_email = "test_import_userrole@example.com" + if frappe.db.exists("User", user_email): + frappe.delete_doc("User", user_email) + + frappe.get_doc({"doctype": "User", "email": user_email, "first_name": "Test Import UserRole"}).insert() + + exporter.get_template("UserRole", "User", all_doctypes="No", with_data="No") + content = read_csv_content(frappe.response.result) + content.append(["", "test_import_userrole@example.com", "Blogger"]) + importer.upload(content) + + user = frappe.get_doc("User", user_email) + self.assertEquals(len(user.get("user_roles")), 1) + self.assertTrue(user.get("user_roles")[0].role, "Blogger") + + # overwrite + exporter.get_template("UserRole", "User", all_doctypes="No", with_data="No") + content = read_csv_content(frappe.response.result) + content.append(["", "test_import_userrole@example.com", "Website Manager"]) + importer.upload(content, overwrite=True) + + user = frappe.get_doc("User", user_email) + self.assertEquals(len(user.get("user_roles")), 1) + self.assertTrue(user.get("user_roles")[0].role, "Website Manager") + def test_import_with_children(self): exporter.get_template("Event", all_doctypes="Yes", with_data="No") content = read_csv_content(frappe.response.result)