diff --git a/frappe/__init__.py b/frappe/__init__.py index d593bb8acb..488b649f57 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.29' +__version__ = '10.1.30' __title__ = "Frappe Framework" local = Local() diff --git a/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.py b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.py index 4df27b9b10..f05e187972 100644 --- a/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.py +++ b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.py @@ -61,10 +61,11 @@ class RolePermissionforPageandReport(Document): def get_roles(self): roles = [] for data in self.roles: - roles.append({ - 'role': data.role, - 'parenttype': 'Custom Role' - }) + if data.role != "All": + roles.append({ + 'role': data.role, + 'parenttype': 'Custom Role' + }) return roles def update_status(self): diff --git a/frappe/model/rename_doc.py b/frappe/model/rename_doc.py index cc502016ea..732b85456b 100644 --- a/frappe/model/rename_doc.py +++ b/frappe/model/rename_doc.py @@ -390,6 +390,8 @@ def bulk_rename(doctype, rows=None, via_console = False): else: rename_log.append(msg) + frappe.enqueue('frappe.utils.global_search.rebuild_for_doctype', doctype=doctype) + if not via_console: return rename_log diff --git a/frappe/patches.txt b/frappe/patches.txt index 02c235d132..de06c712d3 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -200,4 +200,6 @@ frappe.patches.v9_1.resave_domain_settings frappe.patches.v9_1.revert_domain_settings frappe.patches.v9_1.move_feed_to_activity_log execute:frappe.delete_doc('Page', 'data-import-tool', ignore_missing=True) -frappe.patches.v10_0.reload_countries_and_currencies \ No newline at end of file +frappe.patches.v10_0.reload_countries_and_currencies +frappe.patches.v10_0.set_no_copy_to_workflow_state +frappe.patches.v10_0.increase_single_table_column_length diff --git a/frappe/patches/v10_0/increase_single_table_column_length.py b/frappe/patches/v10_0/increase_single_table_column_length.py new file mode 100644 index 0000000000..3c2a2b3233 --- /dev/null +++ b/frappe/patches/v10_0/increase_single_table_column_length.py @@ -0,0 +1,8 @@ +""" +Run this after updating country_info.json and or +""" +import frappe + +def execute(): + for col in ("field", "doctype"): + frappe.db.sql_ddl("alter table `tabSingles` modify column `{0}` varchar(255)".format(col)) diff --git a/frappe/patches/v10_0/set_no_copy_to_workflow_state.py b/frappe/patches/v10_0/set_no_copy_to_workflow_state.py new file mode 100644 index 0000000000..00ca125bf7 --- /dev/null +++ b/frappe/patches/v10_0/set_no_copy_to_workflow_state.py @@ -0,0 +1,11 @@ +import frappe + +def execute(): + for dt in frappe.get_all("Workflow", fields=['name', 'document_type', 'workflow_state_field']): + fieldname = frappe.db.get_value("Custom Field", filters={'dt': dt.document_type, + 'fieldname': dt.workflow_state_field}) + + if fieldname: + custom_field = frappe.get_doc("Custom Field", fieldname) + custom_field.no_copy = 1 + custom_field.save() diff --git a/frappe/tests/test_utils.py b/frappe/tests/test_utils.py index 948e26a74f..9d7690dce4 100644 --- a/frappe/tests/test_utils.py +++ b/frappe/tests/test_utils.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import unittest from frappe.utils import evaluate_filters, money_in_words, scrub_urls, get_url +from frappe.utils import ceil, floor class TestFilters(unittest.TestCase): def test_simple_dict(self): @@ -84,3 +85,22 @@ class TestDataManipulation(unittest.TestCase): self.assertTrue(''.format(url) in html) self.assertTrue('style="background-image: url(\'{0}/assets/frappe/bg.jpg\') !important"'.format(url) in html) self.assertTrue('email' in html) + +class TestMathUtils(unittest.TestCase): + def test_floor(self): + from decimal import Decimal + self.assertEqual(floor(2), 2 ) + self.assertEqual(floor(12.32904), 12) + self.assertEqual(floor(22.7330), 22) + self.assertEqual(floor('24.7'), 24) + self.assertEqual(floor('26.7'), 26) + self.assertEqual(floor(Decimal(29.45)), 29) + + def test_ceil(self): + from decimal import Decimal + self.assertEqual(ceil(2), 2 ) + self.assertEqual(ceil(12.32904), 13) + self.assertEqual(ceil(22.7330), 23) + self.assertEqual(ceil('24.7'), 25) + self.assertEqual(ceil('26.7'), 27) + self.assertEqual(ceil(Decimal(29.45)), 30) diff --git a/frappe/utils/data.py b/frappe/utils/data.py index d6618d3b07..86fef0b61c 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -24,7 +24,7 @@ DATETIME_FORMAT = DATE_FORMAT + " " + TIME_FORMAT # datetime functions def getdate(string_date=None): """ - Coverts string date (yyyy-mm-dd) to datetime.date object + Converts string date (yyyy-mm-dd) to datetime.date object """ if not string_date: @@ -208,7 +208,7 @@ def get_user_format(): def formatdate(string_date=None, format_string=None): """ - Convers the given string date to :data:`user_format` + Converts the given string date to :data:`user_format` User format specified in defaults Examples: @@ -282,6 +282,44 @@ def cint(s): except: num = 0 return num +def floor(s): + """ + A number representing the largest integer less than or equal to the specified number + + Parameters + ---------- + s : int or str or Decimal object + The mathematical value to be floored + + Returns + ------- + int + number representing the largest integer less than or equal to the specified number + + """ + try: num = cint(math.floor(flt(s))) + except: num = 0 + return num + +def ceil(s): + """ + The smallest integer greater than or equal to the given number + + Parameters + ---------- + s : int or str or Decimal object + The mathematical value to be ceiled + + Returns + ------- + int + smallest integer greater than or equal to the given number + + """ + try: num = cint(math.ceil(flt(s))) + except: num = 0 + return num + def cstr(s, encoding='utf-8'): return frappe.as_unicode(s, encoding) @@ -436,7 +474,7 @@ def get_number_format_info(format): return number_format_info.get(format) or (".", ",", 2) # -# convet currency to words +# convert currency to words # def money_in_words(number, main_currency = None, fraction_currency=None): """ diff --git a/frappe/workflow/doctype/workflow/workflow.py b/frappe/workflow/doctype/workflow/workflow.py index 9de175c168..b1b22925ba 100644 --- a/frappe/workflow/doctype/workflow/workflow.py +++ b/frappe/workflow/doctype/workflow/workflow.py @@ -31,6 +31,7 @@ class Workflow(Document): "label": self.workflow_state_field.replace("_", " ").title(), "hidden": 1, "allow_on_submit": 1, + "no_copy": 1, "fieldtype": "Link", "options": "Workflow State", }).save()