diff --git a/frappe/__init__.py b/frappe/__init__.py
index 21a90069c5..9721ed9b08 100644
--- a/frappe/__init__.py
+++ b/frappe/__init__.py
@@ -23,7 +23,7 @@ if sys.version[0] == '2':
reload(sys)
sys.setdefaultencoding("utf-8")
-__version__ = '11.1.21'
+__version__ = '11.1.36'
__title__ = "Frappe Framework"
local = Local()
diff --git a/frappe/core/doctype/doctype/test_doctype.py b/frappe/core/doctype/doctype/test_doctype.py
index fb54fe9732..07a42e73a1 100644
--- a/frappe/core/doctype/doctype/test_doctype.py
+++ b/frappe/core/doctype/doctype/test_doctype.py
@@ -6,7 +6,7 @@ from __future__ import unicode_literals
import frappe
import unittest
from frappe.core.doctype.doctype.doctype import UniqueFieldnameError, IllegalMandatoryError, DoctypeLinkError, WrongOptionsDoctypeLinkError,\
- HiddenAndMandatoryWithoutDefaultError, CannotIndexedError, InvalidFieldNameError
+ HiddenAndMandatoryWithoutDefaultError, CannotIndexedError, InvalidFieldNameError, CannotCreateStandardDoctypeError
# test_records = frappe.get_test_records('DocType')
diff --git a/frappe/core/doctype/report/report.json b/frappe/core/doctype/report/report.json
index d3e23b3115..339b6c5d4c 100644
--- a/frappe/core/doctype/report/report.json
+++ b/frappe/core/doctype/report/report.json
@@ -1,777 +1,777 @@
{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "field:report_name",
- "beta": 0,
- "creation": "2013-03-09 15:45:57",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "System",
- "editable_grid": 0,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "report_name",
- "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": "Report Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
+ "allow_copy": 0,
+ "allow_events_in_timeline": 0,
+ "allow_guest_to_view": 0,
+ "allow_import": 0,
+ "allow_rename": 0,
+ "autoname": "field:report_name",
+ "beta": 0,
+ "creation": "2013-03-09 15:45:57",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "System",
+ "editable_grid": 0,
+ "engine": "InnoDB",
+ "fields": [
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "report_name",
+ "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": "Report Name",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 1
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "ref_doctype",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 1,
+ "label": "Ref DocType",
+ "length": 0,
+ "no_copy": 0,
+ "options": "DocType",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "reference_report",
+ "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": "Reference Report",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "is_standard",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 1,
+ "label": "Is Standard",
+ "length": 0,
+ "no_copy": 0,
+ "options": "No\nYes",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "module",
+ "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": "Module",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Module Def",
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "add_total_row",
+ "fieldtype": "Check",
+ "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": "Add Total Row",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "column_break_4",
+ "fieldtype": "Column Break",
+ "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,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "report_type",
+ "fieldtype": "Select",
+ "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": "Report Type",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Report Builder\nQuery Report\nScript Report\nCustom Report",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "disabled",
+ "fieldtype": "Check",
+ "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": "Disabled",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "icon",
+ "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": "Icon",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "color",
+ "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": "Color",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "eval: doc.is_standard == \"No\"",
+ "fetch_if_empty": 0,
+ "fieldname": "letter_head",
+ "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": "Letter Head",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Letter Head",
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "section_break_6",
+ "fieldtype": "Section Break",
+ "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,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "eval:doc.report_type==\"Query Report\"",
+ "fetch_if_empty": 0,
+ "fieldname": "query",
+ "fieldtype": "Code",
+ "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": "Query",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "",
+ "description": "JavaScript Format: frappe.query_reports['REPORTNAME'] = {}",
+ "fetch_if_empty": 0,
+ "fieldname": "javascript",
+ "fieldtype": "Code",
+ "hidden": 1,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Javascript",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "eval:doc.report_type==\"Report Builder\" || \"Custom Report\"",
+ "fetch_if_empty": 0,
+ "fieldname": "json",
+ "fieldtype": "Code",
+ "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": "JSON",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "permission_rules",
+ "fieldtype": "Section Break",
+ "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": "",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "eval:doc.is_standard == 'Yes'",
+ "fetch_if_empty": 0,
+ "fieldname": "roles",
+ "fieldtype": "Table",
+ "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": "Roles",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Has Role",
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "disable_prepared_report",
+ "fieldtype": "Check",
+ "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": "Disable Prepared Report",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "prepared_report",
+ "fieldtype": "Check",
+ "hidden": 1,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Prepared Report",
+ "length": 0,
+ "no_copy": 0,
+ "options": "",
+ "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,
+ "translatable": 0,
+ "unique": 0
+ }
+ ],
+ "has_web_view": 0,
+ "hide_toolbar": 0,
+ "icon": "",
+ "idx": 1,
+ "in_create": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 0,
+ "max_attachments": 0,
+ "modified": "2019-04-12 15:53:14.194591",
+ "modified_by": "Administrator",
+ "module": "Core",
+ "name": "Report",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Administrator",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 1
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 1
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Report Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 1
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "All",
+ "set_user_permissions": 0,
+ "share": 0,
+ "submit": 0,
+ "write": 0
+ }
+ ],
+ "quick_entry": 0,
"read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 1
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "ref_doctype",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Ref DocType",
- "length": 0,
- "no_copy": 0,
- "options": "DocType",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "reference_report",
- "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": "Reference Report",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "is_standard",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Is Standard",
- "length": 0,
- "no_copy": 0,
- "options": "No\nYes",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "module",
- "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": "Module",
- "length": 0,
- "no_copy": 0,
- "options": "Module Def",
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "add_total_row",
- "fieldtype": "Check",
- "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": "Add Total Row",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "column_break_4",
- "fieldtype": "Column Break",
- "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,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "report_type",
- "fieldtype": "Select",
- "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": "Report Type",
- "length": 0,
- "no_copy": 0,
- "options": "Report Builder\nQuery Report\nScript Report\nCustom Report",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "disabled",
- "fieldtype": "Check",
- "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": "Disabled",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "icon",
- "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": "Icon",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "color",
- "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": "Color",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval: doc.is_standard == \"No\"",
- "fetch_if_empty": 0,
- "fieldname": "letter_head",
- "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": "Letter Head",
- "length": 0,
- "no_copy": 0,
- "options": "Letter Head",
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "section_break_6",
- "fieldtype": "Section Break",
- "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,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:doc.report_type==\"Query Report\"",
- "fetch_if_empty": 0,
- "fieldname": "query",
- "fieldtype": "Code",
- "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": "Query",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "",
- "description": "JavaScript Format: frappe.query_reports['REPORTNAME'] = {}",
- "fetch_if_empty": 0,
- "fieldname": "javascript",
- "fieldtype": "Code",
- "hidden": 1,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Javascript",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:doc.report_type==\"Report Builder\" || \"Custom Report\"",
- "fetch_if_empty": 0,
- "fieldname": "json",
- "fieldtype": "Code",
- "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": "JSON",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "permission_rules",
- "fieldtype": "Section Break",
- "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": "",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:doc.is_standard == 'Yes'",
- "fetch_if_empty": 0,
- "fieldname": "roles",
- "fieldtype": "Table",
- "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": "Roles",
- "length": 0,
- "no_copy": 0,
- "options": "Has Role",
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "disable_prepared_report",
- "fieldtype": "Check",
- "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": "Disable Prepared Report",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "prepared_report",
- "fieldtype": "Check",
- "hidden": 1,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Prepared Report",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "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,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_toolbar": 0,
- "icon": "",
- "idx": 1,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2019-04-12 15:53:14.194591",
- "modified_by": "Administrator",
- "module": "Core",
- "name": "Report",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Administrator",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- },
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "System Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- },
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Report Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- },
- {
- "amend": 0,
- "cancel": 0,
- "create": 0,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "All",
- "set_user_permissions": 0,
- "share": 0,
- "submit": 0,
- "write": 0
- }
- ],
- "quick_entry": 0,
- "read_only": 0,
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
+ "show_name_in_global_search": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1,
+ "track_seen": 0,
+ "track_views": 0
+ }
\ No newline at end of file
diff --git a/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.js b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.js
index fa807792fa..8a121f31ae 100644
--- a/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.js
+++ b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.js
@@ -9,16 +9,22 @@ frappe.ui.form.on('Role Permission for Page and Report', {
refresh: function(frm) {
frm.disable_save();
frm.role_area.hide();
-
- frm.add_custom_button(__("Reset to defaults"), function() {
- frm.trigger("reset_roles");
- });
-
- frm.add_custom_button(__("Update"), function() {
- frm.trigger("update_report_page_data");
- }).addClass('btn-primary');
+ frm.events.add_custom_buttons(frm);
},
-
+
+ add_custom_buttons: function(frm) {
+ frm.clear_custom_buttons();
+ if(frm.doc.set_role_for && frm.doc[frappe.model.scrub(frm.doc.set_role_for)]) {
+ frm.add_custom_button(__("Reset to defaults"), function() {
+ frm.trigger("reset_roles");
+ });
+
+ frm.add_custom_button(__("Update"), function() {
+ frm.trigger("update_report_page_data");
+ }).addClass('btn-primary');
+ }
+ },
+
onload: function(frm) {
if(!frm.roles_editor) {
frm.role_area = $('
')
@@ -48,14 +54,20 @@ frappe.ui.form.on('Role Permission for Page and Report', {
},
page: function(frm) {
+ frm.events.add_custom_buttons(frm);
if(frm.doc.page) {
frm.trigger("set_report_page_data");
+ } else {
+ frm.trigger("set_role_for");
}
},
report: function(frm){
+ frm.events.add_custom_buttons(frm);
if(frm.doc.report) {
frm.trigger("set_report_page_data");
+ } else {
+ frm.trigger("set_role_for");
}
},
@@ -107,7 +119,7 @@ frappe.ui.form.on('Role Permission for Page and Report', {
if(!frm.doc.set_role_for){
frappe.throw(__("Mandatory field: set role for"))
}
-
+
if(frm.doc.set_role_for && !frm.doc[frm.doc.set_role_for.toLocaleLowerCase()]) {
frappe.throw(__("Mandatory field: {0}", [frm.doc.set_role_for]))
}
diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py
index 5b6e6c27a8..83008efd01 100644
--- a/frappe/core/doctype/user/user.py
+++ b/frappe/core/doctype/user/user.py
@@ -96,7 +96,7 @@ class User(Document):
clear_notifications(user=self.name)
frappe.clear_cache(user=self.name)
self.send_password_notification(self.__new_password)
- create_contact(self)
+ create_contact(self, ignore_mandatory=True)
if self.name not in ('Administrator', 'Guest') and not self.user_image:
frappe.enqueue('frappe.core.doctype.user.user.update_gravatar', name=self.name)
diff --git a/frappe/core/doctype/user_permission/test_user_permission.py b/frappe/core/doctype/user_permission/test_user_permission.py
index 8731954556..870d3c7029 100644
--- a/frappe/core/doctype/user_permission/test_user_permission.py
+++ b/frappe/core/doctype/user_permission/test_user_permission.py
@@ -68,7 +68,7 @@ class TestUserPermission(unittest.TestCase):
def test_for_apply_to_all_on_update_from_applicable(self):
''' Update User Permission from some to all applicable Doctypes'''
user = create_user('test_bulk_creation_update@example.com')
- param = get_params(user, 'User', user.name,)
+ param = get_params(user, 'User', user.name)
# create User permissions that with applicable
is_created = add_user_permissions(get_params(user, 'User', user.name, applicable = ["Chat Room", "Chat Message"]))
@@ -88,7 +88,6 @@ class TestUserPermission(unittest.TestCase):
self.assertIsNone(removed_applicable_second)
self.assertEquals(is_created, 1)
-
def create_user(email):
''' create user with role system manager '''
if frappe.db.exists('User', email):
diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py
index 800ce0d462..78ee82efcb 100644
--- a/frappe/custom/doctype/customize_form/customize_form.py
+++ b/frappe/custom/doctype/customize_form/customize_form.py
@@ -151,6 +151,7 @@ class CustomizeForm(Document):
return
self.flags.update_db = False
+ self.flags.rebuild_doctype_for_global_search = False
self.set_property_setters()
self.update_custom_fields()
@@ -165,6 +166,10 @@ class CustomizeForm(Document):
frappe.clear_cache(doctype=self.doc_type)
self.fetch_to_customize()
+ if self.flags.rebuild_doctype_for_global_search:
+ frappe.enqueue('frappe.utils.global_search.rebuild_for_doctype',
+ now=True, doctype=self.doc_type)
+
def set_property_setters(self):
meta = frappe.get_meta(self.doc_type)
# doctype property setters
@@ -225,6 +230,10 @@ class CustomizeForm(Document):
frappe.msgprint(_("You can't set 'Translatable' for field {0}").format(df.label))
continue
+ elif (property == 'in_global_search' and
+ df.in_global_search != meta_df[0].get("in_global_search")):
+ self.flags.rebuild_doctype_for_global_search = True
+
self.make_property_setter(property=property, value=df.get(property),
property_type=docfield_properties[property], fieldname=df.fieldname)
diff --git a/frappe/data_migration/doctype/data_migration_connector/connectors/calendar_connector.py b/frappe/data_migration/doctype/data_migration_connector/connectors/calendar_connector.py
index ec62c69e72..578ac0fc37 100644
--- a/frappe/data_migration/doctype/data_migration_connector/connectors/calendar_connector.py
+++ b/frappe/data_migration/doctype/data_migration_connector/connectors/calendar_connector.py
@@ -7,6 +7,7 @@ from googleapiclient.errors import HttpError
import time
from datetime import datetime
from frappe.utils import add_days, add_years
+from frappe.desk.doctype.event.event import has_permission
class CalendarConnector(BaseConnection):
def __init__(self, connector):
@@ -64,24 +65,21 @@ class CalendarConnector(BaseConnection):
def insert(self, doctype, doc):
if doctype == 'Events':
- from frappe.desk.doctype.event.event import has_permission
d = frappe.get_doc("Event", doc["name"])
if has_permission(d, self.account.name):
- if doc["start_datetime"] >= datetime.now():
- try:
- doctype = "Event"
- e = self.insert_events(doctype, doc)
- return e
- except Exception:
- frappe.log_error(frappe.get_traceback(), "GCalendar Synchronization Error")
+ try:
+ doctype = "Event"
+ e = self.insert_events(doctype, doc)
+ return e
+ except Exception:
+ frappe.log_error(frappe.get_traceback(), "GCalendar Synchronization Error")
def update(self, doctype, doc, migration_id):
if doctype == 'Events':
- from frappe.desk.doctype.event.event import has_permission
d = frappe.get_doc("Event", doc["name"])
if has_permission(d, self.account.name):
- if doc["start_datetime"] >= datetime.now() and migration_id is not None:
+ if migration_id is not None:
try:
doctype = "Event"
return self.update_events(doctype, doc, migration_id)
@@ -217,23 +215,23 @@ class CalendarConnector(BaseConnection):
day = []
if e.repeat_on == "Every Day":
- if e.monday is not None:
+ if e.monday == 1:
day.append("MO")
- if e.tuesday is not None:
+ if e.tuesday == 1:
day.append("TU")
- if e.wednesday is not None:
+ if e.wednesday == 1:
day.append("WE")
- if e.thursday is not None:
+ if e.thursday == 1:
day.append("TH")
- if e.friday is not None:
+ if e.friday == 1:
day.append("FR")
- if e.saturday is not None:
+ if e.saturday == 1:
day.append("SA")
- if e.sunday is not None:
+ if e.sunday == 1:
day.append("SU")
day = "BYDAY=" + ",".join(str(d) for d in day)
- frequency = "FREQ=DAILY"
+ frequency = "FREQ=WEEKLY"
elif e.repeat_on == "Every Week":
frequency = "FREQ=WEEKLY"
diff --git a/frappe/data_migration/doctype/data_migration_run/data_migration_run.py b/frappe/data_migration/doctype/data_migration_run/data_migration_run.py
index 55e7dbe818..93c0d8254d 100644
--- a/frappe/data_migration/doctype/data_migration_run/data_migration_run.py
+++ b/frappe/data_migration/doctype/data_migration_run/data_migration_run.py
@@ -6,7 +6,7 @@ from __future__ import unicode_literals
import frappe, json, math
from frappe.model.document import Document
from frappe import _
-from frappe.utils import get_source_value
+from frappe.utils import get_source_value, cstr
class DataMigrationRun(Document):
def run(self):
@@ -213,19 +213,19 @@ class DataMigrationRun(Document):
def get_deleted_local_data(self):
'''Fetch local deleted data using `frappe.get_all`. Used during Push'''
mapping = self.get_mapping(self.current_mapping)
- or_filters = self.get_or_filters(mapping)
- filters = dict(
- deleted_doctype=mapping.local_doctype
- )
+ filters = self.get_last_modified_condition()
+ filters.update({
+ "deleted_doctype": mapping.local_doctype
+ })
- data = frappe.get_all('Deleted Document', fields=['data'],
- filters=filters, or_filters=or_filters)
+ data = frappe.get_all('Deleted Document', fields=['name', 'data'],
+ filters=filters)
_data = []
for d in data:
doc = json.loads(d.data)
if doc.get(mapping.migration_id_field):
- doc['_deleted_document_name'] = d.name
+ doc['_deleted_document_name'] = d["name"]
_data.append(doc)
return _data
@@ -306,8 +306,8 @@ class DataMigrationRun(Document):
self.update_log('push_insert', 1)
# post process after insert
self.post_process_doc(local_doc=d, remote_doc=response_doc)
- except Exception:
- self.update_log('push_failed', d.name)
+ except Exception as e:
+ self.update_log('push_failed', {d.name: cstr(e)})
# update page_start
self.db_set('current_mapping_start',
@@ -338,8 +338,8 @@ class DataMigrationRun(Document):
self.update_log('push_update', 1)
# post process after update
self.post_process_doc(local_doc=d, remote_doc=response_doc)
- except Exception:
- self.update_log('push_failed', d.name)
+ except Exception as e:
+ self.update_log('push_failed', {d.name: cstr(e)})
# update page_start
self.db_set('current_mapping_start',
@@ -370,8 +370,8 @@ class DataMigrationRun(Document):
self.update_log('push_delete', 1)
# post process only when action is success
self.post_process_doc(local_doc=d, remote_doc=response_doc)
- except Exception:
- self.update_log('push_failed', d.name)
+ except Exception as e:
+ self.update_log('push_failed', {d.name: cstr(e)})
# update page_start
self.db_set('current_mapping_start',
@@ -414,7 +414,7 @@ class DataMigrationRun(Document):
self.post_process_doc(remote_doc=d, local_doc=local_doc)
except Exception:
# failed, append to log
- self.update_log('pull_failed', migration_id_value)
+ self.update_log('pull_failed', {migration_id_value: cstr(e)})
if len(data) < mapping.page_length:
# last page, done with pull
diff --git a/frappe/desk/doctype/auto_repeat/auto_repeat.py b/frappe/desk/doctype/auto_repeat/auto_repeat.py
index e661df36fc..0caaf69c3a 100644
--- a/frappe/desk/doctype/auto_repeat/auto_repeat.py
+++ b/frappe/desk/doctype/auto_repeat/auto_repeat.py
@@ -31,9 +31,15 @@ class AutoRepeat(Document):
validate_template(self.message or "")
def before_submit(self):
+ start_date_copy = self.start_date
+ today_copy = add_days(today(), -1)
+
+ if start_date_copy <= today_copy:
+ start_date_copy = today_copy
+
if not self.next_schedule_date:
self.next_schedule_date = get_next_schedule_date(
- self.start_date, self.frequency, self.repeat_on_day)
+ start_date_copy, self.frequency, self.repeat_on_day)
def on_submit(self):
self.update_auto_repeat_id()
@@ -119,14 +125,15 @@ class AutoRepeat(Document):
days = 60 if self.frequency in ['Daily', 'Weekly'] else 365
end_date_copy = add_days(today_copy, days)
+ start_date_copy = get_next_schedule_date(start_date_copy, self.frequency, self.repeat_on_day)
while (getdate(start_date_copy) < getdate(end_date_copy)):
- start_date_copy = get_next_schedule_date(start_date_copy, self.frequency, self.repeat_on_day)
row = {
"reference_document" : self.reference_document,
"frequency" : self.frequency,
"next_scheduled_date" : start_date_copy
}
schedule_details.append(row)
+ start_date_copy = get_next_schedule_date(start_date_copy, self.frequency, self.repeat_on_day)
return schedule_details
diff --git a/frappe/desk/doctype/auto_repeat/test_auto_repeat.py b/frappe/desk/doctype/auto_repeat/test_auto_repeat.py
index 66ef28eeb0..f0cf9643ce 100644
--- a/frappe/desk/doctype/auto_repeat/test_auto_repeat.py
+++ b/frappe/desk/doctype/auto_repeat/test_auto_repeat.py
@@ -8,7 +8,7 @@ import unittest
import frappe
from frappe.custom.doctype.custom_field.custom_field import create_custom_field
from frappe.desk.doctype.auto_repeat.auto_repeat import get_auto_repeat_entries, create_repeated_entries, disable_auto_repeat
-from frappe.utils import today, add_days, getdate
+from frappe.utils import today, add_days, getdate, add_months
def add_custom_fields():
@@ -44,8 +44,8 @@ class TestAutoRepeat(unittest.TestCase):
self.assertEqual(todo.get('description'), new_todo.get('description'))
def test_monthly_auto_repeat(self):
- start_date = '2018-01-01'
- end_date = '2018-12-31'
+ start_date = today()
+ end_date = add_months(start_date, 12)
todo = frappe.get_doc(
dict(doctype='ToDo', description='test recurring todo', assigned_by='Administrator')).insert()
@@ -103,7 +103,7 @@ def make_auto_repeat(**args):
'reference_document': args.reference_document or frappe.db.get_value('ToDo', {'docstatus': 1}, 'name'),
'frequency': args.frequency or 'Daily',
'start_date': args.start_date or add_days(today(), -1),
- 'end_date': args.end_date or add_days(today(), 1),
+ 'end_date': args.end_date or add_days(today(), 2),
'submit_on_creation': args.submit_on_creation or 0,
'notify_by_email': args.notify or 0,
'recipients': args.recipients or "",
diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py
index dc8048567e..8d0eae74a8 100644
--- a/frappe/desk/query_report.py
+++ b/frappe/desk/query_report.py
@@ -264,13 +264,17 @@ def get_prepared_report_result(report, filters, dn="", user=None):
data = json.loads(uncompressed_content)
if data:
columns = json.loads(doc.columns) if doc.columns else data[0]
+
for column in columns:
- column["label"] = _(column["label"])
+ if isinstance(column, dict):
+ column["label"] = _(column["label"])
+
latest_report_data = {
"columns": columns,
"result": data
}
except Exception:
+ frappe.log_error(frappe.get_traceback())
frappe.delete_doc("Prepared Report", doc.name)
frappe.db.commit()
doc = None
@@ -380,6 +384,8 @@ def add_total_row(result, columns, meta = None):
options = col.get("options")
for row in result:
+ if i >= len(row): continue
+
cell = row.get(fieldname) if isinstance(row, dict) else row[i]
if fieldtype in ["Currency", "Int", "Float", "Percent"] and flt(cell):
total_row[i] = flt(total_row[i]) + flt(cell)
diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.json b/frappe/email/doctype/auto_email_report/auto_email_report.json
index 4fbbe4e58e..8067566ece 100644
--- a/frappe/email/doctype/auto_email_report/auto_email_report.json
+++ b/frappe/email/doctype/auto_email_report/auto_email_report.json
@@ -1,237 +1,237 @@
{
- "allow_rename": 1,
- "creation": "2016-09-01 01:34:34.985457",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "report",
- "user",
- "enabled",
- "column_break_4",
- "report_type",
- "reference_report",
- "filter_data",
- "send_if_data",
- "data_modified_till",
- "no_of_rows",
- "report_filters",
- "filters_display",
- "filters",
- "filter_meta",
- "dynamic_report_filters_section",
- "from_date_field",
- "to_date_field",
- "column_break_17",
- "dynamic_date_period",
- "email_settings",
- "email_to",
- "day_of_week",
- "column_break_13",
- "frequency",
- "format",
- "section_break_15",
- "description"
- ],
- "fields": [
- {
- "fieldname": "report",
- "fieldtype": "Link",
- "label": "Report",
- "options": "Report",
- "reqd": 1
- },
- {
- "default": "User",
- "fieldname": "user",
- "fieldtype": "Link",
- "label": "Based on Permissions For User",
- "options": "User",
- "reqd": 1
- },
- {
- "default": "1",
- "fieldname": "enabled",
- "fieldtype": "Check",
- "label": "Enabled"
- },
- {
- "fieldname": "column_break_4",
- "fieldtype": "Column Break"
- },
- {
- "fetch_from": "report.report_type",
- "fieldname": "report_type",
- "fieldtype": "Read Only",
- "label": "Report Type"
- },
- {
- "fieldname": "filter_data",
- "fieldtype": "Section Break",
- "label": "Filter Data"
- },
- {
- "default": "1",
- "fieldname": "send_if_data",
- "fieldtype": "Check",
- "label": "Send only if there is any data"
- },
- {
- "depends_on": "eval:doc.report_type=='Report Builder'",
- "description": "Zero means send records updated at anytime",
- "fieldname": "data_modified_till",
- "fieldtype": "Int",
- "label": "Only Send Records Updated in Last X Hours"
- },
- {
- "default": "100",
- "fieldname": "no_of_rows",
- "fieldtype": "Int",
- "label": "No of Rows (Max 500)"
- },
- {
- "collapsible": 1,
- "depends_on": "eval:doc.report_type !== 'Report Builder'",
- "fieldname": "report_filters",
- "fieldtype": "Section Break",
- "label": "Report Filters"
- },
- {
- "fieldname": "filters_display",
- "fieldtype": "HTML",
- "label": "Filters Display"
- },
- {
- "fieldname": "filters",
- "fieldtype": "Text",
- "hidden": 1,
- "label": "Filters"
- },
- {
- "fieldname": "filter_meta",
- "fieldtype": "Text",
- "hidden": 1,
- "label": "Filter Meta",
- "read_only": 1
- },
- {
- "collapsible": 1,
- "depends_on": "eval:doc.report_type !== 'Report Builder'",
- "fieldname": "dynamic_report_filters_section",
- "fieldtype": "Section Break",
- "label": "Dynamic Report Filters"
- },
- {
- "fieldname": "from_date_field",
- "fieldtype": "Select",
- "label": "From Date Field"
- },
- {
- "fieldname": "to_date_field",
- "fieldtype": "Select",
- "label": "To Date Field"
- },
- {
- "fieldname": "column_break_17",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "dynamic_date_period",
- "fieldtype": "Select",
- "label": "Period",
- "options": "\nDaily\nWeekly\nMonthly\nQuarterly\nHalf Yearly\nYearly"
- },
- {
- "fieldname": "email_settings",
- "fieldtype": "Section Break",
- "label": "Email Settings"
- },
- {
- "fieldname": "email_to",
- "fieldtype": "Small Text",
- "label": "Email To",
- "reqd": 1
- },
- {
- "default": "Monday",
- "depends_on": "eval:doc.frequency=='Weekly'",
- "fieldname": "day_of_week",
- "fieldtype": "Select",
- "label": "Day of Week",
- "options": "Monday\nTuesday\nWednesday\nThursday\nFriday\nSaturday\nSunday"
- },
- {
- "fieldname": "column_break_13",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "frequency",
- "fieldtype": "Select",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Frequency",
- "options": "Daily\nWeekdays\nWeekly\nMonthly",
- "reqd": 1
- },
- {
- "fieldname": "format",
- "fieldtype": "Select",
- "label": "Format",
- "options": "HTML\nXLSX\nCSV",
- "reqd": 1
- },
- {
- "collapsible": 1,
- "fieldname": "section_break_15",
- "fieldtype": "Section Break",
- "label": "Message"
- },
- {
- "fieldname": "description",
- "fieldtype": "Text Editor",
- "label": "Message"
- },
- {
- "fetch_from": "report.reference_report",
- "fieldname": "reference_report",
- "fieldtype": "Data",
- "hidden": 1,
- "label": "Reference Report",
- "read_only": 1
- }
- ],
- "modified": "2019-05-09 22:38:27.570890",
- "modified_by": "Administrator",
- "module": "Email",
- "name": "Auto Email Report",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "System Manager",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Report Manager",
- "share": 1,
- "write": 1
- }
- ],
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
+ "allow_rename": 1,
+ "creation": "2016-09-01 01:34:34.985457",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "report",
+ "user",
+ "enabled",
+ "column_break_4",
+ "report_type",
+ "reference_report",
+ "filter_data",
+ "send_if_data",
+ "data_modified_till",
+ "no_of_rows",
+ "report_filters",
+ "filters_display",
+ "filters",
+ "filter_meta",
+ "dynamic_report_filters_section",
+ "from_date_field",
+ "to_date_field",
+ "column_break_17",
+ "dynamic_date_period",
+ "email_settings",
+ "email_to",
+ "day_of_week",
+ "column_break_13",
+ "frequency",
+ "format",
+ "section_break_15",
+ "description"
+ ],
+ "fields": [
+ {
+ "fieldname": "report",
+ "fieldtype": "Link",
+ "label": "Report",
+ "options": "Report",
+ "reqd": 1
+ },
+ {
+ "default": "User",
+ "fieldname": "user",
+ "fieldtype": "Link",
+ "label": "Based on Permissions For User",
+ "options": "User",
+ "reqd": 1
+ },
+ {
+ "default": "1",
+ "fieldname": "enabled",
+ "fieldtype": "Check",
+ "label": "Enabled"
+ },
+ {
+ "fieldname": "column_break_4",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fetch_from": "report.report_type",
+ "fieldname": "report_type",
+ "fieldtype": "Read Only",
+ "label": "Report Type"
+ },
+ {
+ "fieldname": "filter_data",
+ "fieldtype": "Section Break",
+ "label": "Filter Data"
+ },
+ {
+ "default": "1",
+ "fieldname": "send_if_data",
+ "fieldtype": "Check",
+ "label": "Send only if there is any data"
+ },
+ {
+ "depends_on": "eval:doc.report_type=='Report Builder'",
+ "description": "Zero means send records updated at anytime",
+ "fieldname": "data_modified_till",
+ "fieldtype": "Int",
+ "label": "Only Send Records Updated in Last X Hours"
+ },
+ {
+ "default": "100",
+ "fieldname": "no_of_rows",
+ "fieldtype": "Int",
+ "label": "No of Rows (Max 500)"
+ },
+ {
+ "collapsible": 1,
+ "depends_on": "eval:doc.report_type !== 'Report Builder'",
+ "fieldname": "report_filters",
+ "fieldtype": "Section Break",
+ "label": "Report Filters"
+ },
+ {
+ "fieldname": "filters_display",
+ "fieldtype": "HTML",
+ "label": "Filters Display"
+ },
+ {
+ "fieldname": "filters",
+ "fieldtype": "Text",
+ "hidden": 1,
+ "label": "Filters"
+ },
+ {
+ "fieldname": "filter_meta",
+ "fieldtype": "Text",
+ "hidden": 1,
+ "label": "Filter Meta",
+ "read_only": 1
+ },
+ {
+ "collapsible": 1,
+ "depends_on": "eval:doc.report_type !== 'Report Builder'",
+ "fieldname": "dynamic_report_filters_section",
+ "fieldtype": "Section Break",
+ "label": "Dynamic Report Filters"
+ },
+ {
+ "fieldname": "from_date_field",
+ "fieldtype": "Select",
+ "label": "From Date Field"
+ },
+ {
+ "fieldname": "to_date_field",
+ "fieldtype": "Select",
+ "label": "To Date Field"
+ },
+ {
+ "fieldname": "column_break_17",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "dynamic_date_period",
+ "fieldtype": "Select",
+ "label": "Period",
+ "options": "\nDaily\nWeekly\nMonthly\nQuarterly\nHalf Yearly\nYearly"
+ },
+ {
+ "fieldname": "email_settings",
+ "fieldtype": "Section Break",
+ "label": "Email Settings"
+ },
+ {
+ "fieldname": "email_to",
+ "fieldtype": "Small Text",
+ "label": "Email To",
+ "reqd": 1
+ },
+ {
+ "default": "Monday",
+ "depends_on": "eval:doc.frequency=='Weekly'",
+ "fieldname": "day_of_week",
+ "fieldtype": "Select",
+ "label": "Day of Week",
+ "options": "Monday\nTuesday\nWednesday\nThursday\nFriday\nSaturday\nSunday"
+ },
+ {
+ "fieldname": "column_break_13",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "frequency",
+ "fieldtype": "Select",
+ "in_list_view": 1,
+ "in_standard_filter": 1,
+ "label": "Frequency",
+ "options": "Daily\nWeekdays\nWeekly\nMonthly",
+ "reqd": 1
+ },
+ {
+ "fieldname": "format",
+ "fieldtype": "Select",
+ "label": "Format",
+ "options": "HTML\nXLSX\nCSV",
+ "reqd": 1
+ },
+ {
+ "collapsible": 1,
+ "fieldname": "section_break_15",
+ "fieldtype": "Section Break",
+ "label": "Message"
+ },
+ {
+ "fieldname": "description",
+ "fieldtype": "Text Editor",
+ "label": "Message"
+ },
+ {
+ "fetch_from": "report.reference_report",
+ "fieldname": "reference_report",
+ "fieldtype": "Data",
+ "hidden": 1,
+ "label": "Reference Report",
+ "read_only": 1
+ }
+ ],
+ "modified": "2019-05-09 22:38:27.570890",
+ "modified_by": "Administrator",
+ "module": "Email",
+ "name": "Auto Email Report",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "share": 1,
+ "write": 1
+ },
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Report Manager",
+ "share": 1,
+ "write": 1
+ }
+ ],
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+ }
\ No newline at end of file
diff --git a/frappe/email/doctype/email_unsubscribe/email_unsubscribe.json b/frappe/email/doctype/email_unsubscribe/email_unsubscribe.json
index 3624a55641..b24359f82f 100644
--- a/frappe/email/doctype/email_unsubscribe/email_unsubscribe.json
+++ b/frappe/email/doctype/email_unsubscribe/email_unsubscribe.json
@@ -3,7 +3,7 @@
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
- "creation": "2015-03-18 09:41:20.216319",
+ "creation": "2015-03-18 09:41:20.216320",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
@@ -35,7 +35,7 @@
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
- "search_index": 0,
+ "search_index": 1,
"set_only_once": 0,
"unique": 0
},
@@ -172,4 +172,4 @@
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
-}
\ No newline at end of file
+}
diff --git a/frappe/email/queue.py b/frappe/email/queue.py
index a7988bc46e..b671dc91d8 100755
--- a/frappe/email/queue.py
+++ b/frappe/email/queue.py
@@ -77,19 +77,35 @@ def send(recipients=None, sender=None, subject=None, message=None, text_content=
except HTMLParser.HTMLParseError:
text_content = "See html attachment"
- if reference_doctype and reference_name:
- unsubscribed = [d.email for d in frappe.db.get_all("Email Unsubscribe", "email",
- {"reference_doctype": reference_doctype, "reference_name": reference_name})]
+ recipients = list(set(recipients))
+ cc = list(set(cc))
- unsubscribed += [d.email for d in frappe.db.get_all("Email Unsubscribe", "email",
- {"global_unsubscribe": 1})]
- else:
- unsubscribed = []
+ all_ids = recipients + cc
- recipients = [r for r in list(set(recipients)) if r and r not in unsubscribed]
+ unsubscribed = frappe.db.sql_list('''
+ SELECT
+ distinct email
+ from
+ `tabEmail Unsubscribe`
+ where
+ email in %(all_ids)s
+ and (
+ (
+ reference_doctype = %(reference_doctype)s
+ and reference_name = %(reference_name)s
+ )
+ or global_unsubscribe = 1
+ )
+ ''', {
+ 'all_ids': all_ids,
+ 'reference_doctype': reference_doctype,
+ 'reference_name': reference_name,
+ })
+
+ recipients = [r for r in recipients if r and r not in unsubscribed]
if cc:
- cc = [r for r in list(set(cc)) if r and r not in unsubscribed]
+ cc = [r for r in cc if r and r not in unsubscribed]
if not recipients and not cc:
# Recipients may have been unsubscribed, exit quietly
diff --git a/frappe/integrations/data_migration_mapping/event_to_gcalendar/event_to_gcalendar.json b/frappe/integrations/data_migration_mapping/event_to_gcalendar/event_to_gcalendar.json
index b940237c8d..6d2a6020a5 100644
--- a/frappe/integrations/data_migration_mapping/event_to_gcalendar/event_to_gcalendar.json
+++ b/frappe/integrations/data_migration_mapping/event_to_gcalendar/event_to_gcalendar.json
@@ -33,6 +33,51 @@
"local_fieldname": "repeat_this_event",
"remote_fieldname": "repeat_this_event"
},
+ {
+ "is_child_table": 0,
+ "local_fieldname": "repeat_on",
+ "remote_fieldname": "repeat_on"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "repeat_till",
+ "remote_fieldname": "repeat_till"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "monday",
+ "remote_fieldname": "monday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "tuesday",
+ "remote_fieldname": "tuesday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "wednesday",
+ "remote_fieldname": "wednesday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "thursday",
+ "remote_fieldname": "thursday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "friday",
+ "remote_fieldname": "friday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "saturday",
+ "remote_fieldname": "saturday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "sunday",
+ "remote_fieldname": "sunday"
+ },
{
"is_child_table": 0,
"local_fieldname": "name",
@@ -45,8 +90,8 @@
"mapping_name": "Event to GCalendar",
"mapping_type": "Push",
"migration_id_field": "gcalendar_sync_id",
- "modified": "2018-05-18 14:38:43.658069",
- "modified_by": "chdecultot@dokos.io",
+ "modified": "2019-03-26 10:16:45.400150",
+ "modified_by": "Administrator",
"name": "Event to GCalendar",
"owner": "Administrator",
"page_length": 10,
diff --git a/frappe/integrations/data_migration_mapping/gcalendar_to_event/__init__.py b/frappe/integrations/data_migration_mapping/gcalendar_to_event/__init__.py
index 441d2c3797..5518871c97 100644
--- a/frappe/integrations/data_migration_mapping/gcalendar_to_event/__init__.py
+++ b/frappe/integrations/data_migration_mapping/gcalendar_to_event/__init__.py
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import frappe
-from datetime import datetime
+from datetime import datetime, timedelta
from dateutil.parser import parse
from pytz import timezone
from frappe.utils import add_days
@@ -30,7 +30,7 @@ def pre_process(events):
event_tz = events["start"]["timeZone"]
else:
event_tz = events["calendar_tz"]
- start_dt= timezone(event_tz).localize(start_dt)
+ start_dt = timezone(event_tz).localize(start_dt)
if end_dt.tzinfo is None or end_dt.tzinfo.utcoffset(end_dt) is None:
if "timeZone" in events["end"]:
@@ -79,32 +79,37 @@ def get_recurrence_event_fields_value(recur_rule, starts_on):
else: repeat_on = "Every Year"
elif "UNTIL" in _str:
# get repeat till
- date = datetime.strptime(_str.split("=")[1], "%Y%m%dT%H%M%SZ")
+ date = parse(_str.split("=")[1])
repeat_till = get_repeat_till_date(date)
elif "COUNT" in _str:
# get repeat till
- date = datetime.strptime(starts_on, "%Y-%m-%d %H:%M:%S")
+ date = parse(starts_on)
repeat_till = get_repeat_till_date(date, count=_str.split("=")[1], repeat_on=repeat_on)
elif "BYDAY" in _str:
days = _str.split("=")[1]
- if repeat_on == "DAILY":
- repeat_days.update({
- "sunday": 1 if "SU" in days else 0,
- "monday": 1 if "MO" in days else 0,
- "tuesday": 1 if "TU" in days else 0,
- "wednesday": 1 if "WD" in days else 0,
- "thursday": 1 if "TU" in days else 0,
- "friday": 1 if "TU" in days else 0,
- "saturday": 1 if "TU" in days else 0,
- })
+ repeat_days.update({
+ "sunday": 1 if "SU" in days else 0,
+ "monday": 1 if "MO" in days else 0,
+ "tuesday": 1 if "TU" in days else 0,
+ "wednesday": 1 if "WD" in days else 0,
+ "thursday": 1 if "TH" in days else 0,
+ "friday": 1 if "FR" in days else 0,
+ "saturday": 1 if "SA" in days else 0,
+ })
+ repeat_on = "Every Day"
- return {
+ recurrence = {
"repeat_on": repeat_on,
"repeat_till": repeat_till,
- "repeat_this_event": 1,
- "repeat_days": repeat_days
+ "repeat_this_event": 1
}
+ if repeat_days:
+ recurrence.update(repeat_days)
+
+ return recurrence
+
+
def get_repeat_till_date(date, count=None, repeat_on=None):
if count:
if repeat_on == "Every Day":
diff --git a/frappe/integrations/data_migration_mapping/gcalendar_to_event/gcalendar_to_event.json b/frappe/integrations/data_migration_mapping/gcalendar_to_event/gcalendar_to_event.json
index ec5bfc5f00..a4ca740ce5 100644
--- a/frappe/integrations/data_migration_mapping/gcalendar_to_event/gcalendar_to_event.json
+++ b/frappe/integrations/data_migration_mapping/gcalendar_to_event/gcalendar_to_event.json
@@ -33,6 +33,51 @@
"local_fieldname": "repeat_this_event",
"remote_fieldname": "repeat_this_event"
},
+ {
+ "is_child_table": 0,
+ "local_fieldname": "repeat_on",
+ "remote_fieldname": "repeat_on"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "repeat_till",
+ "remote_fieldname": "repeat_till"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "monday",
+ "remote_fieldname": "monday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "tuesday",
+ "remote_fieldname": "tuesday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "wednesday",
+ "remote_fieldname": "wednesday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "thursday",
+ "remote_fieldname": "thursday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "friday",
+ "remote_fieldname": "friday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "saturday",
+ "remote_fieldname": "saturday"
+ },
+ {
+ "is_child_table": 0,
+ "local_fieldname": "sunday",
+ "remote_fieldname": "sunday"
+ },
{
"is_child_table": 0,
"local_fieldname": "gcalendar_sync_id",
@@ -50,8 +95,8 @@
"mapping_name": "GCalendar to Event",
"mapping_type": "Pull",
"migration_id_field": "gcalendar_sync_id",
- "modified": "2018-05-18 14:38:43.694867",
- "modified_by": "chdecultot@dokos.io",
+ "modified": "2019-03-26 10:16:45.426138",
+ "modified_by": "Administrator",
"name": "GCalendar to Event",
"owner": "Administrator",
"page_length": 250,
diff --git a/frappe/integrations/data_migration_plan/gcalendar_sync/gcalendar_sync.json b/frappe/integrations/data_migration_plan/gcalendar_sync/gcalendar_sync.json
index 2fac63854f..9eef669203 100644
--- a/frappe/integrations/data_migration_plan/gcalendar_sync/gcalendar_sync.json
+++ b/frappe/integrations/data_migration_plan/gcalendar_sync/gcalendar_sync.json
@@ -2,7 +2,7 @@
"creation": "2018-03-23 19:10:23.715161",
"docstatus": 0,
"doctype": "Data Migration Plan",
- "idx": 4,
+ "idx": 22,
"mappings": [
{
"enabled": 1,
@@ -13,8 +13,8 @@
"mapping": "GCalendar to Event"
}
],
- "modified": "2018-05-18 14:38:43.559026",
- "modified_by": "chdecultot@dokos.io",
+ "modified": "2019-03-26 10:16:45.369037",
+ "modified_by": "Administrator",
"module": "Integrations",
"name": "GCalendar Sync",
"owner": "Administrator",
diff --git a/frappe/integrations/doctype/ldap_settings/ldap_settings.py b/frappe/integrations/doctype/ldap_settings/ldap_settings.py
index e48619bfdd..5fa54e9628 100644
--- a/frappe/integrations/doctype/ldap_settings/ldap_settings.py
+++ b/frappe/integrations/doctype/ldap_settings/ldap_settings.py
@@ -14,16 +14,16 @@ class LDAPSettings(Document):
return
if not self.flags.ignore_mandatory:
- if self.ldap_search_string.endswith("={0}"):
- if self.enabled:
- connect_to_ldap(server_url=self.ldap_server_url,
- base_dn=self.base_dn,
- password=self.get_password(raise_exception=False),
- ssl_tls_mode=self.ssl_tls_mode,
- trusted_cert=self.require_trusted_certificate,
- private_key_file=self.local_private_key_file,
- server_cert_file=self.local_server_certificate_file,
- ca_certs_file=self.local_ca_certs_file)
+ if self.ldap_search_string and self.ldap_search_string.endswith("={0}"):
+ connect_to_ldap(server_url=self.ldap_server_url,
+ base_dn=self.base_dn,
+ password=self.get_password(raise_exception=False),
+ ssl_tls_mode=self.ssl_tls_mode,
+ trusted_cert=self.require_trusted_certificate,
+ private_key_file=self.local_private_key_file,
+ server_cert_file=self.local_server_certificate_file,
+ ca_certs_file=self.local_ca_certs_file
+ )
else:
frappe.throw(_("LDAP Search String needs to end with a placeholder, eg sAMAccountName={0}"))
@@ -160,7 +160,7 @@ def create_user(params):
"language": "",
"user_type": "System User",
"roles": [{
- "role": _("Blogger")
+ "role": _("Customer")
}]
})
diff --git a/frappe/integrations/doctype/paypal_settings/paypal_settings.py b/frappe/integrations/doctype/paypal_settings/paypal_settings.py
index 3eacff0b9d..efd1b03355 100644
--- a/frappe/integrations/doctype/paypal_settings/paypal_settings.py
+++ b/frappe/integrations/doctype/paypal_settings/paypal_settings.py
@@ -369,7 +369,7 @@ def manage_recurring_payment_profile_status(profile_id, action, args, url):
# error code 11556 indicates profile is not in active state(or already cancelled)
# thus could not cancel the subscription.
- # thus raise exception only if error code not quals to 11556
+ # thus raise an exception only if the error code is not equal to 11556
if response.get("ACK")[0] != "Success" and response.get("L_ERRORCODE0", [])[0] != '11556':
frappe.throw(_("Failed while amending subscription"))
diff --git a/frappe/migrate.py b/frappe/migrate.py
index 1128f6eff3..7b5ce55b36 100644
--- a/frappe/migrate.py
+++ b/frappe/migrate.py
@@ -76,4 +76,3 @@ def migrate(verbose=True, rebuild_website=False):
with open(touched_tables_file, 'w') as f:
json.dump(list(frappe.flags.touched_tables), f, sort_keys=True, indent=4)
frappe.flags.touched_tables.clear()
-
diff --git a/frappe/model/create_new.py b/frappe/model/create_new.py
index e882508c99..6dd0ff3eec 100644
--- a/frappe/model/create_new.py
+++ b/frappe/model/create_new.py
@@ -60,24 +60,15 @@ def set_user_and_static_default_values(doc):
allowed_records, default_doc = filter_allowed_docs_for_doctype(doctype_user_permissions, df.parent, with_default_doc=True)
user_default_value = get_user_default_value(df, defaults, doctype_user_permissions, allowed_records, default_doc)
- if user_default_value != None:
- # do not set default if the field on which current field is dependent is not set
- if is_dependent_field_set(df.depends_on, doc):
- doc.set(df.fieldname, user_default_value)
+ if user_default_value is not None:
+ doc.set(df.fieldname, user_default_value)
+
else:
if df.fieldname != doc.meta.title_field:
static_default_value = get_static_default_value(df, doctype_user_permissions, allowed_records)
- if static_default_value != None and is_dependent_field_set(df.depends_on, doc):
+ if static_default_value is not None:
doc.set(df.fieldname, static_default_value)
-
-def is_dependent_field_set(fieldname, doc):
- value_dict = doc.as_dict()
- if not fieldname: return True
- # to check if fieldname passed is valid
- if fieldname not in value_dict: return True
- return value_dict[fieldname]
-
def get_user_default_value(df, defaults, doctype_user_permissions, allowed_records, default_doc):
# don't set defaults for "User" link field using User Permissions!
if df.fieldtype == "Link" and df.options != "User":
diff --git a/frappe/printing/doctype/print_format/print_format.json b/frappe/printing/doctype/print_format/print_format.json
index d899023eac..a5d41ee099 100644
--- a/frappe/printing/doctype/print_format/print_format.json
+++ b/frappe/printing/doctype/print_format/print_format.json
@@ -1,905 +1,905 @@
{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 1,
- "autoname": "Prompt",
- "beta": 0,
- "creation": "2013-01-23 19:54:43",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "editable_grid": 0,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "",
- "fetch_if_empty": 0,
- "fieldname": "doc_type",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 1,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "DocType",
- "length": 0,
- "no_copy": 0,
- "options": "DocType",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "module",
- "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": "Module",
- "length": 0,
- "no_copy": 0,
- "options": "Module Def",
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "disabled",
- "fieldtype": "Check",
- "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": "Disabled",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "column_break_3",
- "fieldtype": "Column Break",
- "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,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "No",
- "fetch_if_empty": 0,
- "fieldname": "standard",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 1,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Standard",
- "length": 0,
- "no_copy": 1,
- "oldfieldname": "standard",
- "oldfieldtype": "Select",
- "options": "No\nYes",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 1,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "custom_format",
- "fieldtype": "Check",
- "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": "Custom Format",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "custom_format",
- "fetch_if_empty": 0,
- "fieldname": "section_break_6",
- "fieldtype": "Section Break",
- "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,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "Jinja",
- "depends_on": "custom_format",
- "description": "",
- "fetch_if_empty": 0,
- "fieldname": "print_format_type",
- "fieldtype": "Select",
- "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": "Print Format Type",
- "length": 0,
- "no_copy": 0,
- "options": "Jinja\nJS",
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "",
- "fetch_if_empty": 0,
- "fieldname": "raw_printing",
- "fieldtype": "Check",
- "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": "Raw Printing",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:!doc.raw_printing",
- "fetch_if_empty": 0,
- "fieldname": "html",
- "fieldtype": "Code",
- "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": "HTML",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "html",
- "oldfieldtype": "Text Editor",
- "options": "HTML",
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "raw_printing",
- "description": "Any string-based printer languages can be used. Writing raw commands requires knowledge of the printer's native language provided by the printer manufacturer. Please refer to the developer manual provided by the printer manufacturer on how to write their native commands. These commands are rendered on the server side using the Jinja Templating Language.",
- "fetch_if_empty": 0,
- "fieldname": "raw_commands",
- "fieldtype": "Code",
- "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": "Raw Commands",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:!doc.custom_format",
- "fetch_if_empty": 0,
- "fieldname": "section_break_9",
- "fieldtype": "Section Break",
- "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": "Style Settings",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "0",
- "fetch_if_empty": 0,
- "fieldname": "align_labels_right",
- "fieldtype": "Check",
- "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": "Align Labels to the Right",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "0",
- "fetch_if_empty": 0,
- "fieldname": "show_section_headings",
- "fieldtype": "Check",
- "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": "Show Section Headings",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "0",
- "fetch_if_empty": 0,
- "fieldname": "line_breaks",
- "fieldtype": "Check",
- "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": "Show Line Breaks after Sections",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "column_break_11",
- "fieldtype": "Column Break",
- "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,
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "default_print_language",
- "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": "Default Print Language",
- "length": 0,
- "no_copy": 0,
- "options": "Language",
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "Default",
- "depends_on": "eval:!doc.custom_format",
- "fetch_if_empty": 0,
- "fieldname": "font",
- "fieldtype": "Select",
- "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": "Font",
- "length": 0,
- "no_copy": 0,
- "options": "Default\nArial\nHelvetica\nVerdana\nMonospace",
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:!doc.raw_printing",
- "fetch_if_empty": 0,
- "fieldname": "css_section",
- "fieldtype": "Section Break",
- "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,
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "css",
- "fieldtype": "Code",
- "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": "Custom CSS",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "custom_html_help",
- "fieldtype": "HTML",
- "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": "Custom HTML Help",
- "length": 0,
- "no_copy": 0,
- "options": "
Custom CSS Help
\n\n
Notes:
\n\n
\n- All field groups (label + value) are set attributes
data-fieldtype and data-fieldname \n- All values are given class
value \n- All Section Breaks are given class
section-break \n- All Column Breaks are given class
column-break \n
\n\n
Examples
\n\n
1. Left align integers
\n\n
[data-fieldtype=\"Int\"] .value { text-left: left; }
\n\n
1. Add border to sections except the last section
\n\n
.section-break { padding: 30px 0px; border-bottom: 1px solid #eee; }\n.section-break:last-child { padding-bottom: 0px; border-bottom: 0px; }
\n",
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "custom_format",
- "fetch_if_empty": 0,
- "fieldname": "section_break_13",
- "fieldtype": "Section Break",
- "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,
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "custom_format",
- "fetch_if_empty": 0,
- "fieldname": "print_format_help",
- "fieldtype": "HTML",
- "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": "Print Format Help",
- "length": 0,
- "no_copy": 0,
- "options": "
Print Format Help
\n
\n
Introduction
\n
Print itemsFormats are rendered on the server side using the Jinja Templating Language. All forms have access to the doc object which contains information about the document that is being formatted. You can also access common utilities via the frappe module.
\n
For styling, the Boostrap CSS framework is provided and you can enjoy the full range of classes.
\n
\n
References
\n
\n\t- Jinja Tempalting Language: Reference
\n\t- Bootstrap CSS Framework
\n
\n
\n
Example
\n
<h3>{{ doc.select_print_heading or \"Invoice\" }}</h3>\n<div class=\"row\">\n\t<div class=\"col-md-3 text-right\">Customer Name</div>\n\t<div class=\"col-md-9\">{{ doc.customer_name }}</div>\n</div>\n<div class=\"row\">\n\t<div class=\"col-md-3 text-right\">Date</div>\n\t<div class=\"col-md-9\">{{ doc.get_formatted(\"invoice_date\") }}</div>\n</div>\n<table class=\"table table-bordered\">\n\t<tbody>\n\t\t<tr>\n\t\t\t<th>Sr</th>\n\t\t\t<th>Item Name</th>\n\t\t\t<th>Description</th>\n\t\t\t<th class=\"text-right\">Qty</th>\n\t\t\t<th class=\"text-right\">Rate</th>\n\t\t\t<th class=\"text-right\">Amount</th>\n\t\t</tr>\n\t\t{%- for row in doc.items -%}\n\t\t<tr>\n\t\t\t<td style=\"width: 3%;\">{{ row.idx }}</td>\n\t\t\t<td style=\"width: 20%;\">\n\t\t\t\t{{ row.item_name }}\n\t\t\t\t{% if row.item_code != row.item_name -%}\n\t\t\t\t<br>Item Code: {{ row.item_code}}\n\t\t\t\t{%- endif %}\n\t\t\t</td>\n\t\t\t<td style=\"width: 37%;\">\n\t\t\t\t<div style=\"border: 0px;\">{{ row.description }}</div></td>\n\t\t\t<td style=\"width: 10%; text-align: right;\">{{ row.qty }} {{ row.uom or row.stock_uom }}</td>\n\t\t\t<td style=\"width: 15%; text-align: right;\">{{\n\t\t\t\trow.get_formatted(\"rate\", doc) }}</td>\n\t\t\t<td style=\"width: 15%; text-align: right;\">{{\n\t\t\t\trow.get_formatted(\"amount\", doc) }}</td>\n\t\t</tr>\n\t\t{%- endfor -%}\n\t</tbody>\n</table>
\n
\n
Common Functions
\n
\n\t\n\t\t\n\t\t\tdoc.get_formatted(\"[fieldname]\", [parent_doc]) | \n\t\t\tGet document value formatted as Date, Currency etc. Pass parent doc for curreny type fields. | \n\t\t
\n\t\t\n\t\t\tfrappe.db.get_value(\"[doctype]\", \"[name]\", \"fieldname\") | \n\t\t\tGet value from another document. | \n\t\t
\n\t\n
\n",
- "permlevel": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "format_data",
- "fieldtype": "Code",
- "hidden": 1,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Format Data",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "print_format_builder",
- "fieldtype": "Check",
- "hidden": 1,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Print Format Builder",
- "length": 0,
- "no_copy": 0,
- "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,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_toolbar": 0,
- "icon": "fa fa-print",
- "idx": 1,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "menu_index": 0,
- "modified": "2019-06-05 12:45:25.869180",
- "modified_by": "Administrator",
- "module": "Printing",
- "name": "Print Format",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "System Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 0,
- "read_only": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
+ "allow_copy": 0,
+ "allow_events_in_timeline": 0,
+ "allow_guest_to_view": 0,
+ "allow_import": 0,
+ "allow_rename": 1,
+ "autoname": "Prompt",
+ "beta": 0,
+ "creation": "2013-01-23 19:54:43",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "editable_grid": 0,
+ "engine": "InnoDB",
+ "fields": [
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "description": "",
+ "fetch_if_empty": 0,
+ "fieldname": "doc_type",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 1,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 1,
+ "label": "DocType",
+ "length": 0,
+ "no_copy": 0,
+ "options": "DocType",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "module",
+ "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": "Module",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Module Def",
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "disabled",
+ "fieldtype": "Check",
+ "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": "Disabled",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "column_break_3",
+ "fieldtype": "Column Break",
+ "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,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "No",
+ "fetch_if_empty": 0,
+ "fieldname": "standard",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 1,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Standard",
+ "length": 0,
+ "no_copy": 1,
+ "oldfieldname": "standard",
+ "oldfieldtype": "Select",
+ "options": "No\nYes",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 1,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "custom_format",
+ "fieldtype": "Check",
+ "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": "Custom Format",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "custom_format",
+ "fetch_if_empty": 0,
+ "fieldname": "section_break_6",
+ "fieldtype": "Section Break",
+ "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,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "Jinja",
+ "depends_on": "custom_format",
+ "description": "",
+ "fetch_if_empty": 0,
+ "fieldname": "print_format_type",
+ "fieldtype": "Select",
+ "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": "Print Format Type",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Jinja\nJS",
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "",
+ "fetch_if_empty": 0,
+ "fieldname": "raw_printing",
+ "fieldtype": "Check",
+ "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": "Raw Printing",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "eval:!doc.raw_printing",
+ "fetch_if_empty": 0,
+ "fieldname": "html",
+ "fieldtype": "Code",
+ "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": "HTML",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "html",
+ "oldfieldtype": "Text Editor",
+ "options": "HTML",
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "raw_printing",
+ "description": "Any string-based printer languages can be used. Writing raw commands requires knowledge of the printer's native language provided by the printer manufacturer. Please refer to the developer manual provided by the printer manufacturer on how to write their native commands. These commands are rendered on the server side using the Jinja Templating Language.",
+ "fetch_if_empty": 0,
+ "fieldname": "raw_commands",
+ "fieldtype": "Code",
+ "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": "Raw Commands",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "eval:!doc.custom_format",
+ "fetch_if_empty": 0,
+ "fieldname": "section_break_9",
+ "fieldtype": "Section Break",
+ "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": "Style Settings",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "0",
+ "fetch_if_empty": 0,
+ "fieldname": "align_labels_right",
+ "fieldtype": "Check",
+ "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": "Align Labels to the Right",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "0",
+ "fetch_if_empty": 0,
+ "fieldname": "show_section_headings",
+ "fieldtype": "Check",
+ "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": "Show Section Headings",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "0",
+ "fetch_if_empty": 0,
+ "fieldname": "line_breaks",
+ "fieldtype": "Check",
+ "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": "Show Line Breaks after Sections",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "column_break_11",
+ "fieldtype": "Column Break",
+ "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,
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "default_print_language",
+ "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": "Default Print Language",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Language",
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "Default",
+ "depends_on": "eval:!doc.custom_format",
+ "fetch_if_empty": 0,
+ "fieldname": "font",
+ "fieldtype": "Select",
+ "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": "Font",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Default\nArial\nHelvetica\nVerdana\nMonospace",
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "eval:!doc.raw_printing",
+ "fetch_if_empty": 0,
+ "fieldname": "css_section",
+ "fieldtype": "Section Break",
+ "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,
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "css",
+ "fieldtype": "Code",
+ "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": "Custom CSS",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "custom_html_help",
+ "fieldtype": "HTML",
+ "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": "Custom HTML Help",
+ "length": 0,
+ "no_copy": 0,
+ "options": "
Custom CSS Help
\n\n
Notes:
\n\n
\n- All field groups (label + value) are set attributes
data-fieldtype and data-fieldname \n- All values are given class
value \n- All Section Breaks are given class
section-break \n- All Column Breaks are given class
column-break \n
\n\n
Examples
\n\n
1. Left align integers
\n\n
[data-fieldtype=\"Int\"] .value { text-left: left; }
\n\n
1. Add border to sections except the last section
\n\n
.section-break { padding: 30px 0px; border-bottom: 1px solid #eee; }\n.section-break:last-child { padding-bottom: 0px; border-bottom: 0px; }
\n",
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "custom_format",
+ "fetch_if_empty": 0,
+ "fieldname": "section_break_13",
+ "fieldtype": "Section Break",
+ "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,
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "custom_format",
+ "fetch_if_empty": 0,
+ "fieldname": "print_format_help",
+ "fieldtype": "HTML",
+ "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": "Print Format Help",
+ "length": 0,
+ "no_copy": 0,
+ "options": "
Print Format Help
\n
\n
Introduction
\n
Print itemsFormats are rendered on the server side using the Jinja Templating Language. All forms have access to the doc object which contains information about the document that is being formatted. You can also access common utilities via the frappe module.
\n
For styling, the Boostrap CSS framework is provided and you can enjoy the full range of classes.
\n
\n
References
\n
\n\t- Jinja Tempalting Language: Reference
\n\t- Bootstrap CSS Framework
\n
\n
\n
Example
\n
<h3>{{ doc.select_print_heading or \"Invoice\" }}</h3>\n<div class=\"row\">\n\t<div class=\"col-md-3 text-right\">Customer Name</div>\n\t<div class=\"col-md-9\">{{ doc.customer_name }}</div>\n</div>\n<div class=\"row\">\n\t<div class=\"col-md-3 text-right\">Date</div>\n\t<div class=\"col-md-9\">{{ doc.get_formatted(\"invoice_date\") }}</div>\n</div>\n<table class=\"table table-bordered\">\n\t<tbody>\n\t\t<tr>\n\t\t\t<th>Sr</th>\n\t\t\t<th>Item Name</th>\n\t\t\t<th>Description</th>\n\t\t\t<th class=\"text-right\">Qty</th>\n\t\t\t<th class=\"text-right\">Rate</th>\n\t\t\t<th class=\"text-right\">Amount</th>\n\t\t</tr>\n\t\t{%- for row in doc.items -%}\n\t\t<tr>\n\t\t\t<td style=\"width: 3%;\">{{ row.idx }}</td>\n\t\t\t<td style=\"width: 20%;\">\n\t\t\t\t{{ row.item_name }}\n\t\t\t\t{% if row.item_code != row.item_name -%}\n\t\t\t\t<br>Item Code: {{ row.item_code}}\n\t\t\t\t{%- endif %}\n\t\t\t</td>\n\t\t\t<td style=\"width: 37%;\">\n\t\t\t\t<div style=\"border: 0px;\">{{ row.description }}</div></td>\n\t\t\t<td style=\"width: 10%; text-align: right;\">{{ row.qty }} {{ row.uom or row.stock_uom }}</td>\n\t\t\t<td style=\"width: 15%; text-align: right;\">{{\n\t\t\t\trow.get_formatted(\"rate\", doc) }}</td>\n\t\t\t<td style=\"width: 15%; text-align: right;\">{{\n\t\t\t\trow.get_formatted(\"amount\", doc) }}</td>\n\t\t</tr>\n\t\t{%- endfor -%}\n\t</tbody>\n</table>
\n
\n
Common Functions
\n
\n\t\n\t\t\n\t\t\tdoc.get_formatted(\"[fieldname]\", [parent_doc]) | \n\t\t\tGet document value formatted as Date, Currency etc. Pass parent doc for curreny type fields. | \n\t\t
\n\t\t\n\t\t\tfrappe.db.get_value(\"[doctype]\", \"[name]\", \"fieldname\") | \n\t\t\tGet value from another document. | \n\t\t
\n\t\n
\n",
+ "permlevel": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "format_data",
+ "fieldtype": "Code",
+ "hidden": 1,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Format Data",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fetch_if_empty": 0,
+ "fieldname": "print_format_builder",
+ "fieldtype": "Check",
+ "hidden": 1,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Print Format Builder",
+ "length": 0,
+ "no_copy": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ }
+ ],
+ "has_web_view": 0,
+ "hide_toolbar": 0,
+ "icon": "fa fa-print",
+ "idx": 1,
+ "in_create": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 0,
+ "max_attachments": 0,
+ "menu_index": 0,
+ "modified": "2019-06-05 12:45:25.869180",
+ "modified_by": "Administrator",
+ "module": "Printing",
+ "name": "Print Format",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 1
+ }
+ ],
+ "quick_entry": 0,
+ "read_only": 0,
+ "show_name_in_global_search": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1,
+ "track_seen": 0,
+ "track_views": 0
+ }
\ No newline at end of file
diff --git a/frappe/public/js/frappe/desk.js b/frappe/public/js/frappe/desk.js
index 27b483b7aa..cbbcc1b262 100644
--- a/frappe/public/js/frappe/desk.js
+++ b/frappe/public/js/frappe/desk.js
@@ -469,7 +469,7 @@ frappe.Application = Class.extend({
},
set_rtl: function() {
- if (["ar", "he", "fa"].indexOf(frappe.boot.lang) >= 0) {
+ if (frappe.utils.is_rtl()) {
var ls = document.createElement('link');
ls.rel="stylesheet";
ls.href= "assets/css/frappe-rtl.css";
diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js
index bf56febdf4..efb4388460 100644
--- a/frappe/public/js/frappe/form/print.js
+++ b/frappe/public/js/frappe/form/print.js
@@ -121,6 +121,29 @@ frappe.ui.form.PrintPreview = Class.extend({
if (e.print_format) {
this.print_sel.val(e.print_format);
}
+ // start a new print format
+ frappe.prompt([
+ {
+ label: __("New Print Format Name"),
+ fieldname: "print_format_name",
+ fieldtype: "Data",
+ reqd: 1,
+ },
+ {
+ label: __('Based On'),
+ fieldname: 'based_on',
+ fieldtype: 'Read Only',
+ default: print_format.name || 'Standard'
+ }
+ ], function (data) {
+ frappe.route_options = {
+ make_new: true,
+ doctype: me.frm.doctype,
+ name: data.print_format_name,
+ based_on: data.based_on
+ };
+ frappe.set_route("print-format-builder");
+ }, __("New Custom Print Format"), __("Start"));
});
},
set_user_lang: function () {
@@ -578,4 +601,3 @@ frappe.ui.form.qz_fail = function (e) {
indicator: 'red'
}, 20);
}
-
diff --git a/frappe/public/js/frappe/model/create_new.js b/frappe/public/js/frappe/model/create_new.js
index 74ce746123..7f409a4b0f 100644
--- a/frappe/public/js/frappe/model/create_new.js
+++ b/frappe/public/js/frappe/model/create_new.js
@@ -90,7 +90,7 @@ $.extend(frappe.model, {
for(var fid=0;fid
frappe.model.trigger(key, value, doc));
} else {
// execute link triggers (want to reselect to execute triggers)
- if(fieldtype=="Link" && doc) {
+ if(in_list(["Link", "Dynamic Link"], fieldtype) && doc) {
tasks.push(() => frappe.model.trigger(key, value, doc));
}
}
diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js
index e37b405074..cc4433aa29 100644
--- a/frappe/public/js/frappe/utils/utils.js
+++ b/frappe/public/js/frappe/utils/utils.js
@@ -716,6 +716,9 @@ Object.assign(frappe.utils, {
indicator: 'green',
message: __('Copied to clipboard.')
});
+ },
+ is_rtl() {
+ return ["ar", "he", "fa"].includes(frappe.boot.lang);
}
});
@@ -736,4 +739,3 @@ if (!Array.prototype.uniqBy) {
}
});
}
-
diff --git a/frappe/public/js/frappe/views/communication.js b/frappe/public/js/frappe/views/communication.js
index 376879f199..2f52b3b4af 100755
--- a/frappe/public/js/frappe/views/communication.js
+++ b/frappe/public/js/frappe/views/communication.js
@@ -253,6 +253,8 @@ frappe.views.CommunicationComposer = Class.extend({
$.extend(last_edited_communication, {
sender: me.dialog.get_value("sender"),
recipients: me.dialog.get_value("recipients"),
+ cc: me.dialog.get_value("cc"),
+ bcc: me.dialog.get_value("bcc"),
subject: me.dialog.get_value("subject"),
content: me.dialog.get_value("content"),
});
@@ -265,6 +267,8 @@ frappe.views.CommunicationComposer = Class.extend({
me.dialog.set_value("sender", last_edited_communication.sender || "");
me.dialog.set_value("subject", last_edited_communication.subject || "");
me.dialog.set_value("recipients", last_edited_communication.recipients || "");
+ me.dialog.set_value("cc", last_edited_communication.cc || "");
+ me.dialog.set_value("bcc", last_edited_communication.bcc || "");
me.dialog.set_value("content", last_edited_communication.content || "");
}
}
diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js
index 916bde10c3..9648f65416 100644
--- a/frappe/public/js/frappe/views/reports/query_report.js
+++ b/frappe/public/js/frappe/views/reports/query_report.js
@@ -457,6 +457,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
layout: 'fixed',
cellHeight: 33,
showTotalRow: this.raw_data.add_total_row,
+ direction: frappe.utils.is_rtl() ? 'rtl' : 'ltr',
hooks: {
columnTotal: frappe.utils.report_column_total
}
@@ -468,6 +469,9 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
this.datatable = new DataTable(this.$report[0], datatable_options);
}
+ if (typeof this.report_settings.initial_depth == "number") {
+ this.datatable.rowmanager.setTreeDepth(this.report_settings.initial_depth);
+ }
if (this.report_settings.after_datatable_render) {
this.report_settings.after_datatable_render(this.datatable);
}
@@ -789,8 +793,9 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
print_settings: print_settings,
landscape: landscape,
filters: this.get_filter_values(),
- data: custom_format ? this.data : this.get_data_for_print(),
+ data: this.get_data_for_print(),
columns: custom_format ? this.columns : this.get_columns_for_print(),
+ original_data: this.data,
report: this
});
}
@@ -802,7 +807,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
const custom_format = this.report_settings.html_format || null;
const columns = custom_format ? this.columns : this.get_columns_for_print();
- const data = custom_format ? this.data : this.get_data_for_print();
+ const data = this.get_data_for_print();
const applied_filters = this.get_filter_values();
const filters_html = this.get_filters_html_for_print();
@@ -811,6 +816,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
subtitle: filters_html,
filters: applied_filters,
data: data,
+ original_data: this.data,
columns: columns,
report: this
});
@@ -924,7 +930,6 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
return this.data[index];
}
}).filter(Boolean);
-
let totalRow = this.datatable.bodyRenderer.getTotalRow().reduce((row, cell) => {
row[cell.column.id] = cell.content;
return row;
diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js
index 62f2092b4f..112ad4edde 100644
--- a/frappe/public/js/frappe/views/reports/report_view.js
+++ b/frappe/public/js/frappe/views/reports/report_view.js
@@ -265,6 +265,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
checkboxColumn: true,
inlineFilters: true,
cellHeight: 35,
+ direction: frappe.utils.is_rtl() ? 'rtl' : 'ltr',
events: {
onRemoveColumn: (column) => {
this.remove_column_from_datatable(column);
@@ -526,7 +527,20 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
.then((updated_doc) => {
const _data = this.data.find(d => d.name === updated_doc.name);
for (let field in _data) {
- _data[field] = updated_doc[field];
+ if (field.includes(':')) {
+ // child table field
+ const [cdt, _field] = field.split(':');
+ const cdt_row = Object.keys(updated_doc)
+ .filter(key => Array.isArray(updated_doc[key]) && updated_doc[key][0].doctype === cdt)
+ .map(key => updated_doc[key])
+ .map(a => a[0])
+ .filter(cdoc => cdoc.name === _data[cdt + ':name'])[0];
+ if (cdt_row) {
+ _data[field] = cdt_row[_field];
+ }
+ } else {
+ _data[field] = updated_doc[field];
+ }
}
})
.then(() => this.refresh_charts());
diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js
new file mode 100644
index 0000000000..aa2933b2b0
--- /dev/null
+++ b/frappe/public/js/legacy/form.js
@@ -0,0 +1,1035 @@
+// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+// MIT License. See license.txt
+
+/* Form page structure
+
+ + this.parent (either FormContainer or Dialog)
+ + this.wrapper
+ + this.toolbar
+ + this.form_wrapper
+ + this.head
+ + this.body
+ + this.layout
+ + this.sidebar
+ + this.footer
+*/
+
+/* eslint-disable no-console */
+
+frappe.provide('_f');
+frappe.provide('frappe.ui.form');
+
+frappe.ui.form.Controller = Class.extend({
+ init: function(opts) {
+ $.extend(this, opts);
+ }
+});
+
+_f.frms = {};
+
+_f.Frm = function(doctype, parent, in_form) {
+ this.docname = '';
+ this.doctype = doctype;
+ this.hidden = false;
+ this.refresh_if_stale_for = 120;
+
+ var me = this;
+ this.opendocs = {};
+ this.custom_buttons = {};
+ this.sections = [];
+ this.grids = [];
+ this.cscript = new frappe.ui.form.Controller({frm:this});
+ this.events = {};
+ this.pformat = {};
+ this.fetch_dict = {};
+ this.parent = parent;
+ this.tinymce_id_list = [];
+
+ this.setup_meta(doctype);
+
+ // show in form instead of in dialog, when called using url (router.js)
+ this.in_form = in_form ? true : false;
+
+ // notify on rename
+ $(document).on('rename', function(event, dt, old_name, new_name) {
+ if(dt==me.doctype)
+ me.rename_notify(dt, old_name, new_name);
+ });
+};
+
+_f.Frm.prototype.check_doctype_conflict = function(docname) {
+ if(this.doctype=='DocType' && docname=='DocType') {
+ frappe.msgprint(__('Allowing DocType, DocType. Be careful!'));
+ } else if(this.doctype=='DocType') {
+ if (frappe.views.formview[docname] || frappe.pages['List/'+docname]) {
+ window.location.reload();
+ // frappe.msgprint(__("Cannot open {0} when its instance is open", ['DocType']))
+ // throw 'doctype open conflict'
+ }
+ } else {
+ if (frappe.views.formview.DocType && frappe.views.formview.DocType.frm.opendocs[this.doctype]) {
+ window.location.reload();
+ // frappe.msgprint(__("Cannot open instance when its {0} is open", ['DocType']))
+ // throw 'doctype open conflict'
+ }
+ }
+};
+
+_f.Frm.prototype.setup = function() {
+ this.fields = [];
+ this.fields_dict = {};
+ this.state_fieldname = frappe.workflow.get_state_fieldname(this.doctype);
+
+ // wrapper
+ this.wrapper = this.parent;
+ this.$wrapper = $(this.wrapper);
+ frappe.ui.make_app_page({
+ parent: this.wrapper,
+ single_column: this.meta.hide_toolbar
+ });
+ this.page = this.wrapper.page;
+ this.layout_main = this.page.main.get(0);
+
+ this.toolbar = new frappe.ui.form.Toolbar({
+ frm: this,
+ page: this.page
+ });
+
+ // print layout
+ this.setup_print_layout();
+
+ // 2 column layout
+ this.setup_std_layout();
+
+ // client script must be called after "setup" - there are no fields_dict attached to the frm otherwise
+ this.script_manager = new frappe.ui.form.ScriptManager({
+ frm: this
+ });
+ this.script_manager.setup();
+ this.watch_model_updates();
+
+ if(!this.meta.hide_toolbar) {
+ this.footer = new frappe.ui.form.Footer({
+ frm: this,
+ parent: $('').appendTo(this.page.main.parent())
+ });
+ $("body").attr("data-sidebar", 1);
+ }
+ this.setup_drag_drop();
+
+ this.setup_done = true;
+};
+
+_f.Frm.prototype.setup_drag_drop = function() {
+ var me = this;
+ this.$wrapper.on('dragenter dragover', false)
+ .on('drop', function(e) {
+ var dataTransfer = e.originalEvent.dataTransfer;
+ if (!(dataTransfer && dataTransfer.files && dataTransfer.files.length > 0)) {
+ return;
+ }
+
+ e.stopPropagation();
+ e.preventDefault();
+
+ if(me.doc.__islocal) {
+ frappe.msgprint(__("Please save before attaching."));
+ throw "attach error";
+ }
+
+ if(me.attachments.max_reached()) {
+ frappe.msgprint(__("Maximum Attachment Limit for this record reached."));
+ throw "attach error";
+ }
+
+ frappe.upload.make({
+ args: me.attachments.get_args(),
+ files: dataTransfer.files,
+ callback: function(attachment, r) {
+ me.attachments.attachment_uploaded(attachment, r);
+ }
+ });
+ });
+};
+
+_f.Frm.prototype.setup_print_layout = function() {
+ var me = this;
+ this.print_preview = new frappe.ui.form.PrintPreview({
+ frm: this
+ });
+
+ // show edit button for print view
+ this.page.wrapper.on('view-change', function() {
+ me.toolbar.set_primary_action();
+ });
+};
+
+_f.Frm.prototype.print_doc = function() {
+ if(this.print_preview.wrapper.is(":visible")) {
+ this.hide_print();
+ return;
+ }
+ if(!frappe.model.can_print(this.doc.doctype, this)) {
+ frappe.msgprint(__("You are not allowed to print this document"));
+ return;
+ }
+
+ this.print_preview.refresh_print_options().trigger("change");
+ this.page.set_view("print");
+ this.print_preview.set_user_lang();
+ this.print_preview.set_default_print_language();
+ this.print_preview.preview();
+};
+
+_f.Frm.prototype.hide_print = function() {
+ if(this.setup_done && this.page.current_view_name==="print") {
+ this.page.set_view(this.page.previous_view_name==="print" ?
+ "main" : (this.page.previous_view_name || "main"));
+ }
+};
+
+_f.Frm.prototype.watch_model_updates = function() {
+ // watch model updates
+ var me = this;
+
+ // on main doc
+ frappe.model.on(me.doctype, "*", function(fieldname, value, doc) {
+ // set input
+ if(doc.name===me.docname) {
+ if ((value==='' || value===null) && !doc[fieldname]) {
+ // both the incoming and outgoing values are falsy
+ // the texteditor, summernote, changes nulls to empty strings on render,
+ // so ignore those changes
+ } else {
+ me.dirty();
+ }
+ me.fields_dict[fieldname]
+ && me.fields_dict[fieldname].refresh(fieldname);
+
+ me.layout.refresh_dependency();
+ let object = me.script_manager.trigger(fieldname, doc.doctype, doc.name);
+ return object;
+ }
+ });
+
+ // on table fields
+ var table_fields = frappe.get_children("DocType", me.doctype, "fields", {fieldtype:"Table"});
+
+ // using $.each to preserve df via closure
+ $.each(table_fields, function(i, df) {
+ frappe.model.on(df.options, "*", function(fieldname, value, doc) {
+ if(doc.parent===me.docname && doc.parentfield===df.fieldname) {
+ me.dirty();
+ me.fields_dict[df.fieldname].grid.set_value(fieldname, value, doc);
+ me.script_manager.trigger(fieldname, doc.doctype, doc.name);
+ }
+ });
+ });
+};
+
+_f.Frm.prototype.setup_std_layout = function() {
+ this.form_wrapper = $('
').appendTo(this.layout_main);
+ this.body = $('
').appendTo(this.form_wrapper);
+
+ // only tray
+ this.meta.section_style='Simple'; // always simple!
+
+ // layout
+ this.layout = new frappe.ui.form.Layout({
+ parent: this.body,
+ doctype: this.doctype,
+ frm: this,
+ with_dashboard: true
+ });
+ this.layout.make();
+
+ this.fields_dict = this.layout.fields_dict;
+ this.fields = this.layout.fields_list;
+
+ this.document_flow = new frappe.ui.form.DocumentFlow({
+ frm: this
+ });
+
+ this.dashboard = new frappe.ui.form.Dashboard({
+ frm: this,
+ });
+
+ // state
+ this.states = new frappe.ui.form.States({
+ frm: this
+ });
+};
+
+// email the form
+_f.Frm.prototype.email_doc = function(message) {
+ new frappe.views.CommunicationComposer({
+ doc: this.doc,
+ frm: this,
+ subject: __(this.meta.name) + ': ' + this.docname,
+ recipients: this.doc.email || this.doc.email_id || this.doc.contact_email,
+ attach_document_print: true,
+ message: message,
+ real_name: this.doc.real_name || this.doc.contact_display || this.doc.contact_name
+ });
+};
+
+// rename the form
+_f.Frm.prototype.rename_doc = function() {
+ frappe.model.rename_doc(this.doctype, this.docname);
+};
+
+_f.Frm.prototype.share_doc = function() {
+ this.shared.show();
+};
+
+// notify this form of renamed records
+_f.Frm.prototype.rename_notify = function(dt, old, name) {
+ // from form
+ if(this.meta.istable)
+ return;
+
+ if(this.docname == old)
+ this.docname = name;
+ else
+ return;
+
+ // cleanup
+ if(this && this.opendocs[old] && frappe.meta.docfield_copy[dt]) {
+ // delete docfield copy
+ frappe.meta.docfield_copy[dt][name] = frappe.meta.docfield_copy[dt][old];
+ delete frappe.meta.docfield_copy[dt][old];
+ }
+
+ delete this.opendocs[old];
+ this.opendocs[name] = true;
+
+ if(this.meta.in_dialog || !this.in_form) {
+ return;
+ }
+
+ frappe.re_route[window.location.hash] = '#Form/' + encodeURIComponent(this.doctype) + '/' + encodeURIComponent(name);
+ frappe.set_route('Form', this.doctype, name);
+};
+
+// SETUP
+
+_f.Frm.prototype.setup_meta = function() {
+ this.meta = frappe.get_doc('DocType', this.doctype);
+ this.perm = frappe.perm.get_perm(this.doctype); // for create
+ if(this.meta.istable) {
+ this.meta.in_dialog = 1;
+ }
+};
+
+_f.Frm.prototype.refresh_header = function(is_a_different_doc) {
+ // set title
+ // main title
+ if(!this.meta.in_dialog || this.in_form) {
+ frappe.utils.set_title(this.meta.issingle ? this.doctype : this.docname);
+ }
+
+ // show / hide buttons
+ if(this.toolbar) {
+ if (is_a_different_doc) {
+ this.toolbar.current_status = undefined;
+ }
+
+ this.toolbar.refresh();
+ }
+
+ this.document_flow.refresh();
+ this.dashboard.refresh();
+
+ if(this.meta.is_submittable
+ && this.perm[0] && this.perm[0].submit
+ && !this.is_dirty()
+ && !this.is_new()
+ && !frappe.model.has_workflow(this.doctype) // show only if no workflow
+ && this.doc.docstatus===0) {
+ this.dashboard.add_comment(__('Submit this document to confirm'), 'orange', true);
+ }
+
+ this.clear_custom_buttons();
+
+ this.show_web_link();
+};
+
+_f.Frm.prototype.show_web_link = function() {
+ var doc = this.doc, me = this;
+ if(!doc.__islocal && doc.__onload && doc.__onload.is_website_generator) {
+ me.web_link && me.web_link.remove();
+ if(doc.__onload.published) {
+ me.add_web_link("/" + doc.route);
+ }
+ }
+};
+
+_f.Frm.prototype.add_web_link = function(path, label) {
+ label = label || "See on Website";
+ this.web_link = this.sidebar.add_user_action(__(label),
+ function() {}).attr("href", path || this.doc.route).attr("target", "_blank");
+};
+
+_f.Frm.prototype.check_doc_perm = function() {
+ // get perm
+ var dt = this.parent_doctype?this.parent_doctype : this.doctype;
+ this.perm = frappe.perm.get_perm(dt, this.doc);
+
+ if(!this.perm[0].read) {
+ return 0;
+ }
+ return 1;
+};
+
+_f.Frm.prototype.refresh = function(docname) {
+ var is_a_different_doc = docname ? true : false;
+
+ if(docname) {
+ // record switch
+ if(this.docname != docname && (!this.meta.in_dialog || this.in_form) && !this.meta.istable) {
+ frappe.utils.scroll_to(0);
+ this.hide_print();
+ }
+ // reset visible columns, since column headings can change in different docs
+ this.grids.forEach(grid_obj => grid_obj.grid.visible_columns = null);
+ frappe.ui.form.close_grid_form();
+ this.docname = docname;
+ }
+
+ cur_frm = this;
+
+ if(this.docname) { // document to show
+
+ // set the doc
+ this.doc = frappe.get_doc(this.doctype, this.docname);
+
+ // check permissions
+ if(!this.check_doc_perm()) {
+ frappe.show_not_permitted(__(this.doctype) + " " + __(this.docname));
+ return;
+ }
+
+ // read only (workflow)
+ this.read_only = frappe.workflow.is_read_only(this.doctype, this.docname);
+ if (this.read_only) this.set_read_only(true);
+
+ // check if doctype is already open
+ if (!this.opendocs[this.docname]) {
+ this.check_doctype_conflict(this.docname);
+ } else {
+ if(this.doc && (!this.doc.__unsaved) && this.doc.__last_sync_on &&
+ (new Date() - this.doc.__last_sync_on) > (this.refresh_if_stale_for * 1000)) {
+ this.reload_doc();
+ return;
+ }
+ }
+
+ // do setup
+ if(!this.setup_done) {
+ this.setup();
+ }
+
+ // load the record for the first time, if not loaded (call 'onload')
+ this.cscript.is_onload = false;
+ if(!this.opendocs[this.docname]) {
+ var me = this;
+ this.cscript.is_onload = true;
+ this.setnewdoc();
+ $(document).trigger("form-load", [this]);
+ $(this.page.wrapper).on('hide', function() {
+ $(document).trigger("form-unload", [me]);
+ });
+ } else {
+ this.render_form(is_a_different_doc);
+ if (this.doc.localname) {
+ // trigger form-rename and remove .localname
+ delete this.doc.localname;
+ $(document).trigger("form-rename", [this]);
+ }
+ }
+
+ // if print format is shown, refresh the format
+ if(this.print_preview.wrapper.is(":visible")) {
+ this.print_preview.preview();
+ }
+
+ if(is_a_different_doc) {
+ if(this.show_print_first && this.doc.docstatus===1) {
+ // show print view
+ this.print_doc();
+ }
+ }
+
+ // set status classes
+ this.$wrapper.removeClass('validated-form')
+ .toggleClass('editable-form', this.doc.docstatus===0)
+ .toggleClass('submitted-form', this.doc.docstatus===1)
+ .toggleClass('cancelled-form', this.doc.docstatus===2);
+
+ this.show_if_needs_refresh();
+ }
+};
+
+_f.Frm.prototype.show_if_needs_refresh = function() {
+ if(this.doc.__needs_refresh) {
+ if(this.doc.__unsaved) {
+ this.dashboard.clear_headline();
+ this.dashboard.set_headline_alert(__("This form has been modified after you have loaded it")
+ + '
'
+ + __("Refresh") + '', "alert-warning");
+ } else {
+ this.reload_doc();
+ }
+ }
+};
+
+_f.Frm.prototype.render_form = function(is_a_different_doc) {
+ if(!this.meta.istable) {
+ this.layout.doc = this.doc;
+ this.layout.attach_doc_and_docfields();
+
+ this.sidebar = new frappe.ui.form.Sidebar({
+ frm: this,
+ page: this.page
+ });
+ this.sidebar.make();
+
+ // clear layout message
+ this.layout.show_message();
+
+ frappe.run_serially([
+ // header must be refreshed before client methods
+ // because add_custom_button
+ () => this.refresh_header(is_a_different_doc),
+ // trigger global trigger
+ // to use this
+ () => $(document).trigger('form-refresh', [this]),
+ // fields
+ () => this.refresh_fields(),
+ // call trigger
+ () => this.script_manager.trigger("refresh"),
+ // call onload post render for callbacks to be fired
+ () => {
+ if(this.cscript.is_onload) {
+ return this.script_manager.trigger("onload_post_render");
+ }
+ },
+ () => this.dashboard.after_refresh()
+ ]);
+ // focus on first input
+
+ if(this.is_new()) {
+ var first = this.form_wrapper.find('.form-layout input:first');
+ if(!in_list(["Date", "Datetime"], first.attr("data-fieldtype"))) {
+ first.focus();
+ }
+ }
+ } else {
+ this.refresh_header(is_a_different_doc);
+ }
+
+ this.$wrapper.trigger('render_complete');
+
+ if(!this.hidden) {
+ this.layout.show_empty_form_message();
+ }
+
+ this.scroll_to_element();
+};
+
+_f.Frm.prototype.refresh_field = function(fname) {
+ if(this.fields_dict[fname] && this.fields_dict[fname].refresh) {
+ this.fields_dict[fname].refresh();
+ this.layout.refresh_dependency();
+ }
+};
+
+_f.Frm.prototype.refresh_fields = function() {
+ this.layout.refresh(this.doc);
+ this.layout.primary_button = this.$wrapper.find(".btn-primary");
+
+ // cleanup activities after refresh
+ this.cleanup_refresh(this);
+};
+
+
+_f.Frm.prototype.cleanup_refresh = function() {
+ var me = this;
+ if(me.fields_dict['amended_from']) {
+ if (me.doc.amended_from) {
+ unhide_field('amended_from');
+ if (me.fields_dict['amendment_date']) unhide_field('amendment_date');
+ } else {
+ hide_field('amended_from');
+ if (me.fields_dict['amendment_date']) hide_field('amendment_date');
+ }
+ }
+
+ if(me.fields_dict['trash_reason']) {
+ if(me.doc.trash_reason && me.doc.docstatus == 2) {
+ unhide_field('trash_reason');
+ } else {
+ hide_field('trash_reason');
+ }
+ }
+
+ if(me.meta.autoname && me.meta.autoname.substr(0,6)=='field:' && !me.doc.__islocal) {
+ var fn = me.meta.autoname.substr(6);
+
+ if (me.doc[fn]) {
+ me.toggle_display(fn, false);
+ }
+ }
+
+ if(me.meta.autoname=="naming_series:" && !me.doc.__islocal) {
+ me.toggle_display("naming_series", false);
+ }
+};
+
+_f.Frm.prototype.setnewdoc = function() {
+ // moved this call to refresh function
+ // this.check_doctype_conflict(docname);
+ var me = this;
+
+ // hide any open grid
+ this.script_manager.trigger("before_load", this.doctype, this.docname)
+ .then(() => {
+ me.script_manager.trigger("onload");
+ me.opendocs[me.docname] = true;
+ me.render_form();
+
+ frappe.after_ajax(function() {
+ me.trigger_link_fields();
+ });
+
+ frappe.breadcrumbs.add(me.meta.module, me.doctype);
+ });
+
+ // update seen
+ if(this.meta.track_seen) {
+ $('.list-id[data-name="'+ me.docname +'"]').addClass('seen');
+ }
+};
+
+_f.Frm.prototype.trigger_link_fields = function() {
+ // trigger link fields which have default values set
+ if (this.is_new() && this.doc.__run_link_triggers) {
+ $.each(this.fields_dict, function(fieldname, field) {
+ if (in_list(['Link', 'Dynamic Link'], field.df.fieldtype) && this.doc[fieldname]) {
+ // triggers add fetch, sets value in model and runs triggers
+ field.set_value(this.doc[fieldname]);
+ }
+ });
+
+ delete this.doc.__run_link_triggers;
+ }
+};
+
+_f.Frm.prototype.runscript = function(scriptname, callingfield, onrefresh) {
+ var me = this;
+ if(this.docname) {
+ // send to run
+ if(callingfield)
+ $(callingfield.input).set_working();
+
+ frappe.call({
+ method: "runserverobj",
+ args: {'docs':this.doc, 'method':scriptname },
+ btn: callingfield.$input,
+ callback: function(r) {
+ if(!r.exc) {
+ if(onrefresh) {
+ onrefresh(r);
+ }
+
+ me.refresh_fields();
+ }
+ }
+ });
+ }
+};
+
+_f.Frm.prototype.copy_doc = function(onload, from_amend) {
+ this.validate_form_action("Create");
+ var newdoc = frappe.model.copy_doc(this.doc, from_amend);
+
+ newdoc.idx = null;
+ newdoc.__run_link_triggers = false;
+ if(onload) {
+ onload(newdoc);
+ }
+ frappe.set_route('Form', newdoc.doctype, newdoc.name);
+};
+
+_f.Frm.prototype.reload_doc = function() {
+ this.check_doctype_conflict(this.docname);
+
+ var me = this;
+
+ if(!me.doc.__islocal) {
+ frappe.model.remove_from_locals(me.doctype, me.docname);
+ frappe.model.with_doc(me.doctype, me.docname, function() {
+ me.refresh();
+ });
+ }
+};
+
+frappe.validated = 0;
+// Proxy for frappe.validated
+Object.defineProperty(window, 'validated', {
+ get: function() {
+ console.warn('Please use `frappe.validated` instead of `validated`. It will be deprecated soon.');
+ return frappe.validated;
+ },
+ set: function(value) {
+ console.warn('Please use `frappe.validated` instead of `validated`. It will be deprecated soon.');
+ frappe.validated = value;
+ return frappe.validated;
+ }
+});
+
+_f.Frm.prototype.save = function(save_action, callback, btn, on_error) {
+ let me = this;
+ return new Promise((resolve, reject) => {
+ btn && $(btn).prop("disabled", true);
+ $(document.activeElement).blur();
+
+ frappe.ui.form.close_grid_form();
+ // let any pending js process finish
+ setTimeout(function() {
+ me._save(save_action, callback, btn, on_error, resolve, reject);
+ }, 100);
+ }).then(() => {
+ me.show_success_action();
+ }).catch((e) => {
+ console.error(e);
+ });
+};
+
+_f.Frm.prototype._save = function(save_action, callback, btn, on_error, resolve, reject) {
+ var me = this;
+ if(!save_action) save_action = "Save";
+ this.validate_form_action(save_action, resolve);
+
+ if((!this.meta.in_dialog || this.in_form) && !this.meta.istable) {
+ frappe.utils.scroll_to(0);
+ }
+ var after_save = function(r) {
+ if(!r.exc) {
+ if (["Save", "Update", "Amend"].indexOf(save_action)!==-1) {
+ frappe.utils.play_sound("click");
+ }
+
+ me.script_manager.trigger("after_save");
+ me.refresh();
+ } else {
+ if(on_error) {
+ on_error();
+ reject();
+ }
+ }
+ callback && callback(r);
+ resolve();
+ };
+
+ var fail = () => {
+ btn && $(btn).prop("disabled", false);
+ if(on_error) {
+ on_error();
+ reject();
+ }
+ };
+
+ if(save_action != "Update") {
+ // validate
+ frappe.validated = true;
+ frappe.run_serially([
+ () => this.script_manager.trigger("validate"),
+ () => this.script_manager.trigger("before_save"),
+ () => {
+ if(!frappe.validated) {
+ fail();
+ return;
+ }
+
+ frappe.ui.form.save(me, save_action, after_save, btn);
+ }
+ ]).catch(fail);
+ } else {
+ frappe.ui.form.save(me, save_action, after_save, btn);
+ }
+};
+
+
+_f.Frm.prototype.savesubmit = function(btn, callback, on_error) {
+ var me = this;
+
+ let handle_fail = () => {
+ $(btn).prop('disabled', false);
+ if (on_error) {
+ on_error();
+ }
+ };
+
+ return new Promise(resolve => {
+ this.validate_form_action("Submit");
+ frappe.confirm(__("Permanently Submit {0}?", [this.docname]), function() {
+ frappe.validated = true;
+ me.script_manager.trigger("before_submit").then(function() {
+ if(!frappe.validated) {
+ handle_fail();
+ return;
+ }
+
+ me.save('Submit', function(r) {
+ if(r.exc) {
+ handle_fail();
+ } else {
+ frappe.utils.play_sound("submit");
+ callback && callback();
+ me.script_manager.trigger("on_submit")
+ .then(() => resolve(me));
+ }
+ }, btn, () => handle_fail(), resolve);
+ });
+ }, () => handle_fail() );
+ });
+};
+
+_f.Frm.prototype.savecancel = function(btn, callback, on_error) {
+ var me = this;
+
+ let handle_fail = () => {
+ $(btn).prop('disabled', false);
+ if (on_error) {
+ on_error();
+ }
+ };
+
+ this.validate_form_action('Cancel');
+ frappe.confirm(__("Permanently Cancel {0}?", [this.docname]), function() {
+ frappe.validated = true;
+ me.script_manager.trigger("before_cancel").then(function() {
+ if(!frappe.validated) {
+ handle_fail();
+ return;
+ }
+
+ var after_cancel = function(r) {
+ if(r.exc) {
+ handle_fail();
+ } else {
+ frappe.utils.play_sound("cancel");
+ me.refresh();
+ callback && callback();
+ me.script_manager.trigger("after_cancel");
+ }
+ };
+ frappe.ui.form.save(me, "cancel", after_cancel, btn);
+ });
+ }, () => handle_fail());
+};
+
+// delete the record
+_f.Frm.prototype.savetrash = function() {
+ this.validate_form_action("Delete");
+ frappe.model.delete_doc(this.doctype, this.docname, function() {
+ window.history.back();
+ });
+};
+
+_f.Frm.prototype.amend_doc = function() {
+ if(!this.fields_dict['amended_from']) {
+ alert('"amended_from" field must be present to do an amendment.');
+ return;
+ }
+ this.validate_form_action("Amend");
+ var me = this;
+ var fn = function(newdoc) {
+ newdoc.amended_from = me.docname;
+ if(me.fields_dict && me.fields_dict['amendment_date'])
+ newdoc.amendment_date = frappe.datetime.obj_to_str(new Date());
+ };
+ this.copy_doc(fn, 1);
+ frappe.utils.play_sound("click");
+};
+
+_f.Frm.prototype.disable_save = function() {
+ // IMPORTANT: this function should be called in refresh event
+ this.save_disabled = true;
+ this.toolbar.current_status = null;
+ this.page.clear_primary_action();
+};
+
+_f.Frm.prototype.enable_save = function() {
+ this.save_disabled = false;
+ this.toolbar.set_primary_action();
+};
+
+_f.Frm.prototype.save_or_update = function() {
+ if(this.save_disabled) return;
+
+ if(this.doc.docstatus===0) {
+ this.save();
+ } else if(this.doc.docstatus===1 && this.doc.__unsaved) {
+ this.save("Update");
+ }
+};
+
+_f.Frm.prototype.dirty = function() {
+ this.doc.__unsaved = 1;
+ this.$wrapper.trigger('dirty');
+};
+
+_f.Frm.prototype.get_docinfo = function() {
+ return frappe.model.docinfo[this.doctype][this.docname];
+};
+
+_f.Frm.prototype.is_dirty = function() {
+ return this.doc.__unsaved;
+};
+
+_f.Frm.prototype.is_new = function() {
+ return this.doc.__islocal;
+};
+
+
+_f.Frm.prototype.reload_docinfo = function(callback) {
+ var me = this;
+ frappe.call({
+ method: "frappe.desk.form.load.get_docinfo",
+ args: {
+ doctype: me.doctype,
+ name: me.doc.name
+ },
+ callback: function(r) {
+ // docinfo will be synced
+ if(callback) callback(r.docinfo);
+ me.timeline.refresh();
+ me.assign_to.refresh();
+ me.attachments.refresh();
+ }
+ });
+};
+
+
+_f.Frm.prototype.get_perm = function(permlevel, access_type) {
+ return this.perm[permlevel] ? this.perm[permlevel][access_type] : null;
+};
+
+
+_f.Frm.prototype.set_intro = function(txt) {
+ this.dashboard.set_headline_alert(txt);
+};
+
+_f.Frm.prototype.set_footnote = function(txt) {
+ this.footnote_area = frappe.utils.set_footnote(this.footnote_area, this.body, txt);
+};
+
+
+_f.Frm.prototype.add_custom_button = function(label, fn, group) {
+ // temp! old parameter used to be icon
+ if(group && group.indexOf("fa fa-")!==-1) group = null;
+ var btn = this.page.add_inner_button(label, fn, group);
+ if(btn) {
+ this.custom_buttons[label] = btn;
+ }
+ return btn;
+};
+
+//Remove all custom buttons
+_f.Frm.prototype.clear_custom_buttons = function() {
+ this.page.clear_inner_toolbar();
+ this.page.clear_user_actions();
+ this.custom_buttons = {};
+};
+
+//Remove specific custom button by button Label
+_f.Frm.prototype.remove_custom_button = function(label, group) {
+ this.page.remove_inner_button(label, group);
+};
+
+_f.Frm.prototype.add_fetch = function(link_field, src_field, tar_field) {
+ if(!this.fetch_dict[link_field]) {
+ this.fetch_dict[link_field] = {'columns':[], 'fields':[]};
+ }
+ this.fetch_dict[link_field].columns.push(src_field);
+ this.fetch_dict[link_field].fields.push(tar_field);
+};
+
+_f.Frm.prototype.set_print_heading = function(txt) {
+ this.pformat[this.docname] = txt;
+};
+
+_f.Frm.prototype.action_perm_type_map = {
+ "Create": "create",
+ "Save": "write",
+ "Submit": "submit",
+ "Update": "submit",
+ "Cancel": "cancel",
+ "Amend": "amend",
+ "Delete": "delete"
+};
+
+_f.Frm.prototype.validate_form_action = function(action, resolve) {
+ var perm_to_check = this.action_perm_type_map[action];
+ var allowed_for_workflow = false;
+ var perms = frappe.perm.get_perm(this.doc.doctype)[0];
+
+ // Allow submit, write, cancel and create permissions for read only documents that are assigned by
+ // workflows if the user already have those permissions. This is to allow for users to
+ // continue through the workflow states and to allow execution of functions like Duplicate.
+ if ((frappe.workflow.is_read_only(this.doctype, this.docname) && (perms["write"] ||
+ perms["create"] || perms["submit"] || perms["cancel"])) || !frappe.workflow.is_read_only(this.doctype, this.docname)) {
+ allowed_for_workflow = true;
+ }
+
+ if (!this.perm[0][perm_to_check] && !allowed_for_workflow) {
+ if(resolve) {
+ // re-enable buttons
+ resolve();
+ }
+ frappe.throw (__("No permission to '{0}' {1}", [__(action), __(this.doc.doctype)]));
+ }
+};
+
+_f.Frm.prototype.has_perm = function(ptype) {
+ return frappe.perm.has_perm(this.doctype, 0, ptype, this.doc);
+};
+
+_f.Frm.prototype.scroll_to_element = function() {
+ if (frappe.route_options && frappe.route_options.scroll_to) {
+ var scroll_to = frappe.route_options.scroll_to;
+ delete frappe.route_options.scroll_to;
+
+ var selector = [];
+ for (var key in scroll_to) {
+ var value = scroll_to[key];
+ selector.push(repl('[data-%(key)s="%(value)s"]', {key: key, value: value}));
+ }
+
+ selector = $(selector.join(" "));
+ if (selector.length) {
+ frappe.utils.scroll_to(selector);
+ }
+ }
+};
+
+_f.Frm.prototype.show_success_action = function() {
+ const route = frappe.get_route();
+ if (route[0] !== 'Form') return;
+ if (this.meta.is_submittable && this.doc.docstatus !== 1) return;
+
+ const success_action = new frappe.ui.form.SuccessAction(this);
+ success_action.show();
+};
+
+_f.Frm.prototype.is_first_creation = function() {
+ let { modified, creation } = this.doc;
+
+ // strip out milliseconds
+ modified = modified.split('.')[0];
+ creation = creation.split('.')[0];
+
+ return modified === creation;
+};
diff --git a/frappe/tests/test_document.py b/frappe/tests/test_document.py
index 44d87746da..4c48ef2811 100644
--- a/frappe/tests/test_document.py
+++ b/frappe/tests/test_document.py
@@ -5,7 +5,6 @@ from __future__ import unicode_literals
import frappe, unittest, os
from frappe.utils import cint
from frappe.model.naming import revert_series_if_last, make_autoname, parse_naming_series
-from frappe.utils.testutils import add_custom_field, clear_custom_fields
class TestDocument(unittest.TestCase):
def test_get_return_empty_list_for_table_field_if_none(self):
@@ -237,20 +236,3 @@ class TestDocument(unittest.TestCase):
new_current = cint(frappe.db.get_value('Series', prefix, "current", order_by="name"))
self.assertEqual(cint(old_current) - 1, new_current)
-
- def test_default_of_dependent_field(self):
- add_custom_field('ToDo', 'parent_field', 'Data')
-
- add_custom_field('ToDo', 'dependent_field', 'Data',
- default='Some Data', depends_on='parent_field')
-
- add_custom_field('ToDo', 'independent_field', 'Data',
- default='Some Data')
-
-
- doc = frappe.new_doc('ToDo')
-
- self.assertFalse(doc.get('dependent_field'))
- self.assertEqual(doc.get('independent_field'), 'Some Data')
-
- clear_custom_fields('ToDo')
\ No newline at end of file
diff --git a/frappe/utils/testutils.py b/frappe/utils/testutils.py
index e47cf3d90f..4af3ad647c 100644
--- a/frappe/utils/testutils.py
+++ b/frappe/utils/testutils.py
@@ -4,15 +4,13 @@ from __future__ import unicode_literals
import frappe
-def add_custom_field(doctype, fieldname, fieldtype='Data', options=None, default=None, depends_on=None):
+def add_custom_field(doctype, fieldname, fieldtype='Data', options=None):
frappe.get_doc({
"doctype": "Custom Field",
"dt": doctype,
"fieldname": fieldname,
"fieldtype": fieldtype,
- "options": options,
- "default": default,
- "depends_on": depends_on
+ "options": options
}).insert()
def clear_custom_fields(doctype):
diff --git a/frappe/utils/user.py b/frappe/utils/user.py
index 22f1e964e3..f4b4ec91d4 100755
--- a/frappe/utils/user.py
+++ b/frappe/utils/user.py
@@ -315,7 +315,6 @@ def disable_users(limits=None):
user_list = ['Administrator', 'Guest']
if system_manager:
user_list.append(system_manager[-1])
-
#exclude system manager from active user list
# active_users = frappe.db.sql_list("""select name from tabUser
# where name not in ('Administrator', 'Guest', %s) and user_type = 'System User' and enabled=1
diff --git a/frappe/website/js/website.js b/frappe/website/js/website.js
index d90df16fb7..384167715c 100644
--- a/frappe/website/js/website.js
+++ b/frappe/website/js/website.js
@@ -374,7 +374,7 @@ $.extend(frappe, {
// Utility functions
window.valid_email = function(id) {
- // eslint-disable-next-line
+ // eslint-disable-next-line
return /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/.test(id.toLowerCase());
}
diff --git a/frappe/www/login.py b/frappe/www/login.py
index f34664e1e2..c21cea2d7f 100644
--- a/frappe/www/login.py
+++ b/frappe/www/login.py
@@ -38,7 +38,6 @@ def get_context(context):
"icon": icon
})
context["social_login"] = True
-
ldap_settings = get_ldap_client_settings()
context["ldap_settings"] = ldap_settings