From e2d51c85894f7db7668b4075fd05755092f46c6d Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 21 Jun 2017 17:18:01 +0530 Subject: [PATCH 1/6] [multiple] frappe.permissions.add_permission, cleanup address and contact html --- frappe/contacts/doctype/address/address.json | 23 +++++- frappe/contacts/doctype/contact/contact.json | 82 ++++++++++++------- frappe/core/doctype/doctype/doctype.py | 16 +++- frappe/core/doctype/report/report.py | 5 +- .../permission_manager/permission_manager.py | 42 ++-------- frappe/desk/query_report.py | 6 +- frappe/permissions.py | 28 ++++++- frappe/public/css/form.css | 12 ++- frappe/public/js/frappe/ui/toolbar/toolbar.js | 13 +-- frappe/public/less/form.less | 13 ++- 10 files changed, 157 insertions(+), 83 deletions(-) diff --git a/frappe/contacts/doctype/address/address.json b/frappe/contacts/doctype/address/address.json index a3c8bd57d4..c3b655cec5 100644 --- a/frappe/contacts/doctype/address/address.json +++ b/frappe/contacts/doctype/address/address.json @@ -12,6 +12,7 @@ "editable_grid": 0, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -41,11 +42,12 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, - "description": "Name of person or organization that this address belongs to.", + "description": "", "fieldname": "address_title", "fieldtype": "Data", "hidden": 0, @@ -70,6 +72,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -99,6 +102,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -127,6 +131,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -155,6 +160,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -183,6 +189,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -212,6 +219,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -240,6 +248,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -269,6 +278,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -297,6 +307,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -325,6 +336,7 @@ "width": "50%" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -353,6 +365,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -381,6 +394,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -409,6 +423,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -439,6 +454,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -469,6 +485,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -498,6 +515,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -528,6 +546,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -569,7 +588,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-04-10 13:09:45.030542", + "modified": "2017-06-21 11:30:20.719590", "modified_by": "Administrator", "module": "Contacts", "name": "Address", diff --git a/frappe/contacts/doctype/contact/contact.json b/frappe/contacts/doctype/contact/contact.json index a9948e00d9..d40866b290 100644 --- a/frappe/contacts/doctype/contact/contact.json +++ b/frappe/contacts/doctype/contact/contact.json @@ -13,6 +13,7 @@ "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -42,36 +43,7 @@ "unique": 0 }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "salutation", - "fieldtype": "Link", - "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": "Salutation", - "length": 0, - "no_copy": 0, - "options": "Salutation", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "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, "bold": 0, "collapsible": 0, @@ -102,6 +74,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -132,6 +105,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -163,6 +137,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -193,6 +168,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -220,6 +196,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -250,6 +227,38 @@ "unique": 0 }, { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "salutation", + "fieldtype": "Link", + "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": "Salutation", + "length": 0, + "no_copy": 0, + "options": "Salutation", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "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, "bold": 0, "collapsible": 0, @@ -280,6 +289,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -310,6 +320,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -340,6 +351,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -369,6 +381,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -398,6 +411,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -430,6 +444,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -460,6 +475,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -489,6 +505,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -518,6 +535,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -547,6 +565,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -575,6 +594,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -615,7 +635,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-04-10 13:09:27.880530", + "modified": "2017-06-21 17:17:44.694188", "modified_by": "Administrator", "module": "Contacts", "name": "Contact", diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index ea7d87b986..60cf53ef22 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -623,10 +623,24 @@ def validate_permissions_for_doctype(doctype, for_remove=False): for perm in doctype.get("permissions"): perm.db_update() + clear_permissions_cache(doctype.name) + +def clear_permissions_cache(doctype): + frappe.clear_cache(doctype=doctype) + delete_notification_count_for(doctype) + for user in frappe.db.sql_list("""select + distinct `tabHas Role`.parent + from + `tabHas Role`, + tabDocPerm + where tabDocPerm.parent = %s + and tabDocPerm.role = `tabHas Role`.role""", doctype): + frappe.clear_cache(user=user) + def validate_permissions(doctype, for_remove=False): permissions = doctype.get("permissions") if not permissions: - frappe.throw(_('Enter at least one permission row'), frappe.MandatoryError) + frappe.msgprint(_('No Permissions Specified'), alert=True, indicator='orange') issingle = issubmittable = isimportable = False if doctype: issingle = cint(doctype.issingle) diff --git a/frappe/core/doctype/report/report.py b/frappe/core/doctype/report/report.py index 143a0cf6b9..c4b16002f8 100644 --- a/frappe/core/doctype/report/report.py +++ b/frappe/core/doctype/report/report.py @@ -39,6 +39,7 @@ class Report(Document): if self.report_type == "Report Builder": self.update_report_json() + def before_insert(self): self.set_doctype_roles() def on_update(self): @@ -48,8 +49,6 @@ class Report(Document): delete_custom_role('report', self.name) def set_doctype_roles(self): - if self.get('roles'): return - doc = frappe.get_meta(self.ref_doctype) roles = [{'role': d.role} for d in doc.permissions if d.permlevel==0] self.set('roles', roles) @@ -153,7 +152,7 @@ class Report(Document): for c in columns] out = out + [list(d) for d in result] - + if as_dict: data = [] for row in out: diff --git a/frappe/core/page/permission_manager/permission_manager.py b/frappe/core/page/permission_manager/permission_manager.py index 3f787a42fc..626bb1c20d 100644 --- a/frappe/core/page/permission_manager/permission_manager.py +++ b/frappe/core/page/permission_manager/permission_manager.py @@ -6,8 +6,10 @@ import frappe import frappe.defaults from frappe.modules.import_file import get_file_path, read_doc_from_file from frappe.translate import send_translations -from frappe.desk.notifications import delete_notification_count_for -from frappe.permissions import reset_perms, get_linked_doctypes, get_all_perms, setup_custom_perms +from frappe.permissions import (reset_perms, get_linked_doctypes, get_all_perms, + setup_custom_perms, add_permission) +from frappe.core.doctype.doctype.doctype import (clear_permissions_cache, + validate_permissions_for_doctype) from frappe import _ @frappe.whitelist() @@ -61,20 +63,7 @@ def get_permissions(doctype=None, role=None): @frappe.whitelist() def add(parent, role, permlevel): frappe.only_for("System Manager") - setup_custom_perms(parent) - - frappe.get_doc({ - "doctype":"Custom DocPerm", - "__islocal": 1, - "parent": parent, - "parenttype": "DocType", - "parentfield": "permissions", - "role": role, - "permlevel": permlevel, - "read": 1 - }).save() - - validate_and_reset(parent) + add_permission(parent, role, permlevel) @frappe.whitelist() def update(doctype, role, permlevel, ptype, value=None): @@ -88,7 +77,7 @@ def update(doctype, role, permlevel, ptype, value=None): frappe.db.sql("""update `tabCustom DocPerm` set `%s`=%s where name=%s"""\ % (frappe.db.escape(ptype), '%s', '%s'), (value, name)) - validate_and_reset(doctype) + validate_permissions_for_doctype(doctype) return out @@ -103,27 +92,14 @@ def remove(doctype, role, permlevel): if not frappe.get_all('Custom DocPerm', dict(parent=doctype)): frappe.throw(_('There must be atleast one permission rule.'), title=_('Cannot Remove')) - validate_and_reset(doctype, for_remove=True) - -def validate_and_reset(doctype, for_remove=False): - from frappe.core.doctype.doctype.doctype import validate_permissions_for_doctype - validate_permissions_for_doctype(doctype, for_remove) - clear_doctype_cache(doctype) + validate_permissions_for_doctype(doctype, for_remove=True) @frappe.whitelist() def reset(doctype): frappe.only_for("System Manager") reset_perms(doctype) - clear_doctype_cache(doctype) - -def clear_doctype_cache(doctype): - frappe.clear_cache(doctype=doctype) - delete_notification_count_for(doctype) - for user in frappe.db.sql_list("""select distinct `tabHas Role`.parent from `tabHas Role`, - tabDocPerm - where tabDocPerm.parent = %s - and tabDocPerm.role = `tabHas Role`.role""", doctype): - frappe.clear_cache(user=user) + clear_permissions_cache(doctype) + @frappe.whitelist() def get_users_with_role(role): diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 13a8659d4a..6f353388da 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -104,7 +104,7 @@ def run(report_name, filters=None, user=None): if cint(report.add_total_row) and result: result = add_total_row(result, columns) - + return { "result": result, "columns": columns, @@ -143,7 +143,7 @@ def export_query(): # add column headings for idx in range(len(data.columns)): result[0].append(columns[idx]["label"]) - + # build table from dict if isinstance(data.result[0], dict): for i,row in enumerate(data.result): @@ -379,4 +379,4 @@ def get_user_match_filters(doctypes, ref_doctype): if filter_list: match_filters[dt] = filter_list - return match_filters + return match_filters \ No newline at end of file diff --git a/frappe/permissions.py b/frappe/permissions.py index 22342d9811..13da62d366 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -330,7 +330,7 @@ def get_all_perms(role): '''Returns valid permissions for a given role''' perms = frappe.get_all('DocPerm', fields='*', filters=dict(role=role)) custom_perms = frappe.get_all('Custom DocPerm', fields='*', filters=dict(role=role)) - doctypes_with_custom_perms = frappe.db.sql_list("""select distinct parent + doctypes_with_custom_perms = frappe.db.sql_list("""select distinct parent from `tabCustom DocPerm`""") for p in perms: @@ -458,6 +458,31 @@ def setup_custom_perms(parent): copy_perms(parent) return True +def add_permission(doctype, role, permlevel=0): + '''Add a new permission rule to the given doctype + for the given Role and Permission Level''' + from frappe.core.doctype.doctype.doctype import validate_permissions_for_doctype + setup_custom_perms(doctype) + + if frappe.db.get_value('Custom DocPerm', dict(parent=doctype, role=role, + permlevel=permlevel)): + return + + custom_docperm = frappe.get_doc({ + "doctype":"Custom DocPerm", + "__islocal": 1, + "parent": doctype, + "parenttype": "DocType", + "parentfield": "permissions", + "role": role, + 'read': 1, + "permlevel": permlevel, + }) + + custom_docperm.save() + + validate_permissions_for_doctype(doctype) + def copy_perms(parent): '''Copy all DocPerm in to Custom DocPerm for the given document''' for d in frappe.get_all('DocPerm', fields='*', filters=dict(parent=parent)): @@ -480,3 +505,4 @@ def get_linked_doctypes(dt): "options": ("!=", "[Select]") }) ])) + diff --git a/frappe/public/css/form.css b/frappe/public/css/form.css index 64d2056de9..1272485515 100644 --- a/frappe/public/css/form.css +++ b/frappe/public/css/form.css @@ -223,6 +223,14 @@ h6.uppercase, .badge-important { background-color: #e74c3c; } +.address-box { + background-color: #fafbfc; + padding: 0px 15px; + margin: 15px 0px; + border: 1px solid #d1d8dd; + border-radius: 3px; + font-size: 12px; +} .timeline { margin: 30px 0px; } @@ -272,7 +280,7 @@ h6.uppercase, } .timeline-item.user-content .media-body { border: 1px solid #d1d8dd; - border-radius: 2px; + border-radius: 3px; margin-left: -7px; position: relative; overflow: visible; @@ -386,7 +394,7 @@ h6.uppercase, .timeline-head { background-color: white; border: 1px solid #d1d8dd; - border-radius: 2px; + border-radius: 3px; position: relative; z-index: 1; } diff --git a/frappe/public/js/frappe/ui/toolbar/toolbar.js b/frappe/public/js/frappe/ui/toolbar/toolbar.js index 24fe005afb..41a22ccd8c 100644 --- a/frappe/public/js/frappe/ui/toolbar/toolbar.js +++ b/frappe/public/js/frappe/ui/toolbar/toolbar.js @@ -218,12 +218,15 @@ $.extend(frappe.ui.toolbar, { frappe.ui.toolbar.clear_cache = function() { frappe.assets.clear_local_storage(); - $c('frappe.sessions.clear',{},function(r,rt){ - if(!r.exc) { - frappe.show_alert(r.message); - location.reload(true); + frappe.call({ + method: 'frappe.sessions.clear', + callback: function(r) { + if(!r.exc) { + frappe.show_alert({message:r.message, indicator:'green'}); + location.reload(true); + } } - }); + }) return false; } diff --git a/frappe/public/less/form.less b/frappe/public/less/form.less index 033addb629..036790d9a2 100644 --- a/frappe/public/less/form.less +++ b/frappe/public/less/form.less @@ -293,6 +293,15 @@ h6.uppercase, .h6.uppercase { background-color: #e74c3c; } +.address-box { + background-color: @light-bg; + padding: 0px 15px; + margin: 15px 0px; + border: 1px solid @border-color; + border-radius: 3px; + font-size: 12px; +} + .timeline { margin: 30px 0px; @@ -356,7 +365,7 @@ h6.uppercase, .h6.uppercase { .media-body { border: 1px solid @border-color; - border-radius: 2px; + border-radius: 3px; margin-left: -7px; position: relative; @@ -502,7 +511,7 @@ h6.uppercase, .h6.uppercase { background-color: white; // padding: 15px 30px; border: 1px solid @border-color; - border-radius: 2px; + border-radius: 3px; position: relative; z-index: 1; From d12adda22f1f4dcc1758c525428dc7fd39d337f8 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 21 Jun 2017 18:27:17 +0530 Subject: [PATCH 2/6] [minor] move todo report to correct module, desk --- frappe/core/report/todo/__init__.py | 3 --- frappe/core/report/todo/todo.js | 8 ------- frappe/core/report/todo/todo.json | 23 ------------------- frappe/core/report/todo/todo.py | 35 ----------------------------- frappe/patches.txt | 3 ++- 5 files changed, 2 insertions(+), 70 deletions(-) delete mode 100644 frappe/core/report/todo/__init__.py delete mode 100644 frappe/core/report/todo/todo.js delete mode 100644 frappe/core/report/todo/todo.json delete mode 100644 frappe/core/report/todo/todo.py diff --git a/frappe/core/report/todo/__init__.py b/frappe/core/report/todo/__init__.py deleted file mode 100644 index 0e57cb68c3..0000000000 --- a/frappe/core/report/todo/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# MIT License. See license.txt - diff --git a/frappe/core/report/todo/todo.js b/frappe/core/report/todo/todo.js deleted file mode 100644 index 805991cc40..0000000000 --- a/frappe/core/report/todo/todo.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2016, Frappe Technologies and contributors -// For license information, please see license.txt - -frappe.query_reports["ToDo"] = { - "filters": [ - - ] -} diff --git a/frappe/core/report/todo/todo.json b/frappe/core/report/todo/todo.json deleted file mode 100644 index 18ff072c23..0000000000 --- a/frappe/core/report/todo/todo.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "add_total_row": 0, - "apply_user_permissions": 1, - "creation": "2013-02-25 14:26:30", - "disabled": 0, - "docstatus": 0, - "doctype": "Report", - "idx": 3, - "is_standard": "Yes", - "modified": "2017-02-24 20:13:12.217943", - "modified_by": "Administrator", - "module": "Core", - "name": "ToDo", - "owner": "Administrator", - "ref_doctype": "ToDo", - "report_name": "ToDo", - "report_type": "Script Report", - "roles": [ - { - "role": "System Manager" - } - ] -} \ No newline at end of file diff --git a/frappe/core/report/todo/todo.py b/frappe/core/report/todo/todo.py deleted file mode 100644 index 8757c05d05..0000000000 --- a/frappe/core/report/todo/todo.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# MIT License. See license.txt - -from __future__ import unicode_literals -import frappe -from frappe import _ -from frappe.utils import getdate - -def execute(filters=None): - priority_map = {"High": 3, "Medium": 2, "Low": 1} - - todo_list = frappe.get_list('ToDo', fields=["name", "date", "description", - "priority", "reference_type", "reference_name", "assigned_by", "owner"], - filters={'status': 'Open'}) - - todo_list.sort(key=lambda todo: (priority_map.get(todo.priority, 0), - todo.date and getdate(todo.date) or getdate("1900-01-01")), reverse=True) - - columns = [_("ID")+":Link/ToDo:90", _("Priority")+"::60", _("Date")+ ":Date", - _("Description")+"::150", _("Assigned To/Owner") + ":Data:120", - _("Assigned By")+":Data:120", _("Reference")+"::200"] - - result = [] - for todo in todo_list: - if todo.owner==frappe.session.user or todo.assigned_by==frappe.session.user: - if todo.reference_type: - todo.reference = """%s: %s""" % (todo.reference_type, - todo.reference_name, todo.reference_type, todo.reference_name) - else: - todo.reference = None - result.append([todo.name, todo.priority, todo.date, todo.description, - todo.owner, todo.assigned_by, todo.reference]) - - return columns, result - diff --git a/frappe/patches.txt b/frappe/patches.txt index 9fb0206557..74ffc5315c 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -183,4 +183,5 @@ frappe.patches.v8_0.set_currency_field_precision # 2017-05-09 frappe.patches.v8_0.rename_print_to_printing frappe.patches.v7_1.disabled_print_settings_for_custom_print_format frappe.patches.v8_0.update_desktop_icons -frappe.patches.v8_0.update_gender_and_salutation \ No newline at end of file +frappe.patches.v8_0.update_gender_and_salutation +execute:frappe.db.sql('update tabReport set module="Desk" where name="ToDo"') \ No newline at end of file From 9435f9348146b08699f0eb5aa1a6645b70d946a9 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 21 Jun 2017 18:28:08 +0530 Subject: [PATCH 3/6] [minor] move todo report to correct module, desk --- frappe/desk/report/__init__.py | 0 frappe/desk/report/todo/__init__.py | 0 frappe/desk/report/todo/todo.js | 9 ++++++++ frappe/desk/report/todo/todo.json | 23 +++++++++++++++++++ frappe/desk/report/todo/todo.py | 34 +++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+) create mode 100644 frappe/desk/report/__init__.py create mode 100644 frappe/desk/report/todo/__init__.py create mode 100644 frappe/desk/report/todo/todo.js create mode 100644 frappe/desk/report/todo/todo.json create mode 100644 frappe/desk/report/todo/todo.py diff --git a/frappe/desk/report/__init__.py b/frappe/desk/report/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/desk/report/todo/__init__.py b/frappe/desk/report/todo/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/desk/report/todo/todo.js b/frappe/desk/report/todo/todo.js new file mode 100644 index 0000000000..bb2e0f7846 --- /dev/null +++ b/frappe/desk/report/todo/todo.js @@ -0,0 +1,9 @@ +// Copyright (c) 2016, Frappe Technologies and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.query_reports["ToDo"] = { + "filters": [ + + ] +} diff --git a/frappe/desk/report/todo/todo.json b/frappe/desk/report/todo/todo.json new file mode 100644 index 0000000000..b42c4c9c67 --- /dev/null +++ b/frappe/desk/report/todo/todo.json @@ -0,0 +1,23 @@ +{ + "add_total_row": 0, + "apply_user_permissions": 1, + "creation": "2013-02-25 14:26:30", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 3, + "is_standard": "Yes", + "modified": "2017-06-21 18:18:50.748793", + "modified_by": "Administrator", + "module": "Desk", + "name": "ToDo", + "owner": "Administrator", + "ref_doctype": "ToDo", + "report_name": "ToDo", + "report_type": "Script Report", + "roles": [ + { + "role": "System Manager" + } + ] +} \ No newline at end of file diff --git a/frappe/desk/report/todo/todo.py b/frappe/desk/report/todo/todo.py new file mode 100644 index 0000000000..a51d44fe08 --- /dev/null +++ b/frappe/desk/report/todo/todo.py @@ -0,0 +1,34 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# MIT License. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from frappe.utils import getdate + +def execute(filters=None): + priority_map = {"High": 3, "Medium": 2, "Low": 1} + + todo_list = frappe.get_list('ToDo', fields=["name", "date", "description", + "priority", "reference_type", "reference_name", "assigned_by", "owner"], + filters={'status': 'Open'}) + + todo_list.sort(key=lambda todo: (priority_map.get(todo.priority, 0), + todo.date and getdate(todo.date) or getdate("1900-01-01")), reverse=True) + + columns = [_("ID")+":Link/ToDo:90", _("Priority")+"::60", _("Date")+ ":Date", + _("Description")+"::150", _("Assigned To/Owner") + ":Data:120", + _("Assigned By")+":Data:120", _("Reference")+"::200"] + + result = [] + for todo in todo_list: + if todo.owner==frappe.session.user or todo.assigned_by==frappe.session.user: + if todo.reference_type: + todo.reference = """%s: %s""" % (todo.reference_type, + todo.reference_name, todo.reference_type, todo.reference_name) + else: + todo.reference = None + result.append([todo.name, todo.priority, todo.date, todo.description, + todo.owner, todo.assigned_by, todo.reference]) + + return columns, result \ No newline at end of file From 1c87ab51720229aefebb980c75a8c47cb836bbe4 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 21 Jun 2017 18:39:13 +0530 Subject: [PATCH 4/6] [fix] test_report.py --- frappe/core/doctype/report/report.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/core/doctype/report/report.py b/frappe/core/doctype/report/report.py index c4b16002f8..c5fa61dfdf 100644 --- a/frappe/core/doctype/report/report.py +++ b/frappe/core/doctype/report/report.py @@ -49,9 +49,10 @@ class Report(Document): delete_custom_role('report', self.name) def set_doctype_roles(self): - doc = frappe.get_meta(self.ref_doctype) - roles = [{'role': d.role} for d in doc.permissions if d.permlevel==0] - self.set('roles', roles) + if not self.roles: + meta = frappe.get_meta(self.ref_doctype) + roles = [{'role': d.role} for d in meta.permissions if d.permlevel==0] + self.set('roles', roles) def is_permitted(self): """Returns true if Has Role is not set or the user is allowed.""" From 6a725d6c953c893ee4f12839b145edcb0c7235bd Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 22 Jun 2017 16:26:08 +0530 Subject: [PATCH 5/6] [cleanups] --- frappe/core/doctype/custom_role/custom_role.py | 4 +++- frappe/core/doctype/report/report.py | 2 +- .../custom/doctype/custom_field/custom_field.py | 3 ++- frappe/desk/page/setup_wizard/setup_wizard.py | 5 +++++ frappe/desk/query_report.py | 3 ++- frappe/model/utils/__init__.py | 17 +++++++++++++++++ frappe/model/utils/user_settings.py | 2 +- 7 files changed, 31 insertions(+), 5 deletions(-) diff --git a/frappe/core/doctype/custom_role/custom_role.py b/frappe/core/doctype/custom_role/custom_role.py index 2e183bc205..25257e1a23 100644 --- a/frappe/core/doctype/custom_role/custom_role.py +++ b/frappe/core/doctype/custom_role/custom_role.py @@ -7,7 +7,9 @@ import frappe from frappe.model.document import Document class CustomRole(Document): - pass + def validate(self): + if self.report and not self.ref_doctype: + self.ref_doctype = frappe.db.get_value('Report', self.report, 'ref_doctype') def get_custom_allowed_roles(field, name): allowed_roles = [] diff --git a/frappe/core/doctype/report/report.py b/frappe/core/doctype/report/report.py index c5fa61dfdf..6151890183 100644 --- a/frappe/core/doctype/report/report.py +++ b/frappe/core/doctype/report/report.py @@ -49,7 +49,7 @@ class Report(Document): delete_custom_role('report', self.name) def set_doctype_roles(self): - if not self.roles: + if not self.get('roles'): meta = frappe.get_meta(self.ref_doctype) roles = [{'role': d.role} for d in meta.permissions if d.permlevel==0] self.set('roles', roles) diff --git a/frappe/custom/doctype/custom_field/custom_field.py b/frappe/custom/doctype/custom_field/custom_field.py index 7265cee8a6..57ea7a2b0b 100644 --- a/frappe/custom/doctype/custom_field/custom_field.py +++ b/frappe/custom/doctype/custom_field/custom_field.py @@ -73,7 +73,8 @@ class CustomField(Document): @frappe.whitelist() def get_fields_label(doctype=None): - return [{"value": df.fieldname or "", "label": _(df.label or "")} for df in frappe.get_meta(doctype).get("fields")] + return [{"value": df.fieldname or "", "label": _(df.label or "")} + for df in frappe.get_meta(doctype).get("fields")] def create_custom_field_if_values_exist(doctype, df): df = frappe._dict(df) diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index dcc9e2bcd8..9a11894ce0 100755 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -86,6 +86,11 @@ def update_user_name(args): first_name, last_name = first_name.split(' ', 1) if args.get("email"): + if frappe.db.exists('User', args.get('email')): + # running again + return + + args['name'] = args.get("email") _mute_emails, frappe.flags.mute_emails = frappe.flags.mute_emails, True diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 6f353388da..6b74bcc80f 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -9,6 +9,7 @@ import os, json from frappe import _ from frappe.modules import scrub, get_module_path from frappe.utils import flt, cint, get_html_format, cstr +from frappe.model.utils import render_include from frappe.translate import send_translations import frappe.desk.reportview from frappe.permissions import get_role_permissions @@ -55,7 +56,7 @@ def get_script(report_name): send_translations(frappe.get_lang_dict("report", report_name)) return { - "script": script, + "script": render_include(script), "html_format": html_format } diff --git a/frappe/model/utils/__init__.py b/frappe/model/utils/__init__.py index 217ad47a54..c795ae2159 100644 --- a/frappe/model/utils/__init__.py +++ b/frappe/model/utils/__init__.py @@ -61,3 +61,20 @@ def render_include(content): break return content + +def get_fetch_values(doctype, fieldname, value): + '''Returns fetch value dict for the given object + + :param doctype: Target doctype + :param fieldname: Link fieldname selected + :param value: Value selected + ''' + out = {} + meta = frappe.get_meta(doctype) + link_df = meta.get_field(fieldname) + for df in meta.get_fields_to_fetch(fieldname): + # example shipping_address.gistin + link_field, source_fieldname = df.options.split('.', 1) + out[df.fieldname] = frappe.db.get_value(link_df.options, value, source_fieldname) + + return out diff --git a/frappe/model/utils/user_settings.py b/frappe/model/utils/user_settings.py index 86498fc507..1034334049 100644 --- a/frappe/model/utils/user_settings.py +++ b/frappe/model/utils/user_settings.py @@ -16,7 +16,7 @@ def get_user_settings(doctype, for_update=False): if not for_update: update_user_settings(doctype, user_settings, True) - + return user_settings or '{}' def update_user_settings(doctype, user_settings, for_update=False): From 0c19319788e6f86bd6469a2b67a3c743db5d73f7 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 22 Jun 2017 18:16:10 +0530 Subject: [PATCH 6/6] [minor] correct flag setting --- frappe/model/document.py | 1 - frappe/modules/import_file.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index 74f6ab0680..3e8db22802 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -4,7 +4,6 @@ from __future__ import unicode_literals, print_function import frappe import time -import redis from frappe import _, msgprint from frappe.utils import flt, cstr, now, get_datetime_str, file_lock from frappe.utils.background_jobs import enqueue diff --git a/frappe/modules/import_file.py b/frappe/modules/import_file.py index 5f7c04c7f5..57c671b407 100644 --- a/frappe/modules/import_file.py +++ b/frappe/modules/import_file.py @@ -34,7 +34,6 @@ def get_file_path(module, dt, dn): def import_file_by_path(path, force=False, data_import=False, pre_process=None, ignore_version=None, reset_permissions=False): - frappe.flags.in_import = True try: docs = read_doc_from_file(path) except IOError: @@ -54,8 +53,10 @@ def import_file_by_path(path, force=False, data_import=False, pre_process=None, original_modified = doc.get("modified") + frappe.flags.in_import = True import_doc(doc, force=force, data_import=data_import, pre_process=pre_process, ignore_version=ignore_version, reset_permissions=reset_permissions) + frappe.flags.in_import = False if original_modified: # since there is a new timestamp on the file, update timestamp in @@ -67,7 +68,6 @@ def import_file_by_path(path, force=False, data_import=False, pre_process=None, (doc['doctype'], '%s', '%s'), (original_modified, doc['name'])) - frappe.flags.in_import = False return True def read_doc_from_file(path):