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()