From 69335b23ce675f999d00a8007743acab9e3fbadd Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 10 Jan 2022 10:38:31 +0000 Subject: [PATCH 001/159] add reset password link expiry feature --- .../doctype/system_settings/system_settings.json | 12 ++++++++++-- frappe/core/doctype/user/user.json | 9 ++++++++- frappe/core/doctype/user/user.py | 12 ++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index 61410fb1a8..3fcd69a704 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -42,6 +42,7 @@ "allow_error_traceback", "strip_exif_metadata_from_uploaded_images", "password_settings", + "reset_password_link_expiry_seconds", "logout_on_password_reset", "force_user_to_reset_password", "password_reset_limit", @@ -485,7 +486,14 @@ "fieldtype": "Select", "label": "First Day of the Week", "options": "Sunday\nMonday\nTuesday\nWednesday\nThursday\nFriday\nSaturday" - } + }, + { + "default": "1200", + "fieldname": "reset_password_link_expiry_seconds", + "fieldtype": "Int", + "label": "Reset Password Link Expiry Seconds", + "non_negative": 1 + } ], "icon": "fa fa-cog", "issingle": 1, @@ -509,4 +517,4 @@ "sort_order": "ASC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index a47f539466..a09d9c794d 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -43,6 +43,7 @@ "new_password", "logout_all_sessions", "reset_password_key", + "reset_password_key_datetime", "last_password_reset_date", "redirect_url", "document_follow_notifications_section", @@ -606,7 +607,13 @@ "fieldtype": "Link", "label": "Module Profile", "options": "Module Profile" - } + }, + { + "fieldname": "reset_password_key_datetime", + "fieldtype": "Datetime", + "label": "Reset Password Key Generation Datetime", + "read_only": 1 + } ], "icon": "fa fa-user", "idx": 413, diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index ef7845d3b0..254e15f101 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -1,6 +1,7 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE from bs4 import BeautifulSoup +from datetime import timedelta import frappe import frappe.share import frappe.defaults @@ -265,6 +266,7 @@ class User(Document): key = random_string(32) self.db_set("reset_password_key", key) + self.db_set("reset_password_key_datetime", now_datetime()) url = "/update-password?key=" + key if password_expired: @@ -728,8 +730,14 @@ def _get_user_for_update_password(key, old_password): # verify old password result = frappe._dict() if key: - result.user = frappe.db.get_value("User", {"reset_password_key": key}) - if not result.user: + user = frappe.db.get_value("User", {"reset_password_key": key}, ["name", "reset_password_key_datetime"]) + result.user, res_pass_key_datetime = user if user else (None, None) + + if result.user: + res_pass_link_exp_sec = frappe.db.get_single_value("System Settings", "reset_password_link_expiry_seconds") + if res_pass_link_exp_sec and now_datetime() > res_pass_key_datetime + timedelta(seconds=res_pass_link_exp_sec): + result.message = _("The Link specified has been expired") + else: result.message = _("The Link specified has either been used before or Invalid") elif old_password: From ceae31f6fe3ad155936e2f8e6493369ba534b37f Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 10 Jan 2022 10:38:31 +0000 Subject: [PATCH 002/159] feat: add reset password link expiry feature --- .../doctype/system_settings/system_settings.json | 12 ++++++++++-- frappe/core/doctype/user/user.json | 9 ++++++++- frappe/core/doctype/user/user.py | 12 ++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index 61410fb1a8..3fcd69a704 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -42,6 +42,7 @@ "allow_error_traceback", "strip_exif_metadata_from_uploaded_images", "password_settings", + "reset_password_link_expiry_seconds", "logout_on_password_reset", "force_user_to_reset_password", "password_reset_limit", @@ -485,7 +486,14 @@ "fieldtype": "Select", "label": "First Day of the Week", "options": "Sunday\nMonday\nTuesday\nWednesday\nThursday\nFriday\nSaturday" - } + }, + { + "default": "1200", + "fieldname": "reset_password_link_expiry_seconds", + "fieldtype": "Int", + "label": "Reset Password Link Expiry Seconds", + "non_negative": 1 + } ], "icon": "fa fa-cog", "issingle": 1, @@ -509,4 +517,4 @@ "sort_order": "ASC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index a47f539466..a09d9c794d 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -43,6 +43,7 @@ "new_password", "logout_all_sessions", "reset_password_key", + "reset_password_key_datetime", "last_password_reset_date", "redirect_url", "document_follow_notifications_section", @@ -606,7 +607,13 @@ "fieldtype": "Link", "label": "Module Profile", "options": "Module Profile" - } + }, + { + "fieldname": "reset_password_key_datetime", + "fieldtype": "Datetime", + "label": "Reset Password Key Generation Datetime", + "read_only": 1 + } ], "icon": "fa fa-user", "idx": 413, diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index ef7845d3b0..254e15f101 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -1,6 +1,7 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE from bs4 import BeautifulSoup +from datetime import timedelta import frappe import frappe.share import frappe.defaults @@ -265,6 +266,7 @@ class User(Document): key = random_string(32) self.db_set("reset_password_key", key) + self.db_set("reset_password_key_datetime", now_datetime()) url = "/update-password?key=" + key if password_expired: @@ -728,8 +730,14 @@ def _get_user_for_update_password(key, old_password): # verify old password result = frappe._dict() if key: - result.user = frappe.db.get_value("User", {"reset_password_key": key}) - if not result.user: + user = frappe.db.get_value("User", {"reset_password_key": key}, ["name", "reset_password_key_datetime"]) + result.user, res_pass_key_datetime = user if user else (None, None) + + if result.user: + res_pass_link_exp_sec = frappe.db.get_single_value("System Settings", "reset_password_link_expiry_seconds") + if res_pass_link_exp_sec and now_datetime() > res_pass_key_datetime + timedelta(seconds=res_pass_link_exp_sec): + result.message = _("The Link specified has been expired") + else: result.message = _("The Link specified has either been used before or Invalid") elif old_password: From 4cf462a610e0eeea0b91eb08e79922e8c193876e Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 10 Jan 2022 23:26:22 +0530 Subject: [PATCH 003/159] test: add test case for link expiry --- frappe/core/doctype/user/test_user.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index d1291acfc4..608f79c7b4 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -1,6 +1,7 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE import json +import time import unittest from unittest.mock import patch @@ -371,6 +372,18 @@ class TestUser(unittest.TestCase): doc = frappe.response.docs[0] self.assertListEqual(doc.get("__onload").get('all_modules', []), [m.get("module_name") for m in get_modules_from_all_apps()]) + + def test_reset_password_link_expiry(self): + new_password = "new_password" + + frappe.db.set_value("System Settings", "System Settings", "reset_password_link_expiry_seconds", 1) + frappe.db.commit() + + frappe.set_user("testpassword@example.com") + test_user = frappe.get_doc("User", "testpassword@example.com") + test_user.reset_password() + time.sleep(1) # sleep for 1 sec to expire the reset link + self.assertEqual(update_password(new_password, key=test_user.reset_password_key), "The Link specified has been expired") def delete_contact(user): From f68b623b3bbda118763660b2fb77cbab475cd238 Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 10 Jan 2022 23:51:15 +0530 Subject: [PATCH 004/159] style: add comment --- frappe/core/doctype/user/test_user.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index 608f79c7b4..fd99f51be9 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -376,6 +376,7 @@ class TestUser(unittest.TestCase): def test_reset_password_link_expiry(self): new_password = "new_password" + # set the reset password expir to 1 second frappe.db.set_value("System Settings", "System Settings", "reset_password_link_expiry_seconds", 1) frappe.db.commit() From 7276721c185681c35ec8a4f2543bf002c332b8ea Mon Sep 17 00:00:00 2001 From: rajkris Date: Thu, 13 Jan 2022 23:29:48 +0530 Subject: [PATCH 005/159] fix(minor): linting errors --- frappe/core/doctype/user/test_user.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index fd99f51be9..ecf7c2b63b 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -376,9 +376,9 @@ class TestUser(unittest.TestCase): def test_reset_password_link_expiry(self): new_password = "new_password" - # set the reset password expir to 1 second + # set the reset password expiry to 1 second frappe.db.set_value("System Settings", "System Settings", "reset_password_link_expiry_seconds", 1) - frappe.db.commit() + frappe.db.commit() # nosemgrep: this is to set value for a test case frappe.set_user("testpassword@example.com") test_user = frappe.get_doc("User", "testpassword@example.com") From 56234a836c45d24f3ce34936d84d58ff2a254e0e Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 24 Jan 2022 22:55:01 +0530 Subject: [PATCH 006/159] fix(minor): change var name typo --- frappe/core/doctype/user/user.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index da84b8eb10..1362a2472c 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -734,8 +734,8 @@ def _get_user_for_update_password(key, old_password): result.user, res_pass_key_datetime = user if user else (None, None) if result.user: - res_pass_link_exp_sec = frappe.db.get_single_value("System Settings", "reset_password_link_expiry_seconds") - if res_pass_link_exp_sec and now_datetime() > res_pass_key_datetime + timedelta(seconds=res_pass_link_exp_sec): + reset_password_link_expiry = frappe.db.get_single_value("System Settings", "reset_password_link_expiry_seconds") + if reset_password_link_expiry and now_datetime() > res_pass_key_datetime + timedelta(seconds=reset_password_link_expiry): result.message = _("The Link specified has been expired") else: result.message = _("The Link specified has either been used before or Invalid") From c571421e20dec705d97b5be53f1b07291bbc66b0 Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 24 Jan 2022 22:58:07 +0530 Subject: [PATCH 007/159] fix(minor): change var name typo --- frappe/core/doctype/system_settings/system_settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index 3fcd69a704..1f79c37e2b 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -491,7 +491,7 @@ "default": "1200", "fieldname": "reset_password_link_expiry_seconds", "fieldtype": "Int", - "label": "Reset Password Link Expiry Seconds", + "label": "Reset Password Link Expiry (in Seconds)", "non_negative": 1 } ], From 692fde6822c46eb04c5aa733208dbfb66b768b44 Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 24 Jan 2022 23:04:42 +0530 Subject: [PATCH 008/159] fix(minor): add description for field reset_password_key_datetime --- frappe/core/doctype/user/user.json | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index a09d9c794d..378406b34a 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -609,6 +609,7 @@ "options": "Module Profile" }, { + "description": "Stores the datetime when the last reset password key was generated.", "fieldname": "reset_password_key_datetime", "fieldtype": "Datetime", "label": "Reset Password Key Generation Datetime", From e6f4359644842fde07e8309643053734044d357f Mon Sep 17 00:00:00 2001 From: rajkris Date: Thu, 27 Jan 2022 11:42:54 +0530 Subject: [PATCH 009/159] fix(minor): var typo fix --- frappe/core/doctype/user/user.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 1362a2472c..7064a3a46f 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -731,11 +731,11 @@ def _get_user_for_update_password(key, old_password): result = frappe._dict() if key: user = frappe.db.get_value("User", {"reset_password_key": key}, ["name", "reset_password_key_datetime"]) - result.user, res_pass_key_datetime = user if user else (None, None) + result.user, reset_password_key_datetime = user if user else (None, None) if result.user: reset_password_link_expiry = frappe.db.get_single_value("System Settings", "reset_password_link_expiry_seconds") - if reset_password_link_expiry and now_datetime() > res_pass_key_datetime + timedelta(seconds=reset_password_link_expiry): + if reset_password_link_expiry and now_datetime() > reset_password_key_datetime + timedelta(seconds=reset_password_link_expiry): result.message = _("The Link specified has been expired") else: result.message = _("The Link specified has either been used before or Invalid") From 3aef1321c1cbfdb6faf3667ad5f0b2afe5792a19 Mon Sep 17 00:00:00 2001 From: rajkris Date: Thu, 27 Jan 2022 17:38:20 +0530 Subject: [PATCH 010/159] test: remove db commit in test_reset_password_link_expiry --- frappe/core/doctype/user/test_user.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index ecf7c2b63b..568bc8ee23 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -378,7 +378,6 @@ class TestUser(unittest.TestCase): # set the reset password expiry to 1 second frappe.db.set_value("System Settings", "System Settings", "reset_password_link_expiry_seconds", 1) - frappe.db.commit() # nosemgrep: this is to set value for a test case frappe.set_user("testpassword@example.com") test_user = frappe.get_doc("User", "testpassword@example.com") From 0ad6d24816864589ca0933a1de4f85ca94021490 Mon Sep 17 00:00:00 2001 From: rajkris Date: Tue, 19 Apr 2022 12:38:13 +0530 Subject: [PATCH 011/159] fix: indentation, lints --- frappe/core/doctype/user/test_user.py | 24 ++++++++++++--------- frappe/core/doctype/user/user.py | 31 +++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index cd773eedb0..c59464054e 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -16,6 +16,7 @@ from frappe.utils import get_url user_module = frappe.core.doctype.user.user test_records = frappe.get_test_records('User') + class TestUser(unittest.TestCase): def tearDown(self): # disable password strength test @@ -229,7 +230,8 @@ class TestUser(unittest.TestCase): @Team and - + @Unknown Team please check @@ -286,7 +288,8 @@ class TestUser(unittest.TestCase): self.assertRaisesRegex(frappe.exceptions.ValidationError, "Sign Up is disabled", sign_up, random_user, random_user_name, "/signup") - self.assertTupleEqual(sign_up(random_user, random_user_name, "/welcome"), (1, "Please check your email for verification")) + self.assertTupleEqual(sign_up(random_user, random_user_name, "/welcome"), + (1, "Please check your email for verification")) self.assertEqual(frappe.cache().hget('redirect_after_login', random_user), "/welcome") # re-register @@ -304,7 +307,6 @@ class TestUser(unittest.TestCase): self.assertRaisesRegex(frappe.exceptions.ValidationError, "Throttled", sign_up, frappe.mock('email'), random_user_name, "/signup") - def test_reset_password(self): from frappe.auth import CookieManager, LoginManager from frappe.utils import set_request @@ -319,7 +321,8 @@ class TestUser(unittest.TestCase): test_user = frappe.get_doc("User", "testpassword@example.com") test_user.reset_password() self.assertEqual(update_password(new_password, key=test_user.reset_password_key), "/app") - self.assertEqual(update_password(new_password, key="wrong_key"), "The Link specified has either been used before or Invalid") + self.assertEqual(update_password(new_password, key="wrong_key"), + "The Link specified has either been used before or Invalid") # password verification should fail with old password self.assertRaises(frappe.exceptions.AuthenticationError, verify_password, old_password) @@ -328,7 +331,8 @@ class TestUser(unittest.TestCase): # reset password update_password(old_password, old_password=new_password) - self.assertRaisesRegex(frappe.exceptions.ValidationError, "Invalid key type", update_password, "test", 1, ['like', '%']) + self.assertRaisesRegex(frappe.exceptions.ValidationError, "Invalid key type", update_password, "test", 1, + ['like', '%']) password_strength_response = { "feedback": { @@ -339,7 +343,8 @@ class TestUser(unittest.TestCase): # password strength failure test with patch.object(user_module, "test_password_strength", return_value=password_strength_response): - self.assertRaisesRegex(frappe.exceptions.ValidationError, "Fix password", update_password, new_password, 0, test_user.reset_password_key) + self.assertRaisesRegex(frappe.exceptions.ValidationError, "Fix password", update_password, new_password, 0, + test_user.reset_password_key) # test redirect URL for website users @@ -376,18 +381,17 @@ class TestUser(unittest.TestCase): doc = frappe.response.docs[0] self.assertListEqual(doc.get("__onload").get('all_modules', []), [m.get("module_name") for m in get_modules_from_all_apps()]) - + def test_reset_password_link_expiry(self): new_password = "new_password" - # set the reset password expiry to 1 second frappe.db.set_value("System Settings", "System Settings", "reset_password_link_expiry_seconds", 1) - frappe.set_user("testpassword@example.com") test_user = frappe.get_doc("User", "testpassword@example.com") test_user.reset_password() time.sleep(1) # sleep for 1 sec to expire the reset link - self.assertEqual(update_password(new_password, key=test_user.reset_password_key), "The Link specified has been expired") + self.assertEqual(update_password(new_password, key=test_user.reset_password_key), + "The Link specified has been expired") def delete_contact(user): diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 97ae0e602f..8b5f073fca 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -22,6 +22,7 @@ from frappe.query_builder import DocType STANDARD_USERS = frappe.STANDARD_USERS + class User(Document): __new_password = None @@ -719,6 +720,7 @@ def get_email_awaiting(user): frappe.qb.update(user_email_table).set(user_email_table.user_email_table, 0).where(user_email_table.parent == user).run() return False + def ask_pass_update(): # update the sys defaults as to awaiting users from frappe.utils import set_default @@ -726,28 +728,28 @@ def ask_pass_update(): password_list = frappe.get_all("User Email", filters={"awaiting_password": True}, pluck="parent", distinct=True) set_default("email_user_password", u','.join(password_list)) + def _get_user_for_update_password(key, old_password): # verify old password result = frappe._dict() if key: user = frappe.db.get_value("User", {"reset_password_key": key}, ["name", "last_reset_password_key_datetime"]) result.user, last_reset_password_key_datetime = user if user else (None, None) - if result.user: reset_password_link_expiry = frappe.db.get_single_value("System Settings", "reset_password_link_expiry_seconds") - if reset_password_link_expiry and now_datetime() > last_reset_password_key_datetime + timedelta(seconds=reset_password_link_expiry): + if reset_password_link_expiry and \ + now_datetime() > last_reset_password_key_datetime + timedelta(seconds=reset_password_link_expiry): result.message = _("The Link specified has been expired") else: result.message = _("The Link specified has either been used before or Invalid") - elif old_password: # verify old password frappe.local.login_manager.check_password(frappe.session.user, old_password) user = frappe.session.user result.user = user - return result + def reset_user_data(user): user_doc = frappe.get_doc("User", user) redirect_url = user_doc.redirect_url @@ -757,10 +759,12 @@ def reset_user_data(user): return user_doc, redirect_url + @frappe.whitelist() def verify_password(password): frappe.local.login_manager.check_password(frappe.session.user, password) + @frappe.whitelist(allow_guest=True) def sign_up(email, full_name, redirect_to): if is_signup_disabled(): @@ -804,6 +808,7 @@ def sign_up(email, full_name, redirect_to): else: return 2, _("Please ask your administrator to verify your sign-up") + @frappe.whitelist(allow_guest=True) @rate_limit(limit=get_password_reset_limit, seconds = 24*60*60, methods=['POST']) def reset_password(user): @@ -827,6 +832,7 @@ def reset_password(user): frappe.clear_messages() return 'not found' + @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs def user_query(doctype, txt, searchfield, start, page_len, filters): @@ -864,6 +870,7 @@ def user_query(doctype, txt, searchfield, start, page_len, filters): dict(start=start, page_len=page_len, txt=txt) ) + def get_total_users(): """Returns total no. of system users""" return flt(frappe.db.sql('''SELECT SUM(`simultaneous_sessions`) @@ -872,6 +879,7 @@ def get_total_users(): AND `user_type` = 'System User' AND `name` NOT IN ({})'''.format(", ".join(["%s"]*len(STANDARD_USERS))), STANDARD_USERS)[0][0]) + def get_system_users(exclude_users=None, limit=None): if not exclude_users: exclude_users = [] @@ -891,6 +899,7 @@ def get_system_users(exclude_users=None, limit=None): return system_users + def get_active_users(): """Returns No. of system users who logged in, in the last 3 days""" return frappe.db.sql("""select count(*) from `tabUser` @@ -898,16 +907,19 @@ def get_active_users(): and name not in ({}) and hour(timediff(now(), last_active)) < 72""".format(", ".join(["%s"]*len(STANDARD_USERS))), STANDARD_USERS)[0][0] + def get_website_users(): """Returns total no. of website users""" return frappe.db.count("User", filters={"enabled": True, "user_type": "Website User"}) + def get_active_website_users(): """Returns No. of website users who logged in, in the last 3 days""" return frappe.db.sql("""select count(*) from `tabUser` where enabled = 1 and user_type = 'Website User' and hour(timediff(now(), last_active)) < 72""")[0][0] + def get_permission_query_conditions(user): if user=="Administrator": return "" @@ -915,11 +927,13 @@ def get_permission_query_conditions(user): return """(`tabUser`.name not in ({standard_users}))""".format( standard_users = ", ".join(frappe.db.escape(user) for user in STANDARD_USERS)) + def has_permission(doc, user): if (user != "Administrator") and (doc.name in STANDARD_USERS): # dont allow non Administrator user to view / edit Administrator user return False + def notify_admin_access_to_system_manager(login_manager=None): if (login_manager and login_manager.user == "Administrator" @@ -940,6 +954,7 @@ def notify_admin_access_to_system_manager(login_manager=None): header=['Access Notification', 'orange'] ) + def extract_mentions(txt): """Find all instances of @mentions in the html.""" soup = BeautifulSoup(txt, 'html.parser') @@ -957,17 +972,20 @@ def extract_mentions(txt): return emails + 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(' '.join([_('Invalid Password:'), warning, suggestions])) + def update_gravatar(name): gravatar = has_gravatar(name) if gravatar: frappe.db.set_value('User', name, 'user_image', gravatar) + def throttle_user_creation(): if frappe.flags.in_import: return @@ -975,16 +993,19 @@ def throttle_user_creation(): if frappe.db.get_creation_count('User', 60) > frappe.local.conf.get("throttle_user_limit", 60): frappe.throw(_('Throttled')) + @frappe.whitelist() def get_role_profile(role_profile): roles = frappe.get_doc('Role Profile', {'role_profile': role_profile}) return roles.roles + @frappe.whitelist() def get_module_profile(module_profile): module_profile = frappe.get_doc('Module Profile', {'module_profile_name': module_profile}) return module_profile.get('block_modules') + def create_contact(user, ignore_links=False, ignore_mandatory=False): from frappe.contacts.doctype.contact.contact import get_contact_name if user.name in ["Administrator", "Guest"]: return @@ -1036,6 +1057,7 @@ def create_contact(user, ignore_links=False, ignore_mandatory=False): contact.save(ignore_permissions=True) + @frappe.whitelist() def generate_keys(user): """ @@ -1061,6 +1083,7 @@ def switch_theme(theme): if theme in ["Dark", "Light", "Automatic"]: frappe.db.set_value("User", frappe.session.user, "desk_theme", theme) + def get_enabled_users(): def _get_enabled_users(): enabled_users = frappe.get_all("User", filters={"enabled": "1"}, pluck="name") From a7a34eaad2f7239c235f683b1ac4f46e87823ef4 Mon Sep 17 00:00:00 2001 From: rajkris Date: Tue, 19 Apr 2022 12:49:10 +0530 Subject: [PATCH 012/159] fix: linter errore --- frappe/core/doctype/user/user.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 91ef7587c4..6e7b5162de 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -777,7 +777,6 @@ def ask_pass_update(): set_default("email_user_password", ",".join(password_list)) - def _get_user_for_update_password(key, old_password): # verify old password result = frappe._dict() From 340995f55db248246eec0ca47f62aaabedccf02d Mon Sep 17 00:00:00 2001 From: Vladislav Date: Thu, 21 Apr 2022 01:44:40 +0300 Subject: [PATCH 013/159] Update ru.csv --- frappe/translations/ru.csv | 186 ++++++++++++++++++------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/frappe/translations/ru.csv b/frappe/translations/ru.csv index 197f2cb26d..0af57072e5 100644 --- a/frappe/translations/ru.csv +++ b/frappe/translations/ru.csv @@ -66,8 +66,8 @@ Details,Подробности, Document Name,название документа, Document Status,Статус документа, Document Type,тип документа, -Domain,Домен, -Domains,Направление деятельности, +Domain,Сфера деятельности, +Domains,Сферы деятельности, Draft,Проект, Edit,редактировать, Email Account,Электронная почта, @@ -1178,7 +1178,7 @@ Generate Keys,Создать ключи, Generate New Report,Создать новый отчет, Generated File,Сгенерированный файл, Geo,Гео, -Geolocation,геолокации, +Geolocation,Геолокация, Get Alerts for Today,Виртуальный на сегодняшний день, Get Contacts,Получить контакты, Get Fields,Получить поля, @@ -1204,19 +1204,19 @@ HTML,HTML, HTML Editor,Редактор HTML, "HTML Header, Robots and Redirects","Заголовок HTML, роботы и перенаправления", HTML for header section. Optional,HTML для секции header. Необязательно, -Half,половина, -Has Attachment,Имеет Вложения, -Has Attachments,Имеет приложения, +Half,Половина, +Has Attachment,Содержит вложения, +Has Attachments,Содержит приложения, Has Domain,Имеет домен, Has Role,Имеет роль, Has Web View,Имеет Web View, -Have an account? Login,Иметь аккаунт? Авторизоваться, +Have an account? Login,Уже есть аккаунт? Авторизоваться, Header,Шапка, Header HTML,Заголовок HTML, Header HTML set from attachment {0},HTML-код заголовка из вложения {0}, Header Image,Заглавное изображение, Headers,Заголовки, -Heading,заголовок, +Heading,Заголовок, Hello {0},"Здравствуйте, {0}", Hello!,Здравствуйте!, Help Articles,Статьи помощи, @@ -1381,26 +1381,26 @@ Is First Startup,Первый запуск, Is Folder,Папка, Is Global,Является глобальным, Is Globally Pinned,Глобально закреплено, -Is Home Folder,Является Главная Папка, -Is Mandatory Field,Является обязательным поле, +Is Home Folder,Является корневой папкой, +Is Mandatory Field,Является обязательным полем, Is Pinned,Прикреплено, Is Primary Contact,Основной контакт, Is Private,Является личным, Is Published Field,Есть Опубликовано поле, Is Published Field must be a valid fieldname,Опубликовано Поле должно быть действительным имя_полем, -Is Single,Одинокий, +Is Single,Единственный, Is Spam,Спам, Is Standard,Стандартный отчёт, -Is Submittable,подлежит проведению, -Is Table,Является ли таблица, -Is Your Company Address,Является ли Ваша компания Адрес, +Is Submittable,Подлежит исполнению, +Is Table,Является таблицей, +Is Your Company Address,Является адресом вашей компании, It is risky to delete this file: {0}. Please contact your System Manager.,"Это рискованно, чтобы удалить этот файл: {0}. Пожалуйста, обратитесь к менеджеру системы.", Item cannot be added to its own descendents,Продукт не может быть добавлен к своим подпродуктам, JS,JS, JSON,JSON, JavaScript Format: frappe.query_reports['REPORTNAME'] = {},Формат JavaScript: frappe.query_reports ['REPORTNAME'] = {}, Javascript to append to the head section of the page.,Javascript для добавления к головной части страницы., -Jinja,дзиндзя, +Jinja,Jinja, John Doe,Джон Доу, Kanban,Канбан, Kanban Board Column,Колонка канбан-доски, @@ -1448,16 +1448,16 @@ Last Year,Прошлый год, Last synced {0},Последняя синхронизация {0}, Leave a Comment,Оставить комментарий, Leave blank to repeat always,"Оставьте пустым, чтобы повторить всегда", -Leave this conversation,Оставьте этот разговор, -Left this conversation,Левая этот разговор, +Leave this conversation,Покинуть этот разговор, +Left this conversation,Покинуть этот разговор, Length,Длина, Length of {0} should be between 1 and 1000,Длина {0} должно быть от 1 до 1000, Let's avoid repeated words and characters,Давайте избегать повторяющихся слов и символов, Let's prepare the system for first use.,Давайте подготовить систему для первого использования., Letter,Письмо, -Letter Head Based On,Письмо на основе, -Letter Head Image,Изображение головы письма, -Letter Head Name,Имя Бланк, +Letter Head Based On,Заголовок письма на основе, +Letter Head Image,Изображение в заголовке письма, +Letter Head Name,Название заголовка письма, Letter Head in HTML,Заголовок письма в HTML, Level Name,Название уровня, Liked,Понравилось, @@ -1468,11 +1468,11 @@ Limit Number of DB Backups,Ограничение количества резе Line,Линия, Link DocType,Ссылка DocType, Link Expired,Срок действия ссылки, -Link Name,Ссылка Имя, -Link Title,Линк Титл, +Link Name,Имя ссылки, +Link Title,Название ссылки, "Link that is the website home page. Standard Links (index, login, products, blog, about, contact)","Ссылка, что находитесь на сайте домашняя страница. Стандартные ссылки (индекс, логин, продукты, блог, о, контакт)", Link to the page you want to open. Leave blank if you want to make it a group parent.,"Ссылка на страницу, вы хотите, чтобы открыть. Оставьте пустым, если вы хотите, чтобы сделать его группа родителей.", -Linked,связанный, +Linked,Связанный, Linked With,Связанные с, Linked with {0},Связано с {0}, Links,Связи, @@ -1506,7 +1506,7 @@ Login and view in Browser,Вход и просмотр в браузере, Login not allowed at this time,Войти не допускается в это время, "Login session expired, refresh page to retry","Срок действия сеанса истек, обновить страницу, чтобы повторить попытку", Login to comment,Вход на комментарий, -Login token required,Требуется токен входа, +Login token required,Для входа требуется токен, Login with LDAP,Вход с LDAP, Logout,Выход, Long Text,Длинный текст, @@ -1515,7 +1515,7 @@ Looks like something is wrong with this site's payment gateway configuration. No "Looks like something went wrong during the transaction. Since we haven't confirmed the payment, Paypal will automatically refund you this amount. If it doesn't, please send us an email and mention the Correlation ID: {0}.","Похоже, что-то пошло не так во время транзакции. Поскольку мы не подтвердили платеж, Paypal автоматически вернет вам эту сумму. Если это не так, отправьте нам электронное письмо и укажите идентификатор корреляции: {0}.", Madam,Госпожа, Main Section,Основной раздел, -"Make ""name"" searchable in Global Search",Сделать «имя» для поиска в Глобальном Поиске, +"Make ""name"" searchable in Global Search",Индексировать ""name"" для глобального поиска, Make use of longer keyboard patterns,Используйте более длинных моделей клавиатуры, Manage Third Party Apps,Управление приложениями сторонних разработчиков, Mandatory Information missing:,Обязательная информация отсутствует:, @@ -1529,7 +1529,7 @@ Mappings,Отображения, Mark as Read,"Пометить, как прочитанное", Mark as Spam,Отметить как спам, Mark as Unread,Отметить как непрочитанные, -Markdown,Уценка, +Markdown,Markdown, Markdown Editor,Редактор Markdown, Marked As Spam,Помеченные как спам, Max 500 records at a time,Max 500 записей за один раз, @@ -1640,14 +1640,14 @@ No Copy,Без копии, No Email Account,Нет аккаунта электронной почты, No Email Accounts Assigned,Аккаунты электронной почты не установлены, No Emails,Нет сообщений электронной почты, -No Label,Без марки, +No Label,Без отметки, No Permissions Specified,Нет разрешенных разрешений, No Permissions set for this criteria.,Разрешения не установлен для этого критериев., No Preview,Нет предварительного просмотра, No Preview Available,Предварительный просмотр недоступен, No Printer is Available.,Принтер не доступен., No Results,Нет результатов, -No Tags,Нет меток, +No Tags,Нет тегов, No alerts for today,Нет предупреждений на сегодня, No comments yet,Комментариев нет, No comments yet. Start a new discussion.,Пока без коментариев. Начать новое обсуждение., @@ -1681,7 +1681,7 @@ Not In,Не в, Not Linked to any record,Не привязано к какой-либо записи, Not Published,Не опубликовано, Not Saved,Не сохранено, -Not Seen,Не Видел, +Not Seen,Непрочитанно, Not Sent,Не Отправлено, Not Set,Не указано, Not a valid Comma Separated Value (CSV File),"Не является допустимым значения, разделенные запятыми (CSV-файл)", @@ -2157,7 +2157,7 @@ Script,Скрипт, Script Report,Программируемый отчёт, Script or Query reports,Отчёты-выборка или программируемый отчёт, Script to attach to all web pages.,Сценарий для подключения к всех веб-страниц., -Search Fields,Поиск Поля, +Search Fields,Поиск полей, Search Help,Поиск по справке, Search field {0} is not valid,Поле поиска {0} не является действительным, Search for '{0}',Поиск '{0}', @@ -2326,13 +2326,13 @@ Single Types have only one record no tables associated. Values are stored in tab Skip Authorization,Пропустить авторизацию, Skip rows with errors,Пропустить строки с ошибками, Skype,Skype, -Slack,слабина, -Slack Channel,Слабый канал, -Slack Webhook Error,Ошибка слабой ошибки Webhook, +Slack,Slack, +Slack Channel,Slack канал, +Slack Webhook Error,Slack Webhook ошибка, Slack Webhook URL,Неверный URL веб-хостинга, Slack Webhooks for internal integration,Slack Webhooks для внутренней интеграции, -Slideshow Items,Продукты слайд-шоу, -Slideshow Name,Слайд-шоу Имя, +Slideshow Items,Элементы слайд-шоу, +Slideshow Name,Название слайд-шоу, Slideshow like display for the website,"Слайд-шоу, как дисплей для сайта", Small Text,Маленьикий текст, Smallest Currency Fraction Value,Минимальное дробное значение, @@ -2558,11 +2558,11 @@ Total Rows,Всего строк, Total Subscribers,Всего Подписчики, Total number of emails to sync in initial sync process ,Общее количество писем для синхронизации в начальном процессе синхронизации, Totals Row,Итоговые строки, -Track Changes,Отслеживать изменения, -Track Email Status,Статус отслеживания электронной почты, -Track Field,Трек Поле, -Track Seen,Трек посещение, -Track Views,Просмотр дорожек, +Track Changes,Трекер изменений, +Track Email Status,Статус трекера электронной почты, +Track Field,Трекер поля, +Track Seen,Трекер посещение, +Track Views,Трекер просмотров, "Track if your email has been opened by the recipient.\n
\nNote: If you're sending to multiple recipients, even if 1 recipient reads the email, it'll be considered ""Opened""","Отслеживайте, если ваш адрес электронной почты был открыт получателем.
Примечание. Если вы отправляете нескольким получателям, даже если один получатель читает электронное письмо, он будет считаться «открытым»,", Track milestones for any document,Отслеживайте этапы для любого документа, Transaction Hash,Сделка транзакций, @@ -2570,14 +2570,14 @@ Transaction Log,Журнал транзакций, Transaction Log Report,Отчет о транзакционном журнале, Transition Rules,Переходные правила, Transitions,Переходы, -Translatable,переводимый, +Translatable,Переводимый, Translate {0},Перевести {0}, Translated Text,Переведенный текст, Translation,Перевод, Translations,Переводы, -Trash,дрянь, -Tree,дерево, -Trigger Method,Метод Trigger, +Trash,Мусор, +Tree,Дерево, +Trigger Method,Метод триггера, Trigger Name,Имя триггера, "Trigger on valid methods like ""before_insert"", ""after_update"", etc (will depend on the DocType selected)","Запуск по уважительным методы, такие как "before_insert", "after_update", и т.д. (будет зависеть от выбранного DocType)", Try to avoid repeated words and characters,Старайтесь избегать повторяющихся слов и символов, @@ -3148,7 +3148,7 @@ Access not allowed from this IP Address,Доступ с этого IP-адрес Action Type,Тип действия, Activity Log by ,Активность Журнал по, Add Fields,Добавить поля, -Administration,администрация, +Administration,Администрация, After Cancel,После отмены, After Delete,После удаления, After Save,После сохранения, @@ -3398,7 +3398,7 @@ LDAP Middle Name Field,Поле второго имени LDAP, LDAP Mobile Field,LDAP Mobile Field, LDAP Phone Field,Поле телефона LDAP, LDAP User Creation and Mapping,Создание и сопоставление пользователей LDAP, -Landscape,Пейзаж, +Landscape,Альбомный, Last,Последний, Last Backup On,Последнее резервное копирование включено, Last Execution,Последнее исполнение, @@ -3422,7 +3422,7 @@ Mapping column {0} to field {1},Отображение столбца {0} в п Mark all as Read,Отметить все как прочитанное, Maximum Points,Максимум очков, Maximum points allowed after multiplying points with the multiplier value\n(Note: For no limit leave this field empty or set 0),"Максимальное количество баллов, допустимое после умножения баллов на значение множителя (Примечание: для ограничения не оставляйте это поле пустым или установите 0)", -Me,мне, +Me,Мне, Mention,Упоминание, Modules,Модули, Monthly Long,Ежемесячно долго, @@ -3543,8 +3543,8 @@ Session Defaults Saved,Сеансы по умолчанию сохранены, Set as Default Theme,Установить как тему по умолчанию, Setting up Global Search documents.,Настройка документов глобального поиска., Show Document,Показать документ, -Show Failed Logs,Показать ошибочные журналы, -Show Keyboard Shortcuts,Показать сочетания клавиш, +Show Failed Logs,Показать журнал ошибок, +Show Keyboard Shortcuts,Показать горячие клавиш, Show More Activity,Показать больше активности, Show Traceback,Показать трассировку, Show Warnings,Показать предупреждения, @@ -3568,7 +3568,7 @@ Sync Calendar,Синхронизировать календарь, Sync Contacts,Синхронизация контактов, Sync with Google Calendar,Синхронизировать с календарем Google, Sync with Google Contacts,Синхронизировать с контактами Google, -Synced,синхронизированные, +Synced,Синхронизированные, Syncing,Синхронизации, Syncing {0} of {1},Синхронизация {0} из {1}, Tag Link,Ссылка на тег, @@ -3604,7 +3604,7 @@ Trigger Primary Action,Триггер Основное действие, URL for documentation or help,URL для документации или помощи, URL must start with 'http://' or 'https://',URL должен начинаться с «http: //» или «https: //», Unchanged,без изменений, -Unpin,открепить, +Unpin,Открепить, Untitled Column,Колонка без названия, Untranslated,Непереведенные, Upcoming Events,Предстоящие События, @@ -3628,7 +3628,7 @@ User {0} has requested for data deletion,Пользователь {0} запро Users assigned to the reference document will get points.,"Пользователи, назначенные для справочного документа, получат баллы.", Value must be one of {0},Значение должно быть одним из {0}, Value {0} missing for {1},Значение {0} отсутствует для {1}, -Verification,верификация, +Verification,Верификация, Verification Code,Код верификации, Verification code email not sent. Please contact Administrator.,"Письмо с кодом подтверждения не отправлено. Пожалуйста, свяжитесь с администратором.", Verified,Проверенный, @@ -3818,61 +3818,61 @@ Attach File,Прикрепить файл, Barcode,Штрих-код, Beginning with,Начиная с, Bold,Жирный, -CANCELLED,Отменено, +CANCELLED,ОТМЕНЕНО, Calendar,Календарь, Center,Центр, -Clear,ясно, +Clear,Отчистить, Comment,Комментарий, Comments,Комментарии, -DRAFT,Проект, +DRAFT,ЧЕРНОВИК, Dashboard,Приборная доска, DocType,DocType, Download,Скачать, EMail,Эл. адрес, Edit in Full Page,Редактировать на полной странице, Email Inbox,Email Inbox, -File,файл, -Forward,Вперед, +File,Файл, +Forward,Дальше, Icon,Икона, In,В, -Inbox,входящие, +Inbox,Входящие, Insert New Records,Вставить новые записи, JavaScript,JavaScript, LDAP Settings,Настройки LDAP, Left,Слева, -Like,подобно, +Like,Лайк, Link,Ссылка на сайт, Logged in,Войти в систему, -New,новый, +New,Новый, Not Found,Не найдено, Not Like,Не как, Notify by Email,Уведомить по электронной почте, Now,Сейчас, Off,от, One of,Один из, -Page,страница, +Page,Страница, Print,Распечатать, Reference Name,Имя ссылки, Refresh,Обновить, -Repeat,повторить, +Repeat,Повторить, Right,Справа, Roles HTML,Роли HTML, Scheduled To Send,Планируется отправить, Search Results for ,Результаты поиска для, Send Notification To,Отправить уведомление на, -Success,успех, +Success,Успешно, Tags,Теги, Time,Время, Updated Successfully,Успешно Обновлено, -Upload,загружать, -User ,пользователь, +Upload,Загрузить, +User ,Пользователь , Value,Значение, Web Link,Ссылка на сайт, Your Email Address,Ваш адрес электронной почты, Desktop,Настольный, -Usage Info,Использование Info, -Download Backups,Скачать Резервные копии, -Recorder,самописец, +Usage Info,Информация об использовании, +Download Backups,Скачать резервные копии, +Recorder,Регистратор, Role Permissions Manager,Менеджер разрешений на роль, Translation Tool,Инструмент перевода, Awaiting password,Ожидание пароля, @@ -3880,16 +3880,16 @@ Current status,Текущее состояние, Download template,Скачать шаблон, Edit in full page,Редактировать на полной странице, Email Id,Email ID, -Email address,Адрес Электронной Почты, +Email address,Адрес электронной почты, Ends on,Заканчивается на, Half-yearly,Полугодовой, -Hidden,скрытый, +Hidden,Скрытый, Javascript,Javascript, Ldap settings,Настройки Ldap, Mobile number,Мобильный номер, Mx,Mx, -No,нет, -Not found,не обнаружена, +No,Нет, +Not found,Не обнаружена, Notes:,Примечания:, Notify by email,Уведомление по почте, Permitted Documents For User,Разрешенные документы для пользователя, @@ -3905,7 +3905,7 @@ Sign up,Подписаться, Time format,Формат времени, Upload failed,Загрузка не удалась, User Id,Идентификатор пользователя, -Yes,да, +Yes,Да, Your email address,Ваша электронная почта, added,добавленной, added {0},Добавлено {0}, @@ -3917,11 +3917,11 @@ book,книга, calendar,календарь, certificate,сертификат, check,чек, -clear,ясно, +clear,отчистить, comment,комментарий, comments,Комментарии, created,созданный, -danger,Опасность, +danger,опасность, dashboard,Панель приборов, download,скачать, edit,Редактировать, @@ -3929,47 +3929,47 @@ email inbox,Входящая почта, file,файл, filter,фильтр, flag,помечать, -font,Шрифт (font), -forward,forward, +font,шрифт, +forward,дальше, green,зеленый, home,дом, icon,значок, -inbox,Входящие, +inbox,хходящие, like,Мне нравится, -link,Ссылка, +link,ссылка, list,список, lock,запирать, -logged in,Записан в, +logged in,записан в, message,сообщение, -module,Модуль, -move,переехать, -music,Музыка, -new,Новый, -now,Теперь, +module,модуль, +move,переместить, +music,музыка, +new,новый, +now,сейчас, off,выкл, one of,один из, orange,оранжевый, -page,Страница, +page,страница, print,печать, purple,пурпурный, random,случайный, red,красный, refresh,обновление, -remove,Удалить, +remove,удалить, response,отклик, search,поиск, share,Поделиться, stop,стоп, -success,Успешно, -tag,Тэг, +success,успешно, +tag,тэг, tags,теги, -tasks,Задачи, +tasks,задачи, time,время, -trash,дрянь, -upload,Загрузить, +trash,мусор, +upload,загрузить, user,пользователь, value,значение, -web link,Ссылка, +web link,ссылка, yellow,желтый, Not permitted,Не разрешено, Add Chart to Dashboard,Добавить диаграмму на панель инструментов, From c9df86f9efc52fb56ba81ad01d123fa7a4b63180 Mon Sep 17 00:00:00 2001 From: saxenabhishek Date: Thu, 7 Apr 2022 20:25:12 +0530 Subject: [PATCH 014/159] feat: multi table queries --- frappe/database/database.py | 4 ++-- frappe/database/query.py | 30 +++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index fb631951fa..df476c20cc 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -1019,13 +1019,13 @@ class Database(object): return self.get_value(dt, dn, ignore=True, cache=cache) - def count(self, dt, filters=None, debug=False, cache=False): + def count(self, dt, filters=None, debug=False, cache=False, distinct:bool = True): """Returns `COUNT(*)` for given DocType and filters.""" if cache and not filters: cache_count = frappe.cache().get_value("doctype:count:{}".format(dt)) if cache_count is not None: return cache_count - query = self.query.get_sql(table=dt, filters=filters, fields=Count("*")) + query = self.query.get_sql(table=dt, filters=filters, fields=Count("*"), distinct=distinct) if filters: count = self.sql(query, debug=debug)[0][0] return count diff --git a/frappe/database/query.py b/frappe/database/query.py index 136f5c86b6..7bb3597574 100644 --- a/frappe/database/query.py +++ b/frappe/database/query.py @@ -4,7 +4,7 @@ from typing import Any, Dict, List, Tuple, Union import frappe from frappe import _ -from frappe.query_builder import Criterion, Field, Order +from frappe.query_builder import Criterion, Field, Order, Table def like(key: str, value: str) -> frappe.qb: @@ -139,7 +139,9 @@ OPERATOR_MAP = { class Query: - def get_condition(self, table: str, **kwargs) -> frappe.qb: + tables:dict = {} + + def get_condition(self, table: Union[str, Table], **kwargs) -> frappe.qb: """Get initial table object Args: @@ -148,11 +150,20 @@ class Query: Returns: frappe.qb: DocType with initial condition """ + table_object = self.get_table(table) if kwargs.get("update"): - return frappe.qb.update(table) + return frappe.qb.update(table_object) if kwargs.get("into"): - return frappe.qb.into(table) - return frappe.qb.from_(table) + return frappe.qb.into(table_object) + return frappe.qb.from_(table_object) + + def get_table(self, table_name: Union[str, Table])->Table: + if isinstance(table_name, Table): + return table_name + table_name = table_name.strip('"').strip("'") + if table_name not in self.tables: + self.tables[table_name] = frappe.qb.DocType(table_name) + return self.tables[table_name] def criterion_query(self, table: str, criterion: Criterion, **kwargs) -> frappe.qb: """Generate filters from Criterion objects @@ -217,8 +228,13 @@ class Query: conditions = conditions.where(_operator(Field(filters[0]), filters[2])) break else: - _operator = OPERATOR_MAP[f[1]] - conditions = conditions.where(_operator(Field(f[0]), f[2])) + _operator = OPERATOR_MAP[f[-2]] + if len(f) == 4: + table_object = self.get_table(f[0]) + _field = table_object[f[1]] + else: + _field = Field(f[0]) + conditions = conditions.where(_operator(_field, f[-1])) return self.add_conditions(conditions, **kwargs) From d39e6a78901f09dfefd8957a81fcd5a2dc974754 Mon Sep 17 00:00:00 2001 From: saxenabhishek Date: Wed, 13 Apr 2022 01:28:59 +0530 Subject: [PATCH 015/159] refactor: new query engine in `get_count()` --- frappe/database/database.py | 14 +++++--------- frappe/database/query.py | 26 +++++++++++++------------- frappe/desk/reportview.py | 7 ++----- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index df476c20cc..eca1656424 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -1019,21 +1019,17 @@ class Database(object): return self.get_value(dt, dn, ignore=True, cache=cache) - def count(self, dt, filters=None, debug=False, cache=False, distinct:bool = True): + def count(self, dt, filters=None, debug=False, cache=False, distinct : bool = True): """Returns `COUNT(*)` for given DocType and filters.""" if cache and not filters: cache_count = frappe.cache().get_value("doctype:count:{}".format(dt)) if cache_count is not None: return cache_count query = self.query.get_sql(table=dt, filters=filters, fields=Count("*"), distinct=distinct) - if filters: - count = self.sql(query, debug=debug)[0][0] - return count - else: - count = self.sql(query, debug=debug)[0][0] - if cache: - frappe.cache().set_value("doctype:count:{}".format(dt), count, expires_in_sec=86400) - return count + count = query.run(debug=debug)[0][0] + if not filters and cache: + frappe.cache().set_value("doctype:count:{}".format(dt), count, expires_in_sec=86400) + return count @staticmethod def format_date(date): diff --git a/frappe/database/query.py b/frappe/database/query.py index 7bb3597574..44c341b6a2 100644 --- a/frappe/database/query.py +++ b/frappe/database/query.py @@ -7,7 +7,7 @@ from frappe import _ from frappe.query_builder import Criterion, Field, Order, Table -def like(key: str, value: str) -> frappe.qb: +def like(key: Field, value: str) -> frappe.qb: """Wrapper method for `LIKE` Args: @@ -17,10 +17,10 @@ def like(key: str, value: str) -> frappe.qb: Returns: frappe.qb: `frappe.qb object with `LIKE` """ - return Field(key).like(value) + return key.like(value) -def func_in(key: str, value: Union[List, Tuple]) -> frappe.qb: +def func_in(key: Field, value: Union[List, Tuple]) -> frappe.qb: """Wrapper method for `IN` Args: @@ -30,10 +30,10 @@ def func_in(key: str, value: Union[List, Tuple]) -> frappe.qb: Returns: frappe.qb: `frappe.qb object with `IN` """ - return Field(key).isin(value) + return key.isin(value) -def not_like(key: str, value: str) -> frappe.qb: +def not_like(key: Field, value: str) -> frappe.qb: """Wrapper method for `NOT LIKE` Args: @@ -43,10 +43,10 @@ def not_like(key: str, value: str) -> frappe.qb: Returns: frappe.qb: `frappe.qb object with `NOT LIKE` """ - return Field(key).not_like(value) + return key.not_like(value) -def func_not_in(key: str, value: Union[List, Tuple]): +def func_not_in(key: Field, value: Union[List, Tuple]): """Wrapper method for `NOT IN` Args: @@ -56,10 +56,10 @@ def func_not_in(key: str, value: Union[List, Tuple]): Returns: frappe.qb: `frappe.qb object with `NOT IN` """ - return Field(key).notin(value) + return key.notin(value) -def func_regex(key: str, value: str) -> frappe.qb: +def func_regex(key: Field, value: str) -> frappe.qb: """Wrapper method for `REGEX` Args: @@ -69,10 +69,10 @@ def func_regex(key: str, value: str) -> frappe.qb: Returns: frappe.qb: `frappe.qb object with `REGEX` """ - return Field(key).regex(value) + return key.regex(value) -def func_between(key: str, value: Union[List, Tuple]) -> frappe.qb: +def func_between(key: Field, value: Union[List, Tuple]) -> frappe.qb: """Wrapper method for `BETWEEN` Args: @@ -82,7 +82,7 @@ def func_between(key: str, value: Union[List, Tuple]) -> frappe.qb: Returns: frappe.qb: `frappe.qb object with `BETWEEN` """ - return Field(key)[slice(*value)] + return key[slice(*value)] def make_function(key: Any, value: Union[int, str]): @@ -265,7 +265,7 @@ class Query: if isinstance(value, (list, tuple)): if isinstance(value[1], (list, tuple)) or value[0] in list(OPERATOR_MAP.keys())[-4:]: _operator = OPERATOR_MAP[value[0]] - conditions = conditions.where(_operator(key, value[1])) + conditions = conditions.where(_operator(Field(key), value[1])) else: _operator = OPERATOR_MAP[value[0]] conditions = conditions.where(_operator(Field(key), value[1])) diff --git a/frappe/desk/reportview.py b/frappe/desk/reportview.py index b45f80f6ff..2813061347 100644 --- a/frappe/desk/reportview.py +++ b/frappe/desk/reportview.py @@ -48,15 +48,12 @@ def get_list(): @frappe.read_only() def get_count(): args = get_form_params() - if is_virtual_doctype(args.doctype): controller = get_controller(args.doctype) data = controller(args.doctype).get_count(args) else: - distinct = "distinct " if args.distinct == "true" else "" - args.fields = [f"count({distinct}`tab{args.doctype}`.name) as total_count"] - data = execute(**args)[0].get("total_count") - + distinct = args["distinct"] == "true" + data = frappe.db.count(args["doctype"], args["filters"], distinct=distinct) return data From 3498445733db3fae7216e1743a89892b3548144c Mon Sep 17 00:00:00 2001 From: saxenabhishek Date: Wed, 13 Apr 2022 16:06:43 +0530 Subject: [PATCH 016/159] test: multiple_tables_in_filters --- frappe/database/query.py | 6 +++--- frappe/tests/test_query.py | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 frappe/tests/test_query.py diff --git a/frappe/database/query.py b/frappe/database/query.py index 44c341b6a2..65ac375148 100644 --- a/frappe/database/query.py +++ b/frappe/database/query.py @@ -139,7 +139,7 @@ OPERATOR_MAP = { class Query: - tables:dict = {} + tables: dict = {} def get_condition(self, table: Union[str, Table], **kwargs) -> frappe.qb: """Get initial table object @@ -157,7 +157,7 @@ class Query: return frappe.qb.into(table_object) return frappe.qb.from_(table_object) - def get_table(self, table_name: Union[str, Table])->Table: + def get_table(self, table_name: Union[str, Table]) -> Table: if isinstance(table_name, Table): return table_name table_name = table_name.strip('"').strip("'") @@ -309,7 +309,7 @@ class Query: self, table: str, fields: Union[List, Tuple], - filters: Union[Dict[str, Union[str, int]], str, int] = None, + filters: Union[Dict[str, Union[str, int]], str, int, List[Union[List, str, int]]] = None, **kwargs, ): criterion = self.build_conditions(table, filters, **kwargs) diff --git a/frappe/tests/test_query.py b/frappe/tests/test_query.py new file mode 100644 index 0000000000..fc03a66166 --- /dev/null +++ b/frappe/tests/test_query.py @@ -0,0 +1,19 @@ +import unittest +import frappe + +from frappe.tests.test_query_builder import db_type_is, run_only_if + +@run_only_if(db_type_is.MARIADB) +class TestQuery(unittest.TestCase): + def test_multiple_tables_in_filters(self): + self.assertEqual( + frappe.db.query.get_sql( + "DocType", + ["*"], + [ + ["BOM Update Log", "name", "like", "f%"], + ["DocType", "parent", "=", "something"], + ], + ).get_sql(), + "SELECT * FROM `tabDocType` WHERE `tabBOM Update Log`.`name` LIKE 'f%' AND `tabDocType`.`parent`='something'", + ) \ No newline at end of file From 0450a25822af2e18a9a17702c456e518b0a6d72c Mon Sep 17 00:00:00 2001 From: saxenabhishek Date: Tue, 19 Apr 2022 12:15:37 +0530 Subject: [PATCH 017/159] test: get_count --- frappe/tests/test_db.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/frappe/tests/test_db.py b/frappe/tests/test_db.py index 6cba55c425..4d105ef28e 100644 --- a/frappe/tests/test_db.py +++ b/frappe/tests/test_db.py @@ -482,6 +482,33 @@ class TestDB(unittest.TestCase): frappe.db.delete("ToDo", {"description": test_body}) + def test_count(self): + frappe.db.delete("Note") + + frappe.get_doc(doctype="Note", title="note1", content="something").insert() + frappe.get_doc(doctype="Note", title="note2", content="someting else").insert() + + # Count with no filtes + self.assertEquals((frappe.db.count("Note")), 2) + + # simple filters + self.assertEquals((frappe.db.count("Note", ["title", "=", "note1"])), 1) + + frappe.get_doc(doctype="Note", title="note3", content="something other").insert() + + # List of list filters with tables + self.assertEquals( + ( + frappe.db.count( + "Note", + [["Note", "title", "like", "note%"], ["Note", "content", "like", "some%"]], + ) + ), + 3, + ) + + frappe.db.rollback() + @run_only_if(db_type_is.MARIADB) class TestDDLCommandsMaria(unittest.TestCase): From b1a0a3816b9a6dd30bfdb36820e09b1c5225cf92 Mon Sep 17 00:00:00 2001 From: saxenabhishek Date: Tue, 19 Apr 2022 13:02:21 +0530 Subject: [PATCH 018/159] style: Applied Frappe linting --- frappe/database/database.py | 2 +- frappe/tests/test_query.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index eca1656424..9e249fc2ad 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -1019,7 +1019,7 @@ class Database(object): return self.get_value(dt, dn, ignore=True, cache=cache) - def count(self, dt, filters=None, debug=False, cache=False, distinct : bool = True): + def count(self, dt, filters=None, debug=False, cache=False, distinct: bool = True): """Returns `COUNT(*)` for given DocType and filters.""" if cache and not filters: cache_count = frappe.cache().get_value("doctype:count:{}".format(dt)) diff --git a/frappe/tests/test_query.py b/frappe/tests/test_query.py index fc03a66166..85d1355d71 100644 --- a/frappe/tests/test_query.py +++ b/frappe/tests/test_query.py @@ -1,8 +1,9 @@ import unittest -import frappe +import frappe from frappe.tests.test_query_builder import db_type_is, run_only_if + @run_only_if(db_type_is.MARIADB) class TestQuery(unittest.TestCase): def test_multiple_tables_in_filters(self): @@ -16,4 +17,4 @@ class TestQuery(unittest.TestCase): ], ).get_sql(), "SELECT * FROM `tabDocType` WHERE `tabBOM Update Log`.`name` LIKE 'f%' AND `tabDocType`.`parent`='something'", - ) \ No newline at end of file + ) From 36de21c059b5bd1c133817ddf9a3473c07db4ae4 Mon Sep 17 00:00:00 2001 From: saxenabhishek Date: Tue, 26 Apr 2022 15:37:54 +0530 Subject: [PATCH 019/159] feat: left join tables by default --- frappe/database/query.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/frappe/database/query.py b/frappe/database/query.py index 65ac375148..f7393bfa54 100644 --- a/frappe/database/query.py +++ b/frappe/database/query.py @@ -312,7 +312,16 @@ class Query: filters: Union[Dict[str, Union[str, int]], str, int, List[Union[List, str, int]]] = None, **kwargs, ): + # Clean up state before each query + self.tables = {} criterion = self.build_conditions(table, filters, **kwargs) + + if len(self.tables) > 1: + primary_table = self.tables[table] + del self.tables[table] + for table_object in self.tables.values(): + criterion = criterion.left_join(table_object).on(table_object.parent == primary_table.name) + if isinstance(fields, (list, tuple)): query = criterion.select(*kwargs.get("field_objects", fields)) From ba51289c3727919feb49d7b1c2286734dc473c09 Mon Sep 17 00:00:00 2001 From: saxenabhishek Date: Tue, 26 Apr 2022 15:59:50 +0530 Subject: [PATCH 020/159] test: update test_multiple_tables_in_filters --- frappe/tests/test_query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/tests/test_query.py b/frappe/tests/test_query.py index 85d1355d71..949c3e9433 100644 --- a/frappe/tests/test_query.py +++ b/frappe/tests/test_query.py @@ -16,5 +16,5 @@ class TestQuery(unittest.TestCase): ["DocType", "parent", "=", "something"], ], ).get_sql(), - "SELECT * FROM `tabDocType` WHERE `tabBOM Update Log`.`name` LIKE 'f%' AND `tabDocType`.`parent`='something'", + "SELECT * FROM `tabDocType` LEFT JOIN `tabBOM Update Log` ON `tabBOM Update Log`.`parent`=`tabDocType`.`name` WHERE `tabBOM Update Log`.`name` LIKE 'f%' AND `tabDocType`.`parent`='something'", ) From 63e2e328c6c0a1d350b23be4fd13408d54b936a6 Mon Sep 17 00:00:00 2001 From: hrwx Date: Thu, 28 Apr 2022 13:38:36 +0100 Subject: [PATCH 021/159] feat: disable change log --- .../core/doctype/system_settings/system_settings.json | 11 +++++++++-- frappe/public/js/frappe/desk.js | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index 0c9b87e618..1247a8c0ee 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -71,7 +71,8 @@ "column_break_64", "max_auto_email_report_per_user", "system_updates_section", - "disable_system_update_notification" + "disable_system_update_notification", + "disable_change_log_notification" ], "fields": [ { @@ -497,12 +498,18 @@ "fieldname": "max_auto_email_report_per_user", "fieldtype": "Int", "label": "Max auto email report per user" + }, + { + "default": "0", + "fieldname": "disable_change_log_notification", + "fieldtype": "Check", + "label": "Disable Change Log Notification" } ], "icon": "fa fa-cog", "issingle": 1, "links": [], - "modified": "2022-04-21 09:11:35.218721", + "modified": "2022-04-28 14:31:50.330954", "modified_by": "Administrator", "module": "Core", "name": "System Settings", diff --git a/frappe/public/js/frappe/desk.js b/frappe/public/js/frappe/desk.js index 72e8010605..a8cbe020f3 100644 --- a/frappe/public/js/frappe/desk.js +++ b/frappe/public/js/frappe/desk.js @@ -511,7 +511,8 @@ frappe.Application = class Application { // "version": "12.2.0" // }]; - if (!Array.isArray(change_log) || !change_log.length || window.Cypress) { + if (!Array.isArray(change_log) || !change_log.length || + window.Cypress || cint(frappe.boot.sysdefaults.disable_change_log_notification)) { return; } From bec77dba0d7ad96bdfc250f1d4a2257ebef6d46b Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 28 Apr 2022 19:32:43 +0530 Subject: [PATCH 022/159] test: Fix flaky tests Disable form tour tests --- cypress/integration/control_data.js | 12 ++++++------ cypress/integration/form_tour.js | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cypress/integration/control_data.js b/cypress/integration/control_data.js index 021b9032c1..25a5c14eff 100644 --- a/cypress/integration/control_data.js +++ b/cypress/integration/control_data.js @@ -59,7 +59,7 @@ context('Data Control', () => { //Checking for the error message cy.get('.modal-title').should('have.text', 'Message'); cy.get('.msgprint').should('have.text', '@@### is not a valid Name'); - cy.get('.modal').type('{esc}'); + cy.hide_dialog(); cy.get_field('name1', 'Data').clear({force: true}); cy.fill_field('name1', 'Komal{}/!', 'Data'); @@ -67,10 +67,10 @@ context('Data Control', () => { cy.findByRole('button', {name: 'Save'}).click(); cy.get('.modal-title').should('have.text', 'Message'); cy.get('.msgprint').should('have.text', 'Komal{}/! is not a valid Name'); + cy.hide_dialog(); }); it('Verifying data control by inputting different patterns for "Email" field', () => { - cy.get('.modal-actions > .btn-modal-close').trigger("click"); cy.get_field('name1', 'Data').clear({force: true}); cy.fill_field('name1', 'Komal', 'Data'); cy.get_field('email', 'Data').clear({force: true}); @@ -79,17 +79,17 @@ context('Data Control', () => { cy.findByRole('button', {name: 'Save'}).click(); cy.get('.modal-title').should('have.text', 'Message'); cy.get('.msgprint').should('have.text', 'komal is not a valid Email Address'); - cy.get('.modal-actions > .btn-modal-close').trigger("click"); + cy.hide_dialog(); cy.get_field('email', 'Data').clear({force: true}); cy.fill_field('email', 'komal@test', 'Data'); cy.get('.frappe-control[data-fieldname="email"]').should('have.class', 'has-error'); cy.findByRole('button', {name: 'Save'}).click(); cy.get('.modal-title').should('have.text', 'Message'); cy.get('.msgprint').should('have.text', 'komal@test is not a valid Email Address'); + cy.hide_dialog(); }); it('Verifying data control by inputting different patterns for "Phone" field', () => { - cy.get('.modal-actions > .btn-modal-close').trigger("click"); cy.get_field('email', 'Data').clear({force: true}); cy.fill_field('email', 'komal@test.com', 'Data'); cy.get_field('phone', 'Data').clear({force: true}); @@ -98,7 +98,7 @@ context('Data Control', () => { cy.findByRole('button', {name: 'Save'}).click({force: true}); cy.get('.modal-title').should('have.text', 'Message'); cy.get('.msgprint').should('have.text', 'komal is not a valid Phone Number'); - cy.get('.modal-actions > .btn-modal-close').trigger("click"); + cy.hide_dialog(); }); it('Inputting correct data and saving the doc', () => { @@ -124,6 +124,6 @@ context('Data Control', () => { cy.get('.actions-btn-group > .btn').contains('Actions').click(); cy.get('.actions-btn-group > .dropdown-menu [data-label="Delete"]').click(); cy.click_modal_primary_button('Yes'); - cy.get('.btn-modal-close').click(); + cy.hide_dialog(); }); }); \ No newline at end of file diff --git a/cypress/integration/form_tour.js b/cypress/integration/form_tour.js index ab7ada9034..0a9a5e8020 100644 --- a/cypress/integration/form_tour.js +++ b/cypress/integration/form_tour.js @@ -1,7 +1,7 @@ context('Form Tour', () => { - before(() => { + before.skip(() => { cy.login(); - cy.visit('/app/form-tour'); + cy.visit('/app'); return cy.window().its('frappe').then(frappe => { return frappe.call("frappe.tests.ui_test_helpers.create_form_tour"); }); From 48947796ce4c4f1dd7642d256b123df278dc5025 Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 2 May 2022 21:38:07 +0530 Subject: [PATCH 023/159] fix: fix linter issues --- frappe/core/doctype/user/test_user.py | 25 ++++++++++++++++--------- frappe/core/doctype/user/user.py | 26 ++++++++++++-------------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index 964603756b..2160c02da1 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -23,7 +23,6 @@ user_module = frappe.core.doctype.user.user test_records = frappe.get_test_records("User") - class TestUser(unittest.TestCase): def tearDown(self): # disable password strength test @@ -320,9 +319,11 @@ class TestUser(unittest.TestCase): "/signup", ) - self.assertTupleEqual(sign_up(random_user, random_user_name, "/welcome"), - (1, "Please check your email for verification")) - self.assertEqual(frappe.cache().hget('redirect_after_login', random_user), "/welcome") + self.assertTupleEqual( + sign_up(random_user, random_user_name, "/welcome"), + (1, "Please check your email for verification"), + ) + self.assertEqual(frappe.cache().hget("redirect_after_login", random_user), "/welcome") # re-register self.assertTupleEqual( @@ -429,19 +430,25 @@ class TestUser(unittest.TestCase): frappe.response.docs = [] getdoc("User", "Administrator") doc = frappe.response.docs[0] - self.assertListEqual(doc.get("__onload").get('all_modules', []), - [m.get("module_name") for m in get_modules_from_all_apps()]) + self.assertListEqual( + doc.get("__onload").get("all_modules", []), + [m.get("module_name") for m in get_modules_from_all_apps()], + ) def test_reset_password_link_expiry(self): new_password = "new_password" # set the reset password expiry to 1 second - frappe.db.set_value("System Settings", "System Settings", "reset_password_link_expiry_seconds", 1) + frappe.db.set_value( + "System Settings", "System Settings", "reset_password_link_expiry_seconds", 1 + ) frappe.set_user("testpassword@example.com") test_user = frappe.get_doc("User", "testpassword@example.com") test_user.reset_password() time.sleep(1) # sleep for 1 sec to expire the reset link - self.assertEqual(update_password(new_password, key=test_user.reset_password_key), - "The Link specified has been expired") + self.assertEqual( + update_password(new_password, key=test_user.reset_password_key), + "The Link specified has been expired", + ) def delete_contact(user): diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 6e7b5162de..4725bca7a3 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -1,7 +1,9 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE -from bs4 import BeautifulSoup from datetime import timedelta + +from bs4 import BeautifulSoup + import frappe import frappe.defaults import frappe.permissions @@ -781,12 +783,17 @@ def _get_user_for_update_password(key, old_password): # verify old password result = frappe._dict() if key: - user = frappe.db.get_value("User", {"reset_password_key": key}, ["name", "last_reset_password_key_datetime"]) + user = frappe.db.get_value( + "User", {"reset_password_key": key}, ["name", "last_reset_password_key_datetime"] + ) result.user, last_reset_password_key_datetime = user if user else (None, None) if result.user: - reset_password_link_expiry = frappe.db.get_single_value("System Settings", "reset_password_link_expiry_seconds") - if reset_password_link_expiry and \ - now_datetime() > last_reset_password_key_datetime + timedelta(seconds=reset_password_link_expiry): + reset_password_link_expiry = frappe.db.get_single_value( + "System Settings", "reset_password_link_expiry_seconds" + ) + if reset_password_link_expiry and now_datetime() > last_reset_password_key_datetime + timedelta( + seconds=reset_password_link_expiry + ): result.message = _("The Link specified has been expired") else: result.message = _("The Link specified has either been used before or Invalid") @@ -888,7 +895,6 @@ def reset_password(user): return "not found" - @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs def user_query(doctype, txt, searchfield, start, page_len, filters): @@ -945,7 +951,6 @@ def get_total_users(): ) - def get_system_users(exclude_users=None, limit=None): if not exclude_users: exclude_users = [] @@ -983,7 +988,6 @@ def get_active_users(): )[0][0] - def get_website_users(): """Returns total no. of website users""" return frappe.db.count("User", filters={"enabled": True, "user_type": "Website User"}) @@ -998,7 +1002,6 @@ def get_active_website_users(): )[0][0] - def get_permission_query_conditions(user): if user == "Administrator": return "" @@ -1008,7 +1011,6 @@ def get_permission_query_conditions(user): ) - def has_permission(doc, user): if (user != "Administrator") and (doc.name in STANDARD_USERS): # dont allow non Administrator user to view / edit Administrator user @@ -1066,14 +1068,12 @@ def handle_password_test_fail(result): frappe.throw(" ".join([_("Invalid Password:"), warning, suggestions])) - def update_gravatar(name): gravatar = has_gravatar(name) if gravatar: frappe.db.set_value("User", name, "user_image", gravatar) - def throttle_user_creation(): if frappe.flags.in_import: return @@ -1082,7 +1082,6 @@ def throttle_user_creation(): frappe.throw(_("Throttled")) - @frappe.whitelist() def get_role_profile(role_profile): roles = frappe.get_doc("Role Profile", {"role_profile": role_profile}) @@ -1095,7 +1094,6 @@ def get_module_profile(module_profile): return module_profile.get("block_modules") - def create_contact(user, ignore_links=False, ignore_mandatory=False): from frappe.contacts.doctype.contact.contact import get_contact_name From 34b1beae5b2701987ee1285864b9ab369f58daf8 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 2 May 2022 20:26:03 +0300 Subject: [PATCH 024/159] fix: Update translation --- frappe/translations/ru.csv | 982 ++++++++++++++++++------------------- 1 file changed, 491 insertions(+), 491 deletions(-) diff --git a/frappe/translations/ru.csv b/frappe/translations/ru.csv index 0af57072e5..7e437c9b3e 100644 --- a/frappe/translations/ru.csv +++ b/frappe/translations/ru.csv @@ -145,7 +145,7 @@ Monthly,Ежемесячно, More,Далее, More Information,Больше информации, More...,Больше..., -Move,перемещение, +Move,Переместить, My Account,Мой аккаунт, New Address,Новый адрес, New Contact,Новый контакт, @@ -178,7 +178,7 @@ Please select Company,"Пожалуйста, выберите компанию", Please select {0},"Пожалуйста, выберите {0}", Please set Email Address,"Пожалуйста, установите адрес электронной почты", Portal,Портал, -Portal Settings,портал Настройки, +Portal Settings,Настройки портала, Preview,Просмотр, Primary,Основной, Print Format,Формат печати, @@ -188,9 +188,9 @@ Private,Личные, Property,Свойство, Public,Публично, Published,Опубликовано, -Purchase Manager,Менеджер поставок, -Purchase Master Manager,Руководитель поставок, -Purchase User,Специалист поставок, +Purchase Manager,Менеджер закупок, +Purchase Master Manager,Мастер закупок, +Purchase User,Специалист закупок, Query Options,Параметры запроса, Range,Диапазон, Rating,Рейтинг, @@ -212,11 +212,11 @@ Report,Отчет, Report Builder,Конструктор отчетов, Report Type,Тип отчета, Reports,Отчеты, -Response,ответ, +Response,Ответ, Role,Роль, -Route,маршрут, +Route,Маршрут, Sales Manager,Менеджер продаж, -Sales Master Manager,Руководитель продаж, +Sales Master Manager,Мастер продаж, Sales User,Продавец, Salutation,Обращение, Sample,Образец, @@ -228,31 +228,31 @@ Search,Поиск, Secret Key,Секретный ключ, Select,Выбрать, Select DocType,Выберите тип документа, -Send Now,Отправить Сейчас, +Send Now,Отправить сейчас, Sent,Отправлено, Series {0} already used in {1},Идентификатор {0} уже используется в {1}, Service,Услуги, Set as Default,Установить по умолчанию, -Settings,настройки, +Settings,Настройки, Shipping,Доставка, -Short Name,Короткое Имя, +Short Name,Короткое имя, Slideshow,Слайд-шоу, Some information is missing,Некоторая информация отсутствует, Source,Источник, Source Name,Имя источника, Standard,Стандартный, -Start Date,Дата Начала, +Start Date,Дата начала, Start Import,Начать импорт, -State,государственный, +State,Состояние, Stopped,Приостановлено, Subject,Тема, Submit,Провести, -Successful,успешный, +Successful,Успешно, Summary,Резюме, Sunday,Воскресенье, System Manager,Менеджер системы, -Target,цель, -Task,задача, +Target,Цель, +Task,Задача, Tax Category,Налоговая категория, Test,Тест, Thank you,Спасибо, @@ -265,7 +265,7 @@ Traceback,Диагностика, URL,URL, Unsubscribed,Отписался, Use Sandbox,Использовать «песочницу», -User,пользователь, +User,Пользователь, User ID,ID пользователя, Users,Пользователи, Validity,Период действия, @@ -286,7 +286,7 @@ old_parent,old_parent, """Company History""","""История компании""", """Parent"" signifies the parent table in which this row must be added","«Родитель» означает родительскую таблицу, в которую должна быть добавлена эта строка", """Team Members"" or ""Management""","""Члены команды"" или ""Управление""", -<head> HTML,HTML, +<head> HTML,<head> HTML, 'In Global Search' not allowed for type {0} in row {1},«В глобальном поиске» не допускается тип {0} в строке {1}, 'In List View' not allowed for type {0} in row {1},"""Режим Просмотра Списком"" не допускается для типа {0} в строке {1}", 'Recipients' not specified,«Получатели» не указаны, @@ -304,7 +304,7 @@ old_parent,old_parent, ; not allowed in condition,; Не допускается в состоянии, "

Default Template

\n

Uses Jinja Templating and all the fields of Address (including Custom Fields if any) will be available

\n
{{ address_line1 }}<br>\n{% if address_line2 %}{{ address_line2 }}<br>{% endif -%}\n{{ city }}<br>\n{% if state %}{{ state }}<br>{% endif -%}\n{% if pincode %} PIN:  {{ pincode }}<br>{% endif -%}\n{{ country }}<br>\n{% if phone %}Phone: {{ phone }}<br>{% endif -%}\n{% if fax %}Fax: {{ fax }}<br>{% endif -%}\n{% if email_id %}Email: {{ email_id }}<br>{% endif -%}\n
","

Шаблон по умолчанию \n <р> Использование дзиндзя Templating и все поля адрес ( в том числе Пользовательские поля если таковые имеются) будут доступны \n
 <код> {{address_line1}} & LT; BR & GT; \n {%, если address_line2%} {{address_line2}} & лт; бр & GT; { % ENDIF -%} \n {{город}} & Lt; BR & GT; \n {%, если государство%} {{состояние}} & Lt; BR & GT; {% ENDIF -%} \n {%, если пин-код%} PIN: {{пин-код}} & Lt; BR & GT; {% ENDIF -%} \n {{страна}} & Lt; BR & GT; \n {%, если телефон%} Телефон: {{телефон}} & Lt; BR & GT; { % ENDIF -%} \n {%, если факс%} Факс: {{FAX}} & Lt; BR & GT; {% ENDIF -%} \n {%, если email_id%} E-mail: {{email_id}} & Lt; BR & GT ; {% ENDIF -%} \n </ код> 

", A Lead with this Email Address should exist,Обращение с этим адресом электронной почты должно существовать, -A list of resources which the Client App will have access to after the user allows it.
e.g. project,"Список ресурсов, которые Клиент App будет иметь доступ к после того, как пользователь позволяет.
например, проект", +A list of resources which the Client App will have access to after the user allows it.
e.g. project,"Список ресурсов, к которым клиентское приложение будет иметь доступ после того, как пользователь разрешит это.
например. проект", A log of request errors,Журнал ошибок запроса, A new account has been created for you at {0},Новая учетная запись была создана для вас в {0}, A symbol for this currency. For e.g. $,"Символ этой валюты. Например, ₽", @@ -337,12 +337,12 @@ Add Contact,Добавить контакт, Add Contacts,Добавить контакты, Add Filter,Добавить фильтр, Add Group,Добавить группу, -Add New Permission Rule,Добавить новое Правило доступа, +Add New Permission Rule,Добавить новое правило доступа, Add Review,Добавить отзыв, Add Signature,Добавить подпись, -Add Subscribers,Добавить Подписчики, +Add Subscribers,Добавить подписчиков, Add Total Row,Добавить итоговую строку, -Add Unsubscribe Link,Добавить ссылку Отказаться, +Add Unsubscribe Link,Добавить ссылку Отписаться, Add User Permissions,Добавить разрешения пользователя, Add a New Role,Добавить новую роль, Add a column,Добавить столбец, @@ -354,7 +354,7 @@ Add custom forms.,Добавить пользовательские формы., Add custom javascript to forms.,Добавить пользовательские JavaScript в формах., Add fields to forms.,Добавление полей в формах., Add meta tags to your web pages,Добавьте метатеги на свои веб-страницы, -Add script for Child Table,Добавить скрипт для Child Table, +Add script for Child Table,Добавить скрипт для дочерней таблицы, Add to table,Добавить в таблицу, Add your own translations,Добавить свои собственные переводы, "Added HTML in the <head> section of the web page, primarily used for website verification and SEO","Добавлена HTML в <HEAD> часть веб-страницы, в основном используется для проверки веб-сайтов и SEO", @@ -368,7 +368,7 @@ Addresses And Contacts,Адреса и контакты, Adds a client custom script to a DocType,Добавляет клиентский пользовательский скрипт в DocType, Adds a custom field to a DocType,Добавляет настраиваемое поле в DocType, Admin,Администратор, -Administrator Logged In,Администратор Записан В, +Administrator Logged In,Администратор вошел в систему, Administrator accessed {0} on {1} via IP Address {2}.,Администратор обращались {0} {1} с помощью IP-адреса {2}., Advanced,Продвинутый, Advanced Control,Расширенный контроль, @@ -380,7 +380,7 @@ All customizations will be removed. Please confirm.,"Все настройки "All possible Workflow States and roles of the workflow. Docstatus Options: 0 is""Saved"", 1 is ""Submitted"" and 2 is ""Cancelled""","Все возможные статусы и роли бизнес-процесса. Варианты статуса документа: 0 — ""Сохранён (черновик)"", 1 — ""Проведён/ Утвержден"" и 2 — ""Отменен""", All-uppercase is almost as easy to guess as all-lowercase.,"All-прописные почти так же легко догадаться, как все-строчными буквами.", Allocated To,Выделяемых на, -Allow,Позволять, +Allow,Разрешить, Allow Bulk Edit,Разрешить массовое редактирование, Allow Comments,Разрешить комментарии, Allow Consecutive Login Attempts ,Разрешить последовательные попытки авторизации, @@ -388,18 +388,18 @@ Allow Dropbox Access,Разрешить доступ Dropbox, Allow Edit,Разрешить редактирование, Allow Guest to View,"Разрешить для гостей, чтобы посмотреть", Allow Import (via Data Import Tool),Разрешить импорт (с помощью инструмента импорта данных), -Allow Incomplete Forms,Разрешить Неполные формы, +Allow Incomplete Forms,Разрешить неполные формы, Allow Login After Fail,Разрешить авторизацию после неудачной попытки, Allow Login using Mobile Number,Разрешить вход в систему с помощью мобильного номера, Allow Login using User Name,Разрешить использование имени пользователя, Allow Modules,Разрешить модули, Allow Multiple,Разрешить многократный, Allow Print,Разрешить печать, -Allow Print for Cancelled,Разрешить печать для Отменено, -Allow Print for Draft,Разрешить печать для проекта, +Allow Print for Cancelled,Разрешить печать для отмененых, +Allow Print for Draft,Разрешить печать для черновика, Allow Read On All Link Options,Разрешить чтение всех ссылок, Allow Rename,Разрешить переименовать, -Allow Roles,Разрешить роли, +Allow Roles,Разрешить ролям, Allow Self Approval,Разрешить самостоятельное утверждение, Allow approval for creator of the document,Разрешает утверждать создателю документа, Allow events in timeline,Разрешить события на временной шкале, @@ -412,15 +412,15 @@ Allow user to login only after this hour (0-24),Разрешить пользо Allow user to login only before this hour (0-24),Разрешать пользователю входить только до этого часа (0—24), Allowed,Разрешено, Allowed In Mentions,Разрешено в упоминаниях, -"Allowing DocType, DocType. Be careful!","Разрешение DocType, DocType. Осторожно!", +"Allowing DocType, DocType. Be careful!","Разрешение DocType, DocType. Будьте осторожны!", Already Registered,Уже регистрировались, Also adding the dependent currency field {0},Также добавление зависимого валютного поля {0}, "Always add ""Draft"" Heading for printing draft documents",Всегда добавляйте "Черновик" Заголовок для печати проектов документов, -Always use Account's Email Address as Sender,Всегда используйте учетную запись Адрес электронной почты в качестве отправителя, -Always use Account's Name as Sender's Name,Всегда используйте имя учетной записи в качестве имени отправителя, +Always use Account's Email Address as Sender,Всегда использовать почту учетной записи в качестве отправителя, +Always use Account's Name as Sender's Name,Всегда использовать имя учетной записи в качестве имени отправителя, Amend,Изменен, -Amending,исправление, -Amount Based On Field,Сумма На основании поле, +Amending,Исправление, +Amount Based On Field,Сумма на основании поля, Amount Field,Сумма поле, Amount must be greater than 0.,Сумма должна быть больше 0., An error occured during the payment process. Please contact us.,В процессе оплаты произошла ошибка. Пожалуйста свяжитесь с нами., @@ -443,12 +443,12 @@ App {0} is not installed,Приложение {0} не установленно, Append To,Добавить к, Append To can be one of {0},Добавить к может быть одним из {0}, Append To is mandatory for incoming mails,Добавить к является обязательным для входящих сообщений, -"Append as communication against this DocType (must have fields, ""Status"", ""Subject"")","Добавьте в связи с этой DocType (должен иметь поля, ""статус"", ""Тема"")", +"Append as communication against this DocType (must have fields, ""Status"", ""Subject"")","Добавить как коммуникацию для этого DocType (должен иметь поля, ""Статус"", ""Тема"")", Applicable Document Types,Применимые типы документов, Apply,Подать заявление, Apply Strict User Permissions,Применение строгих пользовательских разрешений, Apply To All Document Types,Применить ко всем типам документов, -Apply this rule if the User is the Owner,"Применить это правило, если Пользователь Владелец", +Apply this rule if the User is the Owner,"Применить это правило, если пользователь является владелец", Apply to all Documents Types,Применить ко всем типам документов, Appreciate,понимать, Appreciation,Признательность, @@ -456,22 +456,22 @@ Archive,Архив, Archived,Архивные, Archived Columns,архивные Колонны, Are you sure you want to delete the attachment?,"Вы уверены, что хотите удалить вложение?", -Are you sure you want to relink this communication to {0}?,"Вы уверены, что хотите перелинковать это сообщение на {0}?", -Are you sure?,Уверены ли вы?, +Are you sure you want to relink this communication to {0}?,"Вы уверены, что хотите перелинковать эту куммуникацию на {0}?", +Are you sure?,Вы уверены?, Arial,Arial, "As a best practice, do not assign the same set of permission rule to different Roles. Instead, set multiple Roles to the same User.","В качестве лучшего решения, не присваивайте одинаковый набор правил доступа для различных ролей. Вместо этого, установите несколько ролей одному и тому же пользователю.", Assign Condition,Назначить условие, Assign To Users,Назначить пользователям, "Assign one by one, in sequence","Назначить по одному, в последовательности", -Assign to me,Назначить мне, +Assign to me,Назначить самому себе, Assign to the one who has the least assignments,"Назначьте тому, у кого меньше всего заданий", -Assigned,назначенный, +Assigned,Назначенный, Assigned By,Назначаются, Assigned By Full Name,Присваиваемый Полное имя, Assigned By Me,Назначенные мной, Assigned To,Назначено для, Assigned To/Owner,Назначено / Владельца, -Assignment,назначение, +Assignment,Назначение, Assignment Complete,Назначение Полная, Assignment Completed,Задание выполнено, Assignment Rule,Правило назначения, @@ -504,11 +504,11 @@ Authorize URL,Авторизованный URL, Authorized,уполномоченный, Auto,Авто, Auto Email Report,Автоотчет по электронной почте, -Auto Name,Авто Имя, +Auto Name,Авто имя, Auto Reply Message,Автоматический ответ, Auto assignment failed: {0},Автоматическое назначение не выполнено: {0}, Automatically Assign Documents to Users,Автоматически назначать документы пользователям, -Automation,автоматизация, +Automation,Автоматизация, Avatar,Аватар, Average,Средний, Average of {0},Среднее из {0}, @@ -518,13 +518,13 @@ Avoid sequences like abc or 6543 as they are easy to guess,"Избегайте Avoid years that are associated with you.,"Избегайте лет, которые связаны с вами.", Awaiting Password,В ожидании пароля, Away,Далеко, -BCC,BCC, +BCC,Скрытая копия, Back to Desk,Вернуться к списку, Back to Login,Вернуться на страницу входа, Background Color,Цвет фона, Background Email Queue,Фоновая очередь электронной почты, Background Jobs,Фоновые задания, -Background Workers,Фоновые Рабочие, +Background Workers,Фоновые процессы, Backup,Резервное копирование, Backup Frequency,Частота резервного копирования, Backup Limit,Ограничение резервного копирования, @@ -542,18 +542,18 @@ Better add a few more letters or another word,Лучше добавить еще Between,Между, Bio,Биография, Birth Date,Дата рождения, -Block Module,Блок Модуль, +Block Module,Блок модуль, Block Modules,Блок модули, Blocked,Блокирован, Blog,Блог, -Blog Category,Категория Блога, +Blog Category,Категория блога, Blog Intro,Блог Intro, -Blog Introduction,Блог Введение, +Blog Introduction,Блог введение, Blog Post,Пост блога, -Blog Settings,Настройки Блога, +Blog Settings,Настройки блога, Blog Title,Название блога, Blogger,Блоггер, -Bot,Bot, +Bot,Бот, Both DocType and Name required,И DocType и имя требуется, Both login and password required,Необходимо ввести логин и пароль, Bounced,Возвращенные, @@ -563,20 +563,20 @@ Brand HTML,Марка HTML, Brand Image,Изображение бренда, Breadcrumbs,Панировочные сухари, Browser not supported,Браузер не поддерживается, -Brute Force Security,Защита от Брутфорса, +Brute Force Security,Защита от перебора, Build Report,Построить отчет, Bulk Delete,Массовое удаление, -Bulk Edit {0},Массовая Правка {0}, +Bulk Edit {0},Массовая правка {0}, Bulk Rename,Массовое переименование, Bulk Update,Массовое обновление, Busy,Занятый, Button,Кнопка, -Button Help,Кнопка Помощь, -Button Label,Кнопка Этикетка, +Button Help,Кнопка помощь, +Button Label,Кнопка ярлык, Bypass Two Factor Auth for users who login from restricted IP Address,"Обход двух факторов для пользователей, которые подключаются с ограниченным IP-адресом", Bypass restricted IP Address check If Two Factor Auth Enabled,Обход ограниченного IP-адреса. Если включен параметр Two Factor Auth, -CC,CC, -"CC, BCC & Email Template","CC, BCC и шаблон электронной почты", +CC,Копия, +"CC, BCC & Email Template","Копия, Скрытая копия и Шаблон электронной почты", CSS,CSS, CSV,CSV, Cache Cleared,Кэш очищен, @@ -584,22 +584,22 @@ Calculate,Рассчитать, Calendar Name,Имя календаря, Calendar View,Просмотр календаря, Call,Звонок, -Can Read,Может Читать, -Can Share,Может Поделиться, -Can Write,Может Написать, +Can Read,Может читать, +Can Share,Может поделиться, +Can Write,Может изменять, Can't identify open {0}. Try something else.,Не удается идентифицировать открытое {0}. Попробуйте что-нибудь другое., Can't save the form as data import is in progress.,Невозможно сохранить форму в процессе импорта данных., Cancel {0} documents?,Отменить {0} документы?, Cancelled Document restored as Draft,Отмененный документ восстановлен как черновик, -Cancelling,отмена, +Cancelling,Отмена, Cancelling {0},Отмена {0}, Cannot Remove,Не удается удалить, -Cannot cancel before submitting. See Transition {0},Нельзя отменить перед проведением. См. Переход {0}, +Cannot cancel before submitting. See Transition {0},Нельзя отменить перед проведением. См. транзакцию {0}, Cannot change docstatus from 0 to 2,Нельзя изменить статус документа с 0 на 2, Cannot change docstatus from 1 to 0,Нельзя изменить статус документа с 1 на 0, Cannot change header content,Невозможно изменить содержимое заголовка, Cannot change state of Cancelled Document. Transition row {0},Невозможно изменить состояние Отмененные документа. Переход строка {0}, -Cannot change user details in demo. Please signup for a new account at https://erpnext.com,Невозможно изменить данные пользователя в демо. Подпишитесь на новую учетную запись на https://erpnext.com, +Cannot change user details in demo. Please signup for a new account at https://erpnext.com,Невозможно изменить данные пользователя в демо. Создайте новую учетную запись на https://erpnext.com, Cannot create a {0} against a child document: {1},Невозможно создать {0} против дочернего документа: {1}, Cannot delete Home and Attachments folders,Не удается удалить Дома и папки Вложения, Cannot delete file as it belongs to {0} {1} for which you do not have permissions,"Не удается удалить файл, поскольку он принадлежит {0} {1}, для которого у вас нет прав доступа", @@ -609,10 +609,10 @@ Cannot delete {0},Не удается удалить {0}, Cannot delete {0} as it has child nodes,"Не удается удалить {0}, поскольку он имеет дочерние узлы", "Cannot edit Standard Notification. To edit, please disable this and duplicate it","Не удается изменить стандартное уведомление. Чтобы отредактировать, отключите это и продублируйте его.", Cannot edit a standard report. Please duplicate and create a new report,"Изменять стандартный отчёт нельзя. Пожалуйста, создайте новый отчёт из копии", -Cannot edit cancelled document,Не можете редактировать отменен документ, -Cannot edit standard fields,Не можете редактировать стандартные поля, +Cannot edit cancelled document,Нельзя редактировать отмененый документ, +Cannot edit standard fields,Нельзя редактировать стандартные поля, Cannot have multiple printers mapped to a single print format.,"Невозможно иметь несколько принтеров, сопоставленных с одним форматом печати.", -Cannot link cancelled document: {0},Не можете связать отменен документ: {0}, +Cannot link cancelled document: {0},Нельзя привязать отмененый документ: {0}, Cannot map because following condition fails: ,"Невозможно отобразить, потому что не выполняется следующее условие:", Cannot move row,Невозможно переместить строку, Cannot open instance when its {0} is open,"Не могу открыть экземпляр, когда его {0} открыто", @@ -633,7 +633,7 @@ Chaining Hash,Цепочный хэш, Change Label (via Custom Translation),Изменение этикетки (с помощью пользовательского перевода), Change Password,Изменить пароль, "Change field properties (hide, readonly, permission etc.)","Изменение свойств поля (скрыть, только для чтения, доступ и т.д.)", -Channel,канал, +Channel,Канал, Chart Name,Название диаграммы, Chart Options,Параметры диаграммы, Chart Source,Источник диаграммы, @@ -643,11 +643,11 @@ Chat,Чат, Chat Background,История чата, Chat Message,Чат-сообщение, Chat Operators,Операторы чата, -Chat Profile,Профиль пользователя Chat, +Chat Profile,Профиль пользователя чата, Chat Profile for User {0} exists.,Профиль чата для пользователя {0} существует., Chat Room,Общение, Chat Room Name,Имя в чате, -Chat Room User,Пользователь Chat Room, +Chat Room User,Пользователь комнаты чата, Chat Token,Чат-токен, Chat Type,Тип чата, Chat messages and other notifications.,Чат сообщения и другие уведомления., @@ -664,7 +664,7 @@ Child Tables are shown as a Grid in other DocTypes,Дочерние таблиц Choose authentication method to be used by all users,"Выберите метод аутентификации, который будет использоваться всеми пользователями.", Clear Error Logs,Очистить журналы ошибок, Clear User Permissions,Очистить разрешения пользователя, -Clear all roles,Очистите все роли, +Clear all roles,Отчистить все роли, "Clearing end date, as it cannot be in the past for published pages.","Очистка даты окончания, поскольку она не может быть в прошлом для опубликованных страниц.", Click here to post bugs and suggestions,"Нажмите здесь, чтобы сообщать об ошибках и предложениях", Click here to verify,"Нажмите здесь, чтобы проверить,", @@ -673,7 +673,7 @@ Click on the link below to download your data,"Нажмите на ссылку Click on the link below to verify your request,"Нажмите на ссылку ниже, чтобы подтвердить свой запрос", Click table to edit,Нажмите для редактирования таблиц, Click to Set Filters,"Нажмите, чтобы установить фильтры", -Clicked,Нажал, +Clicked,Нажато, Client Credentials,Учетные данные клиента, Client Information,Информация о клиенте, Client Script,Скрипт клиента, @@ -684,15 +684,15 @@ Collapsible Depends On,Складные Зависит от, Column,Колонка, Column {0} already exist.,Столбец {0} уже существует., Column Break,Разрыв столбца, -Column Labels:,Колонка Ярлыки:, +Column Labels:,Колонка ярлыки:, Column Name,Имя столбца, Column Name cannot be empty,Имя столбца не может быть пустым, Columns,Колонны, Columns based on,Колонки на основе…, Combination of Grant Type ({0}) and Response Type ({1}) not allowed,Сочетание типа гранта ( {0} ) и типа ответа ( {1} ) не допускается, -Comment By,Комментарий По, +Comment By,Комментарий по, Comment Email,Комментарий по электронной почте, -Comment Type,Комментарий Тип, +Comment Type,Тип комментариев, Comment can only be edited by the owner,Комментарий может редактировать только владелец, Commented on {0}: {1},Комментарии {0}: {1}, Comments and Communications will be associated with this linked document,Комментарии и коммуникации будут связаны с этой связанного документа, @@ -701,7 +701,7 @@ Common names and surnames are easy to guess.,Общие имена и фамил Communicated via {0} on {1}: {2},Сообщается через {0} {1}: {2}, Communication Type,Вид коммуникации, Company History,История компании, -Company Introduction,Компания Введение, +Company Introduction,Компания - введение, Compiled Successfully,Успешно скомпилировано, Complete By,Завершить до, Complete Registration,Полная регистрация, @@ -709,27 +709,27 @@ Complete Setup,Завершение установки, Completed By,Завершено, Compose Email,Написать письмо, Condition Detail,Детализация условий, -Conditions,условия, +Conditions,Условия, Configure Chart,Настроить диаграмму, Configure Charts,Настроить графики, -Confirm,подтвердить, +Confirm,Подтвердить, Confirm Deletion of Data,Подтвердите удаление данных, Confirm Request,Подтвердите запрос, -Confirm Your Email,Подтвердите Ваш Адрес Электронной Почты, +Confirm Your Email,Подтвердите ваш адрес электронной почты, Confirmed,Подтвердил, Connected to QZ Tray!,Подключен к QZ Tray!, Connection Name,Название соединения, -Connection Success,Успех подключения, +Connection Success,Успешно подключено, Connection lost. Some features might not work.,Соединение потеряно. Некоторые функции могут не работать., Connector Name,Имя соединителя, Connector Type,Тип соединителя, Contact Us Settings,Контакты Настройки, "Contact options, like ""Sales Query, Support Query"" etc each on a new line or separated by commas.","Параметры контакта, как ""Sales Query, поддержки Query"" и т.д. каждого с новой строки или через запятую.", -Contacts,контакты, +Contacts,Контакты, Content (HTML),Контент (HTML), -Content (Markdown),Содержание (Уценка), -Content Hash,Содержимое Hash, -Content web page.,Содержимое веб-страницы., +Content (Markdown),Контент (Markdown), +Content Hash,Контент Hash, +Content web page.,Контент веб-страницы., Conversation Tones,Разговорные тона, Copyright,Авторское право, Core,Центр управления, @@ -740,24 +740,24 @@ Could not find {0} in {1},Не удалось найти {0} в {1}, Could not identify {0},Не удалось определить {0}, Count,подсчитывать, Country Name,Название страны, -County,округ, +County,Округ, Create Chart,Создать диаграмму, Create New,Создать, Create Post,Создать пост, -Create User Email,Создание Электронной почты Пользователя, +Create User Email,Создать электронной почты пользователя, Create a New Format,Создать новый формат, Create a new record,Создать новую запись, Create a new {0},Создать {0}, Create and Send Newsletters,Создание и отправка рассылки, Create and manage newsletter,Создать и управлять рассылкой, -Created,созданный, +Created,Созданный, Created Custom Field {0} in {1},Дата создания настраиваемого поля {0} в {1}, Created On,Дата создания, -Criticism,критика, -Criticize,критиковать, -Ctrl + Down,Ctrl + Вниз, -Ctrl + Up,Ctrl +, -Ctrl+Enter to add comment,"Ctrl + Enter, чтобы добавить комментарий", +Criticism,Критика, +Criticize,Критиковать, +Ctrl + Down,Ctrl + Down, +Ctrl + Up,Ctrl + Up, +Ctrl+Enter to add comment,"Ctrl+Enter, чтобы добавить комментарий", Currency Name,Название валюты, Currency Precision,Точность валюты, Current Mapping,Текущее сопоставление, @@ -769,28 +769,28 @@ Currently Viewing,Сейчас просматривают, Currently updating {0},В настоящее время обновление {0}, Custom,Пользовательские, Custom Base URL,Пользовательский базовый URL, -Custom CSS,Свой CSS, +Custom CSS,Пользовательский CSS, Custom DocPerm,Пользовательские DocPerm, Custom Field,Пользовательские поля, Custom Fields can only be added to a standard DocType.,Пользовательские поля могут быть добавлены только к стандартному типу документа., Custom Fields cannot be added to core DocTypes.,Пользовательские поля не могут быть добавлены в основные типы документов., -Custom Format,Собственный формат, -Custom HTML Help,Особый HTML Помощь, +Custom Format,Пользовательский формат, +Custom HTML Help,Пользовательский HTML Помощь, Custom JS,Пользовательский JS, Custom Menu Items,Пользовательские пункты меню, Custom Report,Пользовательский отчет, Custom Reports,Пользовательские отчеты, Custom Role,Пользовательские роли, -Custom Script,Специального сценария, -Custom Sidebar Menu,Пользовательские боковой панели меню, -Custom Translations,Пользовательские Переводы, +Custom Script,Пользовательский сценарий, +Custom Sidebar Menu,Пользовательское боковое меню, +Custom Translations,Пользовательские переводы, Customization,Пользовательские настройки, Customizations Reset,Сброс настроек, Customizations for {0} exported to:
{1},Настройки для {0} экспортированы в:
{1}, Customize Form,Настроить форму, Customize Form Field,Настроить поля формы, "Customize Label, Print Hide, Default etc.","Настроить Label, распечатать спрятать, Default т.д.", -Customize...,Настройка ..., +Customize...,Пользовательские настройки..., "Customized Formats for Printing, Email","Индивидуальные форматы для печати, электронной почты", Customized HTML Templates for printing transactions.,Индивидуальные шаблоны HTML для печатных операций., Cut,Порез, @@ -806,7 +806,7 @@ Dashboards,Сводки, Data,Данные, Data Export,Экспорт данных, Data Import,Импорт данных, -Data Import Template,Шаблон Импорт данных, +Data Import Template,Шаблон импорт данных, Data Migration,Перенос данных, Data Migration Connector,Разделитель данных, Data Migration Mapping,Миграция данных, @@ -824,19 +824,19 @@ Day of Week,День недели, Days After,Дней после, Days Before,Дней до, Days Before or After,Дней до или после, -"Dear System Manager,","Уважаемый Менеджер системы,", +"Dear System Manager,","Уважаемый менеджер системы,", "Dear User,","Дорогой пользователь,", Dear {0},Уважаемый {0}, Default Address Template cannot be deleted,Адрес по умолчанию шаблона не может быть удален, -Default Inbox,По умолчанию Входящие, -Default Incoming,По умолчанию Входящий, -Default Outgoing,По умолчанию Исходящие, +Default Inbox,По умолчанию входящие, +Default Incoming,По умолчанию для входящих, +Default Outgoing,По умолчанию для исходящих, Default Print Format,Печатная форма по умолчанию, Default Print Language,Язык печати по умолчанию, -Default Redirect URI,По умолчанию Перенаправление URI, -Default Role at Time of Signup,По умолчанию Роль Время в Signup, -Default Sending,По умолчанию Отправка, -Default Sending and Inbox,По умолчанию Отправка и Входящие, +Default Redirect URI,По умолчанию перенаправление URI, +Default Role at Time of Signup,Роль по умолчанию во время регистрации, +Default Sending,По умолчанию для отправки, +Default Sending and Inbox,По умолчанию отправка и получение, Default Sort Field,Поле сортировки по умолчанию, Default Sort Order,Порядок сортировки по умолчанию, Default Value,Значение по умолчанию, @@ -851,10 +851,10 @@ Delete comment?,Удалить комментарий?, Delete this record to allow sending to this email address,"Удалить эту запись, чтобы разрешить отправку на этот адрес электронной почты", Delete {0} items permanently?,Удалить {0} продуктов навсегда?, Deleted,Удаленный, -Deleted DocType,Удаляется DocType, -Deleted Document,Удаляется документ, +Deleted DocType,Удаленный DocType, +Deleted Document,Удаленный документ, Deleted Documents,Удаленные документы, -Deleted Name,Удаляется Имя, +Deleted Name,Удаляется имя, Deleting {0},Удаление {0}, Depends On,Зависит от, Descendants Of,Потомки, @@ -868,7 +868,7 @@ Did not cancel,Не отменить, Did not find {0} for {0} ({1}),Не нашли {0} {0} ({1}), Did not remove,Не удален, "Different ""States"" this document can exist in. Like ""Open"", ""Pending Approval"" etc.","Документ может содержать различные Статусы. Например, ""Создан"", ""Ожидает утверждения"" и т.д.", -Direct,непосредственный, +Direct,Непосредственный, Direct room with {0} already exists.,Прямая комната с {0} уже существует., Disable Auto Refresh,Отключить автоматическое обновление, Disable Count,Отключить счет, @@ -879,16 +879,16 @@ Disable SMTP server authentication,Отключить аутентификаци Disable Sidebar Stats,Отключить статистику боковой панели, Disable Signup,Отключение Регистрация, Disable Standard Email Footer,Отключить стандартный нижний колонтитул электронной почты, -Discard,отбрасывать, +Discard,Отбросить, Display,Показать, Display Depends On,Показание зависит от, Do not allow user to change after set the first time,Не позволяйте пользователю изменять после установить в первый раз, Do not edit headers which are preset in the template,"Не редактируйте заголовки, которые заданы в шаблоне", Do not send Emails,Не отправлять письма, -Doc Event,Событие Doc, -Doc Events,События Doc, +Doc Event,Событие документа, +Doc Events,События документа, Doc Status,Статус документа, -DocField,Поле документа, +DocField,DocField, DocPerm,DocPerm, DocShare,DocShare, DocType {0} provided for the field {1} must have atleast one Link field,"DocType {0}, предоставленный для поля {1}, должен иметь как минимум одно поле Link", @@ -902,10 +902,10 @@ Doctype required,Требуется Doctype, Document,Документ, Document Follow,Документ следовать, Document Follow Notification,Документ следовать уведомлению, -Document Queued,Документ Queued, +Document Queued,Документ в очереди, Document Restored,Восстановленный документ, Document Share Report,Документ Поделиться Пожаловаться, -Document States,Статусы Документа, +Document States,Состояния документа, Document Type is not importable,Тип документа не импортируется, Document Type is not submittable,Тип документа не подлежит отправке, Document Type to Track,Тип документа для отслеживания, @@ -947,7 +947,7 @@ Edit DocType,Редактирование DocType, Edit Filter,Изменить фильтр, Edit Format,Изменить формат, Edit HTML,Изменить HTML, -Edit Heading,Редактировать Заголовок, +Edit Heading,Редактировать заголовок, Edit Properties,Изменить свойства, Edit to add content,"Изменить, чтобы добавить содержание", Edit {0},Изменить {0}, @@ -971,7 +971,7 @@ Email Queue records.,Записи очереди электронной почт Email Reply Help,Ответить на Email Помощь, Email Rule,Правило электронной почты, Email Server,Сервер электронной почты, -Email Settings,Настройки Электронной Почты, +Email Settings,Настройки электронной почты, Email Signature,Подпись электронной почты, Email Status,Статус электронной почты, Email Sync Option,Опция синхронизации электронной почты, @@ -1044,7 +1044,7 @@ Excel,превосходить, Exception,Исключение, Exception Type,Тип исключения, Execution Time: {0} sec,Время выполнения: {0} сек, -Expert,эксперт, +Expert,Эксперт, Expiration time,Время истечения, Expire Notification On,Expire Уведомление о, Expires In,Истекает, @@ -1069,7 +1069,7 @@ Fetch Images,Получение изображений, Fetch attached images from document,Получение прикрепленных изображений из документа, "Field ""route"" is mandatory for Web Views",Поле «маршрут» обязательно для веб-представлений, "Field ""value"" is mandatory. Please specify value to be updated","Поле ""Значение"" является обязательным. Пожалуйста, укажите значение, чтобы обновить", -Field Description,Описание Поля, +Field Description,Описание поля, Field Maps,Карты полей, Field Type,Тип поля, "Field that represents the Workflow State of the transaction (if field is not present, a new hidden Custom Field will be created)","Поле, показывающее статус бизнес-процесса (если поле отсутствует, будет создано новое скрытое настраиваемое поле)", @@ -1128,28 +1128,28 @@ Fold must come before a Section Break,Сложите должны прийти Folder,Папка, Folder name should not include '/' (slash),Имя папки не должно включать «/» (косая черта), Folder {0} is not empty,Папка {0} не пуста, -Follow,следить, +Follow,Следить, Followed by,С последующим, Following fields are missing:,Эти поля отсутствуют:, Following fields have missing values:,Эти поля имеют пропущенные значения:, Font,Шрифт, Font Size,Размер шрифта, Fonts,Шрифты, -Footer,Низ страницы, +Footer,Нижний колонтитул, Footer HTML,Нижний колонтитул HTML, -Footer Items,Элементы колонтитула, +Footer Items,Элементы нижнего колонтитула, Footer will display correctly only in PDF,Нижний колонтитул будет отображаться правильно только в PDF, For Document Type,Для типа документа, -"For Links, enter the DocType as range.\nFor Select, enter list of Options, each on a new line.","Для ссылки, введите DOCTYPE как диапазона. Для Select, введите список вариантов, каждый с новой строки.", +"For Links, enter the DocType as range.\nFor Select, enter list of Options, each on a new line.","Для ссылки, введите DOCTYPE как диапазона.\nДля выбора, введите список вариантов, каждый с новой строки.", For User,Для пользователей, -For Value,Для ценности, +For Value,Для значений, "For currency {0}, the minimum transaction amount should be {1}",Для валюты {0} минимальная сумма транзакции должна быть {1}, For example if you cancel and amend INV004 it will become a new document INV004-1. This helps you to keep track of each amendment.,"Например, если вы отмените и измените INV004, он станет новым документом INV004-1. Это поможет вам отследить каждую правку.", "For example: If you want to include the document ID, use {0}","Например: Если вы хотите добавить идентификатор документа, используйте {0}", "For updating, you can update only selective columns.","Для обновления, вы можете обновить только выборочные столбцы.", For {0} at level {1} in {2} in row {3},Для {0} на уровне {1} в {2} в строке {3}, Force,Принудительно, -Force Show,Force Show, +Force Show,Принудительно показывать, Forgot Password,Забыли пароль, Forgot Password?,Забыли пароль?, Form Customization,Настройка формы, @@ -1163,7 +1163,7 @@ Frames,Рамки, Frappe,Frappe, Frappe Framework,Frappe Framework, Friendly Title,Упрощённое наименование, -From Date Field,Поле даты, +From Date Field,Из поля даты, From Document Type,Из типа документа, From Full Name,От полного имени, Full Page,Полная страница, @@ -1179,13 +1179,13 @@ Generate New Report,Создать новый отчет, Generated File,Сгенерированный файл, Geo,Гео, Geolocation,Геолокация, -Get Alerts for Today,Виртуальный на сегодняшний день, +Get Alerts for Today,Получить оповещения на сегодня, Get Contacts,Получить контакты, Get Fields,Получить поля, Get your globally recognized avatar from Gravatar.com,Получить всемирно признанный аватара из Gravatar.com, GitHub,GitHub, Give Review Points,Дайте очки обзора, -Global Unsubscribe,Глобальный Отказаться, +Global Unsubscribe,Глобальная отписка, Go to the document,Перейти к документу, Go to this URL after completing the form (only for Guest users),Перейдите по этому URL-адресу после заполнения формы (только для гостевых пользователей), Go to {0},Перейти к {0}, @@ -1211,7 +1211,7 @@ Has Domain,Имеет домен, Has Role,Имеет роль, Has Web View,Имеет Web View, Have an account? Login,Уже есть аккаунт? Авторизоваться, -Header,Шапка, +Header,Заголовок, Header HTML,Заголовок HTML, Header HTML set from attachment {0},HTML-код заголовка из вложения {0}, Header Image,Заглавное изображение, @@ -1221,7 +1221,7 @@ Hello {0},"Здравствуйте, {0}", Hello!,Здравствуйте!, Help Articles,Статьи помощи, Help Category,Категория помощи, -Help on Search,Помощь в Поиске, +Help on Search,Помощь в поиске, "Help: To link to another record in the system, use ""#Form/Note/[Note Name]"" as the Link URL. (don't use ""http://"")","Помощь: Чтобы связать с другой записью в системе, используйте «# Form/Note/[Название статьи]», в виде ссылки URL. (Не используйте «http://»)", Helvetica,Helvetica, Hi {0},Привет {0}, @@ -1230,7 +1230,7 @@ Hide Footer Signup,Скрыть колонтитул регистрации, Hide Sidebar and Menu,Скрыть боковую панель и меню, Hide Standard Menu,Скрыть стандартное меню, Hide Weekends,Скрыть выходные, -Hide details,Скрыть детали, +Hide details,Скрыть подробности, Hide footer in auto email reports,Скрыть нижний колонтитул в автоответах электронной почты, Higher priority rule will be applied first,Правило с более высоким приоритетом будет применено первым, Highlight,Выделить, @@ -1238,9 +1238,9 @@ Highlight,Выделить, Home Page,Домашняя Страница, Home Settings,Домашние настройки, Home/Test Folder 1,Главная/Тестовая Папка 1, -Home/Test Folder 1/Test Folder 3,Главная/Тестовая Папка 1/ Тестовая Папка 3, +Home/Test Folder 1/Test Folder 3,Главная/Тестовая Папка 1/Тестовая Папка 3, Home/Test Folder 2,Главная/Тестовая Папка 2, -Host,Хозяин, +Host,Host, Hostname,Hostname, "How should this currency be formatted? If not set, will use system defaults","Как следует отображать числа в этой валюте? Если не указано, то будут использоваться системные значения", I found these: ,Я нашел следующее:, @@ -1251,25 +1251,25 @@ Identity Details,Сведения о личности, Idx,Idx, "If Apply Strict User Permission is checked and User Permission is defined for a DocType for a User, then all the documents where value of the link is blank, will not be shown to that User","Если флажок Apply Strict User Permission установлен, а для пользователя DocType для пользователя задано разрешение пользователя, тогда все документы, где значение ссылки пустым, не будут показаны этому пользователю", If Checked workflow status will not override status in list view,"Если установлен флажок, статус процесса не будет отменять статус в журнале", -If Owner,Если Владелец, -"If a Role does not have access at Level 0, then higher levels are meaningless.","Если Роль не имеет доступа на уровне 0, то более высокие уровни не имеют смысла.", -"If checked, all other workflows become inactive.","Если этот флажок установлен, все остальные рабочие процессы становятся неактивными.", -"If checked, this field will be not overwritten based on Fetch From if a value already exists.","Если флажок установлен, это поле не будет перезаписано на основе извлечения из, если значение уже существует.", +If Owner,Если владелец, +"If a Role does not have access at Level 0, then higher levels are meaningless.","Если роль не имеет доступа на уровне 0, то более высокие уровни не имеют смысла.", +"If checked, all other workflows become inactive.","Если этот флажок установлен, то все остальные рабочие процессы становятся неактивными.", +"If checked, this field will be not overwritten based on Fetch From if a value already exists.","Если флажок установлен, это поле не будет перезаписано на основе Извлечено из, если значение уже существует.", "If checked, users will not see the Confirm Access dialog.","Если этот флажок установлен, пользователи не будут видеть диалоговое окно подтверждения доступа.", -"If disabled, this role will be removed from all users.","Если эта функция отключена, эта роль будет удалена от всех пользователей.", +"If disabled, this role will be removed from all users.","Если эта функция отключена, эта роль будет удалена у всех пользователей.", "If enabled, user can login from any IP Address using Two Factor Auth, this can also be set for all users in System Settings","Если включено, пользователь может войти в систему с любого IP-адреса, используя двухфакторную аутентификацию, это также можно установить для всех пользователей в настройках системы.", -"If enabled, all users can login from any IP Address using Two Factor Auth. This can also be set only for specific user(s) in User Page","Если включено, все пользователи могут войти в систему с любого IP-адреса, используя Two Factor Auth. Это также можно установить только для определенных пользователей (пользователей) на странице пользователя", +"If enabled, all users can login from any IP Address using Two Factor Auth. This can also be set only for specific user(s) in User Page","Если включено, все пользователи могут войти в систему с любого IP-адреса, используя двухфакторную аутентификацию. Это также можно установить только для определенных пользователей на странице пользователя", "If enabled, changes to the document are tracked and shown in timeline","Если включено, изменения в документе отслеживаются и отображаются на временной шкале.", "If enabled, document views are tracked, this can happen multiple times","Если включено, просмотры документов отслеживаются, это может происходить несколько раз", "If enabled, the document is marked as seen, the first time a user opens it","Если этот параметр включен, документ помечается как видимый, когда пользователь впервые открывает его", -"If enabled, the password strength will be enforced based on the Minimum Password Score value. A value of 2 being medium strong and 4 being very strong.","Если включено, сила пароля будет применяться в зависимости от значения минимального пароля. Значение 2 является средним сильным, а 4 - очень сильным.", -"If enabled, users who login from Restricted IP Address, won't be prompted for Two Factor Auth","Если включено, пользователи, которые подключаются с ограниченным IP-адресом, не будут запрашиваться для Two Factor Auth", -"If enabled, users will be notified every time they login. If not enabled, users will only be notified once.","Если включено, пользователи будут уведомляться каждый раз при входе в систему. Если этот параметр не включен, пользователи будут получать уведомления только один раз.", +"If enabled, the password strength will be enforced based on the Minimum Password Score value. A value of 2 being medium strong and 4 being very strong.","Если включено, сложность пароля будет определяться в зависимости от значения минимальной оценки пароля. Значение 2 является средней сложностью, а 4 - очень сложным.", +"If enabled, users who login from Restricted IP Address, won't be prompted for Two Factor Auth","Если включено, пользователи, которые подключаются с установленного IP-адреса, не будут проходить двухфакторную аутентификацию", +"If enabled, users will be notified every time they login. If not enabled, users will only be notified once.","Если включено, пользователи будут получать уведомления каждый раз при входе в систему. Если этот параметр выключен, пользователи будут получать уведомления только один раз.", If non standard port (e.g. 587),"Если, не стандартный порт (например, 587)", "If non standard port (e.g. 587). If on Google Cloud, try port 2525.","Если нестандартный порт (например, 587). Если в Google Cloud, попробуйте порт 2525.", "If not set, the currency precision will depend on number format","Если не установлено, точность валюты будет зависеть от формата числа", If the condition is satisfied user will be rewarded with the points. eg. doc.status == 'Closed'\n,"Если условие выполнено, пользователь будет вознагражден баллами. например. doc.status == 'Закрыто'", -"If the user has any role checked, then the user becomes a ""System User"". ""System User"" has access to the desktop","Если пользователь имеет какую-либо роль, то он становится «Пользователем системы». Пользователем системы имеет доступ к рабочему столу", +"If the user has any role checked, then the user becomes a ""System User"". ""System User"" has access to the desktop","Если пользователь имеет какую-либо роль, то он становится «Пользователем системы». Пользователи системы имеет доступ к рабочему столу", "If these instructions where not helpful, please add in your suggestions on GitHub Issues.","Если эти инструкции бесполезны, пожалуйста, добавьте предложения в GitHub.", "If this is checked, rows with valid data will be imported and invalid rows will be dumped into a new file for you to import later.","Если этот флажок установлен, строки с достоверными данными будут импортированы, а недопустимые строки будут сбрасываться в новый файл для последующего импорта.", If user is the owner,Если пользователь является владельцем, @@ -1281,19 +1281,19 @@ If you don't want to create any new records while updating the older records.,Е "If you set this, this Item will come in a drop-down under the selected parent.","Если вы установите это, этот предмет придет в раскрывающемся списке под выбранной родителя.", "If you think this is unauthorized, please change the Administrator password.","Если вы думаете, что это несанкционированное, пожалуйста, измените пароль администратора.", "If your data is in HTML, please copy paste the exact HTML code with the tags.","Если данные в HTML, скопируйте вставьте точный HTML код с тегами.", -Ignore User Permissions,Игнорировать разрешеник пользователя, +Ignore User Permissions,Игнорировать разрешения пользователя, Ignore XSS Filter,Игнорировать XSS-фильтр, -Ignore attachments over this size,Игнорировать вложения более такого размера, +Ignore attachments over this size,Игнорировать вложения больше указаного размера, Ignore encoding errors,Игнорировать ошибки кодирования, Ignored: {0} to {1},Игнорируется: {0} до {1}, Illegal Access Token. Please try again,"Неправильный токен доступа. Пожалуйста, попробуйте еще раз", Illegal Document Status for {0},Недопустимый статус документа для {0}, Image Field,Поле изображения, Image Link,Ссылка на изображение, -Image field must be a valid fieldname,Поле Изображение должно быть допустимым имя_поля, -Image field must be of type Attach Image,Поле Изображение должно быть типа Присоединить изображения, -Images,Изображении, -Implicit,неявный, +Image field must be a valid fieldname,Поле изображения должно быть допустимым имя_поля, +Image field must be of type Attach Image,Поле изображения должно быть типа Прикрепить изображение, +Images,Изображения, +Implicit,Неявный, Import,Импорт, Import Email From,Импортировать электронную почту из, Import Status,Статус импорта, @@ -1307,8 +1307,8 @@ In List View,В виде списка, In Preview,В предварительном просмотре, In Reply To,В ответ на, In Standard Filter,В стандартный фильтр, -In Valid Request,Неверный запрос, -In points. Default is 9.,В точках. По умолчанию 9., +In Valid Request,В действующем запросе, +In points. Default is 9.,В баллах. По умолчанию 9., In seconds,В секундах, Include Search in Top Bar,Включить поиск в верхней панели, "Include symbols, numbers and capital letters in the password","Включить символы, цифры и заглавные буквы в пароле", @@ -1318,15 +1318,15 @@ Incorrect User or Password,Неверный пользователь или па Incorrect Verification code,Неверный код подтверждения, Incorrect value in row {0}: {1} must be {2} {3},Неверное значение в строке {0}: {1} должно быть {2} {3}, Incorrect value: {0} must be {1} {2},Неверное значение: {0} должно быть {1} {2}, -Index,индекс, +Index,Индекс, Indicator,Индикатор, Info,Информация, Info:,Информация:, Initial Sync Count,Первоначальная синхронизация Count, InnoDB,InnoDB, -Insert Above,Вставьте Над, -Insert After,Вставьте После, -Insert After cannot be set as {0},Вставка После не может быть установлен как {0}, +Insert Above,Вставить сверху, +Insert After,Вставить после, +Insert After cannot be set as {0},Вставка после не может быть установлен как {0}, "Insert After field '{0}' mentioned in Custom Field '{1}', with label '{2}', does not exist","После того, как вставить поле '{0}', упомянутой в настраиваемое поле '{1}', с меткой '{2}', не существует", Insert Below,Вставить ниже, Insert Column Before {0},Вставить столбец до {0}, @@ -1344,39 +1344,39 @@ Internal Server Error,Внутренняя ошибка сервера, Internal record of document shares,Внутренняя запись акций документов, Introduce your company to the website visitor.,Представьте вашу компанию на посетителя сайта., Introductory information for the Contact Us Page,Вводная информация для страницы контактов, -Invalid,Инвалид, +Invalid,Неверно, "Invalid ""depends_on"" expression",Недопустимое выражение "depends_on", Invalid Access Key ID or Secret Access Key.,Недействительный ключ ключа доступа или секретный ключ доступа., Invalid CSV Format,Неверный формат CSV, Invalid Home Page,Неверная главная страница, Invalid Link,Неверная ссылка, -Invalid Login Token,Неверный Логин маркера, +Invalid Login Token,Неверный логин токен, Invalid Login. Try again.,Неверный логин. Попробуй еще раз., Invalid Mail Server. Please rectify and try again.,"Неверный почтовый сервер. Пожалуйста, исправьте и попробуйте еще раз.", -Invalid Outgoing Mail Server or Port,Неверный Сервер исходящей почты или порт, +Invalid Outgoing Mail Server or Port,Неверный сервер исходящей почты или порт, Invalid Output Format,Неверный формат выходного, Invalid Password,Неверный пароль, Invalid Password:,Неверный пароль:, Invalid Request,Неверная заявка, Invalid Search Field {0},Неверное поле поиска {0}, Invalid Subscription,Недействительная подписка, -Invalid Token,Недопустимый маркер, +Invalid Token,Недопустимый токен, Invalid User Name or Support Password. Please rectify and try again.,"Неверное имя пользователя или поддержки Пароль. Пожалуйста, исправить и попробовать еще раз.", Invalid column,Недопустимый столбец, Invalid field name {0},Недопустимое имя поля {0}, -Invalid fieldname '{0}' in autoname,Invalid имя_поля '{0}' в autoname, +Invalid fieldname '{0}' in autoname,Недопустимое имя_поля '{0}' в autoname, Invalid file path: {0},Неверный путь к файлу: {0}, Invalid login or password,Неверный логин или пароль, Invalid module path,Недопустимый путь к модулю, Invalid naming series (. missing),Неверный идентификатор по имени (отсутствует), -Invalid payment gateway credentials,Неверные учетные данные платежный шлюз, +Invalid payment gateway credentials,Неверные учетные данные платежного шлюза, Invalid recipient address,Неверный адрес получателя, Invalid {0} condition,Недопустимое условие {0}, Inverse,Обратный, Is,Является, -Is Attachments Folder,Является Вложения Папка, -Is Child Table,Является дочерней таблице, -Is Custom Field,На заказ поле, +Is Attachments Folder,Является папкой вложений, +Is Child Table,Является дочерней таблицей, +Is Custom Field,Это нестандартное поле, Is First Startup,Первый запуск, Is Folder,Папка, Is Global,Является глобальным, @@ -1385,7 +1385,7 @@ Is Home Folder,Является корневой папкой, Is Mandatory Field,Является обязательным полем, Is Pinned,Прикреплено, Is Primary Contact,Основной контакт, -Is Private,Является личным, +Is Private,Является приватным, Is Published Field,Есть Опубликовано поле, Is Published Field must be a valid fieldname,Опубликовано Поле должно быть действительным имя_полем, Is Single,Единственный, @@ -1394,7 +1394,7 @@ Is Standard,Стандартный отчёт, Is Submittable,Подлежит исполнению, Is Table,Является таблицей, Is Your Company Address,Является адресом вашей компании, -It is risky to delete this file: {0}. Please contact your System Manager.,"Это рискованно, чтобы удалить этот файл: {0}. Пожалуйста, обратитесь к менеджеру системы.", +It is risky to delete this file: {0}. Please contact your System Manager.,"Рискованно удалять этот файл: {0}. Пожалуйста, обратитесь к менеджеру системы.", Item cannot be added to its own descendents,Продукт не может быть добавлен к своим подпродуктам, JS,JS, JSON,JSON, @@ -1407,13 +1407,13 @@ Kanban Board Column,Колонка канбан-доски, Kanban Board Name,Наименование канбан-доски, Karma,Карма, Keep track of all update feeds,Следите за всеми фидами обновлений, -Keeps track of all communications,Отслеживает все сообщения, +Keeps track of all communications,Отслеживать все коммуникации, Key,Ключ, Knowledge Base,База знаний, Knowledge Base Contributor,Пользователь базы знаний, Knowledge Base Editor,Редактор базы знаний, LDAP Email Field,LDAP Email Поле, -LDAP First Name Field,LDAP Имя поля, +LDAP First Name Field,LDAP поле Имя, LDAP Not Installed,LDAP не установлен, LDAP Search String,LDAP Строка поиска, "LDAP Search String needs to end with a placeholder, eg sAMAccountName={0}","Строка поиска LDAP должна заканчиваться заполнителем, например, sAMAccountName = {0}", @@ -1421,12 +1421,12 @@ LDAP Security,LDAP Security, LDAP Server Url,URL cервера LDAP, LDAP Username Field,LDAP Имя пользователя Поле, LDAP is not enabled.,LDAP не включен., -Label Help,Этикетка Помощь, -Label and Type,Этикетка и Тип, -Label is mandatory,Этикетка является обязательным, +Label Help,Ярлык Помощь, +Label and Type,Ярлык и Тип, +Label is mandatory,Ярлык является обязательным, Landing Page,Страница входа, -Language,язык, -Language Code,таблица условных сигналов, +Language,Язык, +Language Code,Языковой код, "Language, Date and Time settings","Настройки языка, даты и времени", Last Active,Последнее посещение, Last IP,Последний IP, @@ -1437,7 +1437,7 @@ Last Modified By,Последнее изменение, Last Modified Date,Дата последней модификации, Last Modified On,Дата последнего обновления, Last Month,Прошлый месяц, -Last Point Allocation Date,Дата выделения последней точки, +Last Point Allocation Date,Дата последнего начисления баллов, Last Quarter,Последняя четверть, Last Synced On,Последняя синхронизация включена, Last Updated By,Последнее обновление, @@ -1447,7 +1447,7 @@ Last Week,Прошлая неделя, Last Year,Прошлый год, Last synced {0},Последняя синхронизация {0}, Leave a Comment,Оставить комментарий, -Leave blank to repeat always,"Оставьте пустым, чтобы повторить всегда", +Leave blank to repeat always,"Оставьте пустым, чтобы повторять всегда", Leave this conversation,Покинуть этот разговор, Left this conversation,Покинуть этот разговор, Length,Длина, @@ -1470,8 +1470,8 @@ Link DocType,Ссылка DocType, Link Expired,Срок действия ссылки, Link Name,Имя ссылки, Link Title,Название ссылки, -"Link that is the website home page. Standard Links (index, login, products, blog, about, contact)","Ссылка, что находитесь на сайте домашняя страница. Стандартные ссылки (индекс, логин, продукты, блог, о, контакт)", -Link to the page you want to open. Leave blank if you want to make it a group parent.,"Ссылка на страницу, вы хотите, чтобы открыть. Оставьте пустым, если вы хотите, чтобы сделать его группа родителей.", +"Link that is the website home page. Standard Links (index, login, products, blog, about, contact)","Ссылка, которая является стартовой страницей сайта. Стандартные ссылки (индекс, логин, продукты, блог, о, контакт)", +Link to the page you want to open. Leave blank if you want to make it a group parent.,"Ссылка на страницу, которую вы хотите открыть. Оставьте пустым, если хотите сделать его родительским элементом группы.", Linked,Связанный, Linked With,Связанные с, Linked with {0},Связано с {0}, @@ -1482,36 +1482,36 @@ List View Setting,Настройка просмотра списка, List a document type,Перечислите тип документа, "List as [{""label"": _(""Jobs""), ""route"":""jobs""}]","Список как [{ "этикетка": _ ( "Работа"), "маршрут": "работа"}]", List of backups available for download,"Список резервных копий, доступных для загрузки", -List of patches executed,Список исправлений выполняется, +List of patches executed,Список выполненных патчей, List of themes for Website.,Список тем для веб-сайта., -Load Balancing,Балансировки нагрузки, +Load Balancing,Балансировка нагрузки, Loading,Идёт загрузка, Local DocType,Локальный DocType, Local Fieldname,Локальное имя поля, Local Primary Key,Местный первичный ключ, Locals,Локальные переменные, Log Details,Сведения о журнале, -Log of Scheduler Errors,Журнал ошибок Scheduler, -Log of error during requests.,Войти ошибки во время запросов., -Log of error on automated events (scheduler).,Войти ошибки на автоматизированных событий (планировщик)., -Logged Out,Вышли из, -Logged in as Guest or Administrator,Вы вошли как Гость или Administrator, +Log of Scheduler Errors,Журнал ошибок планировщика, +Log of error during requests.,Журнал ошибок во время запросов., +Log of error on automated events (scheduler).,Журнал ошибок автоматизированных событий (планировщик)., +Logged Out,Вышел из системы, +Logged in as Guest or Administrator,Войти как гость или администратор, Login,Войти, -Login After,Входить после, -Login Before,Входить до, -Login Id is required,Войти Id требуется, -Login Required,Войти Обязательные, +Login After,Войти после, +Login Before,Войти до, +Login Id is required,Требуется ID для входа, +Login Required,Авторизация обязательна, Login Verification Code from {},Код подтверждения входа в систему {}, Login and view in Browser,Вход и просмотр в браузере, -Login not allowed at this time,Войти не допускается в это время, +Login not allowed at this time,Авторизация не допускается в это время, "Login session expired, refresh page to retry","Срок действия сеанса истек, обновить страницу, чтобы повторить попытку", -Login to comment,Вход на комментарий, +Login to comment,Авторизоваться чтобы оставить комментарий, Login token required,Для входа требуется токен, Login with LDAP,Вход с LDAP, Logout,Выход, Long Text,Длинный текст, Looks like something is wrong with this site's Paypal configuration.,"Похоже, что что-то не так с конфигурацией Paypal этого сайта.", -Looks like something is wrong with this site's payment gateway configuration. No payment has been made.,"Похоже, что-то не так с конфигурацией платежного шлюза этого сайта. Платеж не был достигнут.", +Looks like something is wrong with this site's payment gateway configuration. No payment has been made.,"Похоже, что-то не так с конфигурацией платежного шлюза этого сайта. Платеж не был выполнен.", "Looks like something went wrong during the transaction. Since we haven't confirmed the payment, Paypal will automatically refund you this amount. If it doesn't, please send us an email and mention the Correlation ID: {0}.","Похоже, что-то пошло не так во время транзакции. Поскольку мы не подтвердили платеж, Paypal автоматически вернет вам эту сумму. Если это не так, отправьте нам электронное письмо и укажите идентификатор корреляции: {0}.", Madam,Госпожа, Main Section,Основной раздел, @@ -1521,7 +1521,7 @@ Manage Third Party Apps,Управление приложениями сторо Mandatory Information missing:,Обязательная информация отсутствует:, Mandatory field: set role for,Обязательное поле: установить роль для, Mandatory field: {0},Обязательное поле: {0}, -"Mandatory fields required in table {0}, Row {1}","Обязательные поля, требуемые в таблице {0}, строке {1}", +"Mandatory fields required in table {0}, Row {1}","Обязательные поля, требуемые в таблице {0}, строка {1}", Mandatory fields required in {0},"Обязательные поля, необходимые в {0}", Mandatory:,Обязательно:, Mapping Name,Название карты, @@ -1532,19 +1532,19 @@ Mark as Unread,Отметить как непрочитанные, Markdown,Markdown, Markdown Editor,Редактор Markdown, Marked As Spam,Помеченные как спам, -Max 500 records at a time,Max 500 записей за один раз, -Max Attachment Size (in MB),Максимальный размер вложения (в МБ), -Max Attachments,Максимальное Вложения, -Max Length,Максимальная длина, -Max Value,Максимальное значение, -Max width for type Currency is 100px in row {0},Максимальная ширина для типа валюта 100px в строке {0}, -Maximum Attachment Limit for this record reached.,Максимальная Приложение Лимит на этой записи достигли., -Maximum {0} rows allowed,Максимальные {0} строк разрешено, +Max 500 records at a time,Макс. 500 записей за один раз, +Max Attachment Size (in MB),Макс. размер вложения (в МБ), +Max Attachments,Макс. вложений, +Max Length,Макс. длина, +Max Value,Макс. значение, +Max width for type Currency is 100px in row {0},Макс. ширина для типа валюты 100px в строке {0}, +Maximum Attachment Limit for this record reached.,Достигнут предел вложений для этой записи., +Maximum {0} rows allowed,Макс. {0} строк разрешено, "Meaning of Submit, Cancel, Amend","Значение Провести, Отменить, Изменить", Mention transaction completion page URL,URL-ссылка на страницу-упоминание о завершении транзакции, Mentions,Упоминания, Menu,Меню, -Merchant ID,идентификатор продавца, +Merchant ID,Идентификатор продавца, Merge with existing,Слияние с существующими, Merging is only possible between Group-to-Group or Leaf Node-to-Leaf Node,Слияние возможно только между Группа-в-группе или Leaf узел-листовой узел, Message Count,Количество сообщений, @@ -1554,7 +1554,7 @@ Message Preview,Предварительный просмотр сообщени Message clipped,Сообщение обрезано, Message not setup,Сообщение не установлено, Message to be displayed on successful completion (only for Guest users),"Сообщение, которое будет отображаться при успешном завершении (только для гостевых пользователей)", -Message-id,Message-ID, +Message-id,ID сообщения, Meta Tags,Мета-теги, Migration ID Field,Поле идентификатора миграции, Milestone,Этап, @@ -1566,26 +1566,26 @@ Missing parameter Kanban Board Name,Отсутствует параметр На Missing parameters for login,Недостающие параметры для входа, Models (building blocks) of the Application,Модели (строительные блоки) приложения, Modified By,Модифицирован, -Module,модуль, +Module,Модуль, Module Def,Модуль Def, Module Name,Название модуля, Module Not Found,Модуль не найден, Module Path,Путь модуля, Module to Export,Модуль для экспорта, -Modules HTML,Модули HTML-, +Modules HTML,Модули HTML, Monospace,Моноширинный, More articles on {0},Другие статьи на {0}, More content for the bottom of the page.,Более контент для нижней части страницы., Most Used,Наиболее используемое, Move To,Переместить в, Move To Trash,Переместить в корзину, -Move to Row Number,Переместить в номер строки, +Move to Row Number,Переместить на строку, Mr,Г-н, Mrs,Г-жа, Ms,Госпожа, Multiple root nodes not allowed.,Несколько корневые узлы не допускается., Multiplier Field,Поле множителя, -"Must be of type ""Attach Image""",Должно быть типа "Присоединить изображение", +"Must be of type ""Attach Image""",Должно быть типа "Прикрепить изображение", Must have report permission to access this report.,Должен иметь разрешение отчета для доступа к этой отчета., Must specify a Query to run,"Необходимо указать запрос, чтобы запустить", Mute Sounds,Отключить звуки, @@ -1659,7 +1659,7 @@ No further records,Никаких дополнительных записей, No matching records. Search something new,Нет соответствующих записей. Поиск что-то новое, "No need for symbols, digits, or uppercase letters.","Нет необходимости для символов, цифр или букв в верхнем регистре.", No of Columns,Кол-во колонок, -No of Rows (Max 500),Кол-во строк (максимум 500), +No of Rows (Max 500),Кол-во строк (максимум 500), No of emails remaining to be synced,Нет сообщений для синхронизации, No permission for {0},Нет доступа для {0}, No permission to '{0}' {1},Нет доступа для '{0}' {1}, @@ -1685,10 +1685,10 @@ Not Seen,Непрочитанно, Not Sent,Не Отправлено, Not Set,Не указано, Not a valid Comma Separated Value (CSV File),"Не является допустимым значения, разделенные запятыми (CSV-файл)", -Not a valid User Image.,Недействительный образ пользователя., -Not a valid Workflow Action,Недоступное Действие бизнес-процесса, +Not a valid User Image.,Недействительный изображение пользователя., +Not a valid Workflow Action,Недоступное действие рабочего-процесса, Not a valid user,Не является действительным пользователем, -Not a zip file,Не архивный файл, +Not a zip file,Не zip файл, Not allowed for {0}: {1},Не разрешено для {0}: {1}, Not allowed for {0}: {1} in Row {2}. Restricted field: {3},Недопустимо для {0}: {1} в строке {2}. Запрещенное поле: {3}, Not allowed for {0}: {1}. Restricted field: {2},Не допускается для {0}: {1}. Запрещенное поле: {2}, @@ -1707,7 +1707,7 @@ Note: Changing the Page Name will break previous URL to this page.,Примеч Note: Multiple sessions will be allowed in case of mobile device,Примечание: Несколько сессий будет разрешено в случае мобильного устройства, Nothing to show,"К сожалению, здесь еще ничего не размещено", Nothing to update,Нечего обновлять, -Notification,уведомление, +Notification,Уведомление, Notification Recipient,Получатель уведомлений, Notification Tones,Сигналы уведомления, Notifications,Уведомления, @@ -1763,8 +1763,8 @@ Open {0},Открыть {0}, Opened,Открыт, Operator must be one of {0},Оператор должен быть одним из {0}, Option 1,Опция 1, -Option 2,Вариант 2, -Option 3,Вариант 3, +Option 2,Опция 2, +Option 3,Опция 3, Optional: Always send to these ids. Each Email Address on a new row,Дополнительно: Всегда рассылают по этим идентификаторам. Каждый адрес электронной почты в новой строке, Optional: The alert will be sent if this expression is true,"Дополнительно: предупреждение будет отправлено, если это выражение истинно", Options 'Dynamic Link' type of field must point to another Link Field with options as 'DocType',"""Dynamic Link 'Тип варианты поле должен указывать на другой Link Field с вариантами, как« DocType """, @@ -1772,19 +1772,19 @@ Options Help,Опции Помощь, Options for select. Each option on a new line.,Варианты выбора. Каждый вариант с новой строки., Options not set for link field {0},Опции не установлен поля связи {0}, Or login with,Или войти в систему с, -Order,порядок, +Order,Порядок, Org History,Org История, Org History Heading,Org История Заголовок, -Orientation,ориентация, -Original Value,первоначальная стоимость, +Orientation,Ориентация, +Original Value,Первоначальная стоимость, Outgoing email account not correct,Исходящая учетная запись электронной почты не верна, Outlook.com,Outlook.com, Output,Вывод, PDF,PDF, PDF Page Size,Размер PDF страницы, PDF Settings,Настройки PDF, -PDF generation failed,Не удалось создать PDF-файл, -PDF generation failed because of broken image links,Поколение PDF удалось из-за битых ссылок изображения, +PDF generation failed,Не удалось сгенерировать PDF-файл, +PDF generation failed because of broken image links,Не удалось сгенерировать PDF из-за битых ссылок изображения, "PDF printing via ""Raw Print"" is not yet supported. Please remove the printer mapping in Printer Settings and try again.",Печать PDF через «Raw Print» пока не поддерживается. Удалите отображение принтера в настройках принтера и повторите попытку., Page HTML,Страница HTML, Page Length,Длина страницы, @@ -1807,7 +1807,7 @@ Passive,Пассивный, Password Reset,Сброс пароля, Password Updated,Пароль обновлён, Password for Base DN,Пароль для Base DN, -Password is required or select Awaiting Password,Пароль требуется или выбрать Впредь пароль, +Password is required or select Awaiting Password,Требуется пароль или выберите Ожидание пароля, Password not found,Пароль не найден, Password reset instructions have been sent to your email,Инструкции по восстановлению пароля были отправлены на ваш email, Paste,Вставить, @@ -1820,7 +1820,7 @@ PayPal Settings,Настройки PayPal, PayPal payment gateway settings,Настройки оплаты шлюз PayPal, Payment Cancelled,Оплата отменена, Payment Failed,Платеж не прошел, -Payment Success,Оплата успеха, +Payment Success,Оплата прошла успешно, Pending Approval,В ожидании утверждения, Pending Verification,ожидает подтвержения, Percent,Процент, @@ -1830,12 +1830,12 @@ Permanent,Постоянный, Permanently Cancel {0}?,Постоянно Отменить {0}?, Permanently Submit {0}?,Постоянно провести {0}?, Permanently delete {0}?,Навсегда удалить {0}?, -Permission Error,Ошибка разрешения, +Permission Error,Ошибка доступа, Permission Level,Уровень доступа, Permission Levels,Уровни доступа, Permission Rules,Правило доступа, Permissions,Разрешения, -Permissions are automatically applied to Standard Reports and searches.,Разрешения автоматически применяются к стандартным отчетам и поисковым запросам., +Permissions are automatically applied to Standard Reports and searches.,Разрешения автоматически применяются к стандартнSым отчетам и поисковым запросам., "Permissions are set on Roles and Document Types (called DocTypes) by setting rights like Read, Write, Create, Delete, Submit, Cancel, Amend, Report, Import, Export, Print, Email and Set User Permissions.","Разрешения устанавливаются в Ролях и Типах Документов (называемые DocTypes) путем наделения правами Чтение, Запись, Создание, Удаление, Проведение, Отмена, Изменение, Создание отчета, Импорт, Экпорт, Печать, Отправка email и Назначение прав пользователя.", Permissions at higher levels are Field Level permissions. All Fields have a Permission Level set against them and the rules defined at that permissions apply to the field. This is useful in case you want to hide or make certain field read-only for certain Roles.,"Разрешения на более высоких уровнях - это разрешения на уровне поля. Все поля имеют установленный для них уровень разрешения, и правила, определенные в этих разрешениях, относятся к полю. Это полезно, если вы хотите скрыть или сделать определенное поле только для чтения для определенных ролей.", "Permissions at level 0 are Document Level permissions, i.e. they are primary for access to the document.","Разрешения на уровне 0 это разрешения на уровне документа, то есть они являются первичными для доступа к документу.", @@ -1846,14 +1846,14 @@ Personal Data Download Request,Запрос на скачивание личны Phone No.,Номер телефона, Pick Columns,Выберите столбцы, Plant,Завод, -Please Duplicate this Website Theme to customize.,"Пожалуйста, дублировать эту страницу Тема для настройки.", -Please Enter Your Password to Continue,"Пожалуйста, введите Ваш пароль чтобы продолжить", +Please Duplicate this Website Theme to customize.,"Пожалуйста, дублировать эту тему для настройки.", +Please Enter Your Password to Continue,"Пожалуйста, введите ваш пароль чтобы продолжить", Please Install the ldap3 library via pip to use ldap functionality.,"Пожалуйста, установите библиотеку ldap3 через pip, чтобы использовать функциональность ldap.", -Please Update SMS Settings,Обновите настройки СМС, +Please Update SMS Settings,Обновите настройки SMS, Please add a subject to your email,"Пожалуйста, укажите тему вашего письма", Please ask your administrator to verify your sign-up,"Пожалуйста, обратитесь к администратору, для подтверждения регистрации", -Please attach a file first.,"Пожалуйста, приложите файл первый.", -Please attach an image file to set HTML,"Пожалуйста, приложите файл изображения, чтобы установить HTML", +Please attach a file first.,"Пожалуйста, прикрепите первый файл.", +Please attach an image file to set HTML,"Пожалуйста, прикрепите файл изображения, чтобы установить HTML", Please check your email for verification,"Пожалуйста, проверьте свою электронную почту для подтверждения", Please check your registered email address for instructions on how to proceed. Do not close this window as you will have to return to it.,"Пожалуйста, проверьте электронную почту регистрации для получения инструкций. Не закрывайте это окно, так как вам придется вернуться к нему.", Please close this window,"Пожалуйста, закройте это окно", @@ -1873,7 +1873,7 @@ Please enter the password,"Пожалуйста, введите пароль", Please enter valid mobile nos,Введите действительные мобильных NOS, Please enter values for App Access Key and App Secret Key,"Пожалуйста, введите ключ доступа и секретный ключ приложения", Please make sure that there are no empty columns in the file.,"Пожалуйста, убедитесь, что нет никаких пустые столбцы в файле.", -Please make sure the Reference Communication Docs are not circularly linked.,"Удостоверьтесь, что справочные сообщения не связаны по кругу.", +Please make sure the Reference Communication Docs are not circularly linked.,"Пожалуйста, убедитесь, что справочные коммуникационные документы не имеют циклических ссылок.", Please refresh to get the latest document.,"Обновите, чтобы получить последнюю документ.", Please save before attaching.,"Пожалуйста, сохраните перед установкой.", Please save the Newsletter before sending,"Пожалуйста, сохраните бюллетень перед отправкой", @@ -1891,7 +1891,7 @@ Please select another payment method. PayPal does not support transactions in cu Please select another payment method. Razorpay does not support transactions in currency '{0}',"Пожалуйста, выберите другой способ оплаты. Razorpay не поддерживает транзакции в валюте «{0}»", Please select atleast 1 column from {0} to sort/group,"Пожалуйста, выберите по крайней мере 1 столбец {0} для сортировки / групп", Please select document type first.,Сначала выберите тип документа., -Please select the Document Type.,Выберите Тип документа., +Please select the Document Type.,Выберите тип документа., Please set Base URL in Social Login Key for Frappe,Укажите базовый URL-адрес в ключе социального входа для Frappe, Please set Dropbox access keys in your site config,"Пожалуйста, установите ключи доступа Dropbox на своем сайте конфигурации", Please set a printer mapping for this print format in the Printer Settings,"Пожалуйста, установите сопоставление принтера для этого формата печати в настройках принтера", @@ -1904,8 +1904,8 @@ Please specify which value field must be checked,"Просьба уточнит Please try again,"Пожалуйста, попробуйте еще раз", Please verify your Email Address,"Пожалуйста, подтвердите свой адрес электронной почты", Point Allocation Periodicity,Периодичность распределения точек, -Points,Точки, -Points Given,Очки даны, +Points,Баллы, +Points Given,Баллы засчитаны, Port,Порт, Portal Menu,Меню портала, Portal Menu Item,Портал Пункт меню, @@ -1932,12 +1932,12 @@ Previous,Предыдущая, Previous Hash,Предыдущий хэш, Primary Color,Основной цвет, Print Documents,Печать документов, -Print Format Builder,Конструктор Печатных форм, -Print Format Help,Помощь по Печатным формам, -Print Format Type,Тип Печатной формы, +Print Format Builder,Конструктор печатных форм, +Print Format Help,Помощь по печатным формам, +Print Format Type,Тип печатной формы, Print Format {0} is disabled,Печатная форма {0} отключена, -Print Hide,Распечатать Свернуть, -Print Hide If No Value,Печать Скрыть Если нет значения, +Print Hide,Не печатать, +Print Hide If No Value,Не печатать если нет значения, Print Sent to the printer!,Печать отправлена на принтер!, Print Server,Сервер печати, Print Style,Стиль печати, @@ -1946,23 +1946,23 @@ Print Style Preview,Предварительный просмотр стиля Print Width,Ширина печати, "Print Width of the field, if the field is a column in a table","Ширина поля при печати, если поле является столбцом в таблице", Print with letterhead,Печать с помощью фирменных бланков, -Printer,принтер, +Printer,Принтер, Printer Mapping,Отображение принтера, Printer Name,Имя принтера, Printer Settings,Настройки принтера, Printing failed,Ошибка печати, Private Key,Закрытый ключ, -Private and public Notes.,Личные и общедоступные Примечания., +Private and public Notes.,Личные и общедоступные примечания., ProTip: Add Reference: {{ reference_doctype }} {{ reference_name }} to send document reference,ProTip: Добавить Reference: {{ reference_doctype }} {{ reference_name }} отправить справочный документ, -Processing,обработка, -Processing...,Обработка ..., +Processing,Обработка, +Processing...,Обработка..., Prof,Проф., Progress,Готовность, Property Setter,Сеттер недвижимости, Property Setter overrides a standard DocType or Field property,Недвижимость сеттер отменяет стандартный DOCTYPE или свойств поля, Property Type,Тип недвижимости, -Provider,поставщик, -Provider Name,Имя провайдера, +Provider,Поставщик, +Provider Name,Имя поставщика, Public Key,Открытый ключ, Publishable Key,Ключ для публикации, Published On,Опубликовано на, @@ -1981,37 +1981,37 @@ QR Code,QR код, QR Code for Login Verification,QR-код для подтверждения входа, QZ Tray Connection Active!,Подключение к лотку QZ активно!, QZ Tray Failed: ,QZ Tray Failed:, -Quarter Day,День Квартал, -Query,запрос, +Quarter Day,Четверть дня, +Query,Запрос, Query Report,Отчёт-выборка, Query must be a SELECT,Запрос должен быть ВЫБОР, Queue should be one of {0},Очередь должна быть одной из {0}, Queued for backup. It may take a few minutes to an hour.,Queued для резервного копирования. Это может занять несколько минут до часа., Queued for backup. You will receive an email with the download link,Очередь для резервного копирования. Вы получите электронное письмо с ссылкой для загрузки, Quick Help for Setting Permissions,Быстрая помощь при настройки прав доступа, -Rating: ,Рейтинг:, -Raw Commands,Сырые команды, +Rating: ,Рейтинг: , +Raw Commands,Необработанные команды, Raw Email,Необработанная почта, -Raw Printing,Сырая печать, +Raw Printing,Необработанная печать, Razorpay Payment gateway settings,Настройки шлюза оплаты Razorpay, Razorpay Settings,Настройки Razorpay, Re: ,На:, Re: {0},На: {0}, Read,Читать, Read Only,Только чтения, -Read by Recipient,Читать Получатель, -Read by Recipient On,Прочитать Получатель, -Rebuild,перестраивать, -Receiver Parameter,Параметры Получателя, +Read by Recipient,Прочитано получателем, +Read by Recipient On,Прочитано получателем вкл., +Rebuild,Перестраивать, +Receiver Parameter,Параметры получателя, Recent years are easy to guess.,За последние годы легко догадаться., Recipient,Сторона-реципиент, -Recipient Unsubscribed,Получатель Подписка отменена, +Recipient Unsubscribed,Получатель отменил подписку, Record does not exist,Запись не существует, Records for following doctypes will be filtered,Записи для следующих доктринов будут отфильтрованы, Redirect To,Перенаправить, Redirect URI Bound To Auth Code,"Перенаправление URI, связанного с Auth кодекса", Redirect URIs,Перенаправление идентификаторы URI, -Redis cache server not running. Please contact Administrator / Tech support,"Кэш-сервер Redis не работает. Пожалуйста, обратитесь к администратору / техническая поддержка", +Redis cache server not running. Please contact Administrator / Tech support,"Кэш-сервер Redis не работает. Пожалуйста, обратитесь к администратору / техническую поддержку", Ref DocType,DocType ссылки, Ref Report DocType,Ref Report DocType, Reference DocName,Ссылка DocName, @@ -2021,39 +2021,39 @@ Reference: {0} {1},Ссылка: {0} {1}, Refreshing...,Обновление..., Register OAuth Client App,Регистрация OAuth Client App, Registered but disabled,Зарегистрированный но отключен, -Relapsed,Рецидив, -Relapses,Рецидивы, +Relapsed,Повторный, +Relapses,Повторные, Relink,Перередактируйте, -Relink Communication,Relink связи, -Relinked,Relinked, +Relink Communication,Повторно связать коммуникации, +Relinked,Связать повторно, Reload,Обновить страницу, -Remember Last Selected Value,Помните Последнее выбранное значение, +Remember Last Selected Value,Помнить последнее выбранное значение, Remote,Дистанционный пульт, Remote Fieldname,Удаленное имя поля, Remote ID,Удаленный идентификатор, Remote Objectname,Удаленное имя объекта, Remote Primary Key,Удаленный основной ключ, -Remove,Удалять, +Remove,Удалить, Remove Field,Удалить поле, Remove Filter,Удалить фильтр, Remove Section,Удалить раздел, Remove Tag,Убрать метку, -Remove all customizations?,Удалите все настройки?, +Remove all customizations?,Удалить все настройки?, Removed {0},Удалены {0}, Rename many items by uploading a .csv file.,"Переименовать много пунктов, загрузив. Файл CSV.", Rename {0},Переименовать {0}, Repeat Header and Footer in PDF,Повторите Колонтитулы в PDF, -Repeat On,Повторите На, -Repeat Till,Повторите До, -Repeat on Day,Повторить в День, -Repeat this Event,Повторите этот событие, +Repeat On,Повторите на, +Repeat Till,Повторите до, +Repeat on Day,Повторить в день, +Repeat this Event,Повторить этот событие, "Repeats like ""aaa"" are easy to guess","Повторы, как "ааа" легко догадаться,", "Repeats like ""abcabcabc"" are only slightly harder to guess than ""abc""","Повторы, как "abcabcabc" лишь немного труднее угадать, чем "Азбуки"", Reply,Ответить, Reply All,Ответить всем, Report End Time,Время окончания отчета, Report Filters,Фильтры отчетов, -Report Hide,Сообщить Свернуть, +Report Hide,Скрыть отчет, Report Manager,Диспетчер отчетов, Report Name,Название отчета, Report Start Time,Время начала отчета, @@ -2088,19 +2088,19 @@ Restrict user for specific document,Ограничить пользовател Restrict user from this IP address only. Multiple IP addresses can be added by separating with commas. Also accepts partial IP addresses like (111.111.111),"Разрешить пользователю только этот IP-адрес. Несколько IP-адресов могут быть добавлены через запятую. Принимает также частичные IP-адреса, например 111.111.111", Resume Sending,Резюме Отправка, Retake,пересдавать, -Retry,Retry, +Retry,Повторить, Return to the Verification screen and enter the code displayed by your authentication app,"Вернитесь на экран проверки и введите код, отображаемый приложением для аутентификации.", Reverse Icon Color,Обратный цвет значка, -Revert,возвращаться, -Revert Of,Возврат Из, +Revert,Вернуть, +Revert Of,Вернуть из, Reverted,Отменено, Review Level,Уровень обзора, Review Levels,Уровни обзора, Review Points,Очки обзора, Reviews,Отзывы, -Revoke,отзывать, -Revoked,Revoked, -Rich Text,Rich Text, +Revoke,Аннулировать, +Revoked,Аннулировано, +Rich Text,Форматированный текст, Robots.txt,Robots.txt, Role Name,Имя роли, Role Permission for Page and Report,Роль Разрешение на страницу и отчет, @@ -2108,7 +2108,7 @@ Role Permissions,Разрешения роли, Role Profile,Профиль ролей, Role and Level,Роль и уровень, Roles,Роли, -Roles Assigned,Роли Assigned, +Roles Assigned,Роли назначены, Roles can be set for users from their User page.,Роли могут быть установлены для пользователей со страницы пользователя., Root {0} cannot be deleted,Корневая {0} не может быть удален, Round Robin,По-круговой, @@ -2118,26 +2118,26 @@ Route to Success Link,Ссылка маршрута к успеху, Row,Строка, Row #{0}:,Строка #{0}:, Row Index,Индекс строк, -Row No,Строка Нет, +Row No,Строка №, Row Status,Статус строки, Row Values Changed,Значения строк Измененные, Row {0}: Not allowed to disable Mandatory for standard fields,Строка {0}: не разрешено отключать обязательные для стандартных полей, Row {0}: Not allowed to enable Allow on Submit for standard fields,Ряд {0}: Не разрешается включать Разрешить проведение для стандартных полей, Rows Added,Ряды Добавлено, Rows Removed,Ряды Удалены, -Rule,правило, +Rule,Правило, Rule Name,Название правила, Rules defining transition of state in the workflow.,"Правила, определяющие переход этапов в потоке.", "Rules for how states are transitions, like next state and which role is allowed to change state etc.","Правила для перехода статусов, например, следующий статус и роль, которой доступна смена статуса и т.д.", -Run,Бег, +Run,Запуск, Run scheduled jobs only if checked,"Запуск запланированных заданий, только если проверяются", S3 Backup Settings,Настройки резервного копирования S3, S3 Backup complete!,Резервное копирование S3 завершено!, -SMS,СМС, -SMS Gateway URL,URL СМС-шлюза, -SMS Parameter,Параметр СМС, -SMS Settings,Настройки СМС, -SMS sent to following numbers: {0},СМС отправлено следующим номерам: {0}, +SMS,SMS, +SMS Gateway URL,URL SMS-шлюза, +SMS Parameter,Параметр SMS, +SMS Settings,Настройки SMS, +SMS sent to following numbers: {0},SMS отправлено следующим номерам: {0}, SMTP Server,SMTP-сервер, SMTP Settings for outgoing emails,Настройки SMTP для исходящих писем, "SQL Conditions. Example: status=""Open""",SQL условия. Пример: статус = "Открыть", @@ -2150,7 +2150,7 @@ Save Filter,Сохранить фильтр, Save Report,Сохранить отчет, Save filters,Сохранить фильтры, Saving,Сохранение, -Saving...,Сохранение ..., +Saving...,Сохранение..., Scan the QR Code and enter the resulting code displayed.,Сканируйте QR-код и введите полученный код., Scopes,Области применения, Script,Скрипт, @@ -2166,7 +2166,7 @@ Search in a document type,Поиск в тип документа, Search or Create a New Chat,Поиск или создание нового чата, Search or type a command,Поиск либо введите команду, Search...,Поиск..., -Searching,поиск, +Searching,Поиск, Searching ...,Поиск ..., Section Break,Разделитель Секций, Section Heading,Заголовок раздела, @@ -2175,28 +2175,28 @@ Security Settings,Настройки безопасности, See all past reports.,Посмотреть все прошлые отчеты., See on Website,Посмотреть на веб-сайте, See the document at {0},См. Документ в {0}, -Seems API Key or API Secret is wrong !!!,"Кажется, ключ API или API Секрет неправильно !!!", +Seems API Key or API Secret is wrong !!!,"Кажется, ключ API или API Секрет неверны !!!", Seems Publishable Key or Secret Key is wrong !!!,"Кажется, что ключ для публикации или секретный ключ неправильный !!!", "Seems issue with server's razorpay config. Don't worry, in case of failure amount will get refunded to your account.","Кажется, вопрос с razorpay конфигурации сервера. Не волнуйтесь, в случае отказа суммы будет получить возврат на ваш счет.", Seems token you are using is invalid!,"Кажется, токен, который вы используете, недействителен!", Seen,Посещение, Seen By,Виденный, Seen By Table,Увиденные таблице, -Select Attachments,Выберите Вложения, +Select Attachments,Выберите вложения, Select Child Table,Выберите дочерний стол, Select Column,Выберите колонку, Select Columns,Выбрать столбцы, Select Document Type,Выбор типа документа, Select Document Type or Role to start.,"Выберите тип документа или роль, чтобы начать.", -Select Document Types to set which User Permissions are used to limit access.,"Выберите Типы документов, чтобы указать, какие пользовательские разрешения используются для ограничения доступа.", +Select Document Types to set which User Permissions are used to limit access.,"Выберите типы документов, чтобы указать, какие пользовательские разрешения используются для ограничения доступа.", Select File Format,Выберите формат файла, Select File Type,Выберите тип файла, Select Language...,Выберите язык..., -Select Languages,Выберите Языки, +Select Languages,Выберите языки, Select Module,Выбор модуля, Select Print Format,Выберите Печатную форму, Select Print Format to Edit,Выберите Печатную форму для Редактирование, -Select Role,Выберите Роль, +Select Role,Выберите роль, Select Table Columns for {0},Выберите столбцы таблицы для {0}, Select Your Region,Выберите регион, Select a Brand Image first.,Выберите бренд изображение в первую очередь., @@ -2222,12 +2222,12 @@ Send Notification to,Отправить уведомление на, Send Notifications To,Отправлять уведомления, Send Print as PDF,Отправить Печать в формате PDF, Send Read Receipt,Отправить прочтение, -Send Unsubscribe Link,Отправить ссылку Отказаться, +Send Unsubscribe Link,Отправить ссылку отписки, Send Welcome Email,Отправить приветственное письмо, Send alert if date matches this field's value,"Отправить уведомление, если дата соответствует значению этого поля", Send alert if this field's value changes,"Отправить уведомление, если изменяется значение этого поля", Send an email reminder in the morning,Отправить утром напоминание по электронной почте, -Send days before or after the reference date,Отправить дня до или после отчетной даты, +Send days before or after the reference date,Отправить за несколько дней до или после отчетной даты, Send enquiries to this email address,Отправить запросы на этот адрес электронной почты, Send me a copy,Отправить мне копию, Send only if there is any data,"Отправить только если есть какие-либо данные,", @@ -2241,7 +2241,7 @@ Sent/Received Email,Отправлено/Получено письмо, Server IP,IP-адрес сервера, Session Expired,Сеанс истек, Session Expiry,Время сессии, -Session Expiry Mobile,Сессия Срок Мобильная, +Session Expiry Mobile,Срок мобильной сессии, Session Expiry in Hours e.g. 06:00,"Время сессии в часах, например 06:00", Session Expiry must be in format {0},Время сессии должно быть в формате {0}, Session Start Failed,Сбой запуска сеанса, @@ -2266,16 +2266,16 @@ Set numbering series for transactions.,Установить идентифика Set up rules for user assignments.,Установите правила для пользовательских назначений., Setting this Address Template as default as there is no other default,"Установка этого Адрес шаблон по умолчанию, поскольку нет никакого другого умолчанию", Setting up your system,Настройка системы, -Settings for About Us Page.,Настройки для О нас страницы., -Settings for Contact Us Page,Настройки для контакт мы страница, -Settings for Contact Us Page.,Настройки для Контакты Page., +Settings for About Us Page.,Настройки страницы О нас., +Settings for Contact Us Page,Настройки страницы контактов, +Settings for Contact Us Page.,Настройки страницы контактов., Settings for OAuth Provider,Настройки для OAuth провайдера, -Settings for the About Us Page,Установки для О нас Страница, +Settings for the About Us Page,Установки для страницы О нас, Setup Auto Email,Настройка автоматической электронной почты, Setup Complete,Завершение установки, Setup Notifications based on various criteria.,Настройка уведомлений на основе различных критериев., Setup Reports to be emailed at regular intervals,Настройка регулярной отправки отчетов по электронной почте, -"Setup of top navigation bar, footer and logo.","Настройка верхней панели, навигации, подвала и логотипа.", +"Setup of top navigation bar, footer and logo.","Настройка верхней панели, навигации, нижнего колонтитула и логотипа.", Share,Поделиться, Share URL,Поделиться URL, Share With,Поделиться с, @@ -2292,11 +2292,11 @@ Show Calendar,Показать календарь, Show Dashboard,Показать панель инструментов, Show Full Error and Allow Reporting of Issues to the Developer,Показать полную ошибку и разрешить отправку отчетов разработчикам, Show Line Breaks after Sections,Показать разрывы строк после разделов, -Show Permissions,Показать права Доступа, +Show Permissions,Показать права доступа, Show Preview Popup,Предварительный просмотр, -Show Relapses,Показать Рецидивы, +Show Relapses,Показать рецидивы, Show Report,Показать отчет, -Show Section Headings,Показать Заголовки разделов, +Show Section Headings,Показать заголовки разделов, Show Sidebar,Показать боковую панель, Show Title,Показать Название, Show Totals,Показать итоги, @@ -2305,16 +2305,16 @@ Show all Versions,Показать все версии, Show as Grid,Показать как сетку, Show as cc,Показать в кубических сантиметрах, Show failed jobs,Показывать не удалось рабочих мест, -Show in Module Section,Показать в разделе Модуль, +Show in Module Section,Показать в секции модулей, Show in filter,Показать в фильтре, Show more details,Показать больше информации, Show only errors,Показать только ошибки, "Show title in browser window as ""Prefix - title""",Показать название в окне браузера как "префикс - название", Showing only Numeric fields from Report,Отображение только числовых полей из отчета, -Sidebar Items,Продукты боковой панели, -Sidebar Settings,Боковая панель Настройки, +Sidebar Items,Элементы боковой панели, +Sidebar Settings,Настройки боковой панели, Sidebar and Comments,Боковая панель и комментарии, -Sign Up,Подписаться, +Sign Up,Регистрация, Sign Up is disabled,Регистрация отключена, Signature,Подпись, "Simple Python Expression, Example: Status in (""Closed"", ""Cancelled"")","Простое выражение Python, пример: Статус в («Закрыто», «Отменено»)", @@ -2363,7 +2363,7 @@ Special Characters are not allowed,Спецсимволы не допустим Standard Print Format cannot be updated,Стандартный Формат печати не может быть обновлен, Standard Print Style cannot be changed. Please duplicate to edit.,Стандартный стиль печати не может быть изменен. Повторите попытку для редактирования., Standard Reports,Стандартные отчеты, -Standard Sidebar Menu,Стандартное меню Боковая панель, +Standard Sidebar Menu,Стандартное боковое меню, Standard roles cannot be disabled,Стандартные роли не могут быть отключены, Standard roles cannot be renamed,Стандартные роли не могут быть переименованы, Standings,Турнирная таблица, @@ -2388,7 +2388,7 @@ Stripe Settings,Настройки Stripe, Stripe payment gateway settings,Настройки платежного шлюза, Style,Стиль, Style Settings,Настройки стилей, -"Style represents the button color: Success - Green, Danger - Red, Inverse - Black, Primary - Dark Blue, Info - Light Blue, Warning - Orange","Стиль представляет цвет кнопки: Успех - Зеленый, Danger - красный, Обратная - черный, Первичная - темно-синий, информация - светло-голубой, Предупреждение - Оранжевый", +"Style represents the button color: Success - Green, Danger - Red, Inverse - Black, Primary - Dark Blue, Info - Light Blue, Warning - Orange","Стиль представляет цвет кнопки: Success - Green, Danger - Red, Inverse - Black, Primary - Dark Blue, Info - Light Blue, Warning - Orange", Stylesheets for Print Formats,Таблицы стилей для печатных форматов, "Sub-currency. For e.g. ""Cent""","Разменные единицы, например «цент»", Sub-domain provided by erpnext.com,Суб-домен предоставляется erpnext.com, @@ -2411,7 +2411,7 @@ Successfully Done,Успешно сделано, Successfully Updated,Успешно обновлено, Successfully updated translations,Успешно обновленные переводы, Suggested Username: {0},Похожие Имя пользователя: {0}, -Sum,сумма, +Sum,Сумма, Sum of {0},Сумма {0}, Support Email Address Not Specified,Адрес электронной почты поддержки не указан, Suspend Sending,Приостановить Отправка, @@ -2431,7 +2431,7 @@ Table HTML,Таблица HTML, Table MultiSelect,Таблица MultiSelect, Table updated,Таблица обновляется, Table {0} cannot be empty,Таблица {0} не может быть пустым, -Take Backup Now,Take Backup Now, +Take Backup Now,Сделать резервную копию сейчас, Take Photo,Фотографировать, Team Members,Члены команды, Team Members Heading,Члены команды Возглавлять, @@ -2440,14 +2440,14 @@ Test Email Address,Проверить адрес электронной почт Test Runner,Тест Runner, Test_Folder,Test_Folder, Text,Текст, -Text Align,Text Align, +Text Align,Выравнивание текста, Text Color,Цвет текста, -Text Content,Text Content, +Text Content,Содержимое текста, Text Editor,Редактор текста, Text to be displayed for Link to Web Page if this form has a web page. Link route will be automatically generated based on `page_name` and `parent_website_route`,"Текст, отображаемый в течение ссылка на веб-страницу, если эта форма имеет веб-страницу. Маршрут Ссылка будет генерироваться автоматически на основе `page_name` и` parent_website_route`", Thank you for your email,Спасибо за ваше письмо!, -Thank you for your interest in subscribing to our updates,Спасибо за ваш интерес к подписке на обновления, -Thank you for your message,Спасибо за Ваше сообщение, +Thank you for your interest in subscribing to our updates,Спасибо за ваш интерес и подписку на обновления, +Thank you for your message,Спасибо за ваше сообщение, The CSV format is case sensitive,Формат CSV чувствителен к регистру, The Condition '{0}' is invalid,Условие '{0}' является недействительным, The First User: You,Первый пользователя: Вы, @@ -2461,7 +2461,7 @@ The process for deletion of {0} data associated with {1} has been initiated.,"П The resource you are looking for is not available,"Ресурс, который вы ищете не доступен", The system provides many pre-defined roles. You can add new roles to set finer permissions.,"Система предоставляет множество заранее определенных ролей. Вы можете добавить новые роли, чтобы установить более тонкие разрешения.", The user from this field will be rewarded points,Пользователь из этого поля будет вознагражден баллами, -Theme,тема, +Theme,Тема, Theme URL,URL темы, There can be only one Fold in a form,Там может быть только один Fold в виде, There is an error in your Address Template {0},Существует ошибка в адресной Шаблон {0}, @@ -2489,14 +2489,14 @@ This email was sent to {0},Это письмо было отправлено н This email was sent to {0} and copied to {1},Это письмо было отправлено на адрес {0} и его копии на {1}, This feature is brand new and still experimental,Эта функция является новой и до сих пор экспериментальная, This field will appear only if the fieldname defined here has value OR the rules are true (examples): \nmyfield\neval:doc.myfield=='My Value'\neval:doc.age>18,"Это поле появляется только в случае, если имя_поля определено здесь имеет значение или правила являются истинными (примеры): MyField Eval: doc.myfield == 'My Value' Eval: doc.age> 18", -This form does not have any input,Эта форма не имеет никакого вход, +This form does not have any input,Эта форма не имеет никакого поля для заполнения, This form has been modified after you have loaded it,Эта форма была изменена после загрузки его, This format is used if country specific format is not found,"Этот формат используется, когда формат конкретной страна не найден", This goes above the slideshow.,Это идет над слайд-шоу., This is a background report. Please set the appropriate filters and then generate a new one.,"Это фоновый отчет. Пожалуйста, установите соответствующие фильтры, а затем сгенерируйте новый.", -This is a top-10 common password.,Это топ-10 общий пароль., -This is a top-100 common password.,Это обычный пароль топ-100., -This is a very common password.,Это очень общий пароль., +This is a top-10 common password.,Это из топ-10 простых паролей., +This is a top-100 common password.,Это из топ-100 простых паролей., +This is a very common password.,Это очень простой пароль., This is an automatically generated reply,Это автоматически генерируется ответ, This is similar to a commonly used password.,Это похоже на обычно используемый пароль., This is the template file generated with only the rows having some error. You should use this file for correction and import.,"Это файл шаблона, сгенерированный только строками с некоторой ошибкой. Вы должны использовать этот файл для исправления и импорта.", @@ -2508,7 +2508,7 @@ This query style is discontinued,Этот стиль запроса прекра This report was generated on {0},Этот отчет был создан в {0}, This report was generated {0}.,Этот отчет был сгенерирован {0}., This request has not yet been approved by the user.,Этот запрос еще не был одобрен пользователем., -This role update User Permissions for a user,Эта роль Разрешения обновление пользователя пользователь, +This role update User Permissions for a user,Эта роль обновляет разрешения пользователя для пользователя, This will log out {0} from all other devices,Это выведет {0} из всех других устройств, This will permanently remove your data.,Это навсегда удалит ваши данные., Throttled,Throttled, @@ -2519,14 +2519,14 @@ Time Series Based On,Временные ряды на основе, Time Zone,Часовой пояс, Time Zones,Часовые пояса, Time in seconds to retain QR code image on server. Min:240,"Время в секундах, чтобы сохранить изображение QR-кода на сервере. Мин.: 240", -Timeline DocType,Сроки DocType, -Timeline Field,Сроки поле, -Timeline Links,Хронология Ссылки, -Timeline Name,Сроки Имя, +Timeline DocType,Хронология DocType, +Timeline Field,Хронология поля, +Timeline Links,Хронология ссылок, +Timeline Name,Хронология имени, Timeline field must be a Link or Dynamic Link,Сроки поле должно быть Ссылка или Dynamic Link, Timeline field must be a valid fieldname,Сроки поле должно быть действительным имя_поля, Timeseries,Временные ряды, -Timestamp,Время, +Timestamp,Временная отметка, Title Case,Название дела, Title Field,Название поля, Title Prefix,Название Приставка, @@ -2536,7 +2536,7 @@ To Do,Список дел, To User,Пользователю, "To add dynamic subject, use jinja tags like\n\n
New {{ doc.doctype }} #{{ doc.name }}
","Чтобы добавить динамический объект, используйте теги jinja, например
 New {{ doc.doctype }} #{{ doc.name }} 
", "To add dynamic subject, use jinja tags like\n\n
{{ doc.name }} Delivered
","Чтобы добавить динамический объект, использовать теги, как дзиндзя
 {{ doc.name }} Delivered 
", -To and CC,Чтобы и CC, +To and CC,Получатели, "To get the updated report, click on {0}.","Чтобы получить обновленный отчет, нажмите {0}.", ToDo,Список задач, Today,Cегодня, @@ -2544,7 +2544,7 @@ Toggle Chart,Переключить диаграмму, Toggle Charts,Переключить диаграммы, Toggle Grid View,Просмотр сетки, Toggle Sidebar,Переключить боковую панель, -Token,знак, +Token,Токен, Token is missing,Маркер отсутствует, "Too many users signed up recently, so the registration is disabled. Please try back in an hour","Слишком много пользователей зарегистрировались в последнее время, так что регистрация отключена. Пожалуйста, повторите попытку через час", Too many writes in one request. Please send smaller requests,"Слишком много пишет в одном запросе. Пожалуйста, пришлите меньшие запросы", @@ -2589,7 +2589,7 @@ Type:,Тип:, UID,UID, UIDNEXT,UIDNEXT, UIDVALIDITY,UIDVALIDITY, -UNSEEN,UNSEEN, +UNSEEN,НЕПРОЧИТАННО, UPPER CASE,ВЕРХНИЙ РЕГИСТР, "URIs for receiving authorization code once the user allows access, as well as failure responses. Typically a REST endpoint exposed by the Client App.\n
e.g. http://hostname//api/method/frappe.www.login.login_via_facebook","Идентификаторы URI для получения кода авторизации, как только пользователь разрешает доступ, а также ответы недостаточность. Как правило, конечная точка REST подвергается Клиентом App.
например, HTTP: //hostname//api/method/frappe.www.login.login_via_facebook", URLs,URL-адрес, @@ -2606,24 +2606,24 @@ Under Development,В разработке, Unfollow,Отписаться, Unhandled Email,Необработанная электронная почта, Unique,Уникальный, -Unknown Column: {0},Неизвестный Колонка: {0}, +Unknown Column: {0},Неизвестная колонка: {0}, Unknown User,Неизвестный пользователь, "Unknown file encoding. Tried utf-8, windows-1250, windows-1252.","Неизвестная кодировка файла. Ни UTF-8, ни windows-1250, ни windows-1252.", Unread,Не прочитано, Unread Notification Sent,Не читать уведомления об отправке, Unselect All,Снять все, -Unshared,неразделенный, +Unshared,Неразделенный, Unsubscribe,Отказаться от подписки, -Unsubscribe Method,Метод Отказаться, +Unsubscribe Method,Метод отписки, Unsubscribe Param,Отказаться от Param, Unsupported File Format,Неподдерживаемый формат файла, -Unzip,расстегнуть молнию, +Unzip,Распаковать, Unzipped {0} files,Распакованные файлы {0}, -Unzipping files...,Распаковка файлов ..., +Unzipping files...,Распаковка файлов..., Upcoming Events for Today,Предстоящие события на сегодня, Update Field,Обновляемое поле, Update Translations,Обновление переводов, -Update Value,Обновляемое Значение, +Update Value,Обновляемое значение, Update many values at one time.,Обновить несколько значений одновременно., Update records,Обновить записи, Updated,Обновлено, @@ -2639,11 +2639,11 @@ Use IMAP,Использование IMAP, Use POST,Использовать POST, Use SSL,Использовать SSL, Use TLS,Использовать TLS, -"Use a few words, avoid common phrases.","Используйте несколько слов, избегать общих фраз.", +"Use a few words, avoid common phrases.","Используйте несколько слов, избегайте общих фраз.", Use of sub-query or function is restricted,Использование подзапроса или функции ограничено, Use socketio to upload file,Использовать socketio для загрузки файла, Use this fieldname to generate title,Используйте этот имя_поля генерировать название, -User '{0}' already has the role '{1}',Пользователь '{0}' уже играет роль '{1}', +User '{0}' already has the role '{1}',Пользователь '{0}' уже имеет роль '{1}', User Cannot Create,Пользователь не может создавать, User Cannot Search,Пользователь не может искать, User Defaults,По умолчанию пользователя, @@ -2673,31 +2673,31 @@ User {0} cannot be disabled,Пользователь {0} не может быт User {0} cannot be renamed,Пользователь {0} не может быть переименован, User {0} does not have access to this document,Пользователь {0} не имеет доступа к этому документу, User {0} does not have doctype access via role permission for document {1},Пользователь {0} не имеет доступа к типу документа через разрешение роли для документа {1}, -Username,имя пользователя, +Username,Имя пользователя, Username {0} already exists,Имя пользователя {0} уже существует, Users with role {0}:,Пользователи с ролью {0}:, Uses the Email Address Name mentioned in this Account as the Sender's Name for all emails sent using this Account.,"Использует имя адреса электронной почты, указанное в этой учетной записи, в качестве имени отправителя для всех электронных писем, отправленных с использованием этой учетной записи.", Uses the Email Address mentioned in this Account as the Sender for all emails sent using this Account. ,"Использует адрес электронной почты, указанный в этом аккаунте в качестве отправителя для всех писем, отправляемых с использованием этой учетной записи.", -Valid,действительный, +Valid,Действительный, Valid Login id required.,Требуется действительный ID логин., Valid email and name required,Требуются действительные email и имя, Value Based On,Значение на основе, Value Change,Стоимость Изменение, -Value Changed,Значение Изменен, +Value Changed,Значение изменено, Value To Be Set,"Значение, которое должно быть установлено", Value cannot be changed for {0},Значение не может быть изменено для {0}, Value for a check field can be either 0 or 1,"Значение для поля проверки может быть либо 0, либо 1", Value for {0} cannot be a list,Значение {0} не может быть списком, Value missing for,Нет значения для, Value too big,Слишком большое значение, -Values Changed,Значения Изменено, +Values Changed,Значения изменено, Verdana,Verdana, Verfication Code,Код проверки, Verification Link,Ссылка для проверки, Verification code has been sent to your registered email address.,Код подтверждения отправлен на ваш адрес электронной почты регистрации., Verify,Проверить, -Verify Password,Подтвердите Пароль, -Verifying...,Проверка ..., +Verify Password,Подтвердите пароль, +Verifying...,Проверка..., Version,Версия, Version Updated,Версия обновлена, View All,Посмотреть все, @@ -2714,12 +2714,12 @@ View this in your browser,Просмотреть это в вашем брауз View {0},Просмотреть {0}, Viewed By,просмотрены, Visit,Посетите нас по адресу, -Visitor,посетитель, +Visitor,Посетитель, We have received a request for deletion of {0} data associated with: {1},"Мы получили запрос на удаление {0} данных, связанных с: {1}", We have received a request from you to download your {0} data associated with: {1},"Мы получили от вас запрос на загрузку данных {0}, связанных с: {1}", -Web Form,Web Form, -Web Form Field,Web Form Field, -Web Form Fields,Web Form Поля, +Web Form,Веб форма, +Web Form Field,Поле веб формы, +Web Form Fields,Поля веб формы, Web Page,Веб-страница, Web Page Link Text,Web Текст Ссылка на страницу, Web Site,Веб-сайт, @@ -2739,9 +2739,9 @@ Website Sidebar,Боковая панель Веб-сайт, Website Sidebar Item,Сайт Sidebar товара, Website Slideshow,Сайт Слайд-шоу, Website Slideshow Item,Сайт Слайд-шоу Пункт, -Website Theme,Сайт Тема, -Website Theme Image,Сайт Тема изображения, -Website Theme Image Link,Сайт Тема Ссылка на изображение, +Website Theme,Тема сайта, +Website Theme Image,Изображение темы сайта, +Website Theme Image Link,Ссылка на изображение темы сайта, Website User,Пользователь сайта, Welcome Message,Приветственное сообщение, "When you Amend a document after Cancel and save it, it will get a new number that is a version of the old number.","Когда вы Измените (Amend) документ после Отмены (Cancel) и сохраните его, он получит новый номер, который является версией старого номера.", @@ -2750,18 +2750,18 @@ Widths can be set in px or %.,Ширина может быть установл Will be used in url (usually first name).,Будет использоваться в URL (обычно имя)., Will be your login ID,Будет ли ваш идентификатор входа в систему, Will only be shown if section headings are enabled,"Будет показано, только если заголовки разделов включены", -With Letter head,С головой Письмо, +With Letter head,С буквенным заголовком, With Letterhead,На фирменном бланке, -Workflow Action,Действия бизнес-процесса, -Workflow Action Master,Настройка Действий бизнес-процесса, -Workflow Action Name,Название Действий бизнес-процесса, -Workflow Document State,Состояние документа потока, -Workflow Name,Название потока, -Workflow State,Состояние потока, -Workflow State Field,Поле Статуса Процесса, +Workflow Action,Действия рабочего процесса, +Workflow Action Master,Мастер действий рабочего процесса, +Workflow Action Name,Название действия рабочего процесса, +Workflow Document State,Состояние документа рабочего процесса, +Workflow Name,Название рабочего процесса, +Workflow State,Состояние рабочего процесса, +Workflow State Field,Состояние поля рабочего процесса, Workflow State not set,Состояние рабочего процесса не установлено, -Workflow Transition,Переход потока, -Workflow state represents the current state of a document.,Состояние потока представлено текущим состоянием документа., +Workflow Transition,Переход рабочего процесса, +Workflow state represents the current state of a document.,Состояние рабочего процесса представлено текущим состоянием документа., Write,Написать, Wrong fieldname {0} in add_fetch configuration of custom script,Неверное имя поля {0} в конфигурации add_fetch пользовательского скрипта, X Axis Field,Поле оси X, @@ -2777,31 +2777,31 @@ You are not allowed to print this document,Вы не можете распеча You are not allowed to print this report,У вас нет прав для печати этого отчета, You are not allowed to send emails related to this document,"Вы не можете отправлять письма, связанные с этим документом", You are not allowed to update this Web Form Document,Вы не можете обновить эту веб-форму документа, -You are not connected to Internet. Retry after sometime.,Вы не подключены к Интернету. Повторите попытку через некоторое время., +You are not connected to Internet. Retry after sometime.,Вы не подключены к интернету. Повторите попытку через некоторое время., You are not permitted to access this page.,Вам не разрешен доступ к этой странице., You are not permitted to view the newsletter.,У Вас нет прав для просмотра данной новостной ленты, -You are now following this document. You will receive daily updates via email. You can change this in User Settings.,Вы сейчас следуете этому документу. Вы будете получать ежедневные обновления по электронной почте. Вы можете изменить это в настройках пользователя., -You can add dynamic properties from the document by using Jinja templating.,Вы можете добавить динамические свойства из документа с помощью шаблонов дзиндзя., -You can also copy-paste this ,Вы также можете скопировать и вставить это, +You are now following this document. You will receive daily updates via email. You can change this in User Settings.,Вы подписаны на обновления данного документа. Вы будете получать ежедневные обновления по электронной почте. Вы можете изменить это в настройках пользователя., +You can add dynamic properties from the document by using Jinja templating.,Вы можете добавить динамические свойства из документа с помощью шаблонов Jinja., +You can also copy-paste this ,Вы также можете скопировать и вставить это , "You can change Submitted documents by cancelling them and then, amending them.","Вы можете изменить Проведенные (Submitted) документы, отменив их, а затем изменив их.", -You can find things by asking 'find orange in customers',Моно искать что-либо написав «найти апельсин у клиентов», +You can find things by asking 'find orange in customers',Можно искать что-либо написав «найти апельсин у клиентов», You can only upload upto 5000 records in one go. (may be less in some cases),"Вы можете загружать одновременно до 5000 записей. (Возможно меньше, в некоторых случаях)", You can use Customize Form to set levels on fields.,Вы можете использовать Настройку формы (Customize Form) для установки уровней для полей., -You can use wildcard %,Вы можете использовать подстановочные%, -You can't set 'Options' for field {0},Нельзя включить «Параметры» для поля {0}, +You can use wildcard %,Вы можете использовать подстановочные %, +You can't set 'Options' for field {0},Нельзя включить «Опции» для поля {0}, You can't set 'Translatable' for field {0},Вы не можете установить «Переводимый» для поля {0}, You cannot give review points to yourself,Вы не можете давать оценки себе, You cannot unset 'Read Only' for field {0},Нельзя отменить «только чтение» для поля {0}, You do not have enough permissions to access this resource. Please contact your manager to get access.,"У вас нет достаточных прав для доступа к этому ресурсу. Пожалуйста, обратитесь к своему менеджеру, чтобы получить доступ.", You do not have enough permissions to complete the action,У Вас нет достаточных прав для завершения действия, -You do not have enough points,Вам не хватает очков, -You do not have enough review points,Вам не хватает точек обзора, +You do not have enough points,Вам не хватает баллов, +You do not have enough review points,Вам не хватает баллов обзора, You don't have access to Report: {0},Вы не имеете доступа к отчету: {0}, You don't have any messages yet.,У вас пока нет сообщений., You don't have permission to access this file,У Вас нет разрешения на доступ к этому файлу, You don't have permission to get a report on: {0},У Вас нет разрешения на получение отчета о: {0}, You don't have the permissions to access this document,У Вас нет разрешения на доступ к этому документу, -You gained {0} point,Вы набрали {0} очков, +You gained {0} point,Вы набрали {0} балл, You gained {0} points,Вы набрали {0} баллов, You have a new message from: ,У вас есть новое сообщение от:, You have been successfully logged out,Вы успешно вышли, @@ -2810,7 +2810,7 @@ You must login to submit this form,Для подтверждения этой ф You need to be in developer mode to edit a Standard Web Form,Вы должны быть в режиме разработчика для изменения стандартной веб-формы, You need to be logged in and have System Manager Role to be able to access backups.,"Вы должны войти в систему (и иметь роль менеджера системы), чтобы иметь доступ к резервным копиям.", You need to be logged in to access this {0}.,"Вы должны войти, чтобы получить доступ к {0}.", -"You need to have ""Share"" permission","Вы должны иметь ""Share"" разрешение", +"You need to have ""Share"" permission","Вы должны иметь разрешение ""Поделиться""", You need write permission to rename,"Вам нужно письменное разрешение, чтобы переименовать", You selected Draft or Cancelled documents,Вы выбрали черновик или отмененные документы, You unfollowed this document,Вы отписались от этого документа, @@ -2860,26 +2860,26 @@ camera,Камера, cancelled this document,отменил этот документ, changed value of {0},изменил значение {0}, changed values for {0},измененные значения для {0}, -chevron-down,шеврона вниз, -chevron-left,шеврона оставили, -chevron-right,шеврона право, -chevron-up,шеврона до, -circle-arrow-down,Круг со стрелкой вниз, -circle-arrow-left,Круг со стрелкой налево, -circle-arrow-right,Круг со стрелкой направо, -circle-arrow-up,Круг со стрелкой вверх, +chevron-down,шеврон-вниз, +chevron-left,шеврон-влево, +chevron-right,шеврон-право, +chevron-up,шеврон-вверх, +circle-arrow-down,круг-со-стрелкой-вниз, +circle-arrow-left,круг-со-стрелкой-налево, +circle-arrow-right,круг-со-стрелкой-направо, +circle-arrow-up,круг-со-стрелкой-вверх, cn-north-1,сп-северо-1, cn-northwest-1,сп-северо-запад-1, cog,зубец, darkgrey,темно-серый, dd-mm-yyyy,дд-мм-гггг, dd.mm.yyyy,дд.мм.гггг, -dd/mm/yyyy,дд / мм / гггг, -"document type..., e.g. customer","тип документа ..., например, клиент", +dd/mm/yyyy,дд/мм/гггг, +"document type..., e.g. customer","тип документа..., например, клиент", domain name,доменное имя, download-alt,скачать-альт, -"e.g. ""Support"", ""Sales"", ""Jerry Yang""","например ""Поддержка "","" Продажи "","" Джерри Янг """, -e.g. (55 + 434) / 4 or =Math.sin(Math.PI/2)...,"например, (55 + 434) / 4 = или Math.sin (Math.PI / 2) ...", +"e.g. ""Support"", ""Sales"", ""Jerry Yang""","например ""Поддержка"",""Продажи"",""Джерри Янг""", +e.g. (55 + 434) / 4 or =Math.sin(Math.PI/2)...,"например, (55 + 434) / 4 или =Math.sin (Math.PI / 2)...", e.g. pop.gmail.com / imap.gmail.com,например pop.gmail.com / imap.gmail.com, e.g. replies@yourcomany.com. All replies will come to this inbox.,например replies@yourcomany.com. Все ответы будут приходить на этот почтовый ящик., e.g. smtp.gmail.com,например smtp.gmail.com, @@ -2933,12 +2933,12 @@ minus,минус, minus-sign,минус-знак, mm-dd-yyyy,мм-дд-гггг, mm/dd/yyyy,мм/дд/гггг, -module name...,Модуль имя ..., +module name...,Модуль имя..., new type of document,новый тип документа, no failed attempts,нет неудачных попыток, none of,ни один из, ok,ok, -ok-circle,в порядке круга, +ok-circle,ok-circle, ok-sign,в порядке-знак, on_cancel,on_cancel, on_change,по изменению, @@ -2953,13 +2953,13 @@ pencil,карандаш, picture,картинка, plane,самолет, play,играть, -play-circle,играть круга, -plus,А ТАКЖЕ, +play-circle,играть-круг, +plus,плюс, plus-sign,знак плюс, -qrcode,QR код, +qrcode,QR-код, query-report,запрос-отчет, question-sign,Вопрос-знак, -remove-circle,удалить круга, +remove-circle,удалить-круг, remove-sign,удалить-знак, removed,удален, renamed from {0} to {1},переименован из {0} до {1}, @@ -3106,7 +3106,7 @@ zoom-out,отдалить, {0}: {1} is set to state {2},{0}: {1} установлено состояние {2}, {app_title},{app_title}, {{{0}}} is not a valid fieldname pattern. It should be {{field_name}}.,{{{0}}} недопустимый шаблон имени поля. Должно быть {{field_name}}., -Communication Link,Связь Связь, +Communication Link,Связь коммуникации, Force User to Reset Password,Заставить пользователя сбросить пароль, In Days,В днях, Last Password Reset Date,Дата последнего сброса пароля, @@ -3166,7 +3166,7 @@ Allow Guest,Разрешить гость, Allow Guests to Upload Files,Разрешить гостям загружать файлы, Also adding the status dependency field {0},Также добавляем поле зависимости статуса {0}, An error occurred while setting Session Defaults,Произошла ошибка при настройке параметров сеанса по умолчанию, -Annual,За год, +Annual,Ежегодный, Append Emails to Sent Folder,Добавить электронные письма в отправленную папку, Apply Assignment Rule,Применить правило назначения, Apply Only Once,Применить только один раз, @@ -3223,7 +3223,7 @@ Contact Email,Эл.почта для связи, Contact Numbers,Контактные номера, Contact Phone,Контактный телефон, Contact Synced with Google Contacts.,Контакт синхронизирован с контактами Google., -Context,контекст, +Context,Контекст, Contribute Translations,Внести перевод, Contributed,Внесенный, Controller method get_razorpay_order missing,Метод контроллера get_razorpay_order отсутствует, @@ -3258,11 +3258,11 @@ Documentation Link,Документация Ссылка, Don't Import,Не импортировать, Don't Send Emails,Не отправлять электронные письма, "Drag and drop files, ","Перетащите файлы,", -Drop,Капля, -Drop Here,Падение здесь, +Drop,Бросить, +Drop Here,Бросить тут, Drop files here,Перетащите файлы сюда, Dynamic Template,Динамический шаблон, -ERPNext Role,ERPNext Роль, +ERPNext Role,ERPNext роль, Email / Notifications,Уведомления по электронной почте, Email Account setup please enter your password for: {0},"Настройка учетной записи электронной почты, введите ваш пароль для: {0}", Email Address whose Google Contacts are to be synced.,"Адрес электронной почты, чьи контакты Google должны быть синхронизированы.", @@ -3273,7 +3273,7 @@ Enable Automatic Linking in Documents,Включить автоматическ Enable Email Notifications,Включить уведомления по электронной почте, Enable Google API in Google Settings.,Включить Google API в настройках Google., Enable Security,Включить безопасность, -Energy Point,Энергетическая точка, +Energy Point,Балл активности, Enter Client Id and Client Secret in Google Settings.,Введите идентификатор клиента и секрет клиента в настройках Google., Enter Code displayed in OTP App.,"Введите код, отображаемый в приложении OTP.", Event Configurations,Конфигурации событий, @@ -3295,7 +3295,7 @@ Export Type,Тип экспорта, Export {0} records,Экспорт {0} записей, Failed to connect to the Event Producer site. Retry after some time.,Не удалось подключиться к сайту источника событий. Повторите попытку через некоторое время., Failed to create an Event Consumer or an Event Consumer for the current site is already registered.,"Не удалось создать получателя событий или получателя событий для текущего сайта, который уже зарегистрирован.", -Failure,недостаточность, +Failure,Неудача, Fetching default Global Search documents.,Извлечение документов глобального поиска по умолчанию., Fetching posts...,Получение сообщений ..., Field Mapping,Полевое картографирование, @@ -3352,10 +3352,10 @@ Group By,Группа по, Group By Based On,Группировать по на основе, Group By Type,Группировать по типу, Group By field is required to create a dashboard chart,Поле «По группам» необходимо для создания диаграммы панели инструментов, -HH:mm,HH: мм, -HH:mm:ss,HH: мм: сс, -HOOK-.####,HOOK -. ####, -HTML Page,HTML-страница, +HH:mm,ЧЧ:мм, +HH:mm:ss,ЧЧ:мм:сс, +HOOK-.####,HOOK-.####, +HTML Page,HTML страница, Has Mapping,Имеет отображение, Hourly Long,Почасовая, "If non-standard port (e.g. POP3: 995/110, IMAP: 993/143)","Если нестандартный порт (например, POP3: 995/110, IMAP: 993/143)", @@ -3375,7 +3375,7 @@ Importing {0} of {1},Импорт {0} из {1}, Include indentation,Включить отступ, Incoming Change,Входящие изменения, Invalid Filter Value,Неверное значение фильтра, -Invalid URL,неправильный адрес, +Invalid URL,Неправильный URL, Invalid field name: {0},Неверное имя поля: {0}, Invalid file URL. Please contact System Administrator.,"Неверный URL файла. Пожалуйста, свяжитесь с системным администратором.", Invalid include path,Неверный путь включения, @@ -3386,7 +3386,7 @@ Is Primary Phone,Основной телефон, Is Tree,Дерево, JSON Request Body,Тело запроса JSON, Javascript is disabled on your browser,Javascript отключен в вашем браузере, -Job,работа, +Job,Работа, Jump to field,Перейти к полю, Keyboard Shortcuts,Горячие клавиши, LDAP Group,LDAP Group, @@ -3395,8 +3395,8 @@ LDAP Group Mapping,LDAP Group Mapping, LDAP Group Mappings,Отображения группы LDAP, LDAP Last Name Field,Поле Фамилия LDAP, LDAP Middle Name Field,Поле второго имени LDAP, -LDAP Mobile Field,LDAP Mobile Field, -LDAP Phone Field,Поле телефона LDAP, +LDAP Mobile Field,LDAP мобильный, +LDAP Phone Field,LDAP телефон, LDAP User Creation and Mapping,Создание и сопоставление пользователей LDAP, Landscape,Альбомный, Last,Последний, @@ -3407,20 +3407,20 @@ Last Update,Последнее обновление, Last refreshed,Последнее обновление, Link Document Type,Тип документа ссылки, Link Fieldname,Имя поля ссылки, -Loading import file...,Загрузка файла импорта ..., +Loading import file...,Загрузка файла импорта..., Local Document Type,Локальный тип документа, Log Data,Данные журнала, Main Section (HTML),Основной раздел (HTML), -Main Section (Markdown),Основной раздел (Уценка), +Main Section (Markdown),Основной раздел (Markdown), "Maintains a Log of all inserts, updates and deletions on Event Producer site for documents that have consumers.","Ведение журнала всех вставок, обновлений и удалений на сайте Event Producer для документов, имеющих потребителей.", Maintains a log of every event consumed along with the status of the sync and a Resync button in case sync fails.,"Ведение журнала всех использованных событий, а также состояния синхронизации и кнопки Resync в случае сбоя синхронизации.", Make all attachments private,Сделайте все вложения приватными, -Mandatory Depends On,Обязательный Зависит от, +Mandatory Depends On,Обязательно зависит от, Map Columns,Столбцы карты, Map columns from {0} to fields in {1},Сопоставить столбцы из {0} с полями в {1}, Mapping column {0} to field {1},Отображение столбца {0} в поле {1}, Mark all as Read,Отметить все как прочитанное, -Maximum Points,Максимум очков, +Maximum Points,Максимум баллов, Maximum points allowed after multiplying points with the multiplier value\n(Note: For no limit leave this field empty or set 0),"Максимальное количество баллов, допустимое после умножения баллов на значение множителя (Примечание: для ограничения не оставляйте это поле пустым или установите 0)", Me,Мне, Mention,Упоминание, @@ -3473,14 +3473,14 @@ Page Shortcuts,Ярлыки страниц, Parent Field (Tree),Родительское поле (дерево), Parent Field must be a valid fieldname,Родительское поле должно быть допустимым именем поля, Pin Globally,Pin глобально, -Places,места, -Please check the filter values set for Dashboard Chart: {},"Проверьте значения фильтра, установленные для Диаграммы панели инструментов: {}", +Places,Места, +Please check the filter values set for Dashboard Chart: {},"Проверьте значения фильтра, установленные для диаграммы панели инструментов: {}", Please enable pop-ups in your browser,"Пожалуйста, включите всплывающие окна в вашем браузере", Please find attached {0}: {1},"Пожалуйста, найдите прикрепленный {0}: {1}", Please select applicable Doctypes,"Пожалуйста, выберите подходящий тип документа", -Portrait,Портрет, +Portrait,Портретная, Press Alt Key to trigger additional shortcuts in Menu and Sidebar,"Нажмите клавишу Alt, чтобы вызвать дополнительные ярлыки в меню и боковой панели", -Print Settings...,Настройки печати ..., +Print Settings...,Настройки печати..., Producer Document Name,Название документа производителя, Producer URL,URL производителя, Property Depends On,Недвижимость зависит от, @@ -3491,8 +3491,8 @@ Pulled from Google Contacts,Вытащено из контактов Google, Push to Google Calendar,Нажмите на Google Calendar, Push to Google Contacts,Нажмите на контакты Google, Queue / Worker,Очередь / Рабочий, -RAW Information Log,RAW информационный журнал, -Raw Printing Settings...,Настройки сырой печати ..., +RAW Information Log,Необработанный информационный журнал, +Raw Printing Settings...,Настройки необработанной печати..., Read Only Depends On,Только чтение зависит от, Recent Activity,Недавняя активность, Reference document has been cancelled,Справочный документ был отменен, @@ -3508,7 +3508,7 @@ Restricted,Ограниченный, Restrictions,ограничения, Resync,Синхронизировать, Row Number,Номер строки, -Row {0},Ряд {0}, +Row {0},Строка {0}, Run Jobs only Daily if Inactive For (Days),"Запускать задания только ежедневно, если неактивен в течение (дней)", SMS was not sent. Please contact Administrator.,"SMS не было отправлено. Пожалуйста, свяжитесь с администратором.", Saved Successfully,Успешно сохранено, @@ -3524,11 +3524,11 @@ Search Source Text,Поиск исходного текста, Search by filename or extension,Поиск по имени файла или расширению, Select Date Range,Выберите диапазон дат, Select Field,Выберите поле, -Select Field...,Выберите поле ..., +Select Field...,Выберите поле..., Select Filters,Выберите фильтры, Select Google Calendar to which event should be synced.,"Выберите Календарь Google, к которому нужно синхронизировать событие.", Select Google Contacts to which contact should be synced.,"Выберите Google Контакты, с которыми контакт должен быть синхронизирован.", -Select Group By...,Выбрать группу по ..., +Select Group By...,Выбрать группу по..., Select Mandatory,Выберите Обязательный, Select atleast 2 actions,Выберите по крайней мере 2 действия, Select list item,Выберите элемент списка, @@ -3556,8 +3556,8 @@ Social Home,Социальный Дом, Some columns might get cut off when printing to PDF. Try to keep number of columns under 10.,"Некоторые столбцы могут быть обрезаны при печати в PDF. Старайтесь, чтобы количество столбцов было меньше 10.", Something went wrong during the token generation. Click on {0} to generate a new one.,"Что-то пошло не так во время генерации токенов. Нажмите {0}, чтобы создать новый.", Submit After Import,Отправить после импорта, -Submitting...,Добавляю ..., -Success! You are good to go 👍,Успех! Ты хорош идти go, +Submitting...,Добавляю..., +Success! You are good to go 👍,Успех! Вы можете продолжать 👍, Successful Transactions,Успешные транзакции, Successfully Submitted!,Успешно отправлено!, Successfully imported {0} record.,Успешно импортирована запись {0}., @@ -3597,13 +3597,13 @@ To enable it follow the instructions in the following link: {0},"Чтобы вк "To use Google Contacts, enable {0}.","Чтобы использовать контакты Google, включите {0}.", "To use Google Drive, enable {0}.","Чтобы использовать Google Диск, включите {0}.", Today's Events,Сегодняшние события, -Toggle Public/Private,Переключить Публичный / Частный, +Toggle Public/Private,Переключить Публичный/Приватный, Tracks milestones on the lifecycle of a document if it undergoes multiple stages.,"Отслеживает этапы жизненного цикла документа, если он проходит несколько этапов.", Tree structures are implemented using Nested Set,Древовидные структуры реализованы с использованием Nested Set, Trigger Primary Action,Триггер Основное действие, URL for documentation or help,URL для документации или помощи, -URL must start with 'http://' or 'https://',URL должен начинаться с «http: //» или «https: //», -Unchanged,без изменений, +URL must start with 'http://' or 'https://',URL должен начинаться с «http://» или «https://», +Unchanged,Без изменений, Unpin,Открепить, Untitled Column,Колонка без названия, Untranslated,Непереведенные, @@ -3632,7 +3632,7 @@ Verification,Верификация, Verification Code,Код верификации, Verification code email not sent. Please contact Administrator.,"Письмо с кодом подтверждения не отправлено. Пожалуйста, свяжитесь с администратором.", Verified,Проверенный, -Verifier,контрольник, +Verifier,Проверяющий, View Full Log,Посмотреть полный журнал, "View Log of all print, download and export events","Просмотр журнала всех событий печати, загрузки и экспорта", Visit Web Page,Посетить веб-страницу, @@ -3646,7 +3646,7 @@ Workflow Status,Состояние рабочего процесса, You are not allowed to export {} doctype,Вы не можете экспортировать {} doctype, You can try changing the filters of your report.,Вы можете попробовать изменить фильтры вашего отчета., You do not have permissions to cancel all linked documents.,У вас нет прав для отмены всех связанных документов., -You need to create these first: ,Вам нужно сначала создать это:, +You need to create these first: ,Вам нужно сначала создать это: , You need to enable JavaScript for your app to work.,Вам нужно включить JavaScript для вашего приложения для работы., You need to install pycups to use this feature!,"Вам нужно установить pycups, чтобы использовать эту функцию!", Your Target,Ваша цель, @@ -3696,10 +3696,10 @@ Browse,Обзор, Cancelled,отменен, Chart,Диаграмма, Close,Закрыть, -Communication,Общение, +Communication,Коммуникация, Compact Item Print,Компактный товара печати, Company,Организация, -Complete,полный, +Complete,Завершен, Completed,Завершено, Continue,Продолжать, Country,Страна, @@ -3728,31 +3728,31 @@ Error,Ошибка, Expired,Истек срок действия, Export,Экспорт, Export not allowed. You need {0} role to export.,Экспорт не допускается. Вам нужно {0} роль для экспорта., -Fetching...,Fetching ..., -Field,поле, +Fetching...,Получение..., +Field,Поле, File Manager,Файловый менеджер, Filters,Фильтры, Get Items,Получить продукты, Goal,Цель, -Group,группа, -Group Node,Узел Группа, +Group,Группа, +Group Node,Групповой узел, Help,Помощь, Help Article,Статья помощи, Home,Главная, Import Data from CSV / Excel files.,Импорт данных из файлов CSV / Excel., In Progress,Выполняется, -Intermediate,промежуточный, +Intermediate,Промежуточный, Invite as User,Пригласить в пользователя, "It seems that there is an issue with the server's stripe configuration. In case of failure, the amount will get refunded to your account.","Кажется, что существует проблема с конфигурацией полосок сервера. В случае сбоя сумма будет возвращена на ваш счет.", Loading...,Загрузка..., Location,Местоположение, Looks like someone sent you to an incomplete URL. Please ask them to look into it.,"Похоже, кто-то послал вас к неполному URL. Пожалуйста, попросите их посмотреть в нее.", -Master,Магистр, +Master,Мастер, Message,Сообщение, Missing Values Required,Не заполнены обязательные поля, Mobile No,Мобильный номер, Month,Mесяц, -Name,имя, +Name,Имя, Newsletter,Рассылка новостей, Not Allowed,Не разрешено, Note,Заметки, @@ -3767,12 +3767,12 @@ Please select another payment method. Stripe does not support transactions in cu Please specify,"Пожалуйста, сформулируйте", Printing,Печать, Priority,Приоритет, -Project,проект, +Project,Проект, Quarterly,Ежеквартально, Queued,В очереди, Quick Entry,Быстрый доступ, Reason,Причина, -Refreshing,освежение, +Refreshing,Обновление, Rename,Переименовать, Reset,Сброс, Review,Обзор, @@ -3780,7 +3780,7 @@ Room,Комната, Room Type,Тип номера, Save,Сохранить, Search results for,Результаты поиска, -Select All,Выбрать Все, +Select All,Выбрать все, Send,Отправить, Sending,Отправка, Server Error,Ошибка сервера, @@ -3790,7 +3790,7 @@ Setup Wizard,Мастер установки, Size,Размер, Sr,Sr, Start,Начать, -Start Time,Время, +Start Time,Стартовое время, Status,Статус, Submitted,Проведенный, Tag,Тег, @@ -3825,7 +3825,7 @@ Clear,Отчистить, Comment,Комментарий, Comments,Комментарии, DRAFT,ЧЕРНОВИК, -Dashboard,Приборная доска, +Dashboard,панель инструментов, DocType,DocType, Download,Скачать, EMail,Эл. адрес, @@ -3847,8 +3847,8 @@ New,Новый, Not Found,Не найдено, Not Like,Не как, Notify by Email,Уведомить по электронной почте, -Now,Сейчас, -Off,от, +Now,Только что, +Off,Выключен, One of,Один из, Page,Страница, Print,Распечатать, @@ -3893,7 +3893,7 @@ Not found,Не обнаружена, Notes:,Примечания:, Notify by email,Уведомление по почте, Permitted Documents For User,Разрешенные документы для пользователя, -Reference Docname,Ссылка DOCNAME, +Reference Docname,Ссылка Docname, Reference Doctype,Ссылка DocType, Reference name,Имя ссылки, Roles Html,Роли Html, @@ -3901,7 +3901,7 @@ Row #,Строка #, Scheduled to send,Запланировано для отправки, Select Doctype,Выберите Doctype, Send Email for Successful backup,Отправить письмо об успешном завершении резервного копирования, -Sign up,Подписаться, +Sign up,Зарегистрироваться, Time format,Формат времени, Upload failed,Загрузка не удалась, User Id,Идентификатор пользователя, @@ -3912,14 +3912,14 @@ added {0},Добавлено {0}, barcode,штрих-код, beginning with,начиная с, blue,синий, -bold,храбрый самоуверенный, +bold,жирный, book,книга, calendar,календарь, certificate,сертификат, -check,чек, +check,проверить, clear,отчистить, comment,комментарий, -comments,Комментарии, +comments,комментарии, created,созданный, danger,опасность, dashboard,Панель приборов, @@ -3933,9 +3933,9 @@ font,шрифт, forward,дальше, green,зеленый, home,дом, -icon,значок, -inbox,хходящие, -like,Мне нравится, +icon,иконка, +inbox,входящие, +like,нравится, link,ссылка, list,список, lock,запирать, @@ -3945,7 +3945,7 @@ module,модуль, move,переместить, music,музыка, new,новый, -now,сейчас, +now,только что, off,выкл, one of,один из, orange,оранжевый, @@ -3973,7 +3973,7 @@ web link,ссылка, yellow,желтый, Not permitted,Не разрешено, Add Chart to Dashboard,Добавить диаграмму на панель инструментов, -Add to Dashboard,Добавить в Личный кабинет, +Add to Dashboard,Добавить на панель инструментов, Google Translation,Гугл-перевод, Important,Важный, No Filters Set,Фильтры не установлены, @@ -3994,19 +3994,19 @@ Desk Page,Рабочий стол, Desk Shortcut,Сочетание клавиш, Developer Mode Only,Только режим разработчика, Disable User Customization,Отключить настройку пользователя, -For example: {} Open,Например: {} Открыть, +For example: {} Open,Например: {} Open, Link Cards,Карты ссылок, Link To,Ссылка к, Onboarding,Вводный, -Percentage,процент, -Pie,пирог, -Pin To Bottom,Pin To Bottom, -Pin To Top,Pin To Top, +Percentage,Процент, +Pie,Пирог, +Pin To Bottom,Закрепить внизу, +Pin To Top,Закрепить сверху, Restrict to Domain,Ограничить доступ к домену, Shortcuts,Ярлыки, -X Field,X Field, +X Field,Поле X, Y Axis,Ось Y, -workspace,Рабочее пространство, +workspace,рабочее пространство, Setup > User,Настройка> Пользователь, Setup > Customize Form,Настройка> Настройка формы, Setup > User Permissions,Настройка> Полномочия пользователя, @@ -4067,9 +4067,9 @@ Scheduler Event,Планировщик событий, Select Event Type,Выберите тип события, Schedule Script,Сценарий расписания, Duration,Продолжительность, -Donut,Пончик, +Donut,Донат, Custom Options,Пользовательские параметры, -"Ex: ""colors"": [""#d1d8dd"", ""#ff5858""]","Пример: "colors": ["# d1d8dd", "# ff5858"]", +"Ex: ""colors"": [""#d1d8dd"", ""#ff5858""]","Пример: ""colors"": [""#d1d8dd"", ""#ff5858""]", Confirmation Email Template,Шаблон письма с подтверждением, Welcome Email Template,Шаблон приветственного письма, Schedule Send,Расписание отправки, @@ -4095,7 +4095,7 @@ Browser,Браузер, Browser Version,Версия браузера, Web Template Field,Поле веб-шаблона, Section,Раздел, -Hide,Спрятать, +Hide,Скрыть, Enable In App Website Tracking,Включить отслеживание веб-сайтов в приложении, Enable Google Indexing,Включить индексирование Google, "To use Google Indexing, enable Google Settings.","Чтобы использовать индексирование Google, включите настройки Google .", @@ -4110,7 +4110,7 @@ Button Gradients,Градиенты кнопок, Light Color,Светлый цвет, Stylesheet,Таблица стилей, Custom SCSS,Пользовательский SCSS, -Navbar,Навбар, +Navbar,Навигационна панель, Source Message,Исходное сообщение, Translated Message,Переведенное сообщение, Verified By,Утверждено, @@ -4118,7 +4118,7 @@ Using this console may allow attackers to impersonate you and steal your informa {0} m,{0} м, {0} h,{0} ч, {0} d,{0} д, -{0} w,{0} нед., +{0} w,{0} н, {0} M,{0} М, {0} y,{0} г, yesterday,вчерашний день, @@ -4174,7 +4174,7 @@ Account SID,SID аккаунта, Steps,Шаги, email,Эл. адрес, Component,Компонент, -Subtitle,подзаголовок, +Subtitle,Подзаголовок, Global Defaults,Глобальные вводные по умолчанию, Prefix,Префикс, Is Public,Публично, @@ -4193,13 +4193,13 @@ Number Card Link,Номер карты Ссылка, Card,Карта, API Access,Доступ к API, Access Key Secret,Секретный ключ доступа, -S3 Bucket Details,Детали ковша S3, +S3 Bucket Details,Детали хранилища S3, Bucket Name,Название сегмента, Backup Details,Детали резервного копирования, Backup Files,Резервные файлы, Backup public and private files along with the database.,Резервное копирование общедоступных и частных файлов вместе с базой данных., Set to 0 for no limit on the number of backups taken,"Установите значение 0, чтобы не было ограничений на количество создаваемых резервных копий.", -Meta Description,Мета Описание, +Meta Description,Мета описание, Meta Image,Мета-изображение, Google Snippet Preview,Предварительный просмотр фрагмента кода Google, This is an example Google SERP Preview.,Это пример предварительного просмотра Google SERP., @@ -4231,7 +4231,7 @@ Invalid Option,Неверный вариант, Request Body consists of an invalid JSON structure,Тело запроса состоит из недопустимой структуры JSON, Invalid JSON,Неверный JSON, Party GSTIN,Партия GSTIN, -GST State,Штат GST, +GST State,Состояние НДС, Andaman and Nicobar Islands,Андаманские и Никобарские острова, Andhra Pradesh,Андхра-Прадеш, Arunachal Pradesh,Аруначал-Прадеш, @@ -4299,7 +4299,7 @@ Application Name,Имя приложения, Application Version,Версия приложения, Git Branch,Git Branch, Installed Applications,Установленные приложения, -Navbar Item,Элемент Navbar, +Navbar Item,Элемент навигационной панели, Item Label,Этикетка товара, Item Type,Тип объекта, Separator,Разделитель, @@ -4323,15 +4323,15 @@ Hourly rate limit for generating password reset links,Лимит почасов Send document Web View link in email,Отправить документ Ссылка на веб-просмотр по электронной почте, Enable Auto-deletion of Prepared Reports,Включить автоматическое удаление подготовленных отчетов, Prepared Report Expiry Period (Days),Срок действия подготовленного отчета (дни), -System will automatically delete Prepared Reports after these many days since creation,Система автоматически удалит подготовленные отчеты по прошествии многих дней с момента создания., +System will automatically delete Prepared Reports after these many days since creation,Система автоматически удалит подготовленные отчеты по прошествии нескольких дней с момента создания., Package Document Type,Тип документа пакета, Include Attachments,Включить вложения, Overwrite,Перезаписать, Package Publish Target,Цель публикации пакета, -Site URL,адрес сайта, +Site URL,Адрес сайта, Package Publish Tool,Инструмент публикации пакетов, Click on the row for accessing filters.,Щелкните строку для доступа к фильтрам., -Sites,Места, +Sites,Сайты, Last Deployed On,Последнее развертывание, Console Log,Журнал консоли, "Set Default Options for all charts on this Dashboard (Ex: ""colors"": [""#d1d8dd"", ""#ff5858""])","Установите параметры по умолчанию для всех диаграмм на этой панели инструментов (например: «colors»: [«# d1d8dd», «# ff5858»])", @@ -4354,13 +4354,13 @@ Is Complete,Завершено, Alert,Предупреждение, Document Link,Ссылка на документ, Attached File,Прикрепленный файл, -Attachment Link,Ссылка на приложение, +Attachment Link,Прикрепленная ссылка, Open Reference Document,Открыть справочный документ, Custom Configuration,Пользовательская конфигурация, Filters Configuration,Конфигурация фильтров, Dynamic Filters Section,Раздел динамических фильтров, Please create Card first,"Пожалуйста, сначала создайте карту", -Onboarding Permission,Разрешение на посадку, +Onboarding Permission,Разрешение на подключение, Onboarding Step,Начальный этап, Is Mandatory,Является обязательным, Is Skipped,Пропущено, @@ -4392,7 +4392,7 @@ Commit,Зафиксировать, Execute Console script,Выполнить скрипт консоли, Execute,Выполнить, Create Contacts from Incoming Emails,Создание контактов из входящих писем, -Inbox User,Входящие Пользователь, +Inbox User,Входящие пользователя, Disabled Auto Reply,Отключен автоматический ответ, Schedule Sending,Расписание отправки, Message (Markdown),Сообщение (Markdown), @@ -4409,7 +4409,7 @@ Send System Notification,Отправить системное уведомле Send To All Assignees,Отправить всем уполномоченным, Receiver By Document Field,Получатель по полю документа, Receiver By Role,Получатель по роли, -Child Table,Дочерний стол, +Child Table,Дочерняя таблица, Remote Value Filters,Удаленные фильтры значений, API Key of the user(Event Subscriber) on the producer site,API-ключ пользователя (подписчика на событие) на сайте производителя, API Secret of the user(Event Subscriber) on the producer site,API Secret пользователя (подписчика на событие) на сайте производителя, @@ -4425,8 +4425,8 @@ me-south-1,мне-юг-1, Twilio Number Group,Группа номеров Twilio, Twilio Settings,Настройки Twilio, Auth Token,Токен аутентификации, -Read Time,Время Читать, -in minutes,в считанные минуты, +Read Time,Время на чтение, +in minutes,в минутах, Featured,Рекомендуемые, Hide CTA,Скрыть CTA, "Description for listing page, in plain text, only a couple of lines. (max 200 characters)","Описание страницы с листингом в виде простого текста, всего пара строк. (не более 200 символов)", @@ -4442,7 +4442,7 @@ Social Link Settings,Настройки социальных ссылок, Social Link Type,Тип социальной ссылки, facebook,facebook, linkedin,linkedin, -twitter,твиттер, +twitter,twitter, "If Icon is set, it will be shown instead of Label","Если установлен значок, он будет отображаться вместо метки.", Apply Document Permissions,Применить разрешения документа, "For help see Client Script API and Examples","Для получения справки см. API клиентских скриптов и примеры.", @@ -4459,7 +4459,7 @@ URL of the page,URL страницы, Content type for building the page,Тип контента для построения страницы, "You can select one from the following,","Вы можете выбрать один из следующих,", Standard rich text editor with controls,Стандартный редактор форматированного текста с элементами управления, -Github flavoured markdown syntax,Синтаксис уценки со вкусом Github, +Github flavoured markdown syntax,Синтаксис markdown в стиле Github, HTML with jinja support,HTML с поддержкой jinja, Frappe page builder using components,Конструктор страниц Frappe с использованием компонентов, Checking this will show a text area where you can write custom javascript that will run on this page.,"При выборе этого параметра будет отображаться текстовая область, в которой вы можете написать собственный javascript, который будет запускаться на этой странице.", @@ -4472,7 +4472,7 @@ Add Space on Bottom,Добавить пространство внизу, Is Unique,Уникальный, User Agent,Пользовательский агент, Table Break,Таблица Break, -Hide Login,Скрыть Логин, +Hide Login,Скрыть логин, Navbar Template,Шаблон навигационной панели, Navbar Template Values,Значения шаблона навигационной панели, Call To Action,Призыв к действию, @@ -4493,24 +4493,24 @@ Are you sure you want to save this document?,"Вы уверены, что хот Refresh All,Обновить все, "Level 0 is for document level permissions, higher levels for field level permissions.","Уровень 0 предназначен для разрешений на уровне документа, более высокие уровни - для разрешений на уровне поля.", Website Analytics,Веб-аналитика, -d,d,Days (Field: Duration) -h,час,Hours (Field: Duration) +d,д,Days (Field: Duration) +h,ч,Hours (Field: Duration) m,м,Minutes (Field: Duration) -s,s,Seconds (Field: Duration) +s,с,Seconds (Field: Duration) Less,Меньше, Not a valid DocType view:,Недопустимое представление DocType:, Unknown View,Неизвестный вид, -Go Back,Вернитесь назад, +Go Back,Вернуться назад, Let's take you back to onboarding,Вернемся к адаптации, Great Job,Прекрасная работа, Looks Great,Выглядит отлично, Looks like you didn't change the value,"Похоже, вы не меняли значение", -Oops,Ой, +Oops,Упс, Skip Step,Пропустить шаг, "You're doing great, let's take you back to the onboarding page.","У вас все отлично, давайте вернемся на страницу адаптации.", Good Work 🎉,Хорошая работа 🎉, Submit this document to complete this step.,"Отправьте этот документ, чтобы завершить этот шаг.", -Great,большой, +Great,Отлично, You may continue with onboarding,Вы можете продолжить регистрацию, You seem good to go!,"Кажется, ты в порядке!", Onboarding Complete,Посадка завершена, @@ -4530,13 +4530,13 @@ Delete and Generate New,Удалить и создать новое, Select Fields To Insert,Выберите поля для вставки, Select Fields To Update,Выберите поля для обновления, "This document is already amended, you cannot ammend it again","В этот документ уже внесены поправки, вы не можете изменить его снова", -Add to ToDo,Добавить в ToDo, +Add to ToDo,Добавить в список задач, {0} is currently {1},{0} в настоящее время {1}, {0} are currently {1},{0} в настоящее время {1}, Currently Replying,Отвечаю сейчас, created {0},создано {0}, Make a call,Позвонить, -Change,+ Изменить,Coins +Change,Изменить,Coins Too Many Requests,Слишком много запросов, "Invalid Authorization headers, add a token with a prefix from one of the following: {0}.","Недопустимые заголовки авторизации, добавьте токен с одним из следующих префиксов: {0}.", "Invalid Authorization Type {0}, must be one of {1}.","Недействительный тип авторизации {0}, должен быть одним из {1}.", @@ -4599,7 +4599,7 @@ Please enable twilio settings before sending WhatsApp messages,"Пожалуйс Delivery Failed,Доставка не удалась, Twilio WhatsApp Message Error,Ошибка сообщения Twilio WhatsApp, A featured post must have a cover image,В избранном посте должна быть обложка., -Load More,Загрузи больше, +Load More,Показать больше, Published on,Опубликован в, Enable developer mode to create a standard Web Template,"Включите режим разработчика, чтобы создать стандартный веб-шаблон", Was this article helpful?,Эта статья была полезной?, @@ -4627,8 +4627,8 @@ New module created {0},Создан новый модуль {0}, There are documents which have workflow states that do not exist in this Workflow. It is recommended that you add these states to the Workflow and change their states before removing these states.,"Есть документы, в которых есть состояния рабочего процесса, которых нет в этом рабочем процессе. Рекомендуется добавить эти состояния в рабочий процесс и изменить их состояния перед удалением этих состояний.", Worflow States Don't Exist,Состояния Worflow не существуют, Save Anyway,Все равно сохранить, -Energy Points:,Очки энергии:, -Review Points:,Очки обзора:, +Energy Points:,Баллы активности:, +Review Points:,Баллы обзора:, Rank:,Ранг:, Monthly Rank:,Месячный рейтинг:, Invalid expression set in filter {0} ({1}),Недопустимое выражение в фильтре {0} ({1}), @@ -4639,8 +4639,8 @@ Not permitted to view {0},Не разрешено просматривать {0} Camera,Камера, Invalid filter: {0},Недействительный фильтр: {0}, Let's Get Started,Давайте начнем, -Reports & Masters,Отчеты и магистры, -New {0} {1} added to Dashboard {2},Новый {0} {1} добавлен в Личный кабинет {2}, +Reports & Masters,Отчеты и мастеры, +New {0} {1} added to Dashboard {2},Новый {0} {1} добавлен на панель инструментов {2}, New {0} {1} created,Создан новый {0} {1}, New {0} Created,Новый {0} создан, "Invalid ""depends_on"" expression set in filter {0}",В фильтре {0} задано недопустимое выражение "depends_on", @@ -4678,7 +4678,7 @@ Cannot delete standard link. You can hide it if you want,"Невозможно Cannot delete standard action. You can hide it if you want,"Невозможно удалить стандартное действие. Вы можете скрыть это, если хотите", Applied On,Применено, Row Name,Название строки, -For DocType Link / DocType Action,Для DocType Link / DocType Action, +For DocType Link / DocType Action,Для DocType ссылки / DocType действия, Cannot edit filters for standard charts,Невозможно редактировать фильтры для стандартных диаграмм, Event Producer Last Update,Последнее обновление Event Producer, Default for 'Check' type of field {0} must be either '0' or '1',"По умолчанию для типа поля "Проверка" {0} должен быть либо "0", либо "1".", @@ -4686,7 +4686,7 @@ Non Negative,Не отрицательный, Rules with higher priority number will be applied first.,Сначала будут применяться правила с более высоким номером приоритета., Open URL in a New Tab,Открыть URL в новой вкладке, Align Right,Выровнять по правому краю, -Loading Filters...,Загрузка фильтров ..., +Loading Filters...,Загрузка фильтров..., Count Customizations,Подсчет настроек, For Example: {} Open,Например: {} Открыть, Choose Existing Card or create New Card,Выберите существующую карту или создайте новую карту, From 33b49b4d46ed924fd28f412dfaf7877224eee71b Mon Sep 17 00:00:00 2001 From: phot0n Date: Mon, 2 May 2022 19:54:32 +0530 Subject: [PATCH 025/159] refactor(minor): remove is_first_startup from System Settings --- .../core/doctype/system_settings/system_settings.json | 11 +---------- frappe/desk/page/setup_wizard/setup_wizard.py | 6 ------ frappe/sessions.py | 3 --- 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index 0c9b87e618..ffd671ee2b 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -11,7 +11,6 @@ "language", "column_break_3", "time_zone", - "is_first_startup", "enable_onboarding", "setup_complete", "date_and_number_format", @@ -103,14 +102,6 @@ "read_only": 1, "reqd": 1 }, - { - "default": "0", - "fieldname": "is_first_startup", - "fieldtype": "Check", - "hidden": 1, - "label": "Is First Startup", - "read_only": 1 - }, { "default": "0", "fieldname": "setup_complete", @@ -502,7 +493,7 @@ "icon": "fa fa-cog", "issingle": 1, "links": [], - "modified": "2022-04-21 09:11:35.218721", + "modified": "2022-05-02 18:53:35.218721", "modified_by": "Administrator", "module": "Core", "name": "System Settings", diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index f85d24704f..3f849bbcaa 100755 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -269,7 +269,6 @@ def add_all_roles_to(name): def disable_future_access(): frappe.db.set_default("desktop:home_page", "workspace") frappe.db.set_value("System Settings", "System Settings", "setup_complete", 1) - frappe.db.set_value("System Settings", "System Settings", "is_first_startup", 1) # Enable onboarding after install frappe.db.set_value("System Settings", "System Settings", "enable_onboarding", 1) @@ -334,11 +333,6 @@ def load_user_details(): } -@frappe.whitelist() -def reset_is_first_startup(): - frappe.db.set_value("System Settings", "System Settings", "is_first_startup", 0) - - def prettify_args(args): # remove attachments for key, val in args.items(): diff --git a/frappe/sessions.py b/frappe/sessions.py index d701ac24a7..c07bd7495b 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -187,9 +187,6 @@ def get(): bootinfo["disable_async"] = frappe.conf.disable_async bootinfo["setup_complete"] = cint(frappe.db.get_single_value("System Settings", "setup_complete")) - bootinfo["is_first_startup"] = cint( - frappe.db.get_single_value("System Settings", "is_first_startup") - ) bootinfo["desk_theme"] = frappe.db.get_value("User", frappe.session.user, "desk_theme") or "Light" From ff080cde5a447c15f68b576966e458732d759039 Mon Sep 17 00:00:00 2001 From: phot0n Date: Wed, 4 May 2022 10:43:43 +0530 Subject: [PATCH 026/159] minor: add patch for removing is_first_startup field --- frappe/patches.txt | 1 + frappe/patches/v14_0/remove_is_first_startup.py | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 frappe/patches/v14_0/remove_is_first_startup.py diff --git a/frappe/patches.txt b/frappe/patches.txt index 845ccee09a..80f4e382e3 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -189,6 +189,7 @@ frappe.patches.v14_0.save_ratings_in_fraction #23-12-2021 frappe.patches.v14_0.transform_todo_schema frappe.patches.v14_0.remove_post_and_post_comment frappe.patches.v14_0.reset_creation_datetime +frappe.patches.v14_0.remove_is_first_startup [post_model_sync] frappe.patches.v14_0.drop_data_import_legacy diff --git a/frappe/patches/v14_0/remove_is_first_startup.py b/frappe/patches/v14_0/remove_is_first_startup.py new file mode 100644 index 0000000000..b7d34204e5 --- /dev/null +++ b/frappe/patches/v14_0/remove_is_first_startup.py @@ -0,0 +1,7 @@ +import frappe + + +def execute(): + frappe.db.sql( + """DELETE FROM `tabSingles` where doctype = 'System Settings' and field = 'is_first_startup'""" + ) From cd4b1ebe8f088a711ad187b94f10d1ccd59a1660 Mon Sep 17 00:00:00 2001 From: phot0n Date: Wed, 4 May 2022 13:35:57 +0530 Subject: [PATCH 027/159] chore: use qb for patch --- frappe/patches/v14_0/remove_is_first_startup.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/patches/v14_0/remove_is_first_startup.py b/frappe/patches/v14_0/remove_is_first_startup.py index b7d34204e5..cae38ce2ab 100644 --- a/frappe/patches/v14_0/remove_is_first_startup.py +++ b/frappe/patches/v14_0/remove_is_first_startup.py @@ -2,6 +2,7 @@ import frappe def execute(): - frappe.db.sql( - """DELETE FROM `tabSingles` where doctype = 'System Settings' and field = 'is_first_startup'""" - ) + singles = frappe.qb.Table("tabSingles") + frappe.qb.from_(singles).delete().where( + (singles.doctype == "System Settings") & (singles.field == "is_first_startup") + ).run() From de45cf9bbd20f7d07b47936cad61854408820eec Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Thu, 5 May 2022 13:13:40 +0200 Subject: [PATCH 028/159] feat: Use autocomplete attributes for login, signup and password reset --- frappe/templates/signup.html | 4 ++-- frappe/www/login.html | 4 ++-- frappe/www/update-password.html | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frappe/templates/signup.html b/frappe/templates/signup.html index abc1328e25..7d93bdec85 100644 --- a/frappe/templates/signup.html +++ b/frappe/templates/signup.html @@ -3,12 +3,12 @@
+ required autofocus autocomplete="name">
+ placeholder="{{ _('jane@example.com') }}" required autocomplete="username">
diff --git a/frappe/www/login.html b/frappe/www/login.html index 927f451965..1aaaf85656 100644 --- a/frappe/www/login.html +++ b/frappe/www/login.html @@ -7,7 +7,7 @@ `; } - const comment_count = ` + const comment_count = ` ${frappe.utils.icon('small-message')} ${doc._comment_count > 99 ? "99+" : doc._comment_count} `; From ec798598efb9915abbc2b517c6b3cccd43f21c25 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sat, 21 May 2022 17:34:59 +0530 Subject: [PATCH 137/159] fix: pagination button contrast --- frappe/public/scss/desk/list.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/public/scss/desk/list.scss b/frappe/public/scss/desk/list.scss index c71dbdca89..07f6636825 100644 --- a/frappe/public/scss/desk/list.scss +++ b/frappe/public/scss/desk/list.scss @@ -204,8 +204,8 @@ $level-margin-right: 8px; border: 1px solid var(--dark-border-color); &.btn-info { - background-color: var(--gray-400); - border-color: var(--gray-400); + background-color: var(--gray-600); + border-color: var(--gray-600); color: var(--white); font-weight: var(--text-bold); } From 552ea50a733a6a2bdcbcf43668379bb339f514ab Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sat, 21 May 2022 17:51:23 +0530 Subject: [PATCH 138/159] fix: bump shade of muted text to gray-700 --- frappe/public/scss/common/css_variables.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/scss/common/css_variables.scss b/frappe/public/scss/common/css_variables.scss index 92e505442d..d19502d1aa 100644 --- a/frappe/public/scss/common/css_variables.scss +++ b/frappe/public/scss/common/css_variables.scss @@ -143,7 +143,7 @@ --btn-shadow: var(--shadow-xs); // Type Colors - --text-muted: var(--gray-600); + --text-muted: var(--gray-700); --text-light: var(--gray-800); --text-color: var(--gray-900); --heading-color: var(--gray-900); From ae6657c66b9b489ab4c11d69bf23e5acfde49785 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sat, 21 May 2022 17:57:06 +0530 Subject: [PATCH 139/159] fix: darken text color on light blue buttons --- frappe/public/scss/desk/list.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/scss/desk/list.scss b/frappe/public/scss/desk/list.scss index 07f6636825..31d1661abb 100644 --- a/frappe/public/scss/desk/list.scss +++ b/frappe/public/scss/desk/list.scss @@ -401,7 +401,7 @@ input.list-check-all { } .filter-button.btn-primary-light { - color: var(--blue-500); + color: var(--text-on-blue); } .sort-selector { From d90d6536ef281a0f4c46d6ac4c724672f16a9a34 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 22 May 2022 18:03:37 +0530 Subject: [PATCH 140/159] perf: dont rebuild same translation dict --- frappe/tests/test_search.py | 1 + frappe/tests/test_translate.py | 2 ++ frappe/translate.py | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/frappe/tests/test_search.py b/frappe/tests/test_search.py index eea5783ccb..8a2ea6027c 100644 --- a/frappe/tests/test_search.py +++ b/frappe/tests/test_search.py @@ -132,6 +132,7 @@ class TestSearch(unittest.TestCase): def test_link_search_in_foreign_language(self): try: frappe.local.lang = "fr" + frappe.local.lang_full_dict = None # discard translation cache search_widget(doctype="DocType", txt="pay", page_length=20) output = frappe.response["values"] diff --git a/frappe/tests/test_translate.py b/frappe/tests/test_translate.py index 35eee05a87..9f0efd7958 100644 --- a/frappe/tests/test_translate.py +++ b/frappe/tests/test_translate.py @@ -29,11 +29,13 @@ class TestTranslate(unittest.TestCase): def setUp(self): if self._testMethodName in self.guest_sessions_required: frappe.set_user("Guest") + frappe.local.lang_full_dict = None # reset cached translations def tearDown(self): frappe.form_dict.pop("_lang", None) if self._testMethodName in self.guest_sessions_required: frappe.set_user("Administrator") + frappe.local.lang_full_dict = None # reset cached translations def test_extract_message_from_file(self): data = frappe.translate.get_messages_from_file(translation_string_file) diff --git a/frappe/translate.py b/frappe/translate.py index 7a0fdbdf70..007201f5e1 100644 --- a/frappe/translate.py +++ b/frappe/translate.py @@ -265,7 +265,7 @@ def get_full_dict(lang): return {} # found in local, return! - if getattr(frappe.local, "lang_full_dict", None) and frappe.local.lang_full_dict.get(lang, None): + if getattr(frappe.local, "lang_full_dict", None): return frappe.local.lang_full_dict frappe.local.lang_full_dict = load_lang(lang) From fe8520a2bdd18dda3c1e23577a231124e8ac5a4d Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 23 May 2022 12:39:01 +0530 Subject: [PATCH 141/159] fix: duplicate buttons on desk (#16941) --- cypress/integration/custom_buttons.js | 59 +++++++++++++++++++ cypress/integration/folder_navigation.js | 31 ++++++---- .../js/frappe/ui/alt_keyboard_shortcuts.js | 4 +- frappe/public/js/frappe/ui/page.js | 12 ++-- 4 files changed, 84 insertions(+), 22 deletions(-) create mode 100644 cypress/integration/custom_buttons.js diff --git a/cypress/integration/custom_buttons.js b/cypress/integration/custom_buttons.js new file mode 100644 index 0000000000..e2f02668e9 --- /dev/null +++ b/cypress/integration/custom_buttons.js @@ -0,0 +1,59 @@ +const test_button_names = [ + "Metallica", + "Pink Floyd", + "Porcupine Tree (the GOAT)", + "AC / DC", + `Electronic Dance "music"`, +]; + +const add_button = (label, group = "TestGroup") => { + cy.window() + .its("cur_frm") + .then((frm) => { + frm.add_custom_button(label, () => {}, group); + }); +}; + +const check_button_count = (label, group = "TestGroup") => { + // Verify main buttons + cy.findByRole("button", { name: group }).click(); + cy.get(`[data-label="${encodeURIComponent(label)}"]`) + .should("have.length", 1) + .should("be.visible"); + + // Verify dropdown buttons in mobile view + cy.viewport(420, 900); + const dropdown_btn_label = `${group} > ${label}`; + cy.get(".menu-btn-group > .btn").click(); + cy.get(`[data-label="${encodeURIComponent(dropdown_btn_label)}"]`) + .should("have.length", 1) + .should("be.visible"); + + //reset viewport + cy.viewport( + Cypress.config("viewportWidth"), + Cypress.config("viewportHeight") + ); +}; + +describe( + "Custom group button behaviour on desk", + { scrollBehavior: false }, // speeds up the test + () => { + before(() => { + cy.login(); + cy.visit(`/app/note/new`); + }); + + test_button_names.forEach((button_name) => { + it(`Custom button works with name '${button_name}'`, () => { + add_button(button_name); + check_button_count(button_name); + + // duplicate button shouldn't be added + add_button(button_name); + check_button_count(button_name); + }); + }); + } +); diff --git a/cypress/integration/folder_navigation.js b/cypress/integration/folder_navigation.js index bab14f5441..e61a02ddb9 100644 --- a/cypress/integration/folder_navigation.js +++ b/cypress/integration/folder_navigation.js @@ -1,3 +1,13 @@ +const click_menu_button = (name) => { + cy.get('.menu-btn-group > .btn').click(); + cy.get(`.menu-btn-group [data-label="${encodeURIComponent(name)}"]`).click(); +} + +const click_action_button = (name) => { + cy.findByRole('button', {name: 'Actions'}).click(); + cy.get(`.actions-btn-group [data-label="${encodeURIComponent(name)}"]`).click(); +} + context('Folder Navigation', () => { before(() => { cy.visit('/login'); @@ -15,10 +25,9 @@ context('Folder Navigation', () => { cy.get('.filter-action-buttons > div > .btn-primary').findByText('Apply Filters').click(); //Adding folder (Test Folder) - cy.get('.menu-btn-group > .btn').click(); - cy.get('.menu-btn-group [data-label="New Folder"]').click(); + click_menu_button("New Folder"); cy.fill_field('value', 'Test Folder'); - cy.click_modal_primary_button('Create'); + cy.click_modal_primary_button('Create'); }); it('Navigating the nested folders, checking if the URL formed is correct, checking if the added content in the child folder is correct', () => { @@ -30,10 +39,9 @@ context('Folder Navigation', () => { cy.visit('/app/file/view/home/Attachments'); //Adding folder inside the attachments folder - cy.get('.menu-btn-group > .btn').click(); - cy.get('.menu-btn-group [data-label="New Folder"]').click(); + click_menu_button("New Folder"); cy.fill_field('value', 'Test Folder'); - cy.click_modal_primary_button('Create'); + cy.click_modal_primary_button('Create'); //Navigating inside the added folder in the Attachments folder cy.get('[title="Test Folder"] > span').click(); @@ -59,16 +67,14 @@ context('Folder Navigation', () => { }).as('file_deleted'); //Deleting the added file from the Test folder - cy.findByRole('button', {name: 'Actions'}).click(); - cy.get('.actions-btn-group [data-label="Delete"]').click(); + click_action_button("Delete") cy.click_modal_primary_button('Yes'); cy.wait('@file_deleted'); //Deleting the Test Folder cy.visit('/app/file/view/home/Attachments'); cy.get('.list-row-checkbox').eq(0).click(); - cy.findByRole('button', {name: 'Actions'}).click(); - cy.get('.actions-btn-group [data-label="Delete"]').click(); + click_action_button("Delete") cy.click_modal_primary_button('Yes'); cy.wait('@file_deleted'); }); @@ -77,8 +83,7 @@ context('Folder Navigation', () => { //Deleting the Test Folder added in the home directory cy.visit('/app/file/view/home'); cy.get('.level-left > .list-subject > .file-select >.list-row-checkbox').eq(0).click({force: true, delay: 500}); - cy.findByRole('button', {name: 'Actions'}).click(); - cy.get('.actions-btn-group [data-label="Delete"]').click(); + click_action_button("Delete") cy.click_modal_primary_button('Yes'); }); -}); +}); diff --git a/frappe/public/js/frappe/ui/alt_keyboard_shortcuts.js b/frappe/public/js/frappe/ui/alt_keyboard_shortcuts.js index e6e3e5dc6e..c97c4c343d 100644 --- a/frappe/public/js/frappe/ui/alt_keyboard_shortcuts.js +++ b/frappe/public/js/frappe/ui/alt_keyboard_shortcuts.js @@ -128,7 +128,7 @@ frappe.ui.keys.AltShortcutGroup = class AltShortcutGroup { return !this.is_taken(letter) && is_valid_char; }); if (!shortcut_letter) { - $text_el.attr('data-label', text_content); + $text_el.attr('data-label', encodeURIComponent(text_content)); return; } for (let key in this.shortcuts_dict) { @@ -152,7 +152,7 @@ frappe.ui.keys.AltShortcutGroup = class AltShortcutGroup { } underline_text(shortcut) { - shortcut.$text_el.attr('data-label', shortcut.text); + shortcut.$text_el.attr('data-label', encodeURIComponent(shortcut.text)); let underline_el_found = false; let text_html = shortcut.text.split('').map(letter => { if (letter === shortcut.letter && !underline_el_found) { diff --git a/frappe/public/js/frappe/ui/page.js b/frappe/public/js/frappe/ui/page.js index 38c5f39589..37ab8b6d09 100644 --- a/frappe/public/js/frappe/ui/page.js +++ b/frappe/public/js/frappe/ui/page.js @@ -414,7 +414,7 @@ frappe.ui.Page = class Page { parent.parent().removeClass("hide"); } - let $link = this.is_in_group_button_dropdown(parent, 'li > a.grey-link', label); + let $link = this.is_in_group_button_dropdown(parent, 'li > a.grey-link > span', label); if ($link) return $link; let $li; @@ -510,12 +510,10 @@ frappe.ui.Page = class Page { if (!label || !parent) return false; - const result = $(parent).find(`${selector}:contains('${label}')`) - .filter(function() { - let item = $(this).html(); - return $(item).attr('data-label') === label; - }); - return result.length > 0 && result; + const item_selector = `${selector}[data-label='${encodeURIComponent(label)}']`; + + const existing_items = $(parent).find(item_selector); + return existing_items?.length > 0; } clear_btn_group(parent) { From 97df77f9541894a8dd55f62522f304d8e5e8c060 Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Mon, 23 May 2022 12:58:42 +0530 Subject: [PATCH 142/159] perf(translation): improve if condition to return all values except `None` (#16953) --- frappe/translate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/translate.py b/frappe/translate.py index 007201f5e1..3123eade48 100644 --- a/frappe/translate.py +++ b/frappe/translate.py @@ -265,7 +265,7 @@ def get_full_dict(lang): return {} # found in local, return! - if getattr(frappe.local, "lang_full_dict", None): + if getattr(frappe.local, "lang_full_dict", None) is not None: return frappe.local.lang_full_dict frappe.local.lang_full_dict = load_lang(lang) From 909ce30f0a10e244e3ce1bc74aa4498c301f10c7 Mon Sep 17 00:00:00 2001 From: phot0n Date: Sat, 14 May 2022 14:48:38 +0530 Subject: [PATCH 143/159] ci: Skip CI label for stopping build process --- .github/helper/roulette.py | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/.github/helper/roulette.py b/.github/helper/roulette.py index 90f4608a22..f68ef5046f 100644 --- a/.github/helper/roulette.py +++ b/.github/helper/roulette.py @@ -7,17 +7,27 @@ import sys import urllib.request -def get_files_list(pr_number, repo="frappe/frappe"): - req = urllib.request.Request(f"https://api.github.com/repos/{repo}/pulls/{pr_number}/files") +def fetch_pr_data(pr_number, repo, endpoint): + api_url = f"https://api.github.com/repos/{repo}/pulls/{pr_number}" + + if endpoint: + api_url += f"/{endpoint}" + + req = urllib.request.Request(api_url) res = urllib.request.urlopen(req) - dump = json.loads(res.read().decode('utf8')) - return [change["filename"] for change in dump] + return json.loads(res.read().decode('utf8')) + +def get_files_list(pr_number, repo="frappe/frappe"): + return [change["filename"] for change in fetch_pr_data(pr_number, repo, "files")] def get_output(command, shell=True): print(command) command = shlex.split(command) return subprocess.check_output(command, shell=shell, encoding="utf8").strip() +def has_skip_ci_label(pr_number, repo="frappe/frappe"): + return any([label["name"] for label in fetch_pr_data(pr_number, repo, "")["labels"] if label["name"] == "Skip CI"]) + def is_py(file): return file.endswith("py") @@ -59,6 +69,10 @@ if __name__ == "__main__": if ci_files_changed: print("CI related files were updated, running all build processes.") + elif has_skip_ci_label(pr_number, repo): + print("Found `Skip CI` label on pr, stopping build process.") + sys.exit(0) + elif only_docs_changed: print("Only docs were updated, stopping build process.") sys.exit(0) @@ -67,12 +81,8 @@ if __name__ == "__main__": print("Only Frontend code was updated; Stopping Python build process.") sys.exit(0) - elif build_type == "ui": - if only_py_changed: - print("Only Python code was updated, stopping Cypress build process.") - sys.exit(0) - elif updated_py_file_count > 0: - # both frontend and backend code were updated - os.system('echo "::set-output name=build-server::strawberry"') + elif build_type == "ui" and only_py_changed: + print("Only Python code was updated, stopping Cypress build process.") + sys.exit(0) os.system('echo "::set-output name=build::strawberry"') From 65d96963ba401e12588060ad7d764fd9f2f75f56 Mon Sep 17 00:00:00 2001 From: Vladislav Date: Mon, 23 May 2022 10:48:40 +0300 Subject: [PATCH 144/159] chore: update ru translate (#16948) --- frappe/translations/ru.csv | 210 ++++++++++++++++++------------------- 1 file changed, 105 insertions(+), 105 deletions(-) diff --git a/frappe/translations/ru.csv b/frappe/translations/ru.csv index 7e437c9b3e..3fdeab5546 100644 --- a/frappe/translations/ru.csv +++ b/frappe/translations/ru.csv @@ -17,7 +17,7 @@ Address Title,Название адреса, Address Type,Тип адреса, Administrator,администратор, All Day,Весь день, -Allow Delete,Разрешить Удалить, +Allow Delete,Разрешить удаление, Amended From,Измененный С, Amount,Сумма, Applicable For,Применимо для, @@ -26,7 +26,7 @@ Assign,Назначить, Assign To,Назначить в, Attachment,Вложение, Attachments,Приложения, -Author,автор, +Author,Автор, Auto Repeat,Автоматическое повторение, Base URL,Базовый URL, Based On,На основании, @@ -37,14 +37,14 @@ Category,Категория, Category Name,Название категории, City,Город, City/Town,Город / поселок, -Client,клиент, +Client,Клиент, Client ID,ID клиента, Client Secret,Секрет клиента, Closed,Закрыт, Code,Код, Collapse All,Свернуть все, Color,цвет, -Company Name,название компании, +Company Name,Название компании, Condition,Условия, Contact,Контакты, Contact Details,Контактная информация, @@ -65,11 +65,11 @@ Department,Отдел, Details,Подробности, Document Name,название документа, Document Status,Статус документа, -Document Type,тип документа, +Document Type,Тип документа, Domain,Сфера деятельности, Domains,Сферы деятельности, Draft,Проект, -Edit,редактировать, +Edit,Редактировать, Email Account,Электронная почта, Email Address,Адрес электронной почты, Email ID,Email ID, @@ -91,7 +91,7 @@ Field Name,Имя поля, Fieldname,Имя поля, Fields,Поля, First Name,Имя, -Frequency,частота, +Frequency,Частота, Friday,Пятница, From,От, Full,Полный, @@ -103,16 +103,16 @@ Guest,Гость, Half Day,Полдня, Half Yearly,Половина года, High,Высокий, -Hourly,почасовой, +Hourly,Почасовой, Hub Sync ID,Идентификатор синхронизации концентратора, -IP Address,Айпи адрес, +IP Address,IP адрес, Image,Изображение, Image View,Просмотр изображения, Import Data,Импорт данных, Import Log,Лог импорта, Inactive,Неактивный, Insert,Вставить, -Interests,интересы, +Interests,Интересы, Introduction,Введение, Is Active,Активен, Is Completed,Выполнен, @@ -124,15 +124,15 @@ Last Name,Фамилия, Leaderboard,Доска почёта, Letter Head,Печатный бланк, Level,Уровень, -Limit,предел, +Limit,Предел, Log,Запись в журнале, -Logs,Бревна, +Logs,Журналы, Low,Низкий, Maintenance Manager,Менеджер обслуживания, Maintenance User,Сотрудник обслуживания, Male,Мужской, Mandatory,Обязательный, -Mapping,картографирование, +Mapping,Картографирование, Mapping Type,Тип отображения, Medium,Средний, Meeting,Встреча, @@ -152,10 +152,10 @@ New Contact,Новый контакт, Next,Далее, No Data,Нет данных, No address added yet.,Адресов пока нет., -No contacts added yet.,Нет контактов Пока еще не добавлено., +No contacts added yet.,Контакты еще не добавлены., No items found.,Ничего не найдено., None,Никто, -Not Permitted,Не Допустимая, +Not Permitted,Не разрешено, Not active,Не действует, Notes,Заметки, Number,Число, @@ -171,7 +171,7 @@ Payment Gateway,Платежный шлюз, Payment Gateway Name,Имя платежного шлюза, Payments,Оплата, Period,Период обновления, -Pincode,Pincode, +Pincode,PIN код, Plan Name,Название плана, Please enable pop-ups,"Пожалуйста, включите всплывающие окна", Please select Company,"Пожалуйста, выберите компанию", @@ -203,7 +203,7 @@ Reference Document,Справочный документ, Reference Document Type,Ссылка Тип документа, Reference Owner,Владелец ссылки, Reference Type,Тип ссылки, -Refresh Token,токен обновления, +Refresh Token,Токен обновления, Region,Область, Rejected,Отклоненные, Reopen,Возобновить, @@ -258,7 +258,7 @@ Test,Тест, Thank you,Спасибо, The page you are looking for is missing. This could be because it is moved or there is a typo in the link.,"Страница, которую вы ищете, не найдена. Возможно, она перемещена, или в ссылке допущена опечатка", Timespan,Промежуток времени, -To,к, +To,К, To Date,До, Tools,Инструменты, Traceback,Диагностика, @@ -279,7 +279,7 @@ Weekdays,Будни, Weekly,Еженедельно, Welcome email sent,Письмо с приглашением в систему отправлено, Workflow,Поток, -You need to be logged in to access this page,"Вы должны быть войти в систему, чтобы открыть эту страницу", +You need to be logged in to access this page,"Вы должны войти в систему, чтобы получить доступ к этой странице", old_parent,old_parent, {0} is mandatory,{0} является обязательным, to your browser,в ваш браузер, @@ -301,7 +301,7 @@ old_parent,old_parent, 1 minute ago,1 минуту назад, 1 month ago,1 месяц назад, 1 year ago,1 год назад, -; not allowed in condition,; Не допускается в состоянии, +; not allowed in condition,; не допускается в состоянии, "

Default Template

\n

Uses Jinja Templating and all the fields of Address (including Custom Fields if any) will be available

\n
{{ address_line1 }}<br>\n{% if address_line2 %}{{ address_line2 }}<br>{% endif -%}\n{{ city }}<br>\n{% if state %}{{ state }}<br>{% endif -%}\n{% if pincode %} PIN:  {{ pincode }}<br>{% endif -%}\n{{ country }}<br>\n{% if phone %}Phone: {{ phone }}<br>{% endif -%}\n{% if fax %}Fax: {{ fax }}<br>{% endif -%}\n{% if email_id %}Email: {{ email_id }}<br>{% endif -%}\n
","

Шаблон по умолчанию \n <р> Использование дзиндзя Templating и все поля адрес ( в том числе Пользовательские поля если таковые имеются) будут доступны \n
 <код> {{address_line1}} & LT; BR & GT; \n {%, если address_line2%} {{address_line2}} & лт; бр & GT; { % ENDIF -%} \n {{город}} & Lt; BR & GT; \n {%, если государство%} {{состояние}} & Lt; BR & GT; {% ENDIF -%} \n {%, если пин-код%} PIN: {{пин-код}} & Lt; BR & GT; {% ENDIF -%} \n {{страна}} & Lt; BR & GT; \n {%, если телефон%} Телефон: {{телефон}} & Lt; BR & GT; { % ENDIF -%} \n {%, если факс%} Факс: {{FAX}} & Lt; BR & GT; {% ENDIF -%} \n {%, если email_id%} E-mail: {{email_id}} & Lt; BR & GT ; {% ENDIF -%} \n </ код> 

", A Lead with this Email Address should exist,Обращение с этим адресом электронной почты должно существовать, A list of resources which the Client App will have access to after the user allows it.
e.g. project,"Список ресурсов, к которым клиентское приложение будет иметь доступ после того, как пользователь разрешит это.
например. проект", @@ -421,7 +421,7 @@ Always use Account's Name as Sender's Name,Всегда использовать Amend,Изменен, Amending,Исправление, Amount Based On Field,Сумма на основании поля, -Amount Field,Сумма поле, +Amount Field,Поле суммы, Amount must be greater than 0.,Сумма должна быть больше 0., An error occured during the payment process. Please contact us.,В процессе оплаты произошла ошибка. Пожалуйста свяжитесь с нами., An icon file with .ico extension. Should be 16 x 16 px. Generated using a favicon generator. [favicon-generator.org],Значок файла с расширением .ico расширением. Должно быть 16 х 16 пикселей. Генерируется с использованием генератора FavIcon. [favicon-generator.org], @@ -433,8 +433,8 @@ Any string-based printer languages can be used. Writing raw commands requires kn Api Access,Доступ к API, App,Приложение, App Access Key,Ключ доступа к приложению, -App Client ID,App ID клиента, -App Client Secret,App Client Secret, +App Client ID,ID клиента приложения, +App Client Secret,Секрет клиента приложения, App Name,Имя приложения, App Secret Key,Секретный ключ приложения, App not found,Приложение не найдено, @@ -454,7 +454,7 @@ Appreciate,понимать, Appreciation,Признательность, Archive,Архив, Archived,Архивные, -Archived Columns,архивные Колонны, +Archived Columns,Архивные столбцы, Are you sure you want to delete the attachment?,"Вы уверены, что хотите удалить вложение?", Are you sure you want to relink this communication to {0}?,"Вы уверены, что хотите перелинковать эту куммуникацию на {0}?", Are you sure?,Вы уверены?, @@ -472,7 +472,7 @@ Assigned By Me,Назначенные мной, Assigned To,Назначено для, Assigned To/Owner,Назначено / Владельца, Assignment,Назначение, -Assignment Complete,Назначение Полная, +Assignment Complete,Задание выполнено, Assignment Completed,Задание выполнено, Assignment Rule,Правило назначения, Assignment Rule User,Правило назначения пользователя, @@ -490,18 +490,18 @@ Attach files / urls and add in table.,Прикрепить файлы / URL-ад Attached To DocType,Прикреплено к DocType, Attached To Field,Прикрепленный к полю, Attached To Name,Привязаны к имени, -Attachment Limit (MB),Лимит Вложение (MB), +Attachment Limit (MB),Лимит вложения (MB), Attachment Removed,Вложение удалено, -Attempting Connection to QZ Tray...,Попытка подключения к QZ Tray ..., -Attempting to launch QZ Tray...,Попытка запустить QZ Tray ..., +Attempting Connection to QZ Tray...,Попытка подключения к QZ Tray..., +Attempting to launch QZ Tray...,Попытка запустить QZ Tray..., Auth URL Data,Данные URL-адреса Auth, -Authenticating...,Проверка подлинности ..., +Authenticating...,Проверка подлинности..., Authentication,Аутентификация, Authentication Apps you can use are: ,"Приложения аутентификации, которые вы можете использовать:", Authentication Credentials,Аутентификационные учетные данные, Authorization Code,Код авторизации, Authorize URL,Авторизованный URL, -Authorized,уполномоченный, +Authorized,Авторизованный, Auto,Авто, Auto Email Report,Автоотчет по электронной почте, Auto Name,Авто имя, @@ -559,9 +559,9 @@ Both login and password required,Необходимо ввести логин и Bounced,Возвращенные, Braintree Settings,Настройки Braintree, Braintree payment gateway settings,Настройки шлюза платежных данных Braintree, -Brand HTML,Марка HTML, +Brand HTML,Брендирование HTML, Brand Image,Изображение бренда, -Breadcrumbs,Панировочные сухари, +Breadcrumbs,Хлебные крошки, Browser not supported,Браузер не поддерживается, Brute Force Security,Защита от перебора, Build Report,Построить отчет, @@ -625,7 +625,7 @@ Cannot {0} {1},Невозможно {0} {1}, Capitalization doesn't help very much.,Капитализация не очень поможет., Card Details,Детали карты, Categorize blog posts.,Классифицировать посты блога., -Category Description,Категория Описание, +Category Description,Описание категории, Cent,Цент, "Certain documents, like an Invoice, should not be changed once final. The final state for such documents is called Submitted. You can restrict which roles can Submit.","Некоторые документы, как, например, счета-фактуры, не подлежат изменению, если являются финальными. Конечное состояние для таких документов называется Проведенный. Вы можете ограничить, какие роли имеют право проводить документы.", Chain Integrity,Целостность цепей, @@ -650,11 +650,11 @@ Chat Room Name,Имя в чате, Chat Room User,Пользователь комнаты чата, Chat Token,Чат-токен, Chat Type,Тип чата, -Chat messages and other notifications.,Чат сообщения и другие уведомления., +Chat messages and other notifications.,Сообщения чата и другие уведомления., Check,Проверьте, Check Request URL,Проверить URL-адрес заявки, "Check columns to select, drag to set order.","Проверьте колонки, чтобы выбрать, перетащите, чтобы задать порядок.", -Check this if you are testing your payment using the Sandbox API,"Включите, если Вы проверяете платёж с помощью API-песочницы", +Check this if you are testing your payment using the Sandbox API,"Включите, если вы проверяете платёж с помощью API-песочницы", Check this to pull emails from your mailbox,"Отметьте это, чтобы получать письма из вашего почтового ящика", Check which Documents are readable by a User,"Проверьте, какие документы могут быть прочитаны Пользователем", Checking one moment,Проверка одного момента, @@ -687,7 +687,7 @@ Column Break,Разрыв столбца, Column Labels:,Колонка ярлыки:, Column Name,Имя столбца, Column Name cannot be empty,Имя столбца не может быть пустым, -Columns,Колонны, +Columns,Колонки, Columns based on,Колонки на основе…, Combination of Grant Type ({0}) and Response Type ({1}) not allowed,Сочетание типа гранта ( {0} ) и типа ответа ( {1} ) не допускается, Comment By,Комментарий по, @@ -724,7 +724,7 @@ Connection lost. Some features might not work.,Соединение потеря Connector Name,Имя соединителя, Connector Type,Тип соединителя, Contact Us Settings,Контакты Настройки, -"Contact options, like ""Sales Query, Support Query"" etc each on a new line or separated by commas.","Параметры контакта, как ""Sales Query, поддержки Query"" и т.д. каждого с новой строки или через запятую.", +"Contact options, like ""Sales Query, Support Query"" etc each on a new line or separated by commas.","Параметры контакта, как ""Запрос на продажу, Запрос в службу поддержки"" и т.д. каждого с новой строки или через запятую.", Contacts,Контакты, Content (HTML),Контент (HTML), Content (Markdown),Контент (Markdown), @@ -793,7 +793,7 @@ Customize Form Field,Настроить поля формы, Customize...,Пользовательские настройки..., "Customized Formats for Printing, Email","Индивидуальные форматы для печати, электронной почты", Customized HTML Templates for printing transactions.,Индивидуальные шаблоны HTML для печатных операций., -Cut,Порез, +Cut,Вырезать, DESC,DESC, Daily Event Digest is sent for Calendar Events where reminders are set.,"Ежедневно событие Дайджест направляется на Календарь событий, где установлены напоминания.", Danger,Опасность, @@ -842,9 +842,9 @@ Default Sort Order,Порядок сортировки по умолчанию, Default Value,Значение по умолчанию, "Default: ""Contact Us""","По умолчанию: ""Обратная связь""", DefaultValue,DefaultValue, -Define workflows for forms.,Определите потоки для форм., +Define workflows for forms.,Определите рабочие процессы для форм., Defines actions on states and the next step and allowed roles.,"Определяет действия на статусах, следующий шаг и роли, обладающие правами перевода статусов.", -Defines workflow states and rules for a document.,Определяет статусы бизнес-процесса и правила их перехода для документа., +Defines workflow states and rules for a document.,Определяет статусы рабочего процесса и правила их перехода для документа., Delayed,Задерживается, Delete Data,Удалить данные, Delete comment?,Удалить комментарий?, @@ -858,8 +858,8 @@ Deleted Name,Удаляется имя, Deleting {0},Удаление {0}, Depends On,Зависит от, Descendants Of,Потомки, -Desk,Стол, -Desk Access,Письменный стол Доступ, +Desk,Рабочий стол, +Desk Access,Доступ к рабочему столу, Desktop Icon,Иконка рабочего стола, Desktop Icon already exists,Значок рабочего стола уже существует, Developer,Разработчик, @@ -867,7 +867,7 @@ Did not add,Не добавить, Did not cancel,Не отменить, Did not find {0} for {0} ({1}),Не нашли {0} {0} ({1}), Did not remove,Не удален, -"Different ""States"" this document can exist in. Like ""Open"", ""Pending Approval"" etc.","Документ может содержать различные Статусы. Например, ""Создан"", ""Ожидает утверждения"" и т.д.", +"Different ""States"" this document can exist in. Like ""Open"", ""Pending Approval"" etc.","Документ может содержать различные ""Статусы"". Например, ""Создан"", ""Ожидает утверждения"" и т.д.", Direct,Непосредственный, Direct room with {0} already exists.,Прямая комната с {0} уже существует., Disable Auto Refresh,Отключить автоматическое обновление, @@ -900,7 +900,7 @@ DocType on which this Workflow is applicable.,"DocType, на котором эт "DocType's name should start with a letter and it can only consist of letters, numbers, spaces and underscores","Имя DOCTYPE должно начинаться с буквы и может состоять только из букв, цифр, пробелов и знаков подчеркивания", Doctype required,Требуется Doctype, Document,Документ, -Document Follow,Документ следовать, +Document Follow,Следить за документом, Document Follow Notification,Документ следовать уведомлению, Document Queued,Документ в очереди, Document Restored,Восстановленный документ, @@ -913,45 +913,45 @@ Document Types,Типы документов, Document can't saved.,Документ не может быть сохранен., Document {0} has been set to state {1} by {2},Документ {0} установлен в состояние {1} на {2}, Documents,Документы, -Documents assigned to you and by you.,"Документы, присвоенные вами и вас.", +Documents assigned to you and by you.,"Документы, назначенные вам и вами.", Domain Settings,Настройки домена, Domains HTML,Домены HTML, "Don't HTML Encode HTML tags like <script> or just characters like < or >, as they could be intentionally used in this field","Не HTML Кодировать HTML-теги, такие как <скрипт> или просто символы, такие как <или>, так как они могут быть преднамеренно использованы в этой области", -Don't Override Status,Не отменять статус, +Don't Override Status,Не переопределять статус, Don't create new records,Не создавать новые записи, -Don't have an account? Sign up,Не зарегистрированы? зарегистрироваться, -"Don't know, ask 'help'","Не знаю, спросите 'помощь'", +Don't have an account? Sign up,У вас нет аккаунта? Зарегистрироваться, +"Don't know, ask 'help'","Не знаю, попросить 'помощь'", Download Data,Скачать данные, -Download Files Backup,Загрузка файлов, +Download Files Backup,Скачать файлы резервной копии, Download Link,Ссылка для скачивания, Download Report,Скачать отчет, Download Your Data,Скачать ваши данные, Download link for your backup will be emailed on the following email address: {0},Ссылка для скачивания вашей резервной копии будет отправлена на следующий электронный адрес: {0}, Download with Data,Скачать с данными, -Drag and Drop tool to build and customize Print Formats.,Перетащите и инструмент Интерактивная построить и настроить форматы печати., -Drag elements from the sidebar to add. Drag them back to trash.,"Перетащите элементы на боковой панели, чтобы добавить. Перетащите их обратно в мусорное ведро.", -Dropbox Access Key,Dropbox Ключ доступа, -Dropbox Access Secret,Dropbox Секретный ключ, -Dropbox Access Token,Ток доступа к Dropbox, +Drag and Drop tool to build and customize Print Formats.,Конструктор для сборки и настройки форматов печати., +Drag elements from the sidebar to add. Drag them back to trash.,"Перетащите элементы с боковой панели, чтобы добавить. Перетащите их обратно чтобы удалить.", +Dropbox Access Key,Dropbox ключ доступа, +Dropbox Access Secret,Dropbox секретный ключ, +Dropbox Access Token,Токен доступа к Dropbox, Dropbox Settings,Настройки Dropbox, Dropbox Setup,Настройка Dropbox, -Dropbox access is approved!,доступ Dropbox утвержден!, +Dropbox access is approved!,Доступ к Dropbox получен!, Dropbox backup settings,Настройки резервного копирования Dropbox, Duplicate Filter Name,Дублируемое имя фильтра, Dynamic Link,Динамическая ссылка, Dynamic Report Filters,Фильтры динамических отчетов, ESC,ESC, Edit Auto Email Report Settings,Изменить настройки отчета по электронной почте, -Edit Custom HTML,Edit Custom HTML, +Edit Custom HTML,Редактировать пользовательский HTML, Edit DocType,Редактирование DocType, -Edit Filter,Изменить фильтр, -Edit Format,Изменить формат, -Edit HTML,Изменить HTML, +Edit Filter,Редактировать фильтр, +Edit Format,Редактировать формат, +Edit HTML,Редактировать HTML, Edit Heading,Редактировать заголовок, -Edit Properties,Изменить свойства, -Edit to add content,"Изменить, чтобы добавить содержание", -Edit {0},Изменить {0}, -Editable Grid,редактируемые сетки, +Edit Properties,Редактировать свойства, +Edit to add content,"Редактировать, чтобы добавить содержание", +Edit {0},Редактировать {0}, +Editable Grid,Редактируемые сетки, Editing Row,Редактирование строк, Eg. smsgateway.com/api/send_sms.cgi,Например smsgateway.com/api/send_sms.cgi, Email Account Name,Имя учетной записи электронной почты, @@ -960,7 +960,7 @@ Email Addresses,Адрес электронной почты, Email Domain,Домен электронной почты, "Email Domain not configured for this account, Create one?","Домен электронной почты не настроен для этой учетной записи, создать?", Email Flag Queue,Очередь флагов электронной почты, -Email Footer Address,Подпись в email, +Email Footer Address,Адрес в нижнем колонтитуле, Email Group,Группа электронной почты, Email Group List,Список групп электронной почты, Email Group Member,Электронная почта участника группы, @@ -1004,12 +1004,12 @@ Enabled email inbox for user {0},Включен почтовый ящик для End Date Field,Поле конечной даты, End Date cannot be before Start Date!,Дата окончания не может быть до даты начала!, Endpoint URL,URL конечной точки, -Energy Point Log,Журнал Energy Point, -Energy Point Rule,Правило энергетической точки, -Energy Point Settings,Настройки энергетической точки, -Energy Points,Энергетические точки, +Energy Point Log,Журнал баллов активности, +Energy Point Rule,Правило баллов активности, +Energy Point Settings,Настройки баллов активности, +Energy Points,Баллы активности, Enter Email Recipient(s),Введите E-mail получателя (ей), -Enter Form Type,Введите Form Тип, +Enter Form Type,Введите тип формы, "Enter default value fields (keys) and values. If you add multiple values for a field, the first one will be picked. These defaults are also used to set ""match"" permission rules. To see list of fields, go to ""Customize Form"".","Введите значение по умолчанию поля (Keys) и значения. При добавлении нескольких значений для поля, первая будет определена. Эти значения по умолчанию также используется для установки "Матч" разрешающие правила. Чтобы увидеть список полей, перейдите в раздел "Настройка формы".", Enter folder name,Введите имя папки, "Enter keys to enable login via Facebook, Google, GitHub.","Введите ключи для того, чтобы войти с помощью Facebook, Google, GitHub.", @@ -1023,7 +1023,7 @@ Equals,Равно, Error Message,Сообщение об ошибке, Error Report,Сообщение об ошибке, Error Snapshot,Снимок ошибки, -Error in Custom Script,Ошибка в пользовательской Script, +Error in Custom Script,Ошибка в пользовательском скрипте, Error in Notification,Ошибка в уведомлении, Error in Notification: {},Ошибка в уведомлении: {}, Error while connecting to email account {0},Ошибка при подключении к учетной записи электронной почты {0}, @@ -1039,7 +1039,7 @@ Events in Today's Calendar,События в сегодняшнем календ Everyone,Все, Example,Пример, Example Email Address,Пример электронного адреса, -Example: {{ subject }},Пример: {{subject}}, +Example: {{ subject }},Пример: {{ subject }}, Excel,превосходить, Exception,Исключение, Exception Type,Тип исключения, @@ -1062,7 +1062,7 @@ Failed to complete setup,Не удалось завершить настройк Failed to connect to server,Не удалось подключиться к серверу, Failed while amending subscription,Ошибка при внесении изменений в подписку, FavIcon,FavIcon, -Feedback Request,Запросить оставить отзыв, +Feedback Request,Запрос обратной связи, Fetch From,Извлечь из, Fetch If Empty,"Получить, если пусто", Fetch Images,Получение изображений, @@ -1086,15 +1086,15 @@ Fields Multicheck,Поле Multicheck, Fieldtype,Тип поля, Fieldtype cannot be changed from {0} to {1} in row {2},Тип поля не может быть изменен с {0} на {1} в строке {2}, File '{0}' not found,Файл '{0}' не найден, -File Backup,Архивирование файлов, +File Backup,Резервная копия файла, File Name,Имя файла, -File Size,Размер файла:, +File Size,Размер файла, File Type,Тип файла, File URL,URL файла, File Upload,Файл загружен, -File Upload Disconnected. Please try again.,"Отправка файла отключена. Пожалуйста, попробуйте еще раз.", +File Upload Disconnected. Please try again.,"Ошибка при загрузке. Пожалуйста, попробуйте еще раз.", File Upload in Progress. Please try again in a few moments.,"Файл загружается, повторите позже.", -File backup is ready,Готово резервное копирование файлов, +File backup is ready,Файл резервной копии готов, File not attached,Файл не прикреплен, File size exceeded the maximum allowed size of {0} MB,Размер файла превысил максимально допустимый размер {0} МБ, File too big,Файл слишком большой, @@ -1108,9 +1108,9 @@ Filter Name,Имя фильтра, Filter Values,Значение фильтра, Filter must be a tuple or list (in a list),Фильтр должен быть кортежем или списком (в списке), "Filter must have 4 values (doctype, fieldname, operator, value): {0}","Фильтр должен иметь 4 значения (doctype, имя поля, оператор, значение): {0}", -Filter...,Фильтр ..., -"Filtered by ""{0}""",Отфильтровано по "{0}", -Filters Display,Фильтры Показать, +Filter...,Фильтр..., +"Filtered by ""{0}""","Отфильтровано по ""{0}""", +Filters Display,Показать фильтры, Filters JSON,Фильтры JSON, Filters saved,Фильтры сохранены, Find {0} in {1},Найти {0} в {1}, @@ -1199,11 +1199,11 @@ Google Services,Службы Google, Grant Type,Тип гранта, Group Name,Название группы, Group name cannot be empty.,Имя группы не может быть пустым., -Groups of DocTypes,Группы DOCTYPES, +Groups of DocTypes,Группы DocTypes, HTML,HTML, HTML Editor,Редактор HTML, "HTML Header, Robots and Redirects","Заголовок HTML, роботы и перенаправления", -HTML for header section. Optional,HTML для секции header. Необязательно, +HTML for header section. Optional,HTML для секции header. Необязателен, Half,Половина, Has Attachment,Содержит вложения, Has Attachments,Содержит приложения, @@ -1235,7 +1235,7 @@ Hide footer in auto email reports,Скрыть нижний колонтитул Higher priority rule will be applied first,Правило с более высоким приоритетом будет применено первым, Highlight,Выделить, "Hint: Include symbols, numbers and capital letters in the password","Подсказка: укажите в пароле символы, цифры и прописные буквы", -Home Page,Домашняя Страница, +Home Page,Домашняя страница, Home Settings,Домашние настройки, Home/Test Folder 1,Главная/Тестовая Папка 1, Home/Test Folder 1/Test Folder 3,Главная/Тестовая Папка 1/Тестовая Папка 3, @@ -1345,7 +1345,7 @@ Internal record of document shares,Внутренняя запись акций Introduce your company to the website visitor.,Представьте вашу компанию на посетителя сайта., Introductory information for the Contact Us Page,Вводная информация для страницы контактов, Invalid,Неверно, -"Invalid ""depends_on"" expression",Недопустимое выражение "depends_on", +"Invalid ""depends_on"" expression","Недопустимое выражение ""depends_on""", Invalid Access Key ID or Secret Access Key.,Недействительный ключ ключа доступа или секретный ключ доступа., Invalid CSV Format,Неверный формат CSV, Invalid Home Page,Неверная главная страница, @@ -1480,10 +1480,10 @@ List,Список, List Filter,Фильтр списка, List View Setting,Настройка просмотра списка, List a document type,Перечислите тип документа, -"List as [{""label"": _(""Jobs""), ""route"":""jobs""}]","Список как [{ "этикетка": _ ( "Работа"), "маршрут": "работа"}]", +"List as [{""label"": _(""Jobs""), ""route"":""jobs""}]","Список как [{""Ярлык"": _(""Работы""), ""маршруты"":""работы""}]", List of backups available for download,"Список резервных копий, доступных для загрузки", List of patches executed,Список выполненных патчей, -List of themes for Website.,Список тем для веб-сайта., +List of themes for Website.,Список тем для сайта., Load Balancing,Балансировка нагрузки, Loading,Идёт загрузка, Local DocType,Локальный DocType, @@ -1515,7 +1515,7 @@ Looks like something is wrong with this site's payment gateway configuration. No "Looks like something went wrong during the transaction. Since we haven't confirmed the payment, Paypal will automatically refund you this amount. If it doesn't, please send us an email and mention the Correlation ID: {0}.","Похоже, что-то пошло не так во время транзакции. Поскольку мы не подтвердили платеж, Paypal автоматически вернет вам эту сумму. Если это не так, отправьте нам электронное письмо и укажите идентификатор корреляции: {0}.", Madam,Госпожа, Main Section,Основной раздел, -"Make ""name"" searchable in Global Search",Индексировать ""name"" для глобального поиска, +"Make ""name"" searchable in Global Search","Индексировать ""name"" для глобального поиска", Make use of longer keyboard patterns,Используйте более длинных моделей клавиатуры, Manage Third Party Apps,Управление приложениями сторонних разработчиков, Mandatory Information missing:,Обязательная информация отсутствует:, @@ -1558,7 +1558,7 @@ Message-id,ID сообщения, Meta Tags,Мета-теги, Migration ID Field,Поле идентификатора миграции, Milestone,Этап, -Milestone Tracker,Milestone Tracker, +Milestone Tracker,Трекер этапа, Minimum Password Score,Минимальный балл пароля, Miss,Мисс, Missing Fields,Отсутствующие поля, @@ -1585,7 +1585,7 @@ Mrs,Г-жа, Ms,Госпожа, Multiple root nodes not allowed.,Несколько корневые узлы не допускается., Multiplier Field,Поле множителя, -"Must be of type ""Attach Image""",Должно быть типа "Прикрепить изображение", +"Must be of type ""Attach Image""",Должно быть типа ""Прикрепить изображение"", Must have report permission to access this report.,Должен иметь разрешение отчета для доступа к этой отчета., Must specify a Query to run,"Необходимо указать запрос, чтобы запустить", Mute Sounds,Отключить звуки, @@ -1611,7 +1611,7 @@ New Email Account,Новый аккаунт электронной почты, New Event,Новое событие, New Folder,Новая папка, New Kanban Board,Новая панель канбан, -New Message from Website Contact Page,Новое сообщение от сайта Контакты Страница, +New Message from Website Contact Page,Новое сообщение с формы обратной связи на сайте, New Name,Новое имя, New Newsletter,Новый бюллетень, New Password,Новый пароль, @@ -1682,7 +1682,7 @@ Not Linked to any record,Не привязано к какой-либо запи Not Published,Не опубликовано, Not Saved,Не сохранено, Not Seen,Непрочитанно, -Not Sent,Не Отправлено, +Not Sent,Не отправлено, Not Set,Не указано, Not a valid Comma Separated Value (CSV File),"Не является допустимым значения, разделенные запятыми (CSV-файл)", Not a valid User Image.,Недействительный изображение пользователя., @@ -2160,7 +2160,7 @@ Script to attach to all web pages.,Сценарий для подключени Search Fields,Поиск полей, Search Help,Поиск по справке, Search field {0} is not valid,Поле поиска {0} не является действительным, -Search for '{0}',Поиск '{0}', +Search for '{0}',Поиск '{0}', Search for anything,Искать что-нибудь, Search in a document type,Поиск в тип документа, Search or Create a New Chat,Поиск или создание нового чата, @@ -2168,7 +2168,7 @@ Search or type a command,Поиск либо введите команду, Search...,Поиск..., Searching,Поиск, Searching ...,Поиск ..., -Section Break,Разделитель Секций, +Section Break,Разделитель секций, Section Heading,Заголовок раздела, Security,Безопасность, Security Settings,Настройки безопасности, @@ -2212,7 +2212,7 @@ Select the label after which you want to insert new field.,"Выберите м "Select your Country, Time Zone and Currency","Выберите страну, часовой пояс и валюта", Select {0},Выберите {0}, Self approval is not allowed,Самоподтверждение не допускается, -Send After,Отправить После, +Send After,Отправить после, Send Alert On,Отправить оповещение о, Send Email Alert,Отправлять оповещение по электронной почте, Send Email Print Attachments as PDF (Recommended),Отправлять Email-вложения в формате PDF (рекомендуется), @@ -2235,7 +2235,7 @@ Send unsubscribe message in email,Отправить сообщение об о Sender,Отправитель, Sender Email,Электронная почта отправителя, Sendgrid,Sendgrid, -Sent Read Receipt,Направлено прочтение, +Sent Read Receipt,Отправлять уведомление о прочтении, Sent or Received,Отправлено или получено, Sent/Received Email,Отправлено/Получено письмо, Server IP,IP-адрес сервера, @@ -2317,9 +2317,9 @@ Sidebar and Comments,Боковая панель и комментарии, Sign Up,Регистрация, Sign Up is disabled,Регистрация отключена, Signature,Подпись, -"Simple Python Expression, Example: Status in (""Closed"", ""Cancelled"")","Простое выражение Python, пример: Статус в («Закрыто», «Отменено»)", -"Simple Python Expression, Example: status == 'Open' and type == 'Bug'","Простое выражение Python, пример: status == 'Open' и тип == 'Bug'", -Simultaneous Sessions,одновременных сессий, +"Simple Python Expression, Example: Status in (""Closed"", ""Cancelled"")","Простое выражение Python, пример: Status in (""Closed"", ""Cancelled"")", +"Simple Python Expression, Example: status == 'Open' and type == 'Bug'","Простое выражение Python, пример: status == 'Open' and type == 'Bug'", +Simultaneous Sessions,Одновременные сеансы, Single DocTypes cannot be customized.,Отдельные типы документов не могут быть настроены., Single Post (article).,Один пост(статья)., Single Types have only one record no tables associated. Values are stored in tabSingles,"Холост Типы нет только одна запись не таблицы, связанные. Значения сохраняются в tabSingles", @@ -2426,13 +2426,13 @@ System Settings,Настройки системы, System User,Пользователь системы, System and Website Users,Пользователи сайта и системы, Table,Таблица, -Table Field,Таблица поле, +Table Field,Поле таблицы, Table HTML,Таблица HTML, Table MultiSelect,Таблица MultiSelect, -Table updated,Таблица обновляется, -Table {0} cannot be empty,Таблица {0} не может быть пустым, +Table updated,Таблица обновлена, +Table {0} cannot be empty,Таблица {0} не может быть пустой, Take Backup Now,Сделать резервную копию сейчас, -Take Photo,Фотографировать, +Take Photo,Сделать фото, Team Members,Члены команды, Team Members Heading,Члены команды Возглавлять, Temporarily Disabled,Временно отключен, @@ -2446,10 +2446,10 @@ Text Content,Содержимое текста, Text Editor,Редактор текста, Text to be displayed for Link to Web Page if this form has a web page. Link route will be automatically generated based on `page_name` and `parent_website_route`,"Текст, отображаемый в течение ссылка на веб-страницу, если эта форма имеет веб-страницу. Маршрут Ссылка будет генерироваться автоматически на основе `page_name` и` parent_website_route`", Thank you for your email,Спасибо за ваше письмо!, -Thank you for your interest in subscribing to our updates,Спасибо за ваш интерес и подписку на обновления, +Thank you for your interest in subscribing to our updates,Спасибо за ваш интерес и подписку, Thank you for your message,Спасибо за ваше сообщение, The CSV format is case sensitive,Формат CSV чувствителен к регистру, -The Condition '{0}' is invalid,Условие '{0}' является недействительным, +The Condition '{0}' is invalid,Условие '{0}' является недействительным, The First User: You,Первый пользователя: Вы, "The application has been updated to a new version, please refresh this page","Приложение был обновлен до новой версии, пожалуйста, обновите эту страницу", The attachments could not be correctly linked to the new document,Вложения не могут быть правильно связаны с новым документом, @@ -3297,7 +3297,7 @@ Failed to connect to the Event Producer site. Retry after some time.,Не уда Failed to create an Event Consumer or an Event Consumer for the current site is already registered.,"Не удалось создать получателя событий или получателя событий для текущего сайта, который уже зарегистрирован.", Failure,Неудача, Fetching default Global Search documents.,Извлечение документов глобального поиска по умолчанию., -Fetching posts...,Получение сообщений ..., +Fetching posts...,Получение сообщений..., Field Mapping,Полевое картографирование, Field To Check,Поле для проверки, File Information,Информация о файле, @@ -4089,7 +4089,7 @@ Edit Values,Изменить значения, Web Template Values,Ценности веб-шаблонов, Add Container,Добавить контейнер, Web Page View,Просмотр веб-страницы, -Path,Дорожка, +Path,Путь, Referrer,Реферер, Browser,Браузер, Browser Version,Версия браузера, From 2800923d1b1b090d4f959e7ebc9e4e6d52d4817d Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 23 May 2022 14:31:32 +0530 Subject: [PATCH 145/159] fix: darken blue 600 Co-Authored-By: Shariq Ansari --- frappe/public/scss/common/css_variables.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/public/scss/common/css_variables.scss b/frappe/public/scss/common/css_variables.scss index d19502d1aa..3593469e68 100644 --- a/frappe/public/scss/common/css_variables.scss +++ b/frappe/public/scss/common/css_variables.scss @@ -16,7 +16,7 @@ --blue-900: #1A4469; --blue-800: #154875; --blue-700: #1366AE; - --blue-600: #1579D0; + --blue-600: #1673C5; --blue-500: #2490EF; --blue-400: #50A6F2; --blue-300: #7CBCF5; @@ -178,7 +178,7 @@ --text-3xl: 22px; --text-on-blue: var(--blue-700); - --text-on-light-blue: var(--blue-700); + --text-on-light-blue: var(--blue-600); --text-on-dark-blue: var(--blue-700); --text-on-green: var(--dark-green-700); --text-on-yellow: var(--yellow-700); From c09d61f15fe6a3e9688f54bc4c94ca30120058d2 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 23 May 2022 18:25:23 +0530 Subject: [PATCH 146/159] fix: return found items from duplicate btn check (#16959) Co-Authored-By: Suraj Shetty Co-authored-by: Suraj Shetty --- frappe/public/js/frappe/ui/page.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/ui/page.js b/frappe/public/js/frappe/ui/page.js index 37ab8b6d09..70e0862ba5 100644 --- a/frappe/public/js/frappe/ui/page.js +++ b/frappe/public/js/frappe/ui/page.js @@ -513,7 +513,7 @@ frappe.ui.Page = class Page { const item_selector = `${selector}[data-label='${encodeURIComponent(label)}']`; const existing_items = $(parent).find(item_selector); - return existing_items?.length > 0; + return existing_items?.length > 0 && existing_items; } clear_btn_group(parent) { From 15af545acfc4d2dc720219d44e4499d495023876 Mon Sep 17 00:00:00 2001 From: gavin Date: Mon, 23 May 2022 18:55:55 +0530 Subject: [PATCH 147/159] chore: Update typing + noqa - flake8 failures --- frappe/database/query.py | 4 ++-- frappe/utils/identicon.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/database/query.py b/frappe/database/query.py index 70127dd9d9..f608539854 100644 --- a/frappe/database/query.py +++ b/frappe/database/query.py @@ -1,7 +1,7 @@ import operator import re from functools import cached_property -from typing import Any, Dict, List, Tuple, Union +from typing import Any, Callable, Dict, List, Tuple, Union import frappe from frappe import _ @@ -141,7 +141,7 @@ def change_orderby(order: str): # default operators -OPERATOR_MAP: Dict[str, "function"] = { +OPERATOR_MAP: Dict[str, Callable] = { "+": operator.add, "=": operator.eq, "-": operator.sub, diff --git a/frappe/utils/identicon.py b/frappe/utils/identicon.py index 28df486d03..448f24657c 100644 --- a/frappe/utils/identicon.py +++ b/frappe/utils/identicon.py @@ -104,4 +104,4 @@ class Identicon(object): save_handler(self.image, fp, "") finally: fp.seek(0) - return "data:image/png;base64,{0}".format(base64.b64encode(fp.read())) + return "data:image/png;base64,{0}".format(base64.b64encode(fp.read())) # noqa From 88f65cdefbfead538f64e8788ee7c70495151d96 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 23 May 2022 16:01:42 +0200 Subject: [PATCH 148/159] feat: Add german translations --- frappe/translations/de.csv | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/frappe/translations/de.csv b/frappe/translations/de.csv index ed6c9fa56f..8c87334762 100644 --- a/frappe/translations/de.csv +++ b/frappe/translations/de.csv @@ -2555,7 +2555,7 @@ Today,Heute, Toggle Chart,Diagramm/Grafik(?) umschalten\nplease verify context!, Toggle Charts,Toggle-Diagramme (? depends on context!), Toggle Grid View,Rasteransicht wechseln, -Toggle Sidebar,Toggle Seitenleiste, +Toggle Sidebar,Seitenleiste umschalten, Token,Zeichen, Token is missing,Token fehlt, "Too many users signed up recently, so the registration is disabled. Please try back in an hour","Zu viele Benutzer unterzeichnete vor kurzem, also die Registrierung ist deaktiviert. Bitte versuchen Sie es in einer Stunde zurück", @@ -3023,7 +3023,7 @@ zoom-in,vergrößern, zoom-out,verkleinern, {0} Calendar,{0} Kalender, {0} Chart,{0} Diagramm, -{0} Dashboard,{0} Dashboard, +{0} Dashboard,{0}-Dashboard, {0} List,{0} Liste, {0} Modules,{0} Module, {0} Report,{0} Bericht(e), @@ -3334,7 +3334,7 @@ Go,Gehen, Go to next record,Zum nächsten Datensatz wechseln, Go to previous record,Zum vorherigen Datensatz wechseln, Google API Settings.,Google API-Einstellungen., -Google Calendar,Google Kalender, +Google Calendar,Google-Kalender, "Google Calendar - Could not create Calendar for {0}, error code {1}.","Google Kalender - Kalender für {0}, Fehlercode {1} konnte nicht erstellt werden.", "Google Calendar - Could not delete Event {0} from Google Calendar, error code {1}.","Google Kalender - Ereignis {0} konnte nicht aus Google Kalender gelöscht werden, Fehlercode {1}.", "Google Calendar - Could not fetch event from Google Calendar, error code {0}.","Google Kalender - Ereignis konnte nicht aus Google Kalender abgerufen werden, Fehlercode {0}.", @@ -3836,7 +3836,7 @@ Clear,Löschen, Comment,Kommentar, Comments,Kommentare, DRAFT,ENTWURF, -Dashboard,Instrumententafel, +Dashboard,Dashboard, DocType,DocType, Download,Herunterladen, EMail,E-Mail, @@ -4143,7 +4143,6 @@ Couldn't Load Desk,Schreibtisch konnte nicht geladen werden, Customize Workspace,Arbeitsbereich anpassen, Customizations Saved Successfully,Anpassungen erfolgreich gespeichert, Something went wrong while saving customizations,Beim Speichern von Anpassungen ist ein Fehler aufgetreten, -{} Dashboard,{} Instrumententafel, No changes in document,Keine Änderungen im Dokument, by Role,nach Rolle, Document is only editable by users with role,Das Dokument kann nur von Benutzern mit Rolle bearbeitet werden, @@ -4779,3 +4778,16 @@ Submit on Creation,Nach Erstellung buchen, Show Absolute Values,Absolutwerte anzeigen, Row #{0}: Could not find field {1} in {2} DocType,Zeile #{0}: Feld {1} existiert nicht in DocType {2}, Repeat on Days,An Tagen wiederholen, +Kanban Settings,Kanban-Einstellungen, +Kanban View,Kanban-Ansicht, +Report View,Berichtansicht, +Gantt View,Gantt-Ansicht, +Dashboard View,Dashboard-Ansicht, +Select Kanban,Kanban-Tafel auswählen, +Create New Kanban Board,Neue Kanban-Tafel erstellen, +New Kanban Board,Neue Kanban-Tafel, +Choose a color,Farbe auswählen, +Add / Remove Columns,Spalten hinzufügen / entfernen, +Configure Columns,Spalten konfigurieren, +Reset to default,Auf Standard zurücksetzen, +Column Width,Spaltenbreite, From d83251ad474d14863f3e1be0886f03c498d26e17 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 23 May 2022 16:51:12 +0200 Subject: [PATCH 149/159] feat: Add german translations --- frappe/translations/de.csv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/translations/de.csv b/frappe/translations/de.csv index 8c87334762..d00548458c 100644 --- a/frappe/translations/de.csv +++ b/frappe/translations/de.csv @@ -4791,3 +4791,5 @@ Add / Remove Columns,Spalten hinzufügen / entfernen, Configure Columns,Spalten konfigurieren, Reset to default,Auf Standard zurücksetzen, Column Width,Spaltenbreite, +Choose Kanban Board,Kanban-Tafel auswählen, +Create New Board,Neue Tafel erstellen, From e41bad6066290fecf7b9ba3d76ce1132a146ca98 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Mon, 23 May 2022 17:20:25 +0200 Subject: [PATCH 150/159] feat: if only on email per user the preselect it in email form --- frappe/public/js/frappe/views/communication.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frappe/public/js/frappe/views/communication.js b/frappe/public/js/frappe/views/communication.js index f5bd01f1da..2cb82d8ddc 100755 --- a/frappe/public/js/frappe/views/communication.js +++ b/frappe/public/js/frappe/views/communication.js @@ -168,6 +168,10 @@ frappe.views.CommunicationComposer = class { fieldname: "sender", options: this.user_email_accounts }); + //Preselect email senders if there is only one + if (this.user_email_accounts.length==1) { + this['sender'] = this.user_email_accounts + } } return fields; From 57b2f755e59b26e7c3f39e634615d65d41cc7230 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 24 May 2022 11:50:51 +0530 Subject: [PATCH 151/159] fix: use darker shade for text on dark blue Co-authored-by: Shariq Ansari <30859809+shariquerik@users.noreply.github.com> --- frappe/public/scss/common/css_variables.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/scss/common/css_variables.scss b/frappe/public/scss/common/css_variables.scss index 3593469e68..cadb5bf330 100644 --- a/frappe/public/scss/common/css_variables.scss +++ b/frappe/public/scss/common/css_variables.scss @@ -179,7 +179,7 @@ --text-on-blue: var(--blue-700); --text-on-light-blue: var(--blue-600); - --text-on-dark-blue: var(--blue-700); + --text-on-dark-blue: var(--blue-800); --text-on-green: var(--dark-green-700); --text-on-yellow: var(--yellow-700); --text-on-orange: var(--orange-600); From b61e1d8e55fd727d506bf2df90ce252a79243fae Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 24 May 2022 12:19:36 +0530 Subject: [PATCH 152/159] fix: same stroke color as text on list filters --- frappe/public/scss/desk/filters.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/scss/desk/filters.scss b/frappe/public/scss/desk/filters.scss index 0552311ee2..ffaea7a9bd 100644 --- a/frappe/public/scss/desk/filters.scss +++ b/frappe/public/scss/desk/filters.scss @@ -1,6 +1,6 @@ .filter-icon.active { use { - stroke: var(--blue-500); + stroke: var(--text-on-blue); } } From bfda3869a6726f3fe436508b117da4c20e880264 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 24 May 2022 12:50:37 +0530 Subject: [PATCH 153/159] fix: delete email queue first (#16968) email queue takes a long time and during that previously deleted tables remain locked. Activity/Error logs are relatively faster to delete so should moved last --- frappe/core/doctype/log_settings/log_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/log_settings/log_settings.py b/frappe/core/doctype/log_settings/log_settings.py index 58d5fddcd3..0fde168532 100644 --- a/frappe/core/doctype/log_settings/log_settings.py +++ b/frappe/core/doctype/log_settings/log_settings.py @@ -11,9 +11,9 @@ from frappe.query_builder.functions import Now class LogSettings(Document): def clear_logs(self): + self.clear_email_queue() self.clear_error_logs() self.clear_activity_logs() - self.clear_email_queue() def clear_error_logs(self): table = DocType("Error Log") From b44235587fa2eddbcac29b924b5c4dfb354d17e7 Mon Sep 17 00:00:00 2001 From: Shariq Ansari <30859809+shariquerik@users.noreply.github.com> Date: Tue, 24 May 2022 13:17:21 +0530 Subject: [PATCH 154/159] test: fixed failing UI test (#16958) --- cypress/integration/folder_navigation.js | 20 ++------ cypress/integration/workspace_blocks.js | 62 +++++++++--------------- cypress/support/commands.js | 12 ++++- frappe/commands/utils.py | 4 ++ 4 files changed, 43 insertions(+), 55 deletions(-) diff --git a/cypress/integration/folder_navigation.js b/cypress/integration/folder_navigation.js index e61a02ddb9..484419b4aa 100644 --- a/cypress/integration/folder_navigation.js +++ b/cypress/integration/folder_navigation.js @@ -1,13 +1,3 @@ -const click_menu_button = (name) => { - cy.get('.menu-btn-group > .btn').click(); - cy.get(`.menu-btn-group [data-label="${encodeURIComponent(name)}"]`).click(); -} - -const click_action_button = (name) => { - cy.findByRole('button', {name: 'Actions'}).click(); - cy.get(`.actions-btn-group [data-label="${encodeURIComponent(name)}"]`).click(); -} - context('Folder Navigation', () => { before(() => { cy.visit('/login'); @@ -25,7 +15,7 @@ context('Folder Navigation', () => { cy.get('.filter-action-buttons > div > .btn-primary').findByText('Apply Filters').click(); //Adding folder (Test Folder) - click_menu_button("New Folder"); + cy.click_menu_button("New Folder"); cy.fill_field('value', 'Test Folder'); cy.click_modal_primary_button('Create'); }); @@ -39,7 +29,7 @@ context('Folder Navigation', () => { cy.visit('/app/file/view/home/Attachments'); //Adding folder inside the attachments folder - click_menu_button("New Folder"); + cy.click_menu_button("New Folder"); cy.fill_field('value', 'Test Folder'); cy.click_modal_primary_button('Create'); @@ -67,14 +57,14 @@ context('Folder Navigation', () => { }).as('file_deleted'); //Deleting the added file from the Test folder - click_action_button("Delete") + cy.click_action_button("Delete"); cy.click_modal_primary_button('Yes'); cy.wait('@file_deleted'); //Deleting the Test Folder cy.visit('/app/file/view/home/Attachments'); cy.get('.list-row-checkbox').eq(0).click(); - click_action_button("Delete") + cy.click_action_button("Delete"); cy.click_modal_primary_button('Yes'); cy.wait('@file_deleted'); }); @@ -83,7 +73,7 @@ context('Folder Navigation', () => { //Deleting the Test Folder added in the home directory cy.visit('/app/file/view/home'); cy.get('.level-left > .list-subject > .file-select >.list-row-checkbox').eq(0).click({force: true, delay: 500}); - click_action_button("Delete") + cy.click_action_button("Delete"); cy.click_modal_primary_button('Yes'); }); }); diff --git a/cypress/integration/workspace_blocks.js b/cypress/integration/workspace_blocks.js index d6aceae8f4..3c0a429973 100644 --- a/cypress/integration/workspace_blocks.js +++ b/cypress/integration/workspace_blocks.js @@ -2,6 +2,9 @@ context('Workspace Blocks', () => { before(() => { cy.login(); cy.visit('/app'); + return cy.window().its('frappe').then(frappe => { + return frappe.xcall("frappe.tests.ui_test_helpers.setup_workflow"); + }); }); it('Create Test Page', () => { @@ -10,6 +13,7 @@ context('Workspace Blocks', () => { url: 'api/method/frappe.desk.doctype.workspace.workspace.new_page' }).as('new_page'); + cy.visit('/app/website'); cy.get('.codex-editor__redactor .ce-block'); cy.get('.custom-actions button[data-label="Create%20Workspace"]').click(); cy.fill_field('title', 'Test Block Page', 'Data'); @@ -48,26 +52,6 @@ context('Workspace Blocks', () => { doctype: 'ToDo', description: 'Quick List ToDo 4', status: 'Open' - }, - { - doctype: 'ToDo', - description: 'Quick List ToDo 5', - status: 'Closed' - }, - { - doctype: 'ToDo', - description: 'Quick List ToDo 6', - status: 'Closed' - }, - { - doctype: 'ToDo', - description: 'Quick List ToDo 7', - status: 'Closed' - }, - { - doctype: 'ToDo', - description: 'Quick List ToDo 8', - status: 'Closed' } ]); @@ -92,8 +76,8 @@ context('Workspace Blocks', () => { cy.get_open_dialog().find('.filter-edit-area').should('contain', 'No filters selected'); cy.get_open_dialog().find('.filter-area .add-filter').click(); - cy.get_open_dialog().find('.fieldname-select-area input').type('Status{enter}').blur(); - cy.get_open_dialog().find('select.input-with-feedback').select('Open'); + cy.get_open_dialog().find('.fieldname-select-area input').type('Workflow State{enter}').blur(); + cy.get_open_dialog().find('.filter-field .input-with-feedback').type('Pending'); cy.get_open_dialog().find('.modal-header').click(); cy.get_open_dialog().find('.btn-primary').click(); @@ -105,16 +89,27 @@ context('Workspace Blocks', () => { cy.get('.ce-block .quick-list-widget-box').first().as('todo-quick-list'); - cy.get('@todo-quick-list').find('.quick-list-item .status').should('contain', 'Open'); + cy.get('@todo-quick-list').find('.quick-list-item .status').should('contain', 'Pending'); + + // test quick-list-item + cy.get('@todo-quick-list').find('.quick-list-item .title') + .first() + .invoke('attr', 'title') + .then(title => { + cy.get('@todo-quick-list').find('.quick-list-item').contains(title).click(); + cy.get_field('description', 'Text Editor').should('contain', title); + cy.click_action_button('Approve'); + }); + cy.go('back'); // test filter-list cy.get('@todo-quick-list').realHover().find('.widget-control .filter-list').click(); - cy.get_open_dialog().find('select.input-with-feedback').select('Closed'); + cy.get_open_dialog().find('.filter-field .input-with-feedback').clear().type('Approved'); cy.get_open_dialog().find('.modal-header').click(); cy.get_open_dialog().find('.btn-primary').click(); - cy.get('@todo-quick-list').find('.quick-list-item .status').should('contain', 'Closed'); + cy.get('@todo-quick-list').find('.quick-list-item .status').should('contain', 'Approved'); // test refresh-list @@ -133,23 +128,12 @@ context('Workspace Blocks', () => { cy.go('back'); - // test quick-list-item - cy.get('@todo-quick-list').find('.quick-list-item .title') - .first() - .invoke('attr', 'title') - .then(title => { - cy.get('@todo-quick-list').find('.quick-list-item').contains(title).click(); - cy.get_field('description', 'Text Editor').should('contain', title); - }); - cy.go('back'); - - // test see-all cy.get('@todo-quick-list').find('.widget-footer .see-all').click(); - - cy.get('.standard-filter-section select[data-fieldname="status"]') + cy.open_list_filter(); + cy.get('.filter-field input[data-fieldname="workflow_state"]') .invoke('val') - .should('eq', 'Open'); + .should('eq', 'Pending'); cy.go('back'); }); diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 61ddb33af1..6398018e10 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -313,12 +313,22 @@ Cypress.Commands.add('insert_doc', (doctype, args, ignore_duplicate) => { }); }); -Cypress.Commands.add('add_filter', () => { +Cypress.Commands.add('open_list_filter', () => { cy.get('.filter-section .filter-button').click(); cy.wait(300); cy.get('.filter-popover').should('exist'); }); +Cypress.Commands.add('click_action_button', (name) => { + cy.findByRole('button', {name: 'Actions'}).click(); + cy.get(`.actions-btn-group [data-label="${encodeURIComponent(name)}"]`).click(); +}); + +Cypress.Commands.add('click_menu_button', (name) => { + cy.get('.standard-actions .menu-btn-group > .btn').click(); + cy.get(`.menu-btn-group [data-label="${encodeURIComponent(name)}"]`).click(); +}); + Cypress.Commands.add('clear_filters', () => { let has_filter = false; cy.intercept({ diff --git a/frappe/commands/utils.py b/frappe/commands/utils.py index 663f1a6f7c..2d3916914d 100644 --- a/frappe/commands/utils.py +++ b/frappe/commands/utils.py @@ -856,6 +856,8 @@ def run_ui_tests( node_bin = subprocess.getoutput("npm bin") cypress_path = f"{node_bin}/cypress" plugin_path = f"{node_bin}/../cypress-file-upload" + drag_drop_plugin_path = f"{node_bin}/../@4tw/cypress-drag-drop" + real_events_plugin_path = f"{node_bin}/../cypress-real-events" testing_library_path = f"{node_bin}/../@testing-library" coverage_plugin_path = f"{node_bin}/../@cypress/code-coverage" @@ -863,6 +865,8 @@ def run_ui_tests( if not ( os.path.exists(cypress_path) and os.path.exists(plugin_path) + and os.path.exists(drag_drop_plugin_path) + and os.path.exists(real_events_plugin_path) and os.path.exists(testing_library_path) and os.path.exists(coverage_plugin_path) and cint(subprocess.getoutput("npm view cypress version")[:1]) >= 6 From 576af52ec6039beb344388030112ad3de6f6d2d9 Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Tue, 24 May 2022 18:26:34 +0200 Subject: [PATCH 155/159] fix: mention only users that can be read (#16978) Full Name and Email ID of a **User** are sensitive data. With **Role and User Permissions** we can restrict which other users a user can see, thus maintaining data protection. This could be circumvented by using the `@mention` functionality in comments. It allows us to see all users and their names, regardless of our permissions. This PR aims to fix this issue by using `get_list` instead of `get_all` while retrieving options for `@mention`. --- frappe/desk/search.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/desk/search.py b/frappe/desk/search.py index eb1a2e82ba..639077da5e 100644 --- a/frappe/desk/search.py +++ b/frappe/desk/search.py @@ -348,7 +348,7 @@ def get_names_for_mentions(search_term): def get_users_for_mentions(): - return frappe.get_all( + return frappe.get_list( "User", fields=["name as id", "full_name as value"], filters={ @@ -361,7 +361,7 @@ def get_users_for_mentions(): def get_user_groups(): - return frappe.get_all( + return frappe.get_list( "User Group", fields=["name as id", "name as value"], update={"is_group": True} ) From 00f665c634d670f0f71d9f5a0c76229b8decbfb6 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 24 May 2022 15:07:19 +0530 Subject: [PATCH 156/159] fix: email queue cleanup in pure SQL Currently this background job constantly fails because of the way query is written: 1. It tries to find all docs to delete using select query 2. Deletes them by using `in query` with a HUGE amount of docs 3. Deletes child table with parent, again using `IN` query with huge amount of docs. This times out and never finishes on old sites. Solution: 1. Modified deletion to straightaway delete all main table rows that are older 2. Apply same deletion logic to child table rows. PS: This has potential to leave some orphan child table rows behind for few more days iff modified time was later than parent doc (this is quite rare). But it's safe since child table doesn't contain "links" anyway. --- .../doctype/email_queue/test_email_queue.py | 39 +++++++++++++++++-- frappe/email/queue.py | 24 +++++++----- 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/frappe/email/doctype/email_queue/test_email_queue.py b/frappe/email/doctype/email_queue/test_email_queue.py index b3c5467085..96c566a041 100644 --- a/frappe/email/doctype/email_queue/test_email_queue.py +++ b/frappe/email/doctype/email_queue/test_email_queue.py @@ -1,10 +1,41 @@ # -*- coding: utf-8 -*- # Copyright (c) 2015, Frappe Technologies and Contributors # License: MIT. See LICENSE -import unittest -# test_records = frappe.get_test_records('Email Queue') +import frappe +from frappe.email.queue import clear_outbox +from frappe.tests.utils import FrappeTestCase -class TestEmailQueue(unittest.TestCase): - pass +class TestEmailQueue(FrappeTestCase): + def test_email_queue_deletion_based_on_modified_date(self): + old_record = frappe.get_doc( + { + "doctype": "Email Queue", + "sender": "Test ", + "show_as_cc": "", + "message": "Test message", + "status": "Sent", + "priority": 1, + "recipients": [ + { + "recipient": "test_auth@test.com", + } + ], + } + ).insert() + + old_record.modified = "2010-01-01 00:00:01" + old_record.recipients[0].modified = old_record.modified + old_record.db_update_all() + + new_record = frappe.copy_doc(old_record) + new_record.insert() + + clear_outbox() + + self.assertFalse(frappe.db.exists("Email Queue", old_record.name)) + self.assertFalse(frappe.db.exists("Email Queue Recipient", {"parent": old_record.name})) + + self.assertTrue(frappe.db.exists("Email Queue", new_record.name)) + self.assertTrue(frappe.db.exists("Email Queue Recipient", {"parent": new_record.name})) diff --git a/frappe/email/queue.py b/frappe/email/queue.py index b92dea3e65..07731417d8 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -195,18 +195,24 @@ def clear_outbox(days: int = None) -> None: Note: Used separate query to avoid deadlock """ days = days or 31 - email_queue = DocType("Email Queue") + email_queue = frappe.qb.DocType("Email Queue") + email_recipient = frappe.qb.DocType("Email Queue Recipient") - email_queues = ( + # Delete queue table + ( frappe.qb.from_(email_queue) - .select(email_queue.name) - .where(email_queue.modified < (Now() - Interval(days=days))) - .run(pluck=True) - ) + .delete() + .where((email_queue.modified < (Now() - Interval(days=days)))) + ).run() - if email_queues: - frappe.db.delete("Email Queue", {"name": ("in", email_queues)}) - frappe.db.delete("Email Queue Recipient", {"parent": ("in", email_queues)}) + # delete child tables, note that this has potential to leave some orphan + # child table behind if modified time was later than parent doc (rare). + # But it's safe since child table doesn't contain links. + ( + frappe.qb.from_(email_recipient) + .delete() + .where((email_recipient.modified < (Now() - Interval(days=days)))) + ).run() def set_expiry_for_email_queue(): From 29710621d8675f9a45dddde5a0774787ebd8638a Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 24 May 2022 15:14:18 +0530 Subject: [PATCH 157/159] fix: commit after each log cleanup This preserves "progress" and releases locks held on log tables --- frappe/core/doctype/log_settings/log_settings.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/log_settings/log_settings.py b/frappe/core/doctype/log_settings/log_settings.py index 0fde168532..5632f05a36 100644 --- a/frappe/core/doctype/log_settings/log_settings.py +++ b/frappe/core/doctype/log_settings/log_settings.py @@ -10,8 +10,13 @@ from frappe.query_builder.functions import Now class LogSettings(Document): - def clear_logs(self): + def clear_logs(self, commit=False): self.clear_email_queue() + if commit: + # Since since deleting many logs can take significant amount of time, commit is required to relase locks. + # Error log table doesn't require commit - myisam + # activity logs are deleted last so background job finishes and commits. + frappe.db.commit() self.clear_error_logs() self.clear_activity_logs() @@ -34,7 +39,7 @@ class LogSettings(Document): def run_log_clean_up(): doc = frappe.get_doc("Log Settings") - doc.clear_logs() + doc.clear_logs(commit=True) @frappe.whitelist() From 3a05c0f0933c0b8012b58cf2a8b22566ab81b4e6 Mon Sep 17 00:00:00 2001 From: HENRY Florian Date: Wed, 25 May 2022 07:06:19 +0200 Subject: [PATCH 158/159] fix: update franch translation (#16974) remove plurals (as other translation) --- frappe/translations/fr.csv | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/translations/fr.csv b/frappe/translations/fr.csv index 06a2473d3b..d1dba64a44 100644 --- a/frappe/translations/fr.csv +++ b/frappe/translations/fr.csv @@ -799,9 +799,9 @@ DESC,DESC, Daily Event Digest is sent for Calendar Events where reminders are set.,Un Récapitulatif Quotidien est envoyé pour les Événements du Calendrier ayant des rappels., Danger,Danger, Dark Color,Couleur sombre, -Dashboard Chart,Tableau de bord, -Dashboard Chart Link,Lien de tableau de bord, -Dashboard Chart Source,Source du graphique du tableau de bord, +Dashboard Chart,Tableau de bord - indicateur, +Dashboard Chart Link,Lien de tableau de bord - indicateur, +Dashboard Chart Source,Source du graphique du tableau de bord - indicateur, Dashboard Name,Nom du tableau de bord, Dashboards,Tableaux de bord, Data,Données, From 1c864159f22c6c4ce05ae34daab0f5c6ce80d53a Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 25 May 2022 12:38:29 +0530 Subject: [PATCH 159/159] fix(minor): remove top margins for headings on standard templates --- frappe/website/doctype/web_form/templates/web_form.html | 2 +- .../web_template/section_with_cards/section_with_cards.html | 2 +- .../website/web_template/section_with_cta/section_with_cta.html | 2 +- .../section_with_features/section_with_features.html | 2 +- .../web_template/section_with_videos/section_with_videos.html | 2 +- .../split_section_with_image/split_section_with_image.html | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frappe/website/doctype/web_form/templates/web_form.html b/frappe/website/doctype/web_form/templates/web_form.html index 7dd532421d..96072a19ea 100644 --- a/frappe/website/doctype/web_form/templates/web_form.html +++ b/frappe/website/doctype/web_form/templates/web_form.html @@ -22,7 +22,7 @@ data-web-form="{{ name }}" data-web-form-doctype="{{ doc_type }}" data-login-req {% if is_list %}
-

{{ _(title) }}

+

{{ _(title) }}

diff --git a/frappe/website/web_template/section_with_cards/section_with_cards.html b/frappe/website/web_template/section_with_cards/section_with_cards.html index d0eb164288..b5577795a8 100644 --- a/frappe/website/web_template/section_with_cards/section_with_cards.html +++ b/frappe/website/web_template/section_with_cards/section_with_cards.html @@ -18,7 +18,7 @@ }) }} {%- endif -%}
-

