diff --git a/frappe/__init__.py b/frappe/__init__.py index 405cdd88e5..cd6f0b8a8d 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template, get_email_from_template -__version__ = '10.1.67' +__version__ = '10.1.68' __title__ = "Frappe Framework" local = Local() diff --git a/frappe/core/doctype/report/report.py b/frappe/core/doctype/report/report.py index a7b1c4d4dc..197e781843 100644 --- a/frappe/core/doctype/report/report.py +++ b/frappe/core/doctype/report/report.py @@ -149,7 +149,7 @@ class Report(Document): if params.get('sort_by'): order_by = _format(params.get('sort_by').split('.')) + ' ' + params.get('sort_order') else: - order_by = _format(self.ref_doctype, 'modified') + ' desc' + order_by = _format([self.ref_doctype, 'modified']) + ' desc' if params.get('sort_by_next'): order_by += ', ' + _format(params.get('sort_by_next').split('.')) + ' ' + params.get('sort_order_next') diff --git a/frappe/core/doctype/report/test_report.py b/frappe/core/doctype/report/test_report.py index c2d5629a2b..287363e20f 100644 --- a/frappe/core/doctype/report/test_report.py +++ b/frappe/core/doctype/report/test_report.py @@ -53,3 +53,19 @@ class TestReport(unittest.TestCase): report = frappe.get_doc('Report', 'Test Report') self.assertNotEquals(report.is_permitted(), True) + + # test for the `_format` method if report data doesn't have sort_by parameter + def test_format_method(self): + if frappe.db.exists('Report', 'User Activity Report Without Sort'): + frappe.delete_doc('Report', 'User Activity Report Without Sort') + with open(os.path.join(os.path.dirname(__file__), 'user_activity_report_without_sort.json'), 'r') as f: + frappe.get_doc(json.loads(f.read())).insert() + + report = frappe.get_doc('Report', 'User Activity Report Without Sort') + + # this would raise an error without the fix added along with this test case + columns, data = report.get_data() + self.assertEqual(columns[0].get('label'), 'ID') + self.assertEqual(columns[1].get('label'), 'User Type') + self.assertTrue('Administrator' in [d[0] for d in data]) + frappe.delete_doc('Report', 'User Activity Report Without Sort') \ No newline at end of file diff --git a/frappe/core/doctype/report/user_activity_report_without_sort.json b/frappe/core/doctype/report/user_activity_report_without_sort.json new file mode 100644 index 0000000000..bb520a25e2 --- /dev/null +++ b/frappe/core/doctype/report/user_activity_report_without_sort.json @@ -0,0 +1,17 @@ +{ + "add_total_row": 0, + "apply_user_permissions": 1, + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "is_standard": "No", + "javascript": null, + "json": "{\"filters\":[],\"columns\":[[\"name\",\"User\"],[\"user_type\",\"User\"],[\"first_name\",\"User\"],[\"last_name\",\"User\"],[\"last_active\",\"User\"],[\"role\",\"Has Role\"]],\"sort_order\":\"desc\",\"sort_by_next\":null,\"sort_order_next\":\"desc\"}", + "modified": "2018-12-17 18:27:07.728890", + "module": "Core", + "name": "User Activity Report Without Sort", + "query": null, + "ref_doctype": "User", + "report_name": "User Activity Report Without Sort", + "report_type": "Report Builder" + } \ No newline at end of file diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index a5b54e7b8d..857e537997 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -266,3 +266,10 @@ class TestUser(unittest.TestCase): self.assertEqual(extract_mentions(user_name)[0], "test-user") user_name = "Testing comment, @test.user@example.com please check." self.assertEqual(extract_mentions(user_name)[0], "test.user@example.com") + user_name = "
@test_user@example.com and @test.again@example1.com
This is a test.
" + self.assertEqual(extract_mentions(user_name)[0], "test_user@example.com") + self.assertEqual(extract_mentions(user_name)[1], "test.again@example1.com") + user_name = "
@user@example.com Test @test-comment@xyz.com
Test for comment mentions @test@abc.com
" + self.assertEqual(extract_mentions(user_name)[0], "user@example.com") + self.assertEqual(extract_mentions(user_name)[1], "test-comment@xyz.com") + self.assertEqual(extract_mentions(user_name)[2], "test@abc.com") \ No newline at end of file diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index c4378dbb8c..68e178c42f 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -901,7 +901,7 @@ def notify_admin_access_to_system_manager(login_manager=None): def extract_mentions(txt): """Find all instances of @name in the string. The mentions will be separated by non-word characters or may appear at the start of the string""" - txt = txt.replace("
", "
") + txt = txt.replace("
", "
") txt = re.sub(r'(<[a-zA-Z\/][^>]*>)', '', txt) return re.findall(r'(?:[^\w\.\-\@]|^)@([\w\.\-\@]*)', txt) diff --git a/frappe/data/sample_site_config.json b/frappe/data/sample_site_config.json index 1bf3914039..36818ef286 100644 --- a/frappe/data/sample_site_config.json +++ b/frappe/data/sample_site_config.json @@ -8,7 +8,7 @@ "space": 0.157, "expiry": "2016-07-25", "users": 1 - } + }, "developer_mode": 1, "auto_cache_clear": true, diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py index a75c54f33b..1dca361d0a 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -12,7 +12,7 @@ from frappe.utils import now, global_date_format, format_time from frappe.utils.xlsxutils import make_xlsx from frappe.utils.csvutils import to_csv -max_reports_per_user = 3 +max_reports_per_user = frappe.local.conf.max_reports_per_user or 3 class AutoEmailReport(Document): def autoname(self):