diff --git a/frappe/__init__.py b/frappe/__init__.py index 427d747072..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.1' +__version__ = '11.1.4' __title__ = "Frappe Framework" local = Local() diff --git a/frappe/core/doctype/data_import/data_import.py b/frappe/core/doctype/data_import/data_import.py index 02624cdf65..3ca154c384 100644 --- a/frappe/core/doctype/data_import/data_import.py +++ b/frappe/core/doctype/data_import/data_import.py @@ -34,8 +34,10 @@ def import_data(data_import): frappe.db.set_value("Data Import", data_import, "import_status", "In Progress", update_modified=False) frappe.publish_realtime("data_import_progress", {"progress": "0", "data_import": data_import, "reload": True}, user=frappe.session.user) + from frappe.core.page.background_jobs.background_jobs import get_info enqueued_jobs = [d.get("job_name") for d in get_info()] + if data_import not in enqueued_jobs: enqueue(upload, queue='default', timeout=6000, event='data_import', job_name=data_import, data_import_doc=data_import, from_data_import="Yes", user=frappe.session.user) diff --git a/frappe/core/doctype/data_import/importer.py b/frappe/core/doctype/data_import/importer.py index fe9fe77955..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,31 +411,44 @@ 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"}) except Exception as e: error_flag = True - err_msg = frappe.local.message_log and "\n".join([json.loads(msg).get('message') for msg in frappe.local.message_log]) or cstr(e) + + # build error message + if frappe.local.message_log: + err_msg = "\n".join(['

{}

'.format(json.loads(msg).get('message')) for msg in frappe.local.message_log]) + else: + err_msg = '

{}

'.format(cstr(e)) + 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 - log(**{"row": row_idx + 1, "title":'Error for row %s' % (len(row)>1 and frappe.safe_decode(row[1]) or ""), "message": err_msg, - "indicator": "red", "link":error_link}) + + log(**{ + "row": row_idx + 1, + "title": 'Error for row %s' % (len(row)>1 and frappe.safe_decode(row[1]) or ""), + "message": err_msg, + "indicator": "red", + "link":error_link + }) + # data with error to create a new file # include the errored data in the last row as last_error_row_idx will not be updated for the last row if skip_errors: diff --git a/frappe/core/doctype/data_import/log_details.html b/frappe/core/doctype/data_import/log_details.html index ae6c02ac04..aa160a742b 100644 --- a/frappe/core/doctype/data_import/log_details.html +++ b/frappe/core/doctype/data_import/log_details.html @@ -6,19 +6,19 @@ {{ __("Row Status") }} {{ __("Message") }} - + {% for row in data %} {% if (!show_only_errors) || (show_only_errors && row.indicator == "red") %} - {{ row.row }} + {{ row.row }} {{ row.title }} {% if (import_status != "Failed" || (row.indicator == "red")) { %} - {{ row.message }} +
{{ row.message }}
{% if row.link %} 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 3d1a803e4d..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 @@ -930,7 +933,7 @@ def handle_password_test_fail(result): suggestions = result['feedback']['suggestions'][0] if result['feedback']['suggestions'] else '' warning = result['feedback']['warning'] if 'warning' in result['feedback'] else '' suggestions += "
" + _("Hint: Include symbols, numbers and capital letters in the password") + '
' - frappe.throw(_('Invalid Password: ' + ' '.join([warning, suggestions]))) + frappe.throw(' '.join([_('Invalid Password:'), warning, suggestions])) def update_gravatar(name): gravatar = has_gravatar(name) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index d33c341a9b..105be44dce 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -192,7 +192,9 @@ def run(report_name, filters=None, user=None): def get_prepared_report_result(report, filters, dn="", user=None): latest_report_data = {} # Only look for completed prepared reports with given filters. - doc_list = frappe.get_all("Prepared Report", filters={"status": "Completed", "report_name": report.name, "filters": json.dumps(filters), "owner": user}) + doc_list = frappe.get_all("Prepared Report", + filters={"status": "Completed", "report_name": report.name, "filters": filters, "owner": user}) + doc = None if len(doc_list): if dn: 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/patches.txt b/frappe/patches.txt index cc2dc8827b..ff4079afa1 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -234,3 +234,4 @@ frappe.patches.v11_0.migrate_report_settings_for_new_listview frappe.patches.v11_0.delete_all_prepared_reports frappe.patches.v11_0.fix_order_by_in_reports_json execute:frappe.delete_doc('Page', 'applications', ignore_missing=True) +frappe.patches.v11_0.set_missing_creation_and_modified_value_for_user_permissions \ No newline at end of file diff --git a/frappe/patches/v11_0/remove_skip_for_doctype.py b/frappe/patches/v11_0/remove_skip_for_doctype.py index c3b9ffff80..edd385e317 100644 --- a/frappe/patches/v11_0/remove_skip_for_doctype.py +++ b/frappe/patches/v11_0/remove_skip_for_doctype.py @@ -43,9 +43,9 @@ def execute(): # only specific doctypes are selected # split this into multiple records and delete linked_doctypes = get_linked_doctypes(user_permission.allow, True).keys() - + linked_doctypes = list(linked_doctypes) - + # append the doctype for which we have build the user permission linked_doctypes += [user_permission.allow] @@ -56,14 +56,16 @@ def execute(): user_permission.skip_for_doctype = None for doctype in applicable_for_doctypes: if doctype: - # Maintain sequence (name, user, allow, for_value, applicable_for, apply_to_all_doctypes) + # Maintain sequence (name, user, allow, for_value, applicable_for, apply_to_all_doctypes, creation, modified) new_user_permissions_list.append(( frappe.generate_hash("", 10), user_permission.user, user_permission.allow, user_permission.for_value, doctype, - 0 + 0, + user_permission.creation, + user_permission.modified )) else: # No skip_for_doctype found! Just update apply_to_all_doctypes. @@ -72,7 +74,7 @@ def execute(): if new_user_permissions_list: frappe.db.sql(''' INSERT INTO `tabUser Permission` - (`name`, `user`, `allow`, `for_value`, `applicable_for`, `apply_to_all_doctypes`) + (`name`, `user`, `allow`, `for_value`, `applicable_for`, `apply_to_all_doctypes`, `creation`, `modified`) VALUES {} '''.format( # nosec ', '.join(['%s'] * len(new_user_permissions_list)) diff --git a/frappe/patches/v11_0/set_missing_creation_and_modified_value_for_user_permissions.py b/frappe/patches/v11_0/set_missing_creation_and_modified_value_for_user_permissions.py new file mode 100644 index 0000000000..84d6d6c994 --- /dev/null +++ b/frappe/patches/v11_0/set_missing_creation_and_modified_value_for_user_permissions.py @@ -0,0 +1,6 @@ +import frappe + +def execute(): + frappe.db.sql('''UPDATE `tabUser Permission` + SET `modified`=NOW(), `creation`=NOW() + WHERE `creation` IS NULL''') \ No newline at end of file diff --git a/frappe/printing/page/print_format_builder/print_format_builder_section.html b/frappe/printing/page/print_format_builder/print_format_builder_section.html index d08a7ca5b2..cd173c4b40 100644 --- a/frappe/printing/page/print_format_builder/print_format_builder_section.html +++ b/frappe/printing/page/print_format_builder/print_format_builder_section.html @@ -1,4 +1,4 @@ -