{{ title or '' }}

+

{{ title or '' }}

{{ content or '' }}

diff --git a/frappe/website/web_template/section_with_cta/section_with_cta.html b/frappe/website/web_template/section_with_cta/section_with_cta.html index 4015c05517..80924d9396 100644 --- a/frappe/website/web_template/section_with_cta/section_with_cta.html +++ b/frappe/website/web_template/section_with_cta/section_with_cta.html @@ -1,6 +1,6 @@
-

{{ title }}

+

{{ title }}

{%- if subtitle -%}

{{ subtitle }}

{%- endif -%} diff --git a/frappe/website/web_template/section_with_features/section_with_features.html b/frappe/website/web_template/section_with_features/section_with_features.html index b8cc3c2b90..b97106e32b 100644 --- a/frappe/website/web_template/section_with_features/section_with_features.html +++ b/frappe/website/web_template/section_with_features/section_with_features.html @@ -15,7 +15,7 @@ Icon for {{ feature.title }} {%- endif -%} {%- if feature.title -%} -

{{ feature.title }}

+

{{ feature.title }}

{%- endif -%} {%- if feature.content -%}

{{ frappe.utils.md_to_html(feature.content) }}

diff --git a/frappe/website/web_template/section_with_videos/section_with_videos.html b/frappe/website/web_template/section_with_videos/section_with_videos.html index 30bea5dead..304f77993c 100644 --- a/frappe/website/web_template/section_with_videos/section_with_videos.html +++ b/frappe/website/web_template/section_with_videos/section_with_videos.html @@ -13,7 +13,7 @@
{%- if video.title -%} -

{{ video.title }}

+

{{ video.title }}

{%- endif -%} {%- if video.content -%}

{{ video.content }}

diff --git a/frappe/website/web_template/split_section_with_image/split_section_with_image.html b/frappe/website/web_template/split_section_with_image/split_section_with_image.html index 5ebeef3912..ced68ccf0a 100644 --- a/frappe/website/web_template/split_section_with_image/split_section_with_image.html +++ b/frappe/website/web_template/split_section_with_image/split_section_with_image.html @@ -15,7 +15,7 @@
{%- endif -%}
-

{{ title }}

+

{{ title }}

{%- if content -%}

{{ content }}

{%- endif -%}