diff --git a/frappe/__init__.py b/frappe/__init__.py index 666c51aea0..c540652c8c 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -23,7 +23,7 @@ if sys.version[0] == '2': reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '11.1.3' +__version__ = '11.1.4' __title__ = "Frappe Framework" local = Local() diff --git a/frappe/core/doctype/data_import/importer.py b/frappe/core/doctype/data_import/importer.py index 4ab7c3a10c..99c29be76f 100644 --- a/frappe/core/doctype/data_import/importer.py +++ b/frappe/core/doctype/data_import/importer.py @@ -16,7 +16,7 @@ from frappe.utils.csvutils import getlink from frappe.utils.dateutils import parse_date from frappe.utils.file_manager import save_url -from frappe.utils import cint, cstr, flt, getdate, get_datetime, get_url, get_url_to_form +from frappe.utils import cint, cstr, flt, getdate, get_datetime, get_url, get_absolute_url from six import text_type, string_types @@ -411,16 +411,16 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, # log errors if parentfield: log(**{"row": doc.idx, "title": 'Inserted row for "%s"' % (as_link(parenttype, doc.parent)), - "link": get_url_to_form(parenttype, doc.parent), "message": 'Document successfully saved', "indicator": "green"}) + "link": get_absolute_url(parenttype, doc.parent), "message": 'Document successfully saved', "indicator": "green"}) elif submit_after_import: log(**{"row": row_idx + 1, "title":'Submitted row for "%s"' % (as_link(doc.doctype, doc.name)), - "message": "Document successfully submitted", "link": get_url_to_form(doc.doctype, doc.name), "indicator": "blue"}) + "message": "Document successfully submitted", "link": get_absolute_url(doc.doctype, doc.name), "indicator": "blue"}) elif original: log(**{"row": row_idx + 1,"title":'Updated row for "%s"' % (as_link(doc.doctype, doc.name)), - "message": "Document successfully updated", "link": get_url_to_form(doc.doctype, doc.name), "indicator": "green"}) + "message": "Document successfully updated", "link": get_absolute_url(doc.doctype, doc.name), "indicator": "green"}) elif not update_only: log(**{"row": row_idx + 1, "title":'Inserted row for "%s"' % (as_link(doc.doctype, doc.name)), - "message": "Document successfully saved", "link": get_url_to_form(doc.doctype, doc.name), "indicator": "green"}) + "message": "Document successfully saved", "link": get_absolute_url(doc.doctype, doc.name), "indicator": "green"}) else: log(**{"row": row_idx + 1, "title":'Ignored row for %s' % (row[1]), "link": None, "message": "Document updation ignored", "indicator": "orange"}) @@ -437,7 +437,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, error_trace = frappe.get_traceback() if error_trace: error_log_doc = frappe.log_error(error_trace) - error_link = get_url_to_form("Error Log", error_log_doc.name) + error_link = get_absolute_url("Error Log", error_log_doc.name) else: error_link = None diff --git a/frappe/core/doctype/report/report.py b/frappe/core/doctype/report/report.py index 3f9162ffd7..789c989439 100644 --- a/frappe/core/doctype/report/report.py +++ b/frappe/core/doctype/report/report.py @@ -150,6 +150,8 @@ class Report(Document): if params.get('sort_by'): order_by = _format(params.get('sort_by').split('.')) + ' ' + params.get('sort_order') + elif params.get('order_by'): + order_by = params.get('order_by') else: order_by = _format([self.ref_doctype, 'modified']) + ' desc' diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 5a08f51df1..e746914399 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -358,6 +358,9 @@ class User(Document): where `%s`=%s""" % \ (tab[0], field, '%s', field, '%s'), (new_name, old_name)) + if frappe.db.exists("Chat Profile", old_name): + frappe.rename_doc("Chat Profile", old_name, new_name, force=True) + # set email frappe.db.sql("""\ update `tabUser` set email=%s diff --git a/frappe/desk/reportview.py b/frappe/desk/reportview.py index fef0db9f74..4df25fb1e8 100644 --- a/frappe/desk/reportview.py +++ b/frappe/desk/reportview.py @@ -214,7 +214,7 @@ def delete_items(): """delete selected items""" import json - il = sorted(json.loads(frappe.form_dict.get('items')), reverse=True, key=frappe.safe_decode) + il = sorted(json.loads(frappe.form_dict.get('items')), reverse=True) doctype = frappe.form_dict.get('doctype') failed = [] diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 3617b81ba8..bc5e772627 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -547,10 +547,20 @@ class BaseDocument(object): # single doctype value type is mediumtext return + column_types_to_check_length = ('varchar', 'int', 'bigint') + for fieldname, value in iteritems(self.get_valid_dict()): df = self.meta.get_field(fieldname) - if df and df.fieldtype in type_map and type_map[df.fieldtype][0]=="varchar": - max_length = cint(df.get("length")) or cint(varchar_len) + + if not df or df.fieldtype == 'Check': + # skip standard fields and Check fields + continue + + column_type = type_map[df.fieldtype][0] or None + default_column_max_length = type_map[df.fieldtype][1] or None + + if df and df.fieldtype in type_map and column_type in column_types_to_check_length: + max_length = cint(df.get("length")) or cint(default_column_max_length) if len(cstr(value)) > max_length: if self.parentfield and self.idx: diff --git a/frappe/public/js/frappe/form/grid.js b/frappe/public/js/frappe/form/grid.js index a535d0b35a..cdd3b6fb69 100644 --- a/frappe/public/js/frappe/form/grid.js +++ b/frappe/public/js/frappe/form/grid.js @@ -684,7 +684,7 @@ export default class Grid { data.push(["------"]); $.each(frappe.get_meta(me.df.options).fields, function(i, df) { // don't include the read-only field in the template - if(frappe.model.is_value_type(df.fieldtype) && !df.read_only) { + if(frappe.model.is_value_type(df.fieldtype)) { data[1].push(df.label); data[2].push(df.fieldname); let description = (df.description || "") + ' '; diff --git a/frappe/public/js/frappe/views/reports/reportview.js b/frappe/public/js/frappe/views/reports/reportview.js index b3b454afee..f10e0922af 100644 --- a/frappe/public/js/frappe/views/reports/reportview.js +++ b/frappe/public/js/frappe/views/reports/reportview.js @@ -801,7 +801,9 @@ frappe.views.ReportView = frappe.ui.BaseList.extend({ }); this.page.add_menu_item(__("Delete"), function() { - var delete_list = $.map(me.get_checked_items(), function(d) { return d.name; }); + var delete_list = $.map(me.get_checked_items(), function(d) { + return d.name.toString(); + }); if(!delete_list.length) return; if(frappe.confirm(__("This is PERMANENT action and you cannot undo. Continue?"), diff --git a/frappe/templates/base.html b/frappe/templates/base.html index 5e8f3b3396..9c68254e2f 100644 --- a/frappe/templates/base.html +++ b/frappe/templates/base.html @@ -32,6 +32,7 @@ frappe.ready_events.push(fn); } window.dev_server = {{ dev_server }}; + window.socketio_port = {{ frappe.socketio_port }}; {% block body %} diff --git a/frappe/templates/includes/blog/hero.html b/frappe/templates/includes/blog/hero.html index 8ec47f3ac0..b8a39e5c9c 100644 --- a/frappe/templates/includes/blog/hero.html +++ b/frappe/templates/includes/blog/hero.html @@ -1,4 +1,4 @@ -{% if blog_title and not (frappe.local.form_dict.txt or frappe.local.form_dict.by) %} +{% if blog_title and not (form_dict.txt or form_dict.by) %}

diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 3e92d3e5b9..8e5b89f1ef 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -745,6 +745,9 @@ def get_link_to_form(doctype, name, label=None): return """{1}""".format(get_url_to_form(doctype, name), label) +def get_absolute_url(doctype, name): + return "desk#Form/{0}/{1}".format(quoted(doctype), quoted(name)) + def get_url_to_form(doctype, name): return get_url(uri = "desk#Form/{0}/{1}".format(quoted(doctype), quoted(name))) diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py index 581a75cdaf..b4d2d2f0f3 100644 --- a/frappe/utils/global_search.py +++ b/frappe/utils/global_search.py @@ -311,7 +311,7 @@ def sync_global_search(): :return: """ while frappe.cache().llen('global_search_queue') > 0: - value = json.loads(frappe.cache().lpop('global_search_queue')) + value = json.loads(frappe.cache().lpop('global_search_queue').decode('utf-8')) sync_value(value) def sync_value(value): diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py index 16755e8d28..86b586667d 100644 --- a/frappe/utils/jinja.py +++ b/frappe/utils/jinja.py @@ -56,7 +56,7 @@ def render_template(template, context, is_path=None, safe_render=True): :param template: path or HTML containing the jinja template :param context: dict of properties to pass to the template :param is_path: (optional) assert that the `template` parameter is a path - :param safe_render: (optional) prevent server side scripting via jinja templating + :param safe_render: (optional) prevent server side scripting via jinja templating ''' from frappe import throw @@ -117,7 +117,6 @@ def get_allowed_functions_for_jenv(): 'date_format': date_format, "format_date": frappe.utils.data.global_date_format, "form_dict": getattr(frappe.local, 'form_dict', {}), - "local": frappe.local, "get_hooks": frappe.get_hooks, "get_meta": frappe.get_meta, "get_doc": frappe.get_doc, @@ -130,10 +129,12 @@ def get_allowed_functions_for_jenv(): "get_gravatar": frappe.utils.get_gravatar_url, "full_name": frappe.local.session.data.full_name if getattr(frappe.local, "session", None) else "Guest", "render_template": frappe.render_template, + "request": getattr(frappe.local, 'request', {}), 'session': { 'user': user, 'csrf_token': frappe.local.session.data.csrf_token if getattr(frappe.local, "session", None) else '' }, + "socketio_port": frappe.conf.socketio_port, }, 'style': { 'border_color': '#d1d8dd' diff --git a/frappe/website/js/website.js b/frappe/website/js/website.js index 7fa29991d0..a980955971 100644 --- a/frappe/website/js/website.js +++ b/frappe/website/js/website.js @@ -427,5 +427,6 @@ frappe.ready(function() { }); } } - }) + }); + frappe.socketio.init(window.socketio_port); });