diff --git a/frappe/__init__.py b/frappe/__init__.py index 90b35f8bfc..f0c2fb7e1e 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -13,7 +13,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template -__version__ = '8.0.7' +__version__ = '8.0.8' __title__ = "Frappe Framework" local = Local() @@ -1321,3 +1321,14 @@ def get_desk_link(doctype, name): def bold(text): return '{0}'.format(text) + +def safe_eval(code, eval_globals=None, eval_locals=None): + '''A safer `eval`''' + if '__' in code: + throw('Illegal rule {0}. Cannot use "__"'.format(bold(code))) + + if not eval_globals: + eval_globals = {} + eval_globals['__builtins__'] = {} + + return eval(code, eval_globals, eval_locals) \ No newline at end of file diff --git a/frappe/app.py b/frappe/app.py index 2cfeafb426..5feecb7823 100644 --- a/frappe/app.py +++ b/frappe/app.py @@ -134,6 +134,12 @@ def handle_exception(e): # code 409 represents conflict http_status_code = 508 + if http_status_code==401: + frappe.respond_as_web_page(_("Session Expired"), + _("Your session has expired, please login again to continue."), + http_status_code=http_status_code, indicator_color='red') + return_as_message = True + if http_status_code==403: frappe.respond_as_web_page(_("Not Permitted"), _("You do not have enough permissions to complete the action"), diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index becf114966..820553e9ab 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -1,1306 +1,1306 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "hash", - "beta": 0, - "creation": "2013-02-22 01:27:33", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "Setup", - "editable_grid": 1, + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "hash", + "beta": 0, + "creation": "2013-02-22 01:27:33", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Setup", + "editable_grid": 1, "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "label_and_type", - "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, - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "label_and_type", + "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, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "fieldname": "label", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Label", - "length": 0, - "no_copy": 0, - "oldfieldname": "label", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "163", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "label", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Label", + "length": 0, + "no_copy": 0, + "oldfieldname": "label", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "163", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0, "width": "163" - }, + }, { - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "default": "Data", - "fieldname": "fieldtype", - "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": 0, - "label": "Type", - "length": 0, - "no_copy": 0, - "oldfieldname": "fieldtype", - "oldfieldtype": "Select", - "options": "Attach\nAttach Image\nButton\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nFold\nHeading\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nText\nText Editor\nTime", - "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, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "default": "Data", + "fieldname": "fieldtype", + "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": 0, + "label": "Type", + "length": 0, + "no_copy": 0, + "oldfieldname": "fieldtype", + "oldfieldtype": "Select", + "options": "Attach\nAttach Image\nButton\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nFold\nHeading\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nText\nText Editor\nTime\nSignature", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "fieldname": "fieldname", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Name", - "length": 0, - "no_copy": 0, - "oldfieldname": "fieldname", - "oldfieldtype": "Data", - "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": 1, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "fieldname", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Name", + "length": 0, + "no_copy": 0, + "oldfieldname": "fieldname", + "oldfieldtype": "Data", + "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": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "reqd", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Mandatory", - "length": 0, - "no_copy": 0, - "oldfieldname": "reqd", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reqd", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Mandatory", + "length": 0, + "no_copy": 0, + "oldfieldname": "reqd", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:in_list([\"Float\", \"Currency\", \"Percent\"], doc.fieldtype)", - "description": "Set non-standard precision for a Float or Currency field", - "fieldname": "precision", - "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": "Precision", - "length": 0, - "no_copy": 0, - "options": "\n1\n2\n3\n4\n5\n6\n7\n8\n9", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:in_list([\"Float\", \"Currency\", \"Percent\"], doc.fieldtype)", + "description": "Set non-standard precision for a Float or Currency field", + "fieldname": "precision", + "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": "Precision", + "length": 0, + "no_copy": 0, + "options": "\n1\n2\n3\n4\n5\n6\n7\n8\n9", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:in_list(['Data', 'Link', 'Dynamic Link', 'Password', 'Select', 'Read Only', 'Attach', 'Attach Image'], doc.fieldtype)", - "fieldname": "length", - "fieldtype": "Int", - "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", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:in_list(['Data', 'Link', 'Dynamic Link', 'Password', 'Select', 'Read Only', 'Attach', 'Attach Image'], doc.fieldtype)", + "fieldname": "length", + "fieldtype": "Int", + "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", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "search_index", - "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": "Index", - "length": 0, - "no_copy": 0, - "oldfieldname": "search_index", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "search_index", + "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": "Index", + "length": 0, + "no_copy": 0, + "oldfieldname": "search_index", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "in_list_view", - "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": "In List View", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "70px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "in_list_view", + "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": "In List View", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "70px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "70px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "in_standard_filter", - "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": "In Standard Filter", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "in_standard_filter", + "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": "In Standard Filter", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:([\"Data\", \"Select\", \"Table\", \"Text\", \"Text Editor\", \"Link\", \"Small Text\", \"Long Text\", \"Read Only\", \"Heading\", \"Dynamic Link\"].indexOf(doc.fieldtype) !== -1)", - "fieldname": "in_global_search", - "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": "In Global Search", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:([\"Data\", \"Select\", \"Table\", \"Text\", \"Text Editor\", \"Link\", \"Small Text\", \"Long Text\", \"Read Only\", \"Heading\", \"Dynamic Link\"].indexOf(doc.fieldtype) !== -1)", + "fieldname": "in_global_search", + "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": "In Global Search", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "bold", - "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": "Bold", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "bold", + "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": "Bold", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.fieldtype===\"Section Break\"", - "fieldname": "collapsible", - "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": "Collapsible", - "length": 255, - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.fieldtype===\"Section Break\"", + "fieldname": "collapsible", + "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": "Collapsible", + "length": 255, + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.fieldtype==\"Section Break\"", - "fieldname": "collapsible_depends_on", - "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": "Collapsible Depends On", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.fieldtype==\"Section Break\"", + "fieldname": "collapsible_depends_on", + "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": "Collapsible Depends On", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_6", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_6", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "For Links, enter the DocType as range.\nFor Select, enter list of Options, each on a new line.", - "fieldname": "options", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Options", - "length": 0, - "no_copy": 0, - "oldfieldname": "options", - "oldfieldtype": "Text", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "For Links, enter the DocType as range.\nFor Select, enter list of Options, each on a new line.", + "fieldname": "options", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Options", + "length": 0, + "no_copy": 0, + "oldfieldname": "options", + "oldfieldtype": "Text", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "default", - "fieldtype": "Small Text", - "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", - "length": 0, - "no_copy": 0, - "oldfieldname": "default", - "oldfieldtype": "Text", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default", + "fieldtype": "Small Text", + "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", + "length": 0, + "no_copy": 0, + "oldfieldname": "default", + "oldfieldtype": "Text", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "permissions", - "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": "Permissions", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "permissions", + "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": "Permissions", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "depends_on", - "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": "Display Depends On", - "length": 255, - "no_copy": 0, - "oldfieldname": "depends_on", - "oldfieldtype": "Data", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "depends_on", + "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": "Display Depends On", + "length": 255, + "no_copy": 0, + "oldfieldname": "depends_on", + "oldfieldtype": "Data", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "hidden", - "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": "Hidden", - "length": 0, - "no_copy": 0, - "oldfieldname": "hidden", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "hidden", + "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": "Hidden", + "length": 0, + "no_copy": 0, + "oldfieldname": "hidden", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "read_only", - "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": "Read Only", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "read_only", + "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": "Read Only", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "unique", - "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": "Unique", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "unique", + "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": "Unique", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Do not allow user to change after set the first time", - "fieldname": "set_only_once", - "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": "Set Only Once", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Do not allow user to change after set the first time", + "fieldname": "set_only_once", + "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": "Set Only Once", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_13", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_13", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "0", - "fieldname": "permlevel", - "fieldtype": "Int", - "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": "Perm Level", - "length": 0, - "no_copy": 0, - "oldfieldname": "permlevel", - "oldfieldtype": "Int", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "permlevel", + "fieldtype": "Int", + "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": "Perm Level", + "length": 0, + "no_copy": 0, + "oldfieldname": "permlevel", + "oldfieldtype": "Int", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "User permissions should not apply for this Link", - "fieldname": "ignore_user_permissions", - "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": "Ignore User Permissions", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "User permissions should not apply for this Link", + "fieldname": "ignore_user_permissions", + "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": "Ignore User Permissions", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "allow_on_submit", - "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": "Allow on Submit", - "length": 0, - "no_copy": 0, - "oldfieldname": "allow_on_submit", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "allow_on_submit", + "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": "Allow on Submit", + "length": 0, + "no_copy": 0, + "oldfieldname": "allow_on_submit", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "report_hide", - "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": "Report Hide", - "length": 0, - "no_copy": 0, - "oldfieldname": "report_hide", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "report_hide", + "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": "Report Hide", + "length": 0, + "no_copy": 0, + "oldfieldname": "report_hide", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:(doc.fieldtype == 'Link')", - "fieldname": "remember_last_selected_value", - "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": "Remember Last Selected Value", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:(doc.fieldtype == 'Link')", + "fieldname": "remember_last_selected_value", + "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": "Remember Last Selected Value", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Don't HTML Encode HTML tags like <script> or just characters like < or >, as they could be intentionally used in this field", - "fieldname": "ignore_xss_filter", - "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": "Ignore XSS Filter", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Don't HTML Encode HTML tags like <script> or just characters like < or >, as they could be intentionally used in this field", + "fieldname": "ignore_xss_filter", + "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": "Ignore XSS Filter", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "display", - "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": "Display", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "display", + "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": "Display", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "in_filter", - "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": "In Filter", - "length": 0, - "no_copy": 0, - "oldfieldname": "in_filter", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "in_filter", + "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": "In Filter", + "length": 0, + "no_copy": 0, + "oldfieldname": "in_filter", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "no_copy", - "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": "No Copy", - "length": 0, - "no_copy": 0, - "oldfieldname": "no_copy", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "no_copy", + "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": "No Copy", + "length": 0, + "no_copy": 0, + "oldfieldname": "no_copy", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "print_hide", - "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": "Print Hide", - "length": 0, - "no_copy": 0, - "oldfieldname": "print_hide", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "print_hide", + "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": "Print Hide", + "length": 0, + "no_copy": 0, + "oldfieldname": "print_hide", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:[\"Int\", \"Float\", \"Currency\", \"Percent\"].indexOf(doc.fieldtype)!==-1", - "fieldname": "print_hide_if_no_value", - "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": "Print Hide If No Value", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:[\"Int\", \"Float\", \"Currency\", \"Percent\"].indexOf(doc.fieldtype)!==-1", + "fieldname": "print_hide_if_no_value", + "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": "Print Hide If No Value", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "print_width", - "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": "Print Width", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "print_width", + "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": "Print Width", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "width", - "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": "Width", - "length": 0, - "no_copy": 0, - "oldfieldname": "width", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "width", + "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": "Width", + "length": 0, + "no_copy": 0, + "oldfieldname": "width", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "description": "Number of columns for a field in a List View or a Grid (Total Columns should be less than 11)", - "fieldname": "columns", - "fieldtype": "Int", - "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": "Columns", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "description": "Number of columns for a field in a List View or a Grid (Total Columns should be less than 11)", + "fieldname": "columns", + "fieldtype": "Int", + "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": "Columns", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_22", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_22", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "description", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Description", - "length": 0, - "no_copy": 0, - "oldfieldname": "description", - "oldfieldtype": "Text", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "300px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "description", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "oldfieldname": "description", + "oldfieldtype": "Text", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "300px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "300px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "oldfieldname", - "fieldtype": "Data", - "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, - "length": 0, - "no_copy": 0, - "oldfieldname": "oldfieldname", - "oldfieldtype": "Data", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "oldfieldname", + "fieldtype": "Data", + "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, + "length": 0, + "no_copy": 0, + "oldfieldname": "oldfieldname", + "oldfieldtype": "Data", + "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, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "oldfieldtype", - "fieldtype": "Data", - "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, - "length": 0, - "no_copy": 0, - "oldfieldname": "oldfieldtype", - "oldfieldtype": "Data", - "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, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "oldfieldtype", + "fieldtype": "Data", + "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, + "length": 0, + "no_copy": 0, + "oldfieldname": "oldfieldtype", + "oldfieldtype": "Data", + "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, "unique": 0 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 1, - "image_view": 0, - "in_create": 0, - "in_dialog": 1, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2017-03-03 16:18:13.523592", - "modified_by": "Administrator", - "module": "Core", - "name": "DocField", - "owner": "Administrator", - "permissions": [], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_order": "ASC", - "track_changes": 0, + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 1, + "image_view": 0, + "in_create": 0, + "in_dialog": 1, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2017-03-03 16:18:13.523595", + "modified_by": "Administrator", + "module": "Core", + "name": "DocField", + "owner": "Administrator", + "permissions": [], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_order": "ASC", + "track_changes": 0, "track_seen": 0 } \ No newline at end of file diff --git a/frappe/core/doctype/feedback_trigger/feedback_trigger.py b/frappe/core/doctype/feedback_trigger/feedback_trigger.py index 54409166f0..26ab518d72 100644 --- a/frappe/core/doctype/feedback_trigger/feedback_trigger.py +++ b/frappe/core/doctype/feedback_trigger/feedback_trigger.py @@ -12,29 +12,41 @@ from frappe.utils.jinja import validate_template class FeedbackTrigger(Document): def validate(self): + frappe.cache().delete_value('feedback_triggers') validate_template(self.subject) validate_template(self.message) self.validate_condition() + def on_trash(self): + frappe.cache().delete_value('feedback_triggers') + def validate_condition(self): temp_doc = frappe.new_doc(self.document_type) if self.condition: try: - eval(self.condition, get_context(temp_doc)) + frappe.safe_eval(self.condition, None, get_context(temp_doc)) except: frappe.throw(_("The condition '{0}' is invalid").format(self.condition)) def trigger_feedback_request(doc, method): - """ trigger the feedback alert""" + """Trigger the feedback alert, or delete feedback requests on delete""" - if doc.flags.in_delete: - frappe.enqueue('frappe.core.doctype.feedback_trigger.feedback_trigger.delete_feedback_request_and_feedback', - reference_doctype=doc.doctype, reference_name=doc.name, now=frappe.flags.in_test) - else: - feedback_trigger = frappe.db.get_value("Feedback Trigger", { "enabled": 1, "document_type": doc.doctype }) - if feedback_trigger: + def _get(): + triggers = {} + for d in frappe.get_all('Feedback Trigger', dict(enabled=1), ['name', 'document_type']): + triggers[d.document_type] = d.name + + return triggers + + feedback_triggers = frappe.cache().get_value('feedback_triggers', _get) + if doc.doctype in feedback_triggers: + if doc.flags.in_delete: + frappe.enqueue('frappe.core.doctype.feedback_trigger.feedback_trigger.delete_feedback_request_and_feedback', + reference_doctype=doc.doctype, reference_name=doc.name, now=frappe.flags.in_test) + else: frappe.enqueue('frappe.core.doctype.feedback_trigger.feedback_trigger.send_feedback_request', - trigger=feedback_trigger, reference_doctype=doc.doctype, reference_name=doc.name, now=frappe.flags.in_test) + trigger=feedback_triggers[doc.doctype], reference_doctype=doc.doctype, + reference_name=doc.name, now=frappe.flags.in_test) @frappe.whitelist() def send_feedback_request(reference_doctype, reference_name, trigger="Manual", details=None, is_manual=False): @@ -68,8 +80,6 @@ def send_feedback_request(reference_doctype, reference_name, trigger="Manual", d @frappe.whitelist() def get_feedback_request_details(reference_doctype, reference_name, trigger="Manual", request=None): - feedback_url = "" - if not frappe.db.get_value(reference_doctype, reference_name): # reference document is either deleted or renamed return @@ -101,7 +111,7 @@ def get_feedback_request_details(reference_doctype, reference_name, trigger="Man frappe.msgprint(_("At least one reply is mandatory before requesting feedback")) return None - if recipients and eval(feedback_trigger.condition, context): + if recipients and frappe.safe_eval(feedback_trigger.condition, None, context): subject = feedback_trigger.subject context.update({ "feedback_trigger": feedback_trigger }) @@ -132,7 +142,7 @@ def get_feedback_request_url(reference_doctype, reference_name, recipients, trig "reference_doctype": reference_doctype, }).insert(ignore_permissions=True) - feedback_url = "{base_url}/feedback?reference_doctype={doctype}&reference_name={docname}&email={email_id}&key={nonce}".format( + feedback_url = "{base_url}/feedback?reference_doctype={doctype}&reference_name={docname}&email={email_id}&key={nonce}".format( base_url=get_url(), doctype=reference_doctype, docname=reference_name, @@ -143,7 +153,7 @@ def get_feedback_request_url(reference_doctype, reference_name, recipients, trig return [ feedback_request.name, feedback_url ] def is_feedback_request_already_sent(reference_doctype, reference_name, is_manual=False): - """ + """ check if feedback request mail is already sent but feedback is not submitted to avoid sending multiple feedback request mail """ diff --git a/frappe/core/page/data_import_tool/data_import_tool.js b/frappe/core/page/data_import_tool/data_import_tool.js index a98877c392..e461203fdd 100644 --- a/frappe/core/page/data_import_tool/data_import_tool.js +++ b/frappe/core/page/data_import_tool/data_import_tool.js @@ -119,6 +119,7 @@ frappe.DataImportTool = Class.extend({ args: { method: 'frappe.core.page.data_import_tool.importer.upload', }, + allow_multiple: 0, onerror: function(r) { me.onerror(r); }, diff --git a/frappe/custom/doctype/custom_field/custom_field.json b/frappe/custom/doctype/custom_field/custom_field.json index 672c3ef981..99be32852e 100644 --- a/frappe/custom/doctype/custom_field/custom_field.json +++ b/frappe/custom/doctype/custom_field/custom_field.json @@ -204,7 +204,7 @@ "no_copy": 0, "oldfieldname": "fieldtype", "oldfieldtype": "Select", - "options": "Attach\nAttach Image\nButton\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nText\nText Editor\nTime", + "options": "Attach\nAttach Image\nButton\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nText\nText Editor\nTime\nSignature", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, diff --git a/frappe/custom/doctype/customize_form/customize_form.json b/frappe/custom/doctype/customize_form/customize_form.json index eb1e051a53..bb6c539c74 100644 --- a/frappe/custom/doctype/customize_form/customize_form.json +++ b/frappe/custom/doctype/customize_form/customize_form.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, "autoname": "DL.####", @@ -22,6 +23,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Enter Form Type", @@ -51,6 +53,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "", @@ -78,6 +81,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Change Label (via Custom Translation)", @@ -106,6 +110,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Default Print Format", @@ -135,6 +140,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Max Attachments", @@ -162,6 +168,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Hide Copy", @@ -189,6 +196,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Is Table", @@ -218,6 +226,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Editable Grid", @@ -247,6 +256,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Quick Entry", @@ -264,6 +274,35 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "track_changes", + "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": "Track Changes", + "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, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -276,6 +315,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Image View", @@ -304,6 +344,7 @@ "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, @@ -332,6 +373,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Title Field", @@ -361,6 +403,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Image Field", @@ -390,6 +433,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Search Fields", @@ -418,6 +462,7 @@ "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, @@ -445,6 +490,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Sort Field", @@ -472,6 +518,7 @@ "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, @@ -499,6 +546,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Sort Order", @@ -529,6 +577,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Fields", @@ -556,6 +605,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Fields", @@ -574,18 +624,18 @@ "unique": 0 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 1, "icon": "fa fa-glass", "idx": 1, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2016-12-29 14:40:32.113132", + "modified": "2017-04-10 12:17:23.627634", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form", @@ -601,7 +651,6 @@ "export": 0, "if_owner": 0, "import": 0, - "is_custom": 0, "permlevel": 0, "print": 1, "read": 1, @@ -617,6 +666,7 @@ "read_only": 0, "read_only_onload": 0, "search_fields": "doc_type", + "show_name_in_global_search": 0, "sort_order": "DESC", "track_changes": 1, "track_seen": 0 diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py index b72c81c106..82f1715818 100644 --- a/frappe/custom/doctype/customize_form/customize_form.py +++ b/frappe/custom/doctype/customize_form/customize_form.py @@ -27,7 +27,8 @@ doctype_properties = { 'quick_entry': 'Check', 'editable_grid': 'Check', 'max_attachments': 'Int', - 'image_view': 'Check' + 'image_view': 'Check', + 'track_changes': 'Check', } docfield_properties = { @@ -63,7 +64,7 @@ docfield_properties = { } allowed_fieldtype_change = (('Currency', 'Float', 'Percent'), ('Small Text', 'Data'), - ('Text', 'Data'), ('Text', 'Text Editor', 'Code'), ('Data', 'Select'), + ('Text', 'Data'), ('Text', 'Text Editor', 'Code', 'Signature'), ('Data', 'Select'), ('Text', 'Small Text')) class CustomizeForm(Document): @@ -312,6 +313,7 @@ class CustomizeForm(Document): for allowed_changes in allowed_fieldtype_change: if (old_value in allowed_changes and new_value in allowed_changes): allowed = True + break if not allowed: frappe.throw(_("Fieldtype cannot be changed from {0} to {1} in row {2}").format(old_value, new_value, df.idx)) diff --git a/frappe/custom/doctype/customize_form/test_customize_form.py b/frappe/custom/doctype/customize_form/test_customize_form.py index 197aa99f46..ffa82c3b00 100644 --- a/frappe/custom/doctype/customize_form/test_customize_form.py +++ b/frappe/custom/doctype/customize_form/test_customize_form.py @@ -46,7 +46,7 @@ class TestCustomizeForm(unittest.TestCase): d = self.get_customize_form("Event") self.assertEquals(d.doc_type, "Event") - self.assertEquals(len(d.get("fields")), 27) + self.assertEquals(len(d.get("fields")), 29) d = self.get_customize_form("User") self.assertEquals(d.doc_type, "User") diff --git a/frappe/custom/doctype/customize_form_field/customize_form_field.json b/frappe/custom/doctype/customize_form_field/customize_form_field.json index faec86e6f3..3f39f8b1e0 100644 --- a/frappe/custom/doctype/customize_form_field/customize_form_field.json +++ b/frappe/custom/doctype/customize_form_field/customize_form_field.json @@ -90,7 +90,7 @@ "no_copy": 0, "oldfieldname": "fieldtype", "oldfieldtype": "Select", - "options": "Attach\nAttach Image\nButton\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nFold\nHeading\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nText\nText Editor\nTime", + "options": "Attach\nAttach Image\nButton\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nFold\nHeading\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSignature\nSmall Text\nTable\nText\nText Editor\nTime", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, @@ -1133,7 +1133,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-03-27 21:43:19.748233", + "modified": "2017-03-27 21:43:19.748243", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form Field", diff --git a/frappe/desk/doctype/event/event.json b/frappe/desk/doctype/event/event.json index 497cdc31d2..2646378d1b 100644 --- a/frappe/desk/doctype/event/event.json +++ b/frappe/desk/doctype/event/event.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 0, "autoname": "EV.#####", @@ -129,6 +130,34 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "repeat_this_event", + "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": "Repeat this Event", + "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, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -272,8 +301,39 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "repeat_this_event", - "fieldtype": "Check", + "default": "blue", + "fieldname": "color", + "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": "Color", + "length": 0, + "no_copy": 0, + "options": "red\ngreen\nblue\nyellow\nskyblue\norange", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_11", + "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -281,10 +341,10 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Repeat this Event", "length": 0, "no_copy": 0, "permlevel": 0, + "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, @@ -301,7 +361,7 @@ "collapsible": 0, "columns": 0, "depends_on": "repeat_this_event", - "fieldname": "section_break_11", + "fieldname": "section_break_13", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, @@ -388,7 +448,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "column_break_11", + "fieldname": "column_break_16", "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, @@ -795,19 +855,19 @@ "unique": 0 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-calendar", "idx": 1, "image_view": 0, "in_create": 1, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-02-22 16:25:55.420314", - "modified_by": "Administrator", + "modified": "2017-04-05 11:16:04.281342", + "modified_by": "faris@erpnext.com", "module": "Desk", "name": "Event", "owner": "Administrator", diff --git a/frappe/desk/doctype/event/event.py b/frappe/desk/doctype/event/event.py index ade5763d78..33453f86cc 100644 --- a/frappe/desk/doctype/event/event.py +++ b/frappe/desk/doctype/event/event.py @@ -65,7 +65,7 @@ def get_events(start, end, user=None, for_reminder=False): if not user: user = frappe.session.user roles = frappe.get_roles(user) - events = frappe.db.sql("""select name, subject, description, + events = frappe.db.sql("""select name, subject, description, color, starts_on, ends_on, owner, all_day, event_type, repeat_this_event, repeat_on,repeat_till, monday, tuesday, wednesday, thursday, friday, saturday, sunday from tabEvent where (( diff --git a/frappe/desk/doctype/event/event_calendar.js b/frappe/desk/doctype/event/event_calendar.js index c99e9f9334..df474a0258 100644 --- a/frappe/desk/doctype/event/event_calendar.js +++ b/frappe/desk/doctype/event/event_calendar.js @@ -6,6 +6,7 @@ frappe.views.calendar["Event"] = { "allDay": "all_day", "title": "subject", "status": "event_type", + "color": "color" }, style_map: { "Public": "success", diff --git a/frappe/email/doctype/email_alert/email_alert.py b/frappe/email/doctype/email_alert/email_alert.py index 21cf2b88f5..26cdc4e796 100755 --- a/frappe/email/doctype/email_alert/email_alert.py +++ b/frappe/email/doctype/email_alert/email_alert.py @@ -55,7 +55,7 @@ def get_context(context): temp_doc = frappe.new_doc(self.document_type) if self.condition: try: - eval(self.condition, get_context(temp_doc)) + frappe.safe_eval(self.condition, None, get_context(temp_doc)) except: frappe.throw(_("The Condition '{0}' is invalid").format(self.condition)) @@ -81,7 +81,7 @@ def get_context(context): doc = frappe.get_doc(self.document_type, name) - if self.condition and not eval(self.condition, get_context(doc)): + if self.condition and not frappe.safe_eval(self.condition, None, get_context(doc)): continue docs.append(doc) @@ -95,7 +95,7 @@ def get_context(context): recipients = [] for recipient in self.recipients: if recipient.condition: - if not eval(recipient.condition, context): + if not frappe.safe_eval(recipient.condition, None, context): continue if recipient.email_by_document_field: if validate_email_add(doc.get(recipient.email_by_document_field)): @@ -189,16 +189,16 @@ def evaluate_alert(doc, alert, event): context = get_context(doc) if alert.condition: - if not eval(alert.condition, context): + if not frappe.safe_eval(alert.condition, None, context): return if event=="Value Change" and not doc.is_new(): db_value = frappe.db.get_value(doc.doctype, doc.name, alert.value_changed) - + # cast to string if not already for comparing to doc.get's value if not isinstance(db_value, basestring): db_value = str(frappe.db.get_value(doc.doctype, doc.name, alert.value_changed)) - + if doc.get(alert.value_changed) == db_value: return # value not changed diff --git a/frappe/exceptions.py b/frappe/exceptions.py index c09ebd26e0..1ffbf96391 100644 --- a/frappe/exceptions.py +++ b/frappe/exceptions.py @@ -14,6 +14,9 @@ class ValidationError(Exception): class AuthenticationError(Exception): http_status_code = 401 +class SessionExpired(Exception): + http_status_code = 401 + class PermissionError(Exception): http_status_code = 403 diff --git a/frappe/geo/country_info.json b/frappe/geo/country_info.json index deac9f2532..376a9f3c10 100644 --- a/frappe/geo/country_info.json +++ b/frappe/geo/country_info.json @@ -847,6 +847,7 @@ "currency_fraction_units": 100, "currency_symbol": "\u20ac", "number_format": "# ###,##", + "date_format": "dd/mm/yyyy", "timezones": [ "Europe/Paris" ] @@ -1196,7 +1197,8 @@ "currency_fraction": "Cent", "currency_fraction_units": 100, "currency_symbol": "\u20ac", - "number_format": "#,###.##", + "number_format": "#.###,##", + "date_format": "dd/mm/yyyy", "timezones": [ "Europe/Rome" ] diff --git a/frappe/geo/languages.json b/frappe/geo/languages.json index 149025d92a..ba732cb9f1 100644 --- a/frappe/geo/languages.json +++ b/frappe/geo/languages.json @@ -1,290 +1,294 @@ [ { - "code": "am", + "code": "am", "name": "\u12a0\u121b\u122d\u129b" - }, + }, { - "code": "ar", + "code": "ar", "name": "\u0627\u0644\u0639\u0631\u0628\u064a\u0629" - }, + }, { - "code": "bg", + "code": "bg", "name": "b\u01celgarski" - }, + }, { - "code": "bn", + "code": "bn", "name": "\u09ac\u09be\u0999\u09be\u09b2\u09bf" - }, + }, { - "code": "bo", + "code": "bo", "name": "\u0f63\u0fb7\u0f0b\u0f66\u0f60\u0f72\u0f0b\u0f66\u0f90\u0f51\u0f0b" - }, + }, { - "code": "bs", + "code": "bs", "name": "bosanski" - }, + }, { - "code": "ca", + "code": "ca", "name": "catal\u00e0" - }, + }, { - "code": "cs", + "code": "cs", "name": "\u010desky" - }, + }, { - "code": "da", + "code": "da", "name": "dansk" - }, + }, { - "code": "da-DK", + "code": "da-DK", "name": "Dansk (Danmark)" - }, + }, { - "code": "de", + "code": "de", "name": "deutsch" - }, + }, { - "code": "el", + "code": "el", "name": "\u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac" - }, + }, { - "code": "en", - "name": "english" - }, + "code": "en", + "name": "English" + }, { - "code": "en-US", + "code": "en-GB", + "name": "English (United Kingdom)" + }, + { + "code": "en-US", "name": "English (United States)" - }, + }, { - "code": "es", + "code": "es", "name": "espa\u00f1ol" - }, + }, { - "code": "es-AR", + "code": "es-AR", "name": "Espa\u00f1ol (Argentina)" - }, + }, { - "code": "es-CL", + "code": "es-CL", "name": "Espa\u00f1ol (Chile)" - }, + }, { - "code": "es-GT", + "code": "es-GT", "name": "Espa\u00f1ol (Guatemala)" - }, + }, { - "code": "es-MX", + "code": "es-MX", "name": "Espa\u00f1ol (M\u00e9xico)" - }, + }, { - "code": "es-NI", + "code": "es-NI", "name": "Espa\u00f1ol (Nicaragua)" - }, + }, { - "code": "es-PE", + "code": "es-PE", "name": "Espa\u00f1ol (Per\u00fa)" - }, + }, { - "code": "et", + "code": "et", "name": "eesti" - }, + }, { - "code": "fa", + "code": "fa", "name": "\u067e\u0627\u0631\u0633\u06cc" - }, + }, { - "code": "fi", + "code": "fi", "name": "suomalainen" - }, + }, { - "code": "fr", + "code": "fr", "name": "fran\u00e7ais" - }, + }, { - "code": "fr-CA", + "code": "fr-CA", "name": "fran\u00e7ais canadien" - }, + }, { - "code": "gu", + "code": "gu", "name": "\u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0" - }, + }, { - "code": "he", + "code": "he", "name": "\u05e2\u05d1\u05e8\u05d9\u05ea" - }, + }, { - "code": "hi", + "code": "hi", "name": "\u0939\u093f\u0902\u0926\u0940" - }, + }, { - "code": "hr", + "code": "hr", "name": "hrvatski" - }, + }, { - "code": "hu", + "code": "hu", "name": "magyar" - }, + }, { - "code": "id", + "code": "id", "name": "Indonesia" - }, + }, { - "code": "is", + "code": "is", "name": "\u00edslenska" - }, + }, { - "code": "it", + "code": "it", "name": "italiano" - }, + }, { - "code": "ja", + "code": "ja", "name": "\u65e5\u672c\u8a9e" - }, + }, { - "code": "km", + "code": "km", "name": "\u1797\u17b6\u179f\u17b6\u1781\u17d2\u1798\u17c2\u179a" - }, + }, { - "code": "kn", + "code": "kn", "name": "\u0c95\u0ca8\u0ccd\u0ca8\u0ca1" - }, + }, { - "code": "ko", + "code": "ko", "name": "\ud55c\uad6d\uc758" - }, + }, { - "code": "ku", + "code": "ku", "name": "\u06a9\u0648\u0631\u062f\u06cc" - }, + }, { - "code": "lo", + "code": "lo", "name": "\u0ea5\u0eb2\u0ea7" - }, + }, { - "code": "lt", + "code": "lt", "name": "lietuvi\u0173 kalba" - }, + }, { - "code": "lv", + "code": "lv", "name": "latvie\u0161u valoda" - }, + }, { - "code": "mk", + "code": "mk", "name": "\u043c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438" - }, + }, { - "code": "ml", + "code": "ml", "name": "\u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02" - }, + }, { - "code": "mr", + "code": "mr", "name": "\u092e\u0930\u093e\u0920\u0940" - }, + }, { - "code": "ms", + "code": "ms", "name": "Melayu" - }, + }, { - "code": "my", + "code": "my", "name": "\u1019\u103c\u1014\u103a\u1019\u102c" - }, + }, { - "code": "nl", + "code": "nl", "name": "nederlands" - }, + }, { - "code": "no", + "code": "no", "name": "norsk" - }, + }, { - "code": "pl", + "code": "pl", "name": "polski" - }, + }, { - "code": "ps", + "code": "ps", "name": "\u067e\u069a\u062a\u0648" - }, + }, { - "code": "pt", + "code": "pt", "name": "portugu\u00eas" - }, + }, { - "code": "pt-BR", + "code": "pt-BR", "name": "portugu\u00eas brasileiro" - }, + }, { - "code": "ro", + "code": "ro", "name": "rom\u00e2n" - }, + }, { - "code": "ru", + "code": "ru", "name": "\u0440\u0443\u0441\u0441\u043a\u0438\u0439" - }, + }, { - "code": "rw", + "code": "rw", "name": "Kinyarwanda" - }, + }, { - "code": "si", + "code": "si", "name": "\u0dc3\u0dd2\u0d82\u0dc4\u0dbd" - }, + }, { - "code": "sk", + "code": "sk", "name": "sloven\u010dina (Slovak)" - }, + }, { - "code": "sl", + "code": "sl", "name": "sloven\u0161\u010dina (Slovene)" - }, + }, { - "code": "sq", + "code": "sq", "name": "shqiptar" - }, + }, { - "code": "sr", + "code": "sr", "name": "\u0441\u0440\u043f\u0441\u043a\u0438" - }, + }, { - "code": "sr-SP", + "code": "sr-SP", "name": "srpski" - }, + }, { - "code": "sv", + "code": "sv", "name": "svenska" - }, + }, { - "code": "ta", + "code": "ta", "name": "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd" - }, + }, { - "code": "te", + "code": "te", "name": "\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41" - }, + }, { - "code": "th", + "code": "th", "name": "\u0e44\u0e17\u0e22" - }, + }, { - "code": "tr", + "code": "tr", "name": "T\u00fcrk" - }, + }, { - "code": "uk", + "code": "uk", "name": "\u0443\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430" - }, + }, { - "code": "ur", + "code": "ur", "name": "\u0627\u0631\u062f\u0648" - }, + }, { - "code": "vi", + "code": "vi", "name": "vi\u1ec7t" - }, + }, { - "code": "zh", + "code": "zh", "name": "\u7b80\u4f53\u4e2d\u6587" - }, + }, { - "code": "zh-TW", + "code": "zh-TW", "name": "\u7e41\u9ad4\u4e2d\u6587" } -] \ No newline at end of file +] diff --git a/frappe/installer.py b/frappe/installer.py index eb0bee903d..d3c4296c65 100755 --- a/frappe/installer.py +++ b/frappe/installer.py @@ -275,8 +275,8 @@ def update_site_config(key, value, validate=True, site_config_path=None): value = int(value) # boolean - if value in ("false", "true"): - value = eval(value.title()) + if value == 'false': value = False + if value == 'true': value = True # remove key if value is None if value == "None": diff --git a/frappe/integrations/doctype/stripe_settings/__init__.py b/frappe/integrations/doctype/stripe_settings/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/integrations/doctype/stripe_settings/stripe_settings.js b/frappe/integrations/doctype/stripe_settings/stripe_settings.js new file mode 100644 index 0000000000..578ae94906 --- /dev/null +++ b/frappe/integrations/doctype/stripe_settings/stripe_settings.js @@ -0,0 +1,8 @@ +// Copyright (c) 2017, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Stripe Settings', { + refresh: function(frm) { + + } +}); diff --git a/frappe/integrations/doctype/stripe_settings/stripe_settings.json b/frappe/integrations/doctype/stripe_settings/stripe_settings.json new file mode 100644 index 0000000000..adf8a82206 --- /dev/null +++ b/frappe/integrations/doctype/stripe_settings/stripe_settings.json @@ -0,0 +1,120 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2017-03-09 17:18:29.458397", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "publishable_key", + "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": "Publishable Key", + "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": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "secret_key", + "fieldtype": "Password", + "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": "Secret Key", + "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": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 1, + "istable": 0, + "max_attachments": 0, + "modified": "2017-03-09 17:19:25.087475", + "modified_by": "Administrator", + "module": "Integrations", + "name": "Stripe Settings", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 0, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 0, + "track_seen": 0 +} \ No newline at end of file diff --git a/frappe/integrations/doctype/stripe_settings/stripe_settings.py b/frappe/integrations/doctype/stripe_settings/stripe_settings.py new file mode 100644 index 0000000000..9966ff1049 --- /dev/null +++ b/frappe/integrations/doctype/stripe_settings/stripe_settings.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document +from frappe import _ +import urllib +from frappe.utils import get_url, call_hook_method, cint +from frappe.integrations.utils import make_get_request, make_post_request, create_request_log, create_payment_gateway + +class StripeSettings(Document): + supported_currencies = [ + "AED", "ALL", "ANG", "ARS", "AUD", "AWG", "BBD", "BDT", "BIF", "BMD", "BND", + "BOB", "BRL", "BSD", "BWP", "BZD", "CAD", "CHF", "CLP", "CNY", "COP", "CRC", "CVE", "CZK", "DJF", + "DKK", "DOP", "DZD", "EGP", "ETB", "EUR", "FJD", "FKP", "GBP", "GIP", "GMD", "GNF", "GTQ", "GYD", + "HKD", "HNL", "HRK", "HTG", "HUF", "IDR", "ILS", "INR", "ISK", "JMD", "JPY", "KES", "KHR", "KMF", + "KRW", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "MAD", "MDL", "MNT", "MOP", "MRO", "MUR", "MVR", + "MWK", "MXN", "MYR", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "PAB", "PEN", "PGK", "PHP", "PKR", + "PLN", "PYG", "QAR", "RUB", "SAR", "SBD", "SCR", "SEK", "SGD", "SHP", "SLL", "SOS", "STD", "SVC", + "SZL", "THB", "TOP", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "UYU", "UZS", "VND", "VUV", "WST", + "XAF", "XOF", "XPF", "YER", "ZAR" + ] + + def validate(self): + create_payment_gateway('Stripe') + call_hook_method('payment_gateway_enabled', gateway='Stripe') + if not self.flags.ignore_mandatory: + self.validate_stripe_credentails() + + def validate_stripe_credentails(self): + if self.publishable_key and self.secret_key: + header = {"Authorization": "Bearer {0}".format(self.get_password(fieldname="secret_key", raise_exception=False))} + try: + make_get_request(url="https://api.stripe.com/v1/charges", headers=header) + except Exception: + frappe.throw(_("Seems Publishable Key or Secret Key is wrong !!!")) + + def validate_transaction_currency(self, currency): + if currency not in self.supported_currencies: + frappe.throw(_("Please select another payment method. Stripe does not support transactions in currency '{0}'").format(currency)) + + def get_payment_url(self, **kwargs): + return get_url("./integrations/stripe_checkout?{0}".format(urllib.urlencode(kwargs))) + + def create_request(self, data): + self.data = frappe._dict(data) + + try: + self.integration_request = create_request_log(self.data, "Host", "Stripe") + return self.create_charge_on_stripe() + except Exception: + frappe.log_error(frappe.get_traceback()) + return{ + "redirect_to": frappe.redirect_to_message(_('Server Error'), _("Seems issue with server's razorpay config. Don't worry, in case of failure amount will get refunded to your account.")), + "status": 401 + } + + def create_charge_on_stripe(self): + headers = {"Authorization": + "Bearer {0}".format(self.get_password(fieldname="secret_key", raise_exception=False))} + + data = { + "amount": cint(self.data.amount)*100, + "currency": self.data.currency, + "source": self.data.stripe_token_id, + "description": self.data.description + } + + redirect_to = self.data.get('redirect_to') or None + redirect_message = self.data.get('redirect_message') or None + + try: + resp = make_post_request(url="https://api.stripe.com/v1/charges", headers=headers, data=data) + + if resp.get("captured") == True: + self.integration_request.db_set('status', 'Completed', update_modified=False) + self.flags.status_changed_to = "Completed" + + else: + frappe.log_error(str(resp), 'Stripe Payment not completed') + + except: + frappe.log_error(frappe.get_traceback()) + # failed + pass + + status = frappe.flags.integration_request.status_code + + if self.flags.status_changed_to == "Completed": + if self.data.reference_doctype and self.data.reference_docname: + custom_redirect_to = None + try: + custom_redirect_to = frappe.get_doc(self.data.reference_doctype, + self.data.reference_docname).run_method("on_payment_authorized", self.flags.status_changed_to) + except Exception: + frappe.log_error(frappe.get_traceback()) + + if custom_redirect_to: + redirect_to = custom_redirect_to + + redirect_url = 'payment-success' + else: + redirect_url = 'payment-failed' + + if redirect_to: + redirect_url += '?' + urllib.urlencode({'redirect_to': redirect_to}) + if redirect_message: + redirect_url += '&' + urllib.urlencode({'redirect_message': redirect_message}) + + return { + "redirect_to": redirect_url, + "status": status + } diff --git a/frappe/integrations/utils.py b/frappe/integrations/utils.py index ff30250042..0870222202 100644 --- a/frappe/integrations/utils.py +++ b/frappe/integrations/utils.py @@ -8,15 +8,17 @@ import json, urlparse from frappe.utils import get_request_session from frappe import _ -def make_get_request(url, auth=None, data=None): +def make_get_request(url, auth=None, headers=None, data=None): if not auth: auth = '' if not data: data = {} + if not headers: + headers = {} try: s = get_request_session() - frappe.flags.integration_request = s.get(url, data={}, auth=auth) + frappe.flags.integration_request = s.get(url, data={}, auth=auth, headers=headers) frappe.flags.integration_request.raise_for_status() return frappe.flags.integration_request.json() @@ -24,20 +26,23 @@ def make_get_request(url, auth=None, data=None): frappe.log_error(frappe.get_traceback()) raise exc -def make_post_request(url, auth=None, data=None): +def make_post_request(url, auth=None, headers=None, data=None): if not auth: auth = '' if not data: data = {} + if not headers: + headers = {} + try: s = get_request_session() - res = s.post(url, data=data, auth=auth) - res.raise_for_status() + frappe.flags.integration_request = s.post(url, data=data, auth=auth, headers=headers) + frappe.flags.integration_request.raise_for_status() - if res.headers.get("content-type") == "text/plain; charset=utf-8": - return urlparse.parse_qs(res.text) + if frappe.flags.integration_request.headers.get("content-type") == "text/plain; charset=utf-8": + return urlparse.parse_qs(frappe.flags.integration_request.text) - return res.json() + return frappe.flags.integration_request.json() except Exception, exc: frappe.log_error() raise exc diff --git a/frappe/model/db_schema.py b/frappe/model/db_schema.py index 84fc44e6da..6023761bcc 100644 --- a/frappe/model/db_schema.py +++ b/frappe/model/db_schema.py @@ -42,6 +42,7 @@ type_map = { ,'Read Only': ('varchar', varchar_len) ,'Attach': ('text', '') ,'Attach Image':('text', '') + ,'Signature': ('longtext', '') } default_columns = ['name', 'creation', 'modified', 'modified_by', 'owner', diff --git a/frappe/public/build.json b/frappe/public/build.json index fd32fceae6..f08b9fc6d3 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -55,7 +55,8 @@ ], "css/frappe-rtl.css": [ "public/css/bootstrap-rtl.css", - "public/css/desk-rtl.css" + "public/css/desk-rtl.css", + "public/css/report-rtl.css" ], "js/libs.min.js": [ "public/js/lib/awesomplete/awesomplete.min.js", @@ -68,6 +69,7 @@ "public/js/lib/moment/moment-timezone-with-data.min.js", "public/js/lib/socket.io.min.js", "public/js/lib/markdown.js", + "public/js/lib/jSignature.min.js", "public/js/frappe/translate.js", "public/js/lib/datepicker/datepicker.min.js", "public/js/lib/datepicker/locale-all.js" diff --git a/frappe/public/css/desk.css b/frappe/public/css/desk.css index e2fe3a6d14..5c4359f239 100644 --- a/frappe/public/css/desk.css +++ b/frappe/public/css/desk.css @@ -569,8 +569,19 @@ fieldset[disabled] .form-control { display: inline-block; vertical-align: middle; } +.file-upload .input-upload { + vertical-align: top; +} +.file-upload .uploaded-filename { + border: 1px solid #d1d8dd; + border-radius: 3px; +} +.file-upload .uploaded-filename .btn-group { + margin-right: 5px; + margin-bottom: 5px; +} .file-upload .uploaded-filename-display { - max-width: 194px; + max-width: 150px; } .frappe-rtl input, .frappe-rtl textarea { @@ -668,6 +679,9 @@ fieldset[disabled] .form-control { max-height: 300px; overflow: auto; } +.note-editor .note-image-input { + height: auto; +} .modal .note-editor .note-btn-italic, .modal .note-editor .note-btn-underline, .modal .note-editor [data-original-title="Font Size"], diff --git a/frappe/public/css/form.css b/frappe/public/css/form.css index 94dee6b469..735ddec442 100644 --- a/frappe/public/css/form.css +++ b/frappe/public/css/form.css @@ -415,6 +415,36 @@ h6.uppercase, border-radius: 0px; } } +.signature-field { + min-height: 300px; + background: #fff; + border: 1px solid #d1d8dd; + border-radius: 3px; + position: relative; + margin-top: -10px; +} +.signature-display { + margin: 7px 0px; + background: #fff; +} +.signature-btn-row { + position: absolute; + bottom: 12px; + right: 12px; +} +.signature-reset { + height: 30px; + width: 30px; + padding: 4px 0px; +} +.signature-img { + border: 1px solid #d1d8dd; + background: #fff; + border-radius: 3px; + margin-top: 5px; + width: 100%; + max-height: 300px; +} .timeline-new-email { margin: 30px 0px; padding-left: 70px; @@ -474,15 +504,6 @@ h6.uppercase, .shared-user { margin-bottom: 10px; } -.linked-with-dialog { - width: 75%; -} -.linked-with-dialog .panel-body { - padding: 0px; -} -.linked-with-dialog .form-section { - padding-top: 15px; -} .attach-missing-image, .attach-image-display { cursor: pointer; diff --git a/frappe/public/css/list.css b/frappe/public/css/list.css index 8bc696f113..e63080dfb1 100644 --- a/frappe/public/css/list.css +++ b/frappe/public/css/list.css @@ -393,6 +393,10 @@ .list-item-container:last-child { border-bottom: none; } +.list-item-table { + border: 1px solid #d1d8dd; + border-radius: 3px; +} .list-item { display: flex; align-items: center; diff --git a/frappe/public/css/mobile.css b/frappe/public/css/mobile.css index e388fb24b2..5d954a9ce2 100644 --- a/frappe/public/css/mobile.css +++ b/frappe/public/css/mobile.css @@ -182,9 +182,6 @@ body { body[data-sidebar="0"] .navbar-home { margin-left: 15px !important; } - .linked-with-dialog { - width: 100% !important; - } } @media (max-width: 991px) and (max-width: 480px) { #navbar-breadcrumbs li a { diff --git a/frappe/public/css/report-rtl.css b/frappe/public/css/report-rtl.css new file mode 100644 index 0000000000..cc87b52bbf --- /dev/null +++ b/frappe/public/css/report-rtl.css @@ -0,0 +1,3 @@ +.grid-report { + direction: ltr; +} diff --git a/frappe/public/js/frappe/desk.js b/frappe/public/js/frappe/desk.js index 11c6375cc7..804ed9d0e1 100644 --- a/frappe/public/js/frappe/desk.js +++ b/frappe/public/js/frappe/desk.js @@ -311,13 +311,61 @@ frappe.Application = Class.extend({ method:'logout', callback: function(r) { if(r.exc) { - console.log(r.exc); return; } me.redirect_to_login(); } }) }, + handle_session_expired: function() { + if(!frappe.app.session_expired_dialog) { + var dialog = new frappe.ui.Dialog({ + title: __('Session Expired'), + fields: [ + { fieldtype:'Password', fieldname:'password', + label: __('Please Enter Your Password to Continue') }, + ], + onhide: () => { + if (!dialog.logged_in) { + frappe.app.redirect_to_login(); + } + } + }); + dialog.set_primary_action(__('Login'), () => { + frappe.call({ + method: 'login', + args: { + usr: frappe.session.user, + pwd: dialog.get_values().password + }, + callback: (r) => { + if (r.message==='Logged In') { + dialog.logged_in = true; + + // revert backdrop + $('.modal-backdrop').css({ + 'opacity': '', + 'background-color': '#334143' + }); + } + dialog.hide(); + }, + statusCode: () => { + dialog.hide(); + } + }); + }); + frappe.app.session_expired_dialog = dialog; + } + if(!frappe.app.session_expired_dialog.display) { + frappe.app.session_expired_dialog.show(); + // add backdrop + $('.modal-backdrop').css({ + 'opacity': 1, + 'background-color': '#EBEFF2' + }); + } + }, redirect_to_login: function() { window.location.href = '/'; }, diff --git a/frappe/public/js/frappe/form/control.js b/frappe/public/js/frappe/form/control.js old mode 100644 new mode 100755 index 9144ba9931..2a62948345 --- a/frappe/public/js/frappe/form/control.js +++ b/frappe/public/js/frappe/form/control.js @@ -1000,6 +1000,7 @@ frappe.ui.form.ControlAttach = frappe.ui.form.ControlData.extend({ this.upload_options = { parent: this.dialog.get_field("upload_area").$wrapper, args: {}, + allow_multiple: 0, max_width: this.df.max_width, max_height: this.df.max_height, options: this.df.options, @@ -1792,7 +1793,118 @@ frappe.ui.form.ControlTable = frappe.ui.form.Control.extend({ return this.grid.get_data(); } } -}) +}); + +frappe.ui.form.ControlSignature = frappe.ui.form.ControlData.extend({ + saving: false, + loading: false, + make: function() { + var me = this; + this._super(); + + // make jSignature field + this.$pad = $('
') + .appendTo(me.wrapper) + .jSignature({height:300, width: "100%", "lineWidth": 0.8}) + .on('change', this.on_save_sign.bind(this)); + + this.img_wrapper = $(`
+
+ +
`) + .appendTo(this.wrapper); + this.img = $("") + .appendTo(this.img_wrapper).toggle(false); + + + this.$btnWrapper = $(`
+ + `) + .appendTo(this.$pad) + .on("click", '.signature-reset', function() { + me.on_reset_sign(); + return false; + }); + // handle refresh by reloading the pad + this.$wrapper.on("refresh", this.on_refresh.bind(this)); + }, + on_refresh: function(e) { + // prevent to load the second time + this.$wrapper.find(".control-input").toggle(false); + this.set_editable(this.get_status()=="Write"); + this.load_pad(); + if(this.get_status()=="Read") { + $(this.disp_area).toggle(false); + } + }, + set_image: function(value) { + if(value) { + $(this.img_wrapper).find(".missing-image").toggle(false); + this.img.attr("src", value).toggle(true); + } else { + $(this.img_wrapper).find(".missing-image").toggle(true); + this.img.toggle(false); + } + }, + load_pad: function() { + // make sure not triggered during saving + if (this.saving) return; + // get value + var value = this.get_value(); + // import data for pad + if (this.$pad) { + this.loading = true; + // reset in all cases + this.$pad.jSignature('reset'); + if (value) { + // load the image to find out the size, because scaling will affect + // stroke width + try { + this.$pad.jSignature('setData', value); + this.set_image(value); + } + catch (e){ + console.log("Cannot set data for signature", value, e); + } + } + + this.loading = false; + } + }, + set_editable: function(editable) { + this.$pad.toggle(editable); + this.img_wrapper.toggle(!editable); + this.$btnWrapper.toggle(editable); + if (editable) { + this.$btnWrapper.addClass('editing'); + } + else { + this.$btnWrapper.removeClass('editing'); + } + }, + set_my_value: function(value) { + if (this.saving || this.loading) return; + this.saving = true; + this.set_value(value); + this.value = value; + this.saving = false; + }, + get_value: function() { + return this.value? this.value: this.get_model_value(); + }, + // reset signature canvas + on_reset_sign: function() { + this.$pad.jSignature("reset"); + this.set_my_value(""); + }, + // save signature value to model and display + on_save_sign: function() { + if (this.saving || this.loading) return; + var base64_img = this.$pad.jSignature("getData"); + this.set_my_value(base64_img); + this.set_image(this.get_value()); + } +}); frappe.ui.form.fieldtype_icons = { "Date": "fa fa-calendar", diff --git a/frappe/public/js/frappe/form/footer/attachments.js b/frappe/public/js/frappe/form/footer/attachments.js index 13645e7083..59138c5500 100644 --- a/frappe/public/js/frappe/form/footer/attachments.js +++ b/frappe/public/js/frappe/form/footer/attachments.js @@ -234,6 +234,7 @@ frappe.ui.get_upload_dialog = function(opts){ } }, callback: function(r){ + if(!r.message) return; dialog.$wrapper.find('[name="file_url"]').val(r.message.file_url); dialog.$wrapper.find('.private-file input').prop('checked', r.message.is_private); opts.args.filename = r.message.file_name diff --git a/frappe/public/js/frappe/form/linked_with.js b/frappe/public/js/frappe/form/linked_with.js index f04c7d89f5..70a096b234 100644 --- a/frappe/public/js/frappe/form/linked_with.js +++ b/frappe/public/js/frappe/form/linked_with.js @@ -3,156 +3,162 @@ frappe.provide("frappe.ui.form"); -frappe.ui.form.LinkedWith = Class.extend({ - init: function(opts) { - var me = this; +frappe.ui.form.LinkedWith = class LinkedWith { + + constructor(opts) { $.extend(this, opts); - }, - show: function() { + } + + show() { if(!this.dialog) this.make_dialog(); - this.dialog.fields_dict.list.$wrapper.html('
' - + __("Loading") + '...
'); + $(this.dialog.body).html( + `
+ ${__("Loading")}... +
`); this.dialog.show(); - }, - make_dialog: function() { + } + + make_dialog() { var me = this; this.dialog = new frappe.ui.Dialog({ hide_on_page_refresh: true, - title: __("Linked With"), - fields: [ - { fieldtype: "HTML", label: "list" } - ] + title: __("Linked With") }); - this.dialog.$wrapper.find(".modal-dialog").addClass("linked-with-dialog"); - - this.dialog.on_page_show = function() { + this.dialog.on_page_show = () => { // execute ajax calls sequentially // 1. get linked doctypes // 2. load all doctypes // 3. load linked docs - $.when(me.get_linked_doctypes()) - .then(function() { return me.load_doctypes() }) - .then(function() { - if (me.links_not_permitted_or_missing()) { - return; - } - - return me.get_linked_docs(); - }); + this.get_linked_doctypes() + .then(() => this.load_doctypes()) + .then(() => this.links_not_permitted_or_missing()) + .then(() => this.get_linked_docs()) + .then(() => this.make_html()) } + } - }, + make_html() { + const linked_docs = this.frm.__linked_docs; - load_doctypes: function() { - var me = this; - var already_loaded = Object.keys(locals.DocType); - var doctypes_to_load = []; - if (me.frm.__linked_doctypes) { - $.each(Object.keys(me.frm.__linked_doctypes), function(i, v) { - if (already_loaded.indexOf(v)===-1) { - doctypes_to_load.push(v); - } + let html; + + if(Object.keys(linked_docs).length === 0) { + html = __("Not Linked to any record"); + } else { + html = Object.keys(linked_docs).map(dt => { + return `
+ ${this.make_doc_head(dt)} + ${linked_docs[dt] + .map(doc => this.make_doc_row(doc, dt)) + .join("")} +
`; }); } - // load all doctypes sequentially using with_doctype - return $.when.apply($, $.map(doctypes_to_load, function(dt) { - return frappe.model.with_doctype(dt, function() { - if (frappe.listview_settings[dt]) { - // add additional fields to __linked_doctypes - me.frm.__linked_doctypes[dt].add_fields = frappe.listview_settings[dt].add_fields; - } - }, /*async*/ false); - })); - }, - links_not_permitted_or_missing: function() { - var me = this; - var links = []; - $.each(me.frm.__linked_doctypes, function(doctype, tmp) { - if(frappe.model.can_get_report(doctype)) { - links.push({label: __(doctype), value: doctype}); - } - }); + $(this.dialog.body).html(html); + } - links = frappe.utils.sort(links, "label"); + load_doctypes() { + const already_loaded = Object.keys(locals.DocType); + let doctypes_to_load = []; - if(!links) { - me.dialog.fields_dict.list.$wrapper.html("
" - + me.frm.doctype + ": " - + (me.frm.__linked_doctypes ? __("Not Linked to any record.") : __("Not enough permission to see links.")) - + "
") - return true; - } - - return false; - }, - - get_linked_doctypes: function() { - var me = this; if (this.frm.__linked_doctypes) { - return; + doctypes_to_load = + Object.keys(this.frm.__linked_doctypes) + .filter(doctype => !already_loaded.includes(doctype)); } - return frappe.call({ - method: "frappe.desk.form.linked_with.get_linked_doctypes", - args: { - doctype: this.frm.doctype - }, - callback: function(r) { - me.frm.__linked_doctypes = r.message; - } - }); - }, - - get_linked_docs: function() { - var me = this; - return frappe.call({ - method:"frappe.desk.form.linked_with.get_linked_docs", - args: { - doctype: me.frm.doctype, - name: me.frm.docname, - linkinfo: me.frm.__linked_doctypes, - for_doctype: me.for_doctype - }, - callback: function(r) { - var parent = me.dialog.fields_dict.list.$wrapper.empty(); - - if(keys(r.message || {}).length) { - $.each(keys(r.message).sort(), function(i, doctype) { - - if (Object.keys(locals.DocType).indexOf(doctype)=== -1) { - frappe.model.with_doctype(doctype, function() { - if (frappe.listview_settings[doctype]) { - // add additional fields to __linked_doctypes - me.frm.__linked_doctypes[doctype] = {} - me.frm.__linked_doctypes[doctype].add_fields = frappe.listview_settings[doctype].add_fields; - } - }, /*async*/ false); - } - - var listview = frappe.views.get_listview(doctype, me); - listview.no_delete = true; - me.current_view = "List" - - var wrapper = $('
').appendTo(parent); - $('
').html(__(doctype).bold()).appendTo(wrapper); - var body = $('
').appendTo(wrapper); - - $.each(r.message[doctype], function(i, d) { - d.doctype = doctype; - listview.render($('
') - .appendTo(body), d, me); - }) - }) - } else { - parent.html(__("Not Linked to any record.")); + // load all doctypes asynchronously using with_doctype + const promises = doctypes_to_load.map(dt => { + return frappe.model.with_doctype(dt, () => { + if(frappe.listview_settings[dt]) { + // add additional fields to __linked_doctypes + this.frm.__linked_doctypes[dt].add_fields = + frappe.listview_settings[dt].add_fields; } + }); + }); + + return Promise.all(promises); + } + + links_not_permitted_or_missing() { + var me = this; + let links = null; + + links = + Object.keys(this.frm.__linked_doctypes) + .filter(frappe.model.can_get_report); + + let flag; + if(!links) { + $(this.dialog.body).html( + `${this.frm.__linked_doctypes + ? __("Not enough permission to see links") + : __("Not Linked to any record")}`); + flag = true; + } + flag = false; + + // reject Promise if not_permitted or missing + return new Promise( + (resolve, reject) => flag ? reject() : resolve() + ); + } + + get_linked_doctypes() { + return new Promise((resolve, reject) => { + if (this.frm.__linked_doctypes) { + resolve(); + } + + frappe.call({ + method: "frappe.desk.form.linked_with.get_linked_doctypes", + args: { + doctype: this.frm.doctype + }, + callback: (r) => { + this.frm.__linked_doctypes = r.message; + resolve(); + } + }); + }); + } + + get_linked_docs() { + return frappe.call({ + method: "frappe.desk.form.linked_with.get_linked_docs", + args: { + doctype: this.frm.doctype, + name: this.frm.docname, + linkinfo: this.frm.__linked_doctypes, + for_doctype: this.for_doctype + }, + callback: (r) => { + this.frm.__linked_docs = r.message || {}; } }); } -}); + + make_doc_head(heading) { + return `
+
+ ${heading} +
`; + } + + make_doc_row(doc, doctype) { + return `
+
+ +
+
`; + } +} diff --git a/frappe/public/js/frappe/list/list_renderer.js b/frappe/public/js/frappe/list/list_renderer.js index 5e9399cab0..bbdc86b120 100644 --- a/frappe/public/js/frappe/list/list_renderer.js +++ b/frappe/public/js/frappe/list/list_renderer.js @@ -503,6 +503,8 @@ frappe.views.ListRenderer = Class.extend({ this.render_view = function (values) { // prepare data before rendering view values = values.map(me.prepare_data.bind(this)); + // remove duplicates + values = values.uniqBy(value => value.name); if (lib_exists) { me.load_lib(function () { diff --git a/frappe/public/js/frappe/misc/tools.js b/frappe/public/js/frappe/misc/tools.js index 622d0da507..1414a5eee6 100644 --- a/frappe/public/js/frappe/misc/tools.js +++ b/frappe/public/js/frappe/misc/tools.js @@ -77,6 +77,14 @@ frappe.slickgrid_tools = { get_filtered_items: function(dataView) { var data = []; for (var i=0, len=dataView.getLength(); i 0 && (isNaN((new Date(val)).valueOf()))) { + val = " ".repeat(d['indent'] * 8) + val; + } + // remove single quotes at start and end of total labels when export to csv + if(val.charAt(0) == "'" && val.charAt(val.length -1) == "'") { + val = val.substr(1, val.length-2); + } + } row.push(val); }); diff --git a/frappe/public/js/frappe/request.js b/frappe/public/js/frappe/request.js index 41a2aef40b..e6ed3ccc18 100644 --- a/frappe/public/js/frappe/request.js +++ b/frappe/public/js/frappe/request.js @@ -67,15 +67,22 @@ frappe.request.call = function(opts) { opts.success_callback && opts.success_callback(data, xhr.responseText); }, 401: function(xhr) { - msgprint({message:__("You have been logged out"), indicator: 'red'}); - frappe.app.logout(); + if(frappe.app.session_expired_dialog && frappe.app.session_expired_dialog.display) { + frappe.app.redirect_to_login(); + } else { + frappe.app.handle_session_expired(); + }; }, 404: function(xhr) { msgprint({title:__("Not found"), indicator:'red', message: __('The resource you are looking for is not available')}); }, 403: function(xhr) { - if (xhr.responseJSON && xhr.responseJSON._server_messages) { + if (frappe.get_cookie('sid')==='Guest') { + // session expired + frappe.app.handle_session_expired(); + } + else if (xhr.responseJSON && xhr.responseJSON._server_messages) { var _server_messages = JSON.parse(xhr.responseJSON._server_messages); // avoid double messages @@ -83,10 +90,13 @@ frappe.request.call = function(opts) { return; } } + else { + frappe.msgprint({ + title:__("Not permitted"), indicator:'red', + message: __('You do not have enough permissions to access this resource. Please contact your manager to get access.')}); + } + - frappe.utils.play_sound("error"); - msgprint({title:__("Not permitted"), indicator:'red', - message: __('You do not have enough permissions to access this resource. Please contact your manager to get access.')}); }, 508: function(xhr) { frappe.utils.play_sound("error"); @@ -233,11 +243,7 @@ frappe.request.cleanup = function(opts, r) { // session expired? - Guest has no business here! if(r.session_expired || frappe.get_cookie("sid")==="Guest") { - if(!frappe.app.logged_out) { - localStorage.setItem("session_last_route", location.hash); - msgprint(__('Session Expired. Logging you out')); - frappe.app.logout(); - } + frappe.app.handle_session_expired(); return; } diff --git a/frappe/public/js/frappe/ui/dialog.js b/frappe/public/js/frappe/ui/dialog.js index 18ef247519..8ab1019a54 100644 --- a/frappe/public/js/frappe/ui/dialog.js +++ b/frappe/public/js/frappe/ui/dialog.js @@ -47,7 +47,8 @@ frappe.ui.Dialog = frappe.ui.FieldGroup.extend({ cur_dialog = null; } } - me.onhide && me.onhide.apply(me); + me.onhide && me.onhide(); + me.on_hide && me.on_hide(); }) .on("shown.bs.modal", function() { // focus on first input diff --git a/frappe/public/js/frappe/ui/upload.html b/frappe/public/js/frappe/ui/upload.html index 23b4a8b4de..08977e0be0 100644 --- a/frappe/public/js/frappe/ui/upload.html +++ b/frappe/public/js/frappe/ui/upload.html @@ -1,9 +1,9 @@
- +
- + +
`; + + return $(template); + }, + upload_multiple_files: function(files /*FileData array*/, args, opts) { + var i = -1; + + // upload the first file + upload_next(); + // subsequent files will be uploaded after + // upload_complete event is fired for the previous file + $(document).on('upload_complete', on_upload); + + function upload_next() { + i += 1; + var file = files[i]; + args.is_private = file.is_private; + frappe.upload.upload_file(file, args, opts); + frappe.show_progress(__('Uploading'), i+1, files.length); + } + + function on_upload(e, attachment) { + if (i === files.length - 1) { + $(document).off('upload_complete', on_upload); + frappe.hide_progress(); + return; + } + upload_next(); + } + }, upload_file: function(fileobj, args, opts) { if(!fileobj && !args.file_url) { if(opts.on_no_attach) { @@ -153,7 +270,7 @@ frappe.upload = { }, upload_to_server: function(fileobj, args, opts, dataurl) { - var msgbox = msgprint(__("Uploading...")); + // var msgbox = msgprint(__("Uploading...")); if(opts.start) { opts.start(); } @@ -162,11 +279,12 @@ frappe.upload = { args: args, callback: function(r) { if(!r._server_messages) { - msgbox.hide(); + // msgbox.hide(); } if(r.exc) { // if no onerror, assume callback will handle errors opts.onerror ? opts.onerror(r) : opts.callback(null, r); + frappe.hide_progress(); return; } var attachment = r.message; @@ -177,6 +295,7 @@ frappe.upload = { error: function(r) { // if no onerror, assume callback will handle errors opts.onerror ? opts.onerror(r) : opts.callback(null, null, r); + frappe.hide_progress(); return; } } @@ -216,9 +335,9 @@ frappe.upload = { for (var i =0,j = fileobjs.length;i%(label)s', { module: breadcrumbs.module, label: __(label) })) .appendTo($breadcrumbs); diff --git a/frappe/public/js/frappe/views/calendar/calendar.js b/frappe/public/js/frappe/views/calendar/calendar.js index d8df66ceea..f17e48b2e2 100644 --- a/frappe/public/js/frappe/views/calendar/calendar.js +++ b/frappe/public/js/frappe/views/calendar/calendar.js @@ -96,31 +96,10 @@ frappe.views.Calendar = Class.extend({ "end": "end", "allDay": "all_day", }, - styles: { - "standard": { - "color": "#F0F4F7" - }, - "important": { - "color": "#FFDCDC" - }, - "danger": { - "color": "#FFDCDC" - }, - "warning": { - "color": "#FFE6BF", - }, - "success": { - "color": "#E4FFC1", - }, - "info": { - "color": "#E8DDFF" - }, - "inverse": { - "color": "#D9F6FF" - }, - "": { - "color": "#F0F4F7" - } + color_map: { + "danger": "red", + "success": "green", + "warning": "orange" }, get_system_datetime: function(date) { date._offset = moment.user_utc_offset; @@ -146,7 +125,7 @@ frappe.views.Calendar = Class.extend({ args: me.get_args(start, end), callback: function(r) { var events = r.message; - me.prepare_events(events); + events = me.prepare_events(events); callback(events); } }) @@ -168,7 +147,6 @@ frappe.views.Calendar = Class.extend({ if (view.name==="month" && (endDate - startDate)===86400000) { // detect single day click in month view return; - } var event = frappe.model.get_new_doc(me.doctype); @@ -221,7 +199,8 @@ frappe.views.Calendar = Class.extend({ }, prepare_events: function(events) { var me = this; - $.each(events || [], function(i, d) { + + return (events || []).map(d => { d.id = d.name; d.editable = frappe.model.can_write(d.doctype || me.doctype); @@ -243,25 +222,21 @@ frappe.views.Calendar = Class.extend({ me.fix_end_date_for_event_render(d); + let color; if(me.get_css_class) { - $.extend(d, me.styles[me.get_css_class(d)] || {}); - } else if(me.style_map) { - $.extend(d, me.styles[me.style_map[d.status]] || {}); + color = me.color_map[me.get_css_class(d)]; } else { - $.extend(d, me.styles[frappe.utils.guess_style(d.status, "standard")]); + // color field can be set in {doctype}_calendar.js + // see event_calendar.js + color = d.color; } - d["textColor"] = "#36414C"; - }) - - var palette_colors = ['red', 'green', 'blue', 'yellow', 'skyblue', 'orange']; - var index = 0; - - if(events) { - events = events.map(function(event) { - event.className = "fc-bg-" + palette_colors[index]; - index = (index + 1) % palette_colors.length; - }) - } + // if invalid, fallback to blue color + if(!Object.values(me.color_map).includes(color)) { + color = "blue"; + } + d.className = "fc-bg-" + color; + return d; + }); }, update_event: function(event, revertFunc) { var me = this; diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js index 930e52ab0a..8aa1deb45c 100644 --- a/frappe/public/js/legacy/form.js +++ b/frappe/public/js/legacy/form.js @@ -145,12 +145,12 @@ _f.Frm.prototype.setup_drag_drop = function() { throw "attach error"; } - frappe.upload.multifile_upload(dataTransfer.files, me.attachments.get_args(), { + frappe.upload.make({ + args: me.attachments.get_args(), + files: dataTransfer.files, callback: function(attachment, r) { me.attachments.attachment_uploaded(attachment, r); - }, - - confirm_is_private: true + } }); }); } diff --git a/frappe/public/js/lib/datepicker/locale-all.js b/frappe/public/js/lib/datepicker/locale-all.js index e7021c3b80..6893fbc169 100644 --- a/frappe/public/js/lib/datepicker/locale-all.js +++ b/frappe/public/js/lib/datepicker/locale-all.js @@ -38,6 +38,19 @@ }; })(jQuery); ;(function ($) { $.fn.datepicker.language['en'] = { + days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], + months: ['January','February','March','April','May','June', 'July','August','September','October','November','December'], + monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + today: 'Today', + clear: 'Clear', + dateFormat: 'dd/mm/yyyy', + timeFormat: 'hh:ii aa', + firstDay: 0 +}; })(jQuery); + +;(function ($) { $.fn.datepicker.language['en-GB'] = { days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], @@ -234,4 +247,4 @@ dateFormat: 'yyyy-mm-dd', timeFormat: 'hh:ii', firstDay: 1 -}; })(jQuery); \ No newline at end of file +}; })(jQuery); diff --git a/frappe/public/js/lib/jSignature.min.js b/frappe/public/js/lib/jSignature.min.js new file mode 100755 index 0000000000..b89c06ff58 --- /dev/null +++ b/frappe/public/js/lib/jSignature.min.js @@ -0,0 +1,79 @@ +/* + +jSignature v2 "2013-12-09T05:51" "commit ID ebe94c351d7267e21b4fc741c79a8191391cb579" +Copyright (c) 2012 Willow Systems Corp http://willow-systems.com +Copyright (c) 2010 Brinley Ang http://www.unbolt.net +MIT License + + +base64 encoder +MIT, GPL +http://phpjs.org/functions/base64_encode ++ original by: Tyler Akins (http://rumkin.com) ++ improved by: Bayron Guevara ++ improved by: Thunder.m ++ improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) ++ bugfixed by: Pellentesque Malesuada ++ improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) ++ improved by: Rafal Kukawski (http://kukawski.pl) + + +jSignature v2 jSignature's Undo Button and undo functionality plugin + + +jSignature v2 jSignature's custom "base30" format export and import plugins. + + +jSignature v2 SVG export plugin. + + +Simplify.js BSD +(c) 2012, Vladimir Agafonkin +mourner.github.com/simplify-js + +*/ +(function(){function r(c){var a,b=c.css("color"),d;c=c[0];for(var l=!1;c&&!d&&!l;){try{a=$(c).css("background-color")}catch(E){a="transparent"}"transparent"!==a&&"rgba(0, 0, 0, 0)"!==a&&(d=a);l=c.body;c=c.parentNode}c=/rgb[a]*\((\d+),\s*(\d+),\s*(\d+)/;var l=/#([AaBbCcDdEeFf\d]{2})([AaBbCcDdEeFf\d]{2})([AaBbCcDdEeFf\d]{2})/,h;a=void 0;(a=b.match(c))?h={r:parseInt(a[1],10),g:parseInt(a[2],10),b:parseInt(a[3],10)}:(a=b.match(l))&&(h={r:parseInt(a[1],16),g:parseInt(a[2],16),b:parseInt(a[3],16)});var e; +d?(a=void 0,(a=d.match(c))?e={r:parseInt(a[1],10),g:parseInt(a[2],10),b:parseInt(a[3],10)}:(a=d.match(l))&&(e={r:parseInt(a[1],16),g:parseInt(a[2],16),b:parseInt(a[3],16)})):e=h?127
').appendTo(d);this.isCanvasEmulator=!1;a=this.canvas=this.initializeCanvas(e);b=$(a);this.$controlbarLower=$('
').appendTo(d); +this.canvasContext=a.getContext("2d");b.data(f+".this",this);e.lineWidth=function(a,b){return a?a:Math.max(Math.round(b/400),2)}(e.lineWidth,a.width);this.lineCurveThreshold=3*e.lineWidth;e.cssclass&&""!=$.trim(e.cssclass)&&b.addClass(e.cssclass);this.fatFingerCompensation=0;d=function(a){var b,c,d=function(d){d=d.changedTouches&&0e.minFatFingerCompensation?-3*e.lineWidth:e.minFatFingerCompensation;b(l);d.ontouchend=a;d.ontouchstart=b;d.ontouchmove=c},d.onmousedown=function(e){d.ontouchstart=d.ontouchend=d.ontouchmove=void 0;b(e);d.onmousedown=b;d.onmouseup=a;d.onmousemove=c},window.navigator.msPointerEnabled&& +(d.onmspointerdown=b,d.onmspointerup=a,d.onmspointermove=c))}).call(this,d.drawEndHandler,d.drawStartHandler,d.drawMoveHandler);c[f+".windowmouseup"]=l.subscribe(f+".windowmouseup",d.drawEndHandler);this.events.publish(f+".attachingEventHandlers");s.call(this,this,e.width.toString(10),f,l);this.resetCanvas(e.data);this.events.publish(f+".initialized");return this}function w(c){if(c.getContext)return!1;var a=c.ownerDocument.parentWindow,b=a.FlashCanvas?c.ownerDocument.parentWindow.FlashCanvas:"undefined"=== +typeof FlashCanvas?void 0:FlashCanvas;if(b){c=b.initElement(c);b=1;a&&a.screen&&a.screen.deviceXDPI&&a.screen.logicalXDPI&&(b=1*a.screen.deviceXDPI/a.screen.logicalXDPI);if(1!==b)try{$(c).children("object").get(0).resize(Math.ceil(c.width*b),Math.ceil(c.height*b)),c.getContext("2d").scale(b,b)}catch(d){}return!0}throw Error("Canvas element does not support 2d context. jSignature cannot proceed.");}var f="jSignature",u=function(c,a){var b;this.kick=function(){clearTimeout(b);b=setTimeout(a,c)};this.clear= +function(){clearTimeout(b)};return this},t=function(c){this.topics={};this.context=c?c:this;this.publish=function(a,b,c,e){if(this.topics[a]){var f=this.topics[a],h=Array.prototype.slice.call(arguments,1),m=[],q,g,p,x;g=0;for(p=f.length;gthis.lineCurveThreshold){m=2this.lineCurveThreshold)if(1').appendTo(this.$controlbarLower),k=g.width();g.css("left",Math.round((this.canvas.width-k)/2));k!==g.width()&&g.width(k);return g});r.call(this,g,"jSignature",k)}})})})(); +(function(){for(var r={},k={},g="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX".split(""),n=g.length/2,s=n-1;-1l&&0a&&(a=1,e.push("Y")),d=Math.abs(l),d>=n?e.push(v(d.toString(n))):e.push(d.toString(n));return e.join("")},f=function(f){var e= +[];f=f.split("");for(var c=f.length,a,b=1,d=[],l=0,g=0;ga?(a=2c){var a=(new k(e.x[a-2],e.y[a-2])).getVectorToPoint(d),d=b.angleTo(a.reverse()),f=0.35*b.getLength(),a=(new r(a.x+b.x,a.y+b.y)).resizeTo(Math.max(0.05,d)*f);return["c",g(a.x,2),g(a.y,2),g(b.x, +2),g(b.y,2),g(b.x,2),g(b.y,2)]}return["l",g(b.x,2),g(b.y,2)]}function v(e,c,a){c=["M",g(e.x[0]-c,2),g(e.y[0]-a,2)];a=1;for(var b=e.x.length-1;a',''],b,d=e.length,f,g=[],h=[],m=f=b=0,k=0,n=[];if(0!==d){for(b=0;bd?0:d;k=0>g?0:g;b-=d;f=h-g}a.push('');b=0;for(d=n.length;b');a.push("");return a.join("")}function u(e,c){return[C,f(e,c)]}function t(e,c){return[q,y(f(e,c))]}(function(e,c){"use strict";(typeof exports!= +c+""?exports:e).simplify=function(a,b,d){b=b!==c?b*b:1;if(!d){var e=a.length,f,g=a[0],m=[g];for(d=1;db&&(m.push(f),g=f)}a=(g!==f&&m.push(f),m)}f=a;d=f.length;var e=new (typeof Uint8Array!=c+""?Uint8Array:Array)(d),g=0,m=d-1,p,q,r=[],s=[],y=[];for(e[g]=e[m]=1;m;){n=0;for(k=g+1;kn&&(q=k,n=p)}n>b&&(e[q]=1,r.push(g),s.push(q),r.push(q),s.push(m));g=r.pop();m=s.pop()}for(k=0;k>18&63,b=f>>12&63,d=f>>6&63,f&=63,k[h++]=c[a]+c[b]+c[d]+c[f];while(g -1)) { + window.location.href = r.message.redirect_to + } + } + }) +} diff --git a/frappe/templates/includes/login/login.js b/frappe/templates/includes/login/login.js index 652ee1f244..633dc15a45 100644 --- a/frappe/templates/includes/login/login.js +++ b/frappe/templates/includes/login/login.js @@ -170,11 +170,12 @@ login.login_handlers = (function() { window.location.href = data.home_page; } } else if(window.location.hash === '#forgot') { - console.log(data.message); if(data.message==='not found') { login.set_indicator(__("Not a valid user"), 'red'); } else if (data.message=='not allowed') { login.set_indicator(__("Not Allowed"), 'red'); + } else { + login.set_indicator(__("Instructions Emailed"), 'green'); } diff --git a/frappe/templates/pages/integrations/stripe_checkout.html b/frappe/templates/pages/integrations/stripe_checkout.html new file mode 100644 index 0000000000..0fe5dc0bb1 --- /dev/null +++ b/frappe/templates/pages/integrations/stripe_checkout.html @@ -0,0 +1,28 @@ +{% extends "templates/web.html" %} + +{% block title %} Payment {% endblock %} + +{%- block header -%}{% endblock %} + +{% block script %} + + +{% endblock %} + +{%- block page_content -%} + +

+ Loading Payment System + +

+ +{% endblock %} + +{% block style %} + +{% endblock %} \ No newline at end of file diff --git a/frappe/templates/pages/integrations/stripe_checkout.py b/frappe/templates/pages/integrations/stripe_checkout.py new file mode 100644 index 0000000000..e79a10fa44 --- /dev/null +++ b/frappe/templates/pages/integrations/stripe_checkout.py @@ -0,0 +1,49 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt +from __future__ import unicode_literals +import frappe +from frappe import _ +from frappe.utils import flt, cint +import json + +no_cache = 1 +no_sitemap = 1 + +expected_keys = ('amount', 'title', 'description', 'reference_doctype', 'reference_docname', + 'payer_name', 'payer_email', 'order_id', 'currency') + +def get_context(context): + context.no_cache = 1 + context.publishable_key = get_api_key() + + # all these keys exist in form_dict + if not (set(expected_keys) - set(frappe.form_dict.keys())): + for key in expected_keys: + context[key] = frappe.form_dict[key] + + context['amount'] = flt(context['amount']) + + else: + frappe.redirect_to_message(_('Some information is missing'), + _('Looks like someone sent you to an incomplete URL. Please ask them to look into it.')) + frappe.local.flags.redirect_location = frappe.local.response.location + raise frappe.Redirect + +def get_api_key(): + publishable_key = frappe.db.get_value("Stripe Settings", None, "publishable_key") + if cint(frappe.form_dict.get("use_sandbox")): + publishable_key = frappe.conf.sandbox_publishable_key + + return publishable_key + +@frappe.whitelist(allow_guest=True) +def make_payment(stripe_token_id, data, reference_doctype=None, reference_docname=None): + data = json.loads(data) + + data.update({ + "stripe_token_id": stripe_token_id + }) + + data = frappe.get_doc("Stripe Settings").create_request(data) + frappe.db.commit() + return data \ No newline at end of file diff --git a/frappe/templates/print_formats/standard_macros.html b/frappe/templates/print_formats/standard_macros.html index 0bfdd9d68b..b3c2059887 100644 --- a/frappe/templates/print_formats/standard_macros.html +++ b/frappe/templates/print_formats/standard_macros.html @@ -5,7 +5,7 @@
{{ frappe.render_template(df.options, {"doc": doc}) or "" }}
{%- elif df.fieldtype in ("Text", "Text Editor", "Code") -%} {{ render_text_field(df, doc) }} - {%- elif df.fieldtype in ("Image", "Attach Image", "Attach") + {%- elif df.fieldtype in ("Image", "Attach Image", "Attach", "Signature") and (guess_mimetype(doc[df.fieldname])[0] or "").startswith("image/") -%} {{ render_image(df, doc) }} {%- else -%} @@ -94,7 +94,6 @@ data-fieldname="{{ df.fieldname }}" data-fieldtype="{{ df.fieldtype }}" {%- endmacro -%} {%- macro render_image(df, doc) -%} - {%- if df.label %}{%- endif %} {{ print_value(df, doc) }} {% endmacro %} @@ -108,6 +107,8 @@ data-fieldname="{{ df.fieldname }}" data-fieldtype="{{ df.fieldtype }}" + {% elif df.fieldtype=="Signature" %} + {% elif df.fieldtype in ("Attach", "Attach Image") and doc[df.fieldname] and (guess_mimetype(doc[df.fieldname])[0] or "").startswith("image/") %}