From a8aba197b8d481907e3fe6db4522f1179132ef9c Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Wed, 10 Apr 2019 15:33:13 +0530 Subject: [PATCH 01/11] feat(site_sync): add scheduler event for site_sync via central agent --- frappe/hooks.py | 1 + frappe/limits.py | 10 +++++++++- frappe/utils/__init__.py | 5 ++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index 960badcbab..4b5390567a 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -156,6 +156,7 @@ scheduler_events = { "frappe.utils.error.collect_error_snapshots", "frappe.desk.page.backups.backups.delete_downloadable_backups", "frappe.limits.update_space_usage", + "frappe.limits.update_site_usage", "frappe.desk.doctype.auto_repeat.auto_repeat.make_auto_repeat_entry", ], "daily": [ diff --git a/frappe/limits.py b/frappe/limits.py index 0330db2567..7dac57e7a0 100755 --- a/frappe/limits.py +++ b/frappe/limits.py @@ -5,7 +5,8 @@ from frappe.utils import now_datetime, getdate, flt, cint, get_fullname from frappe.installer import update_site_config from frappe.utils.data import formatdate from frappe.utils.user import get_enabled_system_users, disable_users -import os, subprocess +from frappe.utils.__init__ import get_site_info +import os, subprocess, json from six.moves.urllib.parse import parse_qsl, urlsplit, urlunsplit, urlencode from six import string_types @@ -235,3 +236,10 @@ def get_database_size(): FROM information_schema.TABLES WHERE table_schema = %s GROUP BY table_schema''', db_name, as_dict=True) return flt(db_size[0].get('database_size'), 2) + +def update_site_usage(): + data = get_site_info() + # exists = os.path.isfile(frappe.get_site_path("site_data.json")) + with open(os.path.join(frappe.get_site_path(), 'site_data.json'), 'w') as outfile: + json.dump(data, outfile) + outfile.close() diff --git a/frappe/utils/__init__.py b/frappe/utils/__init__.py index d65819edcb..2803234fe0 100644 --- a/frappe/utils/__init__.py +++ b/frappe/utils/__init__.py @@ -541,6 +541,8 @@ def get_site_info(): system_settings = frappe.db.get_singles_dict('System Settings') space_usage = frappe._dict((frappe.local.conf.limits or {}).get('space_usage', {})) + kwargs = {"fields": ["user", "creation", "full_name"], "filters":{"Operation": "Login", "Status": "Success"}, "limit": "10"} + site_info = { 'installed_apps': get_installed_apps_info(), 'users': users, @@ -555,7 +557,8 @@ def get_site_info(): 'space_used': flt((space_usage.total or 0) / 1024.0, 2), 'database_size': space_usage.database_size, 'backup_size': space_usage.backup_size, - 'files_size': space_usage.files_size + 'files_size': space_usage.files_size, + 'last_logins': frappe.get_all("Activity Log", **kwargs) } # from other apps From 39660d6bd1340b732f52ae79e573cd248803da5f Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Fri, 12 Apr 2019 01:43:18 +0530 Subject: [PATCH 02/11] fix: get_system_manager --- frappe/utils/user.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/frappe/utils/user.py b/frappe/utils/user.py index 9814b22de4..d449abc219 100755 --- a/frappe/utils/user.py +++ b/frappe/utils/user.py @@ -312,13 +312,15 @@ def disable_users(limits=None): return if limits.get('users'): - system_manager = get_system_managers(only_name=True)[-1] - + system_manager = get_system_managers(only_name=True) + user_list = ['Administrator', 'Guest'] + if system_manager: + user_list.append(system_manager[-1]) #exclude system manager from active user list - active_users = frappe.db.sql_list("""select name from tabUser - where name not in ('Administrator', 'Guest', %s) and user_type = 'System User' and enabled=1 - order by creation desc""", system_manager) - + # active_users = frappe.db.sql_list("""select name from tabUser + # where name not in ('Administrator', 'Guest', %s) and user_type = 'System User' and enabled=1 + # order by creation desc""", system_manager) + active_users = frappe.get_all("User", filters={"user_type":"System User", "enabled":1, "name": ["not in", user_list]}, fields=["name"]) user_limit = cint(limits.get('users')) - 1 if len(active_users) > user_limit: From e4e2a6c310f3024a1ca2b6292faa7c9ea172dd16 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 15 Apr 2019 14:38:09 +0530 Subject: [PATCH 03/11] fix: save button should not remain disabled when the system is offline --- frappe/public/js/frappe/request.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/request.js b/frappe/public/js/frappe/request.js index 99b130ceb9..ce862fd25b 100644 --- a/frappe/public/js/frappe/request.js +++ b/frappe/public/js/frappe/request.js @@ -30,7 +30,8 @@ frappe.call = function(opts) { indicator: 'orange', message: __('You are not connected to Internet. Retry after sometime.') }, 3); - return; + opts.always && opts.always(); + return $.ajax(); } if (typeof arguments[0]==='string') { opts = { From 5558a42fa70e9a8c786efbf3a122407c4867f760 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 16 Apr 2019 13:32:09 +0530 Subject: [PATCH 04/11] fix: Show Hidden fields in Report Builder --- frappe/public/js/frappe/views/reports/report_view.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index 9799a7e934..686483ed91 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -720,9 +720,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { let out = {}; const standard_fields_filter = df => - !in_list(frappe.model.no_value_type, df.fieldtype) && - !df.report_hide && df.fieldname !== 'naming_series' && - !df.hidden; + !in_list(frappe.model.no_value_type, df.fieldtype) && !df.report_hide; let doctype_fields = frappe.meta.get_docfields(this.doctype).filter(standard_fields_filter); From 93d518755dec557b17e78c4f1cf0622d4077215a Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 16 Apr 2019 13:47:35 +0530 Subject: [PATCH 05/11] fix: Allow numeric filter without using = --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 358a4920aa..c2f6aaec6f 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "cookie": "^0.3.1", "express": "^4.16.2", "fast-deep-equal": "^2.0.1", - "frappe-datatable": "^1.12.0", + "frappe-datatable": "^1.12.1", "frappe-gantt": "^0.1.0", "fuse.js": "^3.2.0", "highlight.js": "^9.12.0", diff --git a/yarn.lock b/yarn.lock index a3c928e858..b8fb29551f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1224,10 +1224,10 @@ forwarded@~0.1.2: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= -frappe-datatable@^1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/frappe-datatable/-/frappe-datatable-1.12.0.tgz#2273535ead4404e5b165b6564c622acbacfdf61e" - integrity sha512-rrsRaxP9+CwPdJiYzmgmYD5ud+0pWzon8n+DKBrnrbFheN5SFnbuRdR58G8qA4/psHIN3rrSEximiQsbTUNdzw== +frappe-datatable@^1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/frappe-datatable/-/frappe-datatable-1.12.1.tgz#6efe342346025ffeed822e188a05da6c9c9230c9" + integrity sha512-AC2sJDuJOr0nSfT+w7DPZd7zPW7PHGhg9XxdRNlaAYpy45r3owdJVF+R6lCMQRvFvvzmPMht02EOE6cFpkzLKw== dependencies: hyperlist "^1.0.0-beta" lodash "^4.17.5" From 43d6b4f81fd303b036106779faa74afff7bf518e Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 18 Apr 2019 12:33:04 +0530 Subject: [PATCH 06/11] fix: On assignment, system sending an email to the assigned user even if notify to email is disabled --- frappe/desk/form/assign_to.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index a07d76ecd0..f57e0a92d7 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -6,6 +6,7 @@ from __future__ import unicode_literals import frappe from frappe import _ +from frappe.utils import cint from frappe.desk.form.load import get_docinfo import frappe.share @@ -160,7 +161,7 @@ def notify_assignment(assigned_by, owner, doc_type, doc_name, action='CLOSE', 'notify': notify } - if arg and arg.get("notify"): + if arg and cint(arg.get("notify")): _notify(arg) def _notify(args): From aa7ff91239cd148fd44e4a16a814ffc877066659 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 18 Apr 2019 13:16:05 +0530 Subject: [PATCH 07/11] fix: User not able to make lead from the communication --- frappe/email/inbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/email/inbox.py b/frappe/email/inbox.py index 9df4218d71..0ff3a4ddd8 100644 --- a/frappe/email/inbox.py +++ b/frappe/email/inbox.py @@ -145,7 +145,7 @@ def make_lead_from_communication(communication, ignore_communication_links=False lead_name = None if doc.sender: lead_name = frappe.db.get_value("Lead", {"email_id": doc.sender}) - if not lead_name and doc.mobile_no: + if not lead_name and doc.phone_no: lead_name = frappe.db.get_value("Lead", {"mobile_no": doc.phone_no}) if not lead_name: lead = frappe.get_doc({ From 1fd14e13ce33efd5b369eb4098a94ae37ad77c29 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Sat, 20 Apr 2019 11:48:47 +0530 Subject: [PATCH 08/11] fix: Prepared report shows status as Queued even if job is failed (#7317) --- .../prepared_report/prepared_report.json | 114 +++++++++++++++++- .../prepared_report/prepared_report.py | 37 +++--- .../prepared_report/prepared_report_list.js | 12 ++ 3 files changed, 146 insertions(+), 17 deletions(-) create mode 100644 frappe/core/doctype/prepared_report/prepared_report_list.js diff --git a/frappe/core/doctype/prepared_report/prepared_report.json b/frappe/core/doctype/prepared_report/prepared_report.json index e1b122e68a..ec89c6327a 100644 --- a/frappe/core/doctype/prepared_report/prepared_report.json +++ b/frappe/core/doctype/prepared_report/prepared_report.json @@ -21,6 +21,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "report_name", "fieldtype": "Data", "hidden": 1, @@ -53,6 +54,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "ref_report_doctype", "fieldtype": "Link", "hidden": 1, @@ -86,6 +88,8 @@ "bold": 0, "collapsible": 0, "columns": 0, + "default": "Queued", + "fetch_if_empty": 0, "fieldname": "status", "fieldtype": "Select", "hidden": 1, @@ -93,12 +97,12 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 0, + "in_list_view": 1, "in_standard_filter": 0, "label": "Status", "length": 0, "no_copy": 0, - "options": "Queued\nCompleted", + "options": "Error\nQueued\nCompleted", "permlevel": 0, "precision": "", "print_hide": 0, @@ -119,6 +123,39 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, "fieldname": "report_start_time", "fieldtype": "Datetime", "hidden": 0, @@ -151,6 +188,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "report_end_time", "fieldtype": "Datetime", "hidden": 0, @@ -183,6 +221,73 @@ "bold": 0, "collapsible": 0, "columns": 0, + "depends_on": "eval:doc.status == 'Error'", + "fetch_if_empty": 0, + "fieldname": "section_break_7", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "error_message", + "fieldtype": "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": "Error Message", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, "fieldname": "filters_sb", "fieldtype": "Section Break", "hidden": 0, @@ -215,6 +320,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "filters", "fieldtype": "Small Text", "hidden": 1, @@ -247,6 +353,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "filter_values", "fieldtype": "HTML", "hidden": 0, @@ -279,6 +386,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "columns", "fieldtype": "Code", "hidden": 1, @@ -315,7 +423,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-10-23 16:58:14.879417", + "modified": "2019-04-19 12:39:47.211516", "modified_by": "Administrator", "module": "Core", "name": "Prepared Report", diff --git a/frappe/core/doctype/prepared_report/prepared_report.py b/frappe/core/doctype/prepared_report/prepared_report.py index 13273d50b9..bc7050d3c4 100644 --- a/frappe/core/doctype/prepared_report/prepared_report.py +++ b/frappe/core/doctype/prepared_report/prepared_report.py @@ -25,31 +25,40 @@ class PreparedReport(Document): def after_insert(self): enqueue( run_background, - instance=self, timeout=6000 + prepared_report=self.name, timeout=6000 ) def on_trash(self): remove_all("PreparedReport", self.name, from_delete=True) -def run_background(instance): +def run_background(prepared_report): + instance = frappe.get_doc("Prepared Report", prepared_report) report = frappe.get_doc("Report", instance.ref_report_doctype) - report.custom_columns = [] + try: + report.custom_columns = [] - if report.report_type == 'Custom Report': - custom_report_doc = report - reference_report = custom_report_doc.reference_report - report = frappe.get_doc("Report", reference_report) - report.custom_columns = custom_report_doc.json + if report.report_type == 'Custom Report': + custom_report_doc = report + reference_report = custom_report_doc.reference_report + report = frappe.get_doc("Report", reference_report) + report.custom_columns = custom_report_doc.json - result = generate_report_result(report, filters=instance.filters, user=instance.owner) - create_json_gz_file(result['result'], 'Prepared Report', instance.name) + result = generate_report_result(report, filters=instance.filters, user=instance.owner) + create_json_gz_file(result['result'], 'Prepared Report', instance.name) - instance.status = "Completed" - instance.columns = json.dumps(result["columns"]) - instance.report_end_time = frappe.utils.now() - instance.save() + instance.status = "Completed" + instance.columns = json.dumps(result["columns"]) + instance.report_end_time = frappe.utils.now() + instance.save() + + except Exception: + frappe.log_error(frappe.get_traceback()) + instance = frappe.get_doc("Prepared Report", prepared_report) + instance.status = "Error" + instance.error_message = frappe.get_traceback() + instance.save() frappe.publish_realtime( 'report_generated', diff --git a/frappe/core/doctype/prepared_report/prepared_report_list.js b/frappe/core/doctype/prepared_report/prepared_report_list.js new file mode 100644 index 0000000000..8acb3bc75a --- /dev/null +++ b/frappe/core/doctype/prepared_report/prepared_report_list.js @@ -0,0 +1,12 @@ +frappe.listview_settings['Prepared Report'] = { + add_fields: ["status"], + get_indicator: function(doc) { + if(doc.status==="Completed"){ + return [__("Completed"), "green", "status,=,Completed"]; + } else if(doc.status ==="Error"){ + return [__("Error"), "red", "status,=,Error"]; + } else if(doc.status ==="Queued"){ + return [__("Queued"), "orange", "status,=,Queued"]; + } + } +}; \ No newline at end of file From 0c5fe71b69bcef488dd4529af5c6310d961be8d1 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Sat, 20 Apr 2019 11:50:36 +0530 Subject: [PATCH 09/11] fix: Move erpnext related methods from frappe to erpnext (#7315) Dependent PR https://github.com/frappe/erpnext/pull/17293 --- frappe/email/inbox.py | 65 +------------------------------------------ 1 file changed, 1 insertion(+), 64 deletions(-) diff --git a/frappe/email/inbox.py b/frappe/email/inbox.py index 0ff3a4ddd8..9d15b387e3 100644 --- a/frappe/email/inbox.py +++ b/frappe/email/inbox.py @@ -118,67 +118,4 @@ def link_communication_to_document(doc, reference_doctype, reference_name, ignor doc.reference_doctype = reference_doctype doc.reference_name = reference_name doc.status = "Linked" - doc.save(ignore_permissions=True) - -@frappe.whitelist() -def make_issue_from_communication(communication, ignore_communication_links=False): - """ raise a issue from email """ - - doc = frappe.get_doc("Communication", communication) - issue = frappe.get_doc({ - "doctype": "Issue", - "subject": doc.subject, - "communication_medium": doc.communication_medium, - "raised_by": doc.sender or "", - "raised_by_phone": doc.phone_no or "" - }).insert(ignore_permissions=True) - - link_communication_to_document(doc, "Issue", issue.name, ignore_communication_links) - - return issue.name - -@frappe.whitelist() -def make_lead_from_communication(communication, ignore_communication_links=False): - """ raise a issue from email """ - - doc = frappe.get_doc("Communication", communication) - lead_name = None - if doc.sender: - lead_name = frappe.db.get_value("Lead", {"email_id": doc.sender}) - if not lead_name and doc.phone_no: - lead_name = frappe.db.get_value("Lead", {"mobile_no": doc.phone_no}) - if not lead_name: - lead = frappe.get_doc({ - "doctype": "Lead", - "lead_name": doc.sender_full_name, - "email_id": doc.sender, - "mobile_no": doc.phone_no - }) - lead.flags.ignore_mandatory = True - lead.flags.ignore_permissions = True - lead.insert() - - lead_name = lead.name - - link_communication_to_document(doc, "Lead", lead_name, ignore_communication_links) - return lead_name - -@frappe.whitelist() -def make_opportunity_from_communication(communication, ignore_communication_links=False): - doc = frappe.get_doc("Communication", communication) - - lead = doc.reference_name if doc.reference_doctype == "Lead" else None - if not lead: - lead = make_lead_from_communication(communication, ignore_communication_links=True) - - enquiry_from = "Lead" - - opportunity = frappe.get_doc({ - "doctype": "Opportunity", - "enquiry_from": enquiry_from, - "lead": lead - }).insert(ignore_permissions=True) - - link_communication_to_document(doc, "Opportunity", opportunity.name, ignore_communication_links) - - return opportunity.name + doc.save(ignore_permissions=True) \ No newline at end of file From fd2f1b5e362835df1410033077cf0c96a8b5f70b Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Sun, 21 Apr 2019 22:03:19 +0530 Subject: [PATCH 10/11] fix: Link field fixes for custom reports --- frappe/desk/query_report.py | 2 +- frappe/public/js/frappe/views/reports/query_report.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index ce68437566..9da78e365a 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -225,7 +225,7 @@ def add_data_to_custom_columns(columns, result): fieldname = column['fieldname'] key = (column['doctype'], fieldname) link_field = column['link_field'] - row[fieldname] = custom_fields_data.get(key, {}).get(row[link_field]) + row[fieldname] = custom_fields_data.get(key, {}).get(row.get(link_field)) return data diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 9b91b2a2b5..7d689e1421 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -1020,6 +1020,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { label: df.label, link_field: this.doctype_field_map[values.doctype], doctype: values.doctype, + options: df.fieldtype === "Link" ? values.doctype : undefined, width: 100 }); From 2454a85b929402d6aa9ed0a7850e129bed64a3ae Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Mon, 22 Apr 2019 14:24:09 +0550 Subject: [PATCH 11/11] bumped to version 11.1.23 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 3ad1b5bc84..d2443e93f1 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -24,7 +24,7 @@ if sys.version[0] == '2': reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '11.1.22' +__version__ = '11.1.23' __title__ = "Frappe Framework" local = Local()