msgid "ID"
msgstr "编号"
-#: frappe/desk/reportview.py:526
+#: frappe/desk/reportview.py:527
#: frappe/public/js/frappe/views/reports/report_view.js:989
msgctxt "Label of name column in report"
msgid "ID"
@@ -12508,8 +12512,8 @@ msgstr "忽略的应用"
msgid "Illegal Document Status for {0}"
msgstr "{0}非法单据状态"
-#: frappe/model/db_query.py:454 frappe/model/db_query.py:457
-#: frappe/model/db_query.py:1122
+#: frappe/model/db_query.py:503 frappe/model/db_query.py:506
+#: frappe/model/db_query.py:1172
msgid "Illegal SQL Query"
msgstr "非法SQL查询"
@@ -12630,7 +12634,7 @@ msgstr "隐式"
msgid "Import"
msgstr "导入"
-#: frappe/public/js/frappe/list/list_view.js:1913
+#: frappe/public/js/frappe/list/list_view.js:1922
msgctxt "Button in list view menu"
msgid "Import"
msgstr "导入"
@@ -12859,15 +12863,15 @@ msgid "Include Web View Link in Email"
msgstr "邮件包含网页视图链接"
#: frappe/public/js/frappe/form/print_utils.js:59
-#: frappe/public/js/frappe/views/reports/query_report.js:1628
+#: frappe/public/js/frappe/views/reports/query_report.js:1647
msgid "Include filters"
msgstr "包括过滤条件"
-#: frappe/public/js/frappe/views/reports/query_report.js:1648
+#: frappe/public/js/frappe/views/reports/query_report.js:1667
msgid "Include hidden columns"
msgstr ""
-#: frappe/public/js/frappe/views/reports/query_report.js:1620
+#: frappe/public/js/frappe/views/reports/query_report.js:1639
msgid "Include indentation"
msgstr "包括缩进"
@@ -12934,11 +12938,11 @@ msgstr "不正确的用户或密码"
msgid "Incorrect Verification code"
msgstr "验证码不正确"
-#: frappe/model/document.py:1555
+#: frappe/model/document.py:1569
msgid "Incorrect value in row {0}:"
msgstr "第{0}行值错误:"
-#: frappe/model/document.py:1557
+#: frappe/model/document.py:1571
msgid "Incorrect value:"
msgstr "错误值:"
@@ -13025,7 +13029,7 @@ msgstr "在上面插入"
#. Label of the insert_after (Select) field in DocType 'Custom Field'
#: frappe/custom/doctype/custom_field/custom_field.json
-#: frappe/public/js/frappe/views/reports/query_report.js:1893
+#: frappe/public/js/frappe/views/reports/query_report.js:1912
msgid "Insert After"
msgstr "在后边插入"
@@ -13215,7 +13219,7 @@ msgstr "无效"
#: frappe/public/js/form_builder/utils.js:221
#: frappe/public/js/frappe/form/grid_row.js:850
-#: frappe/public/js/frappe/form/layout.js:810
+#: frappe/public/js/frappe/form/layout.js:818
#: frappe/public/js/frappe/views/reports/report_view.js:721
msgid "Invalid \"depends_on\" expression"
msgstr "“depends_on”表达式无效"
@@ -13345,7 +13349,7 @@ msgstr "无效的密码"
msgid "Invalid Phone Number"
msgstr "电话号码无效"
-#: frappe/auth.py:97 frappe/utils/oauth.py:184 frappe/utils/oauth.py:191
+#: frappe/auth.py:97 frappe/utils/oauth.py:213 frappe/utils/oauth.py:220
#: frappe/www/login.py:128
msgid "Invalid Request"
msgstr "无效请求"
@@ -13363,7 +13367,7 @@ msgid "Invalid Transition"
msgstr "无效转换"
#: frappe/core/doctype/file/file.py:232
-#: frappe/public/js/frappe/file_uploader/FileUploader.vue:550
+#: frappe/public/js/frappe/file_uploader/FileUploader.vue:551
#: frappe/public/js/frappe/widgets/widget_dialog.js:602
#: frappe/utils/csvutils.py:226 frappe/utils/csvutils.py:247
msgid "Invalid URL"
@@ -13421,7 +13425,7 @@ msgstr ""
msgid "Invalid direction in Order By: {0}. Must be 'ASC' or 'DESC'."
msgstr ""
-#: frappe/model/document.py:1020 frappe/model/document.py:1034
+#: frappe/model/document.py:1034 frappe/model/document.py:1048
msgid "Invalid docstatus"
msgstr "文档状态无效"
@@ -13547,7 +13551,7 @@ msgid "Invalid token state! Check if the token has been created by the OAuth use
msgstr "令牌状态无效!请检查是否由OAuth用户创建"
#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:165
-#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:336
+#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:338
msgid "Invalid username or password"
msgstr "用户名或密码错误"
@@ -14229,8 +14233,8 @@ msgstr "LDAP用户创建与映射"
msgid "LDAP Username Field"
msgstr "LDAP用户名字段"
-#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:309
-#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:426
+#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:310
+#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:429
msgid "LDAP is not enabled."
msgstr "LDAP未启用。"
@@ -14672,7 +14676,7 @@ msgstr "打印表头HTML"
msgid "Level"
msgstr "级别"
-#: frappe/core/page/permission_manager/permission_manager.js:467
+#: frappe/core/page/permission_manager/permission_manager.js:468
msgid "Level 0 is for document level permissions, higher levels for field level permissions."
msgstr "级别0为单据级权限,大于0为字段级权限。"
@@ -14960,7 +14964,7 @@ msgstr "列表过滤条件"
msgid "List Settings"
msgstr "列表设置"
-#: frappe/public/js/frappe/list/list_view.js:1993
+#: frappe/public/js/frappe/list/list_view.js:2002
msgctxt "Button in list view menu"
msgid "List Settings"
msgstr "列表设置"
@@ -14974,7 +14978,7 @@ msgstr "列表视图"
msgid "List View Settings"
msgstr "列表视图设置"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:161
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:162
msgid "List a document type"
msgstr "列出某单据类型"
@@ -15031,7 +15035,7 @@ msgstr "加载更多"
#: frappe/public/js/frappe/list/base_list.js:526
#: frappe/public/js/frappe/list/list_view.js:363
#: frappe/public/js/frappe/ui/listing.html:16
-#: frappe/public/js/frappe/views/reports/query_report.js:1097
+#: frappe/public/js/frappe/views/reports/query_report.js:1116
msgid "Loading"
msgstr "载入中"
@@ -15568,6 +15572,15 @@ msgstr "标记为垃圾邮件"
msgid "Marketing Manager"
msgstr "市场营销经理"
+#. Label of the mask (Check) field in DocType 'Custom DocPerm'
+#. Label of the mask (Check) field in DocType 'DocField'
+#. Label of the mask (Check) field in DocType 'DocPerm'
+#: frappe/core/doctype/custom_docperm/custom_docperm.json
+#: frappe/core/doctype/docfield/docfield.json
+#: frappe/core/doctype/docperm/docperm.json
+msgid "Mask"
+msgstr "掩码"
+
#: frappe/desk/page/setup_wizard/install_fixtures.py:50
msgid "Master"
msgstr "主数据"
@@ -15953,7 +15966,7 @@ msgstr "分钟偏移量"
#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:108
#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:117
#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:125
-#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:333
+#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:335
msgid "Misconfigured"
msgstr "配置错误"
@@ -15961,7 +15974,7 @@ msgstr "配置错误"
msgid "Miss"
msgstr "小姐"
-#: frappe/desk/form/meta.py:194
+#: frappe/desk/form/meta.py:197
msgid "Missing DocType"
msgstr "缺失文档类型"
@@ -16258,19 +16271,19 @@ msgstr "移到废纸篓"
msgid "Move current and all subsequent sections to a new tab"
msgstr "移动当前及以下段到新页签"
-#: frappe/public/js/frappe/form/form.js:177
+#: frappe/public/js/frappe/form/form.js:178
msgid "Move cursor to above row"
msgstr "移动光标至上一行"
-#: frappe/public/js/frappe/form/form.js:181
+#: frappe/public/js/frappe/form/form.js:182
msgid "Move cursor to below row"
msgstr "移动光标至下一行"
-#: frappe/public/js/frappe/form/form.js:185
+#: frappe/public/js/frappe/form/form.js:186
msgid "Move cursor to next column"
msgstr "移动光标至下一列"
-#: frappe/public/js/frappe/form/form.js:189
+#: frappe/public/js/frappe/form/form.js:190
msgid "Move cursor to previous column"
msgstr "移动光标至上一列"
@@ -16494,12 +16507,12 @@ msgstr "导航栏模板"
msgid "Navbar Template Values"
msgstr "导航栏模板值"
-#: frappe/public/js/frappe/list/list_view.js:1380
+#: frappe/public/js/frappe/list/list_view.js:1389
msgctxt "Description of a list view shortcut"
msgid "Navigate list down"
msgstr "向下导航列表"
-#: frappe/public/js/frappe/list/list_view.js:1387
+#: frappe/public/js/frappe/list/list_view.js:1396
msgctxt "Description of a list view shortcut"
msgid "Navigate list up"
msgstr "向上导航列表"
@@ -16522,7 +16535,7 @@ msgstr ""
msgid "Need Workspace Manager role to edit private workspace of other users"
msgstr "需具备工作区管理员角色才能编辑其他用户的私有工作区"
-#: frappe/model/document.py:794
+#: frappe/model/document.py:806
msgid "Negative Value"
msgstr "负值"
@@ -16626,7 +16639,7 @@ msgstr "新建链接"
msgid "New Mention on {0}"
msgstr "{0}的新@提及"
-#: frappe/www/contact.py:61
+#: frappe/www/contact.py:68
msgid "New Message from Website Contact Page"
msgstr "从网站的联系页面新消息"
@@ -16897,7 +16910,7 @@ msgstr "点击进入下一步"
#: frappe/public/js/form_builder/utils.js:341
#: frappe/public/js/frappe/form/controls/link.js:498
#: frappe/public/js/frappe/list/list_sidebar_group_by.js:223
-#: frappe/public/js/frappe/views/reports/query_report.js:1673
+#: frappe/public/js/frappe/views/reports/query_report.js:1692
#: frappe/website/doctype/help_article/templates/help_article.html:26
msgid "No"
msgstr "否"
@@ -16955,7 +16968,7 @@ msgstr ""
msgid "No Emails"
msgstr "没有电子邮件"
-#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:361
+#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:364
msgid "No Entry for the User {0} found within LDAP!"
msgstr "LDAP中未找到用户{0}的条目!"
@@ -16971,7 +16984,7 @@ msgstr "无Google日历事件需同步"
msgid "No Images"
msgstr "无图像"
-#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:363
+#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:366
msgid "No LDAP User found for email: {0}"
msgstr "未找到邮箱为{0}的LDAP用户"
@@ -17054,7 +17067,7 @@ msgstr "无生成看板列所需的单选字段"
msgid "No Suggestions"
msgstr "无建议"
-#: frappe/desk/reportview.py:707
+#: frappe/desk/reportview.py:708
msgid "No Tags"
msgstr "无标签"
@@ -17193,12 +17206,12 @@ msgstr "发送短信数量"
msgid "No permission for {0}"
msgstr "无权限操作{0}"
-#: frappe/public/js/frappe/form/form.js:1142
+#: frappe/public/js/frappe/form/form.js:1145
msgctxt "{0} = verb, {1} = object"
msgid "No permission to '{0}' {1}"
msgstr "无权限'{0}' {1}"
-#: frappe/model/db_query.py:949
+#: frappe/model/db_query.py:999
msgid "No permission to read {0}"
msgstr "没有读取{0}的权限"
@@ -17303,7 +17316,7 @@ msgid "Normalized Query"
msgstr "规范化查询"
#: frappe/core/doctype/user/user.py:1029
-#: frappe/templates/includes/login/login.js:257 frappe/utils/oauth.py:269
+#: frappe/templates/includes/login/login.js:257 frappe/utils/oauth.py:298
msgid "Not Allowed"
msgstr "不允许"
@@ -18032,7 +18045,7 @@ msgstr "仅工作区管理员可编辑公共工作区"
msgid "Only allowed to export customizations in developer mode"
msgstr "仅开发者模式下允许导出自定义项"
-#: frappe/model/document.py:1239
+#: frappe/model/document.py:1253
msgid "Only draft documents can be discarded"
msgstr "仅草稿文档可丢弃"
@@ -18063,7 +18076,7 @@ msgstr "仅报表生成器类型的报告可编辑"
msgid "Only standard DocTypes are allowed to be customized from Customize Form."
msgstr "只允许从“定制表单”定制标准DocType。"
-#: frappe/model/delete_doc.py:281
+#: frappe/model/delete_doc.py:283
msgid "Only the Administrator can delete a standard DocType."
msgstr "仅管理员可删除标准文档类型。"
@@ -18147,7 +18160,7 @@ msgstr "在新标签页打开URL"
msgid "Open a dialog with mandatory fields to create a new record quickly. There must be at least one mandatory field to show in dialog."
msgstr "打开含必填字段的对话框快速创建记录。对话框中需至少显示一个必填字段。"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:176
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:177
msgid "Open a module or tool"
msgstr "打开一个模块或工具"
@@ -18159,7 +18172,7 @@ msgstr ""
msgid "Open in a new tab"
msgstr "在新标签页打开"
-#: frappe/public/js/frappe/list/list_view.js:1433
+#: frappe/public/js/frappe/list/list_view.js:1442
msgctxt "Description of a list view shortcut"
msgid "Open list item"
msgstr "打开列表项"
@@ -18407,7 +18420,7 @@ msgstr "PATCH方法"
#: frappe/email/doctype/auto_email_report/auto_email_report.json
#: frappe/printing/page/print/print.js:84
#: frappe/public/js/frappe/form/templates/print_layout.html:44
-#: frappe/public/js/frappe/views/reports/query_report.js:1812
+#: frappe/public/js/frappe/views/reports/query_report.js:1831
msgid "PDF"
msgstr "PDF"
@@ -18783,7 +18796,7 @@ msgstr "密码重置链接生成限制"
msgid "Password cannot be filtered"
msgstr "密码不可被过滤"
-#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:357
+#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:360
msgid "Password changed successfully."
msgstr "密码修改成功"
@@ -18882,7 +18895,7 @@ msgstr "服务器证书的路径"
msgid "Path to private Key File"
msgstr "私钥文件的路径"
-#: frappe/website/path_resolver.py:208
+#: frappe/website/path_resolver.py:230
msgid "Path {0} it not a valid path"
msgstr "{0}不是有效路径"
@@ -18963,15 +18976,15 @@ msgstr "权限级别"
msgid "Permanent"
msgstr "常驻"
-#: frappe/public/js/frappe/form/form.js:1028
+#: frappe/public/js/frappe/form/form.js:1031
msgid "Permanently Cancel {0}?"
msgstr "取消{0} ?"
-#: frappe/public/js/frappe/form/form.js:1074
+#: frappe/public/js/frappe/form/form.js:1077
msgid "Permanently Discard {0}?"
msgstr "永久丢弃{0}?"
-#: frappe/public/js/frappe/form/form.js:861
+#: frappe/public/js/frappe/form/form.js:864
msgid "Permanently Submit {0}?"
msgstr "正式提交{0}?"
@@ -18989,7 +19002,7 @@ msgid "Permission Inspector"
msgstr "权限调试工具"
#. Label of the permlevel (Int) field in DocType 'Custom Field'
-#: frappe/core/page/permission_manager/permission_manager.js:463
+#: frappe/core/page/permission_manager/permission_manager.js:464
#: frappe/custom/doctype/custom_field/custom_field.json
msgid "Permission Level"
msgstr "权限级别"
@@ -19284,7 +19297,7 @@ msgstr "请先创建卡片"
msgid "Please create chart first"
msgstr "请先创建图表"
-#: frappe/desk/form/meta.py:190
+#: frappe/desk/form/meta.py:193
msgid "Please delete the field from {0} or add the required doctype."
msgstr "请从{0}删除字段或添加所需文档类型"
@@ -19318,7 +19331,7 @@ msgstr "请在浏览器中启用弹窗"
msgid "Please enable {} before continuing."
msgstr "请先启用{}再继续"
-#: frappe/utils/oauth.py:191
+#: frappe/utils/oauth.py:220
msgid "Please ensure that your profile has an email address"
msgstr "请确保您的个人资料有一个电子邮件地址,"
@@ -19392,7 +19405,7 @@ msgstr "请登录后发表评论"
msgid "Please make sure the Reference Communication Docs are not circularly linked."
msgstr "请确保参考通信单据未被递归引用。"
-#: frappe/model/document.py:992
+#: frappe/model/document.py:1006
msgid "Please refresh to get the latest document."
msgstr "请刷新获取最新数据。"
@@ -19400,7 +19413,7 @@ msgstr "请刷新获取最新数据。"
msgid "Please remove the printer mapping in Printer Settings and try again."
msgstr "请在打印机设置中移除打印机映射后重试"
-#: frappe/public/js/frappe/form/form.js:358
+#: frappe/public/js/frappe/form/form.js:359
msgid "Please save before attaching."
msgstr "请安装前保存。"
@@ -19432,7 +19445,7 @@ msgstr "请先选择实体类型"
msgid "Please select Minimum Password Score"
msgstr "请选择最低密码分数"
-#: frappe/public/js/frappe/views/reports/query_report.js:1193
+#: frappe/public/js/frappe/views/reports/query_report.js:1212
msgid "Please select X and Y fields"
msgstr "请选择X和Y轴字段"
@@ -19440,7 +19453,7 @@ msgstr "请选择X和Y轴字段"
msgid "Please select a country code for field {1}."
msgstr "请为字段{1}选择国家代码"
-#: frappe/public/js/frappe/file_uploader/FileUploader.vue:526
+#: frappe/public/js/frappe/file_uploader/FileUploader.vue:527
msgid "Please select a file first."
msgstr "请先选择文件"
@@ -19460,7 +19473,7 @@ msgstr "请选择有效日期过滤器"
msgid "Please select applicable Doctypes"
msgstr "请选择单据类型"
-#: frappe/model/db_query.py:1163
+#: frappe/model/db_query.py:1213
msgid "Please select atleast 1 column from {0} to sort/group"
msgstr "请选择从{0}进行排序/组ATLEAST 1柱"
@@ -19490,7 +19503,7 @@ msgstr "请设置电子邮件地址"
msgid "Please set a printer mapping for this print format in the Printer Settings"
msgstr "请在“打印机设置”中为此打印格式设置打印机映射"
-#: frappe/public/js/frappe/views/reports/query_report.js:1416
+#: frappe/public/js/frappe/views/reports/query_report.js:1435
msgid "Please set filters"
msgstr "请设置过滤条件"
@@ -19563,7 +19576,7 @@ msgstr "请再试一次"
msgid "Please update {} before continuing."
msgstr "继续前请更新{}"
-#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:333
+#: frappe/integrations/doctype/ldap_settings/ldap_settings.py:335
msgid "Please use a valid LDAP search filter"
msgstr "请使用有效的LDAP搜索过滤器"
@@ -19812,7 +19825,7 @@ msgctxt "Go to previous slide"
msgid "Previous"
msgstr "上一条"
-#: frappe/public/js/frappe/form/form.js:2216
+#: frappe/public/js/frappe/form/form.js:2229
msgid "Previous Submission"
msgstr "前次提交"
@@ -19864,13 +19877,13 @@ msgstr "文档类型{0}的主键存在值,不可修改"
#: frappe/public/js/frappe/form/toolbar.js:360
#: frappe/public/js/frappe/form/toolbar.js:372
#: frappe/public/js/frappe/list/bulk_operations.js:95
-#: frappe/public/js/frappe/views/reports/query_report.js:1797
+#: frappe/public/js/frappe/views/reports/query_report.js:1816
#: frappe/public/js/frappe/views/reports/report_view.js:1539
#: frappe/public/js/frappe/views/treeview.js:492 frappe/www/printview.html:18
msgid "Print"
msgstr "打印"
-#: frappe/public/js/frappe/list/list_view.js:2166
+#: frappe/public/js/frappe/list/list_view.js:2175
msgctxt "Button in list view actions menu"
msgid "Print"
msgstr "打印"
@@ -19940,7 +19953,7 @@ msgstr "打印格式帮助"
msgid "Print Format Type"
msgstr "打印格式类型"
-#: frappe/public/js/frappe/views/reports/query_report.js:1586
+#: frappe/public/js/frappe/views/reports/query_report.js:1605
msgid "Print Format not found"
msgstr ""
@@ -20036,7 +20049,7 @@ msgstr "打印宽度"
msgid "Print Width of the field, if the field is a column in a table"
msgstr "表中的列(字段)打印宽度"
-#: frappe/public/js/frappe/form/form.js:170
+#: frappe/public/js/frappe/form/form.js:171
msgid "Print document"
msgstr "打印单据"
@@ -20200,7 +20213,7 @@ msgstr "属性类型"
msgid "Protect Attached Files"
msgstr "保护上传的附件(文件)"
-#: frappe/core/doctype/file/file.py:526
+#: frappe/core/doctype/file/file.py:523
msgid "Protected File"
msgstr "受保护文件"
@@ -20484,7 +20497,7 @@ msgstr "排队时间"
msgid "Queued By"
msgstr "队列创建者"
-#: frappe/core/doctype/submission_queue/submission_queue.py:174
+#: frappe/core/doctype/submission_queue/submission_queue.py:186
msgid "Queued for Submission. You can track the progress over {0}."
msgstr "已加入提交队列,可通过{0}跟踪进度"
@@ -20869,7 +20882,7 @@ msgstr "Redis缓存服务器无法运行。请联系管理员/技术支持"
msgid "Redo"
msgstr "恢复"
-#: frappe/public/js/frappe/form/form.js:164
+#: frappe/public/js/frappe/form/form.js:165
#: frappe/public/js/frappe/form/toolbar.js:538
msgid "Redo last action"
msgstr "重做上一步操作"
@@ -21088,10 +21101,10 @@ msgstr "来源页"
#: frappe/printing/page/print/print.js:86 frappe/public/js/frappe/desk.js:168
#: frappe/public/js/frappe/desk.js:552
-#: frappe/public/js/frappe/form/form.js:1201
+#: frappe/public/js/frappe/form/form.js:1213
#: frappe/public/js/frappe/form/templates/print_layout.html:6
#: frappe/public/js/frappe/list/base_list.js:66
-#: frappe/public/js/frappe/views/reports/query_report.js:1786
+#: frappe/public/js/frappe/views/reports/query_report.js:1805
#: frappe/public/js/frappe/views/treeview.js:498
#: frappe/public/js/frappe/widgets/chart_widget.js:291
#: frappe/public/js/frappe/widgets/number_card_widget.js:352
@@ -21514,7 +21527,7 @@ msgstr "报表管理"
#: frappe/core/report/prepared_report_analytics/prepared_report_analytics.py:39
#: frappe/desk/doctype/dashboard_chart/dashboard_chart.json
#: frappe/desk/doctype/number_card/number_card.json
-#: frappe/public/js/frappe/views/reports/query_report.js:1973
+#: frappe/public/js/frappe/views/reports/query_report.js:1992
msgid "Report Name"
msgstr "报表名称"
@@ -21586,7 +21599,7 @@ msgstr "报表已成功更新"
msgid "Report was not saved (there were errors)"
msgstr "报表尚未保存(有错误)"
-#: frappe/public/js/frappe/views/reports/query_report.js:2011
+#: frappe/public/js/frappe/views/reports/query_report.js:2030
msgid "Report with more than 10 columns looks better in Landscape mode."
msgstr "超过10列的报表更适合横向模式"
@@ -21865,7 +21878,7 @@ msgstr "今日剩余时间"
msgid "Restore"
msgstr "恢复"
-#: frappe/core/page/permission_manager/permission_manager.js:509
+#: frappe/core/page/permission_manager/permission_manager.js:510
msgid "Restore Original Permissions"
msgstr "恢复原权限"
@@ -21914,8 +21927,8 @@ msgctxt "Title of message showing restrictions in list view"
msgid "Restrictions"
msgstr "限制条件"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:382
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:397
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:383
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:398
msgid "Result"
msgstr "结果"
@@ -22020,7 +22033,7 @@ msgstr "机器人自动回复文字"
#: frappe/core/doctype/user_type/user_type.json
#: frappe/core/doctype/user_type/user_type.py:110
#: frappe/core/page/permission_manager/permission_manager.js:219
-#: frappe/core/page/permission_manager/permission_manager.js:456
+#: frappe/core/page/permission_manager/permission_manager.js:457
#: frappe/core/workspace/users/users.json
#: frappe/desk/doctype/onboarding_permission/onboarding_permission.json
#: frappe/desk/doctype/todo/todo.json
@@ -22065,7 +22078,7 @@ msgstr "角色权限"
msgid "Role Permissions Manager"
msgstr "角色权限管理"
-#: frappe/public/js/frappe/list/list_view.js:1935
+#: frappe/public/js/frappe/list/list_view.js:1944
msgctxt "Button in list view menu"
msgid "Role Permissions Manager"
msgstr "角色权限管理器"
@@ -22210,7 +22223,7 @@ msgstr "网址重定向"
msgid "Route: Example \"/app\""
msgstr "路径: 例如 \"/app\""
-#: frappe/model/base_document.py:909 frappe/model/document.py:779
+#: frappe/model/base_document.py:909 frappe/model/document.py:791
msgid "Row"
msgstr "行"
@@ -22493,7 +22506,7 @@ msgstr "星期六"
#: frappe/public/js/frappe/views/kanban/kanban_settings.js:45
#: frappe/public/js/frappe/views/kanban/kanban_settings.js:189
#: frappe/public/js/frappe/views/kanban/kanban_view.js:357
-#: frappe/public/js/frappe/views/reports/query_report.js:1965
+#: frappe/public/js/frappe/views/reports/query_report.js:1984
#: frappe/public/js/frappe/views/reports/report_view.js:1735
#: frappe/public/js/frappe/views/workspace/workspace.js:335
#: frappe/public/js/frappe/widgets/base_widget.js:142
@@ -22516,7 +22529,7 @@ msgstr "另存为"
msgid "Save Customizations"
msgstr "保存自定义"
-#: frappe/public/js/frappe/views/reports/query_report.js:1968
+#: frappe/public/js/frappe/views/reports/query_report.js:1987
msgid "Save Report"
msgstr "保存报表"
@@ -22774,7 +22787,7 @@ msgstr "搜索框"
msgid "Search Fields"
msgstr "搜索字段"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:186
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:187
msgid "Search Help"
msgstr "搜索帮助"
@@ -22809,12 +22822,12 @@ msgstr "搜索字段类型"
msgid "Search for anything"
msgstr "搜索任何内容"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:300
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:306
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:301
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:307
msgid "Search for {0}"
msgstr "搜索{0}"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:166
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:167
msgid "Search in a document type"
msgstr "在单据类型中搜索"
@@ -22896,7 +22909,7 @@ msgstr "查看所有活动"
msgid "See all past reports."
msgstr "点这儿可以查看之前的历史报表。"
-#: frappe/public/js/frappe/form/form.js:1235
+#: frappe/public/js/frappe/form/form.js:1247
#: frappe/website/doctype/contact_us_settings/contact_us_settings.js:4
msgid "See on Website"
msgstr "在门户网站查看"
@@ -22955,7 +22968,7 @@ msgid "Select"
msgstr "单选"
#: frappe/public/js/frappe/data_import/data_exporter.js:149
-#: frappe/public/js/frappe/form/controls/multicheck.js:166
+#: frappe/public/js/frappe/form/controls/multicheck.js:167
#: frappe/public/js/frappe/form/grid_row.js:498
msgid "Select All"
msgstr "全选"
@@ -23193,13 +23206,13 @@ msgstr "选择打印ATLEAST 1项纪录"
msgid "Select atleast 2 actions"
msgstr "选择至少2个操作"
-#: frappe/public/js/frappe/list/list_view.js:1447
+#: frappe/public/js/frappe/list/list_view.js:1456
msgctxt "Description of a list view shortcut"
msgid "Select list item"
msgstr "选择列表项"
-#: frappe/public/js/frappe/list/list_view.js:1399
-#: frappe/public/js/frappe/list/list_view.js:1415
+#: frappe/public/js/frappe/list/list_view.js:1408
+#: frappe/public/js/frappe/list/list_view.js:1424
msgctxt "Description of a list view shortcut"
msgid "Select multiple list items"
msgstr "选择多个列表项"
@@ -23645,7 +23658,7 @@ msgstr "设置过滤条件"
msgid "Set Filters for {0}"
msgstr "为{0}设置过滤器"
-#: frappe/public/js/frappe/views/reports/query_report.js:2121
+#: frappe/public/js/frappe/views/reports/query_report.js:2140
msgid "Set Level"
msgstr "设置层级"
@@ -23885,7 +23898,7 @@ msgstr "设置 > 用户"
msgid "Setup > User Permissions"
msgstr "设置 > 用户权限"
-#: frappe/public/js/frappe/views/reports/query_report.js:1834
+#: frappe/public/js/frappe/views/reports/query_report.js:1853
#: frappe/public/js/frappe/views/reports/report_view.js:1713
msgid "Setup Auto Email"
msgstr "设置电子邮件自动发送"
@@ -24032,7 +24045,7 @@ msgstr "显示错误"
msgid "Show External Link Warning"
msgstr ""
-#: frappe/public/js/frappe/form/layout.js:578
+#: frappe/public/js/frappe/form/layout.js:586
msgid "Show Fieldname (click to copy on clipboard)"
msgstr "显示字段名(点击复制到剪贴板)"
@@ -24160,7 +24173,7 @@ msgid "Show Social Login Key as Authorization Server"
msgstr ""
#: frappe/public/js/frappe/list/list_sidebar.html:77
-#: frappe/public/js/frappe/list/list_view.js:1851
+#: frappe/public/js/frappe/list/list_view.js:1860
msgid "Show Tags"
msgstr "显示标签"
@@ -24265,8 +24278,8 @@ msgstr "显示文档链接"
msgid "Show list"
msgstr "显示列表"
-#: frappe/public/js/frappe/form/layout.js:272
-#: frappe/public/js/frappe/form/layout.js:290
+#: frappe/public/js/frappe/form/layout.js:280
+#: frappe/public/js/frappe/form/layout.js:298
msgid "Show more details"
msgstr "显示更多详情"
@@ -24404,7 +24417,7 @@ msgstr "单笔记录单据类型只有一条记录,适用于存储系统或模
msgid "Site is running in read only mode for maintenance or site update, this action can not be performed right now. Please try again later."
msgstr "站点处于维护或更新的只读模式,当前操作不可执行,请稍后重试"
-#: frappe/public/js/frappe/views/file/file_view.js:370
+#: frappe/public/js/frappe/views/file/file_view.js:371
msgid "Size"
msgstr "大小"
@@ -24731,7 +24744,7 @@ msgstr "指定允许嵌入此表单的域名或源。每行输入一个域名(
msgid "Splash Image"
msgstr "启动图像"
-#: frappe/desk/reportview.py:455
+#: frappe/desk/reportview.py:456
#: frappe/public/js/frappe/web_form/web_form_list.js:176
#: frappe/templates/print_formats/standard_macros.html:44
msgid "Sr"
@@ -25189,7 +25202,7 @@ msgstr "提交队列"
msgid "Submit"
msgstr "提交"
-#: frappe/public/js/frappe/list/list_view.js:2233
+#: frappe/public/js/frappe/list/list_view.js:2242
msgctxt "Button in list view actions menu"
msgid "Submit"
msgstr "提交"
@@ -25243,11 +25256,11 @@ msgstr "创建时提交"
msgid "Submit this document to complete this step."
msgstr "提交此文档以完成此步骤"
-#: frappe/public/js/frappe/form/form.js:1221
+#: frappe/public/js/frappe/form/form.js:1233
msgid "Submit this document to confirm"
msgstr "点提交按钮进行确认"
-#: frappe/public/js/frappe/list/list_view.js:2238
+#: frappe/public/js/frappe/list/list_view.js:2247
msgctxt "Title of confirmation dialog"
msgid "Submit {0} documents?"
msgstr "是否提交{0}个文档?"
@@ -25827,7 +25840,7 @@ msgstr "表格已截断"
msgid "Table updated"
msgstr "表更新"
-#: frappe/model/document.py:1578
+#: frappe/model/document.py:1592
msgid "Table {0} cannot be empty"
msgstr "表{0}不能为空"
@@ -25854,7 +25867,7 @@ msgstr "标签链接"
#: frappe/public/js/frappe/list/list_sidebar.js:253
#: frappe/public/js/frappe/model/meta.js:207
#: frappe/public/js/frappe/model/model.js:133
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:171
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:172
msgid "Tags"
msgstr "标签"
@@ -26008,7 +26021,7 @@ msgstr "文本编辑器"
msgid "Thank you"
msgstr "谢谢"
-#: frappe/www/contact.py:39
+#: frappe/www/contact.py:46
msgid "Thank you for reaching out to us. We will get back to you at the earliest.\n\n\n"
"Your query:\n\n"
"{0}"
@@ -26328,7 +26341,7 @@ msgstr ""
msgid "There is nothing new to show you right now."
msgstr "暂无可显示新消息"
-#: frappe/core/doctype/file/file.py:643 frappe/utils/file_manager.py:372
+#: frappe/core/doctype/file/file.py:640 frappe/utils/file_manager.py:372
msgid "There is some problem with the file url: {0}"
msgstr "有一些问题与文件的URL:{0}"
@@ -26461,23 +26474,27 @@ msgstr "此文档类型无孤立字段需清理"
msgid "This doctype has pending migrations, run 'bench migrate' before modifying the doctype to avoid losing changes."
msgstr "此文档类型有待执行迁移,修改前请运行'bench migrate'以避免丢失更改。"
-#: frappe/model/delete_doc.py:153
+#: frappe/model/delete_doc.py:155
msgid "This document can not be deleted right now as it's being modified by another user. Please try again after some time."
msgstr "此文档正被其他用户修改,暂时无法删除。请稍后重试。"
+#: frappe/core/doctype/submission_queue/submission_queue.py:171
+msgid "This document has already been queued for submission. You can track the progress over {0}."
+msgstr ""
+
#: frappe/www/confirm_workflow_action.html:8
msgid "This document has been modified after the email was sent."
msgstr "发电子邮件后,此单据已被修改。"
-#: frappe/public/js/frappe/form/form.js:1305
+#: frappe/public/js/frappe/form/form.js:1317
msgid "This document has unsaved changes which might not appear in final PDF.
Consider saving the document before printing."
msgstr "此文档存在未保存更改,可能不会反映在最终PDF中。
打印前请先保存文档。"
-#: frappe/public/js/frappe/form/form.js:1102
+#: frappe/public/js/frappe/form/form.js:1105
msgid "This document is already amended, you cannot ammend it again"
msgstr "此文档已修订,不可再次修订"
-#: frappe/model/document.py:475
+#: frappe/model/document.py:487
msgid "This document is currently locked and queued for execution. Please try again after some time."
msgstr "单据被后台待执行操作锁定,请稍后再试。"
@@ -26507,7 +26524,7 @@ msgstr "本字段仅在以上代码框中定义的字段有值或表达式(js代
"案例2:年龄大于18
\n"
"eval:doc.age>18"
-#: frappe/core/doctype/file/file.py:525
+#: frappe/core/doctype/file/file.py:522
msgid "This file is attached to a protected document and cannot be deleted."
msgstr "该文件已关联至受保护文档,不可删除。"
@@ -26519,11 +26536,11 @@ msgstr "本文件为公开文件,无需登录即可访问。请设为私有以
msgid "This file is public. It can be accessed without authentication."
msgstr "此为公开文件,用户无需登录即可访问"
-#: frappe/public/js/frappe/form/form.js:1199
+#: frappe/public/js/frappe/form/form.js:1211
msgid "This form has been modified after you have loaded it"
msgstr "重新加载后表单就已被修改,"
-#: frappe/public/js/frappe/form/form.js:2259
+#: frappe/public/js/frappe/form/form.js:2272
msgid "This form is not editable due to a Workflow."
msgstr "此表单因工作流状态不能被编辑。"
@@ -26542,7 +26559,7 @@ msgstr "暂不支持此地理位置服务提供商。"
msgid "This goes above the slideshow."
msgstr "在幻灯片上面。"
-#: frappe/public/js/frappe/views/reports/query_report.js:2197
+#: frappe/public/js/frappe/views/reports/query_report.js:2216
msgid "This is a background report. Please set the appropriate filters and then generate a new one."
msgstr "此报表是后台运行报表,请设置恰当的过滤条件并点击右上角生成新报表按钮获取报表结果"
@@ -26592,7 +26609,7 @@ msgstr "可能会打印多页"
msgid "This month"
msgstr "这个月"
-#: frappe/public/js/frappe/views/reports/query_report.js:1045
+#: frappe/public/js/frappe/views/reports/query_report.js:1049
msgid "This report contains {0} rows and is too big to display in browser, you can {1} this report instead."
msgstr "此报告包含{0}行数据,浏览器显示过大,建议{1}此报告。"
@@ -27088,7 +27105,7 @@ msgstr "切换到图标视图"
msgid "Toggle Sidebar"
msgstr "切换边栏"
-#: frappe/public/js/frappe/list/list_view.js:1966
+#: frappe/public/js/frappe/list/list_view.js:1975
msgctxt "Button in list view menu"
msgid "Toggle Sidebar"
msgstr "切换侧边栏"
@@ -27125,7 +27142,7 @@ msgstr "令牌类型"
msgid "Token URI"
msgstr "令牌URI"
-#: frappe/utils/oauth.py:184
+#: frappe/utils/oauth.py:213
msgid "Token is missing"
msgstr "令牌丢失"
@@ -27214,7 +27231,7 @@ msgstr "主题"
#: frappe/desk/query_report.py:587
#: frappe/public/js/frappe/views/reports/print_grid.html:45
-#: frappe/public/js/frappe/views/reports/query_report.js:1332
+#: frappe/public/js/frappe/views/reports/query_report.js:1351
#: frappe/public/js/frappe/views/reports/report_view.js:1553
msgid "Total"
msgstr "总计"
@@ -27373,7 +27390,7 @@ msgstr "状态转换"
msgid "Translatable"
msgstr "可翻译"
-#: frappe/public/js/frappe/views/reports/query_report.js:2252
+#: frappe/public/js/frappe/views/reports/query_report.js:2271
msgid "Translate Data"
msgstr "翻译数据"
@@ -27535,7 +27552,7 @@ msgstr "双重验证方法"
#: frappe/desk/doctype/workspace/workspace.json
#: frappe/desk/doctype/workspace_link/workspace_link.json
#: frappe/desk/doctype/workspace_shortcut/workspace_shortcut.json
-#: frappe/public/js/frappe/views/file/file_view.js:370
+#: frappe/public/js/frappe/views/file/file_view.js:371
#: frappe/public/js/frappe/views/workspace/workspace.js:399
#: frappe/public/js/frappe/widgets/widget_dialog.js:404
#: frappe/website/doctype/web_template/web_template.json
@@ -27732,7 +27749,7 @@ msgstr "缺少邮箱账户无法发送邮件,请通过设置>邮箱账户配
msgid "Unable to update event"
msgstr "无法更新事件"
-#: frappe/core/doctype/file/file.py:489
+#: frappe/core/doctype/file/file.py:486
msgid "Unable to write file format for {0}"
msgstr "无法写入{0}的文件格式"
@@ -27837,7 +27854,7 @@ msgid "Unsafe SQL query"
msgstr "不安全的SQL查询"
#: frappe/public/js/frappe/data_import/data_exporter.js:159
-#: frappe/public/js/frappe/form/controls/multicheck.js:166
+#: frappe/public/js/frappe/form/controls/multicheck.js:167
msgid "Unselect All"
msgstr "全部不选"
@@ -28159,7 +28176,7 @@ msgstr "使用别的邮箱账号"
msgid "Use if the default settings don't seem to detect your data correctly"
msgstr "当默认设置无法正确识别数据时使用"
-#: frappe/model/db_query.py:411
+#: frappe/model/db_query.py:460
msgid "Use of sub-query or function is restricted"
msgstr "子查询或函数的使用受到限制"
@@ -28381,12 +28398,12 @@ msgstr "用户权限限制"
#. Label of a Link in the Users Workspace
#: frappe/core/page/permission_manager/permission_manager_help.html:30
#: frappe/core/workspace/users/users.json
-#: frappe/public/js/frappe/views/reports/query_report.js:1952
+#: frappe/public/js/frappe/views/reports/query_report.js:1971
#: frappe/public/js/frappe/views/reports/report_view.js:1761
msgid "User Permissions"
msgstr "用户权限限制"
-#: frappe/public/js/frappe/list/list_view.js:1924
+#: frappe/public/js/frappe/list/list_view.js:1933
msgctxt "Button in list view menu"
msgid "User Permissions"
msgstr "用户权限"
@@ -28526,7 +28543,7 @@ msgstr "用户{0}已请求数据删除"
msgid "User {0} impersonated as {1}"
msgstr "用户 {0} 以 {1} 身份登录"
-#: frappe/utils/oauth.py:269
+#: frappe/utils/oauth.py:298
msgid "User {0} is disabled"
msgstr "用户{0}已禁用"
@@ -28575,7 +28592,7 @@ msgstr "用户"
msgid "Users are only able to delete attached files if the document is either in draft or if the document is canceled and they are also able to delete the document."
msgstr "仅限用户有单据删除权限且单据在草稿或已取消状态下删除上传的附件"
-#: frappe/core/page/permission_manager/permission_manager.js:355
+#: frappe/core/page/permission_manager/permission_manager.js:356
msgid "Users with role {0}:"
msgstr "被分派了角色{0}的用户:"
@@ -28691,15 +28708,15 @@ msgstr "值变更的字段"
msgid "Value To Be Set"
msgstr "字段值"
-#: frappe/model/base_document.py:1115 frappe/model/document.py:835
+#: frappe/model/base_document.py:1115 frappe/model/document.py:847
msgid "Value cannot be changed for {0}"
msgstr "值不能被改变为{0}"
-#: frappe/model/document.py:781
+#: frappe/model/document.py:793
msgid "Value cannot be negative for"
msgstr "值不能为负数:"
-#: frappe/model/document.py:785
+#: frappe/model/document.py:797
msgid "Value cannot be negative for {0}: {1}"
msgstr "{0}的值不能为负数:{1}"
@@ -29017,7 +29034,7 @@ msgstr "我们已收到您的请求,要求您下载与{1}相关联的{0}数据
msgid "We would like to thank the authors of these packages for their contribution."
msgstr "感谢以下软件包作者的贡献"
-#: frappe/www/contact.py:50
+#: frappe/www/contact.py:57
msgid "We've received your query!"
msgstr "已收到您的查询!"
@@ -29478,7 +29495,7 @@ msgstr "工作流"
#. Name of a DocType
#: frappe/workflow/doctype/workflow_action/workflow_action.json
-#: frappe/workflow/doctype/workflow_action/workflow_action.py:444
+#: frappe/workflow/doctype/workflow_action/workflow_action.py:446
msgid "Workflow Action"
msgstr "待审批工作流"
@@ -29734,7 +29751,7 @@ msgstr "Y轴字段"
#. Label of the y_field (Select) field in DocType 'Dashboard Chart Field'
#: frappe/desk/doctype/dashboard_chart_field/dashboard_chart_field.json
-#: frappe/public/js/frappe/views/reports/query_report.js:1233
+#: frappe/public/js/frappe/views/reports/query_report.js:1252
msgid "Y Field"
msgstr "Y轴字段"
@@ -29796,7 +29813,7 @@ msgstr "黄色"
#: frappe/public/js/form_builder/utils.js:336
#: frappe/public/js/frappe/form/controls/link.js:498
#: frappe/public/js/frappe/list/list_sidebar_group_by.js:223
-#: frappe/public/js/frappe/views/reports/query_report.js:1673
+#: frappe/public/js/frappe/views/reports/query_report.js:1692
#: frappe/website/doctype/help_article/templates/help_article.html:25
msgid "Yes"
msgstr "是"
@@ -29874,7 +29891,7 @@ msgstr "您无权编辑此报表"
#: frappe/core/doctype/data_import/exporter.py:121
#: frappe/core/doctype/data_import/exporter.py:125
-#: frappe/desk/reportview.py:444 frappe/desk/reportview.py:447
+#: frappe/desk/reportview.py:445 frappe/desk/reportview.py:448
#: frappe/permissions.py:626
msgid "You are not allowed to export {} doctype"
msgstr "未被授权导出单据类型{}"
@@ -29960,11 +29977,11 @@ msgstr "可在 {0} 中设置日志保留天数让系统自动删除过期数据"
msgid "You can continue with the onboarding after exploring this page"
msgstr "浏览本页后可继续完成新手引导"
-#: frappe/model/delete_doc.py:177
+#: frappe/model/delete_doc.py:179
msgid "You can disable this {0} instead of deleting it."
msgstr "你可以禁用而不是删除物料 {0}"
-#: frappe/core/doctype/file/file.py:761
+#: frappe/core/doctype/file/file.py:758
msgid "You can increase the limit from System Settings."
msgstr "可从系统设置中提高限制"
@@ -30087,11 +30104,11 @@ msgstr "您未被授权完成此操作"
msgid "You do not have permission to access field: {0}"
msgstr ""
-#: frappe/desk/query_report.py:923
+#: frappe/desk/query_report.py:934
msgid "You do not have permission to access {0}: {1}."
msgstr "您无权访问{0}:{1}。"
-#: frappe/public/js/frappe/form/form.js:960
+#: frappe/public/js/frappe/form/form.js:963
msgid "You do not have permissions to cancel all linked documents."
msgstr "没有权限取消所有关联的单据"
@@ -30176,7 +30193,7 @@ msgstr "必须登录才能使用此表单"
msgid "You must login to submit this form"
msgstr "您必须登录才能提交此表单"
-#: frappe/model/document.py:358
+#: frappe/model/document.py:370
msgid "You need the '{0}' permission on {1} {2} to perform this action."
msgstr "执行此操作需要{1} {2}的'{0}'权限"
@@ -30398,7 +30415,7 @@ msgstr "电子邮件页脚上您的组织名称和地址。"
msgid "Your query has been received. We will reply back shortly. If you have any additional information, please reply to this mail."
msgstr "您的问题已收到。我们将尽快回复邮件。如果您还有任何其他的信息,请回覆此邮件。"
-#: frappe/desk/query_report.py:342 frappe/desk/reportview.py:396
+#: frappe/desk/query_report.py:342 frappe/desk/reportview.py:397
msgid "Your report is being generated in the background. You will receive an email on {0} with a download link once it is ready."
msgstr ""
@@ -30573,7 +30590,7 @@ msgstr "删除"
msgid "descending"
msgstr "降序"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:163
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:164
msgid "document type..., e.g. customer"
msgstr "单据类型...,如客户"
@@ -30583,7 +30600,7 @@ msgstr "单据类型...,如客户"
msgid "e.g. \"Support\", \"Sales\", \"Jerry Yang\""
msgstr "例如“支持“,”销售“,”杨杰“"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:183
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:184
msgid "e.g. (55 + 434) / 4 or =Math.sin(Math.PI/2)..."
msgstr "例如:(55 + 434)/ 4 =或Math.sin(Math.PI / 2)..."
@@ -30630,7 +30647,7 @@ msgid "email inbox"
msgstr "电子邮件收件箱"
#: frappe/permissions.py:425 frappe/permissions.py:436
-#: frappe/public/js/frappe/form/controls/link.js:507
+#: frappe/public/js/frappe/form/controls/link.js:510
msgid "empty"
msgstr "空"
@@ -30779,7 +30796,7 @@ msgstr "月/日/年"
msgid "module"
msgstr "模块"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:178
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:179
msgid "module name..."
msgstr "模块名称..."
@@ -30787,7 +30804,7 @@ msgstr "模块名称..."
msgid "new"
msgstr "新建"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:158
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:159
msgid "new type of document"
msgstr "单据新类型"
@@ -31016,11 +31033,11 @@ msgstr "字符串值,例如{0}或uid={0},ou=users,dc=example,dc=com"
msgid "submit"
msgstr "提交"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:173
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:174
msgid "tag name..., e.g. #tag"
msgstr "标签名称...,例如#标签"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:168
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:169
msgid "text in document type"
msgstr "文件类型的文本"
@@ -31167,8 +31184,8 @@ msgstr "{0}({1})(至少1行)"
msgid "{0} ({1}) - {2}%"
msgstr "{0}({1})- {2}%"
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:374
-#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:377
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:375
+#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:378
msgid "{0} = {1}"
msgstr "{0} = {1}"
@@ -31324,7 +31341,7 @@ msgctxt "Form timeline"
msgid "{0} cancelled this document {1}"
msgstr "{0}于{1}取消了此文档"
-#: frappe/model/document.py:548
+#: frappe/model/document.py:560
msgid "{0} cannot be amended because it is not cancelled. Please cancel the document before creating an amendment."
msgstr "{0}未被取消,无法修订。请在创建修订前取消该文档"
@@ -31433,7 +31450,7 @@ msgstr "行{1}中的{0}不能同时有URL和子项"
msgid "{0} is a mandatory field"
msgstr "{0}是必填字段"
-#: frappe/core/doctype/file/file.py:569
+#: frappe/core/doctype/file/file.py:566
msgid "{0} is a not a valid zip file"
msgstr "{0}不是有效的zip文件"
@@ -31539,7 +31556,7 @@ msgstr "{0}不是{1}的有效父字段"
msgid "{0} is not a valid report format. Report format should one of the following {1}"
msgstr "{0}不是有效的报告格式。报告格式应为以下之一:{1}"
-#: frappe/core/doctype/file/file.py:549
+#: frappe/core/doctype/file/file.py:546
msgid "{0} is not a zip file"
msgstr "{0}不是zip文件"
@@ -31587,7 +31604,7 @@ msgstr "{0}已设置"
msgid "{0} is within {1}"
msgstr "{0}在{1}范围内"
-#: frappe/public/js/frappe/list/list_view.js:1841
+#: frappe/public/js/frappe/list/list_view.js:1850
msgid "{0} items selected"
msgstr "已选{0}条记录"
@@ -31624,23 +31641,23 @@ msgstr "{0}分钟前"
msgid "{0} months ago"
msgstr "{0}个月前"
-#: frappe/model/document.py:1808
+#: frappe/model/document.py:1822
msgid "{0} must be after {1}"
msgstr "{0}必须在{1}之后"
-#: frappe/model/document.py:1564
+#: frappe/model/document.py:1578
msgid "{0} must be beginning with '{1}'"
msgstr "{0}必须以'{1}'开头"
-#: frappe/model/document.py:1566
+#: frappe/model/document.py:1580
msgid "{0} must be equal to '{1}'"
msgstr "{0}必须等于'{1}'"
-#: frappe/model/document.py:1562
+#: frappe/model/document.py:1576
msgid "{0} must be none of {1}"
msgstr "{0}不能是{1}中的任何一项"
-#: frappe/model/document.py:1560 frappe/utils/csvutils.py:161
+#: frappe/model/document.py:1574 frappe/utils/csvutils.py:161
msgid "{0} must be one of {1}"
msgstr "{0}必须属于{1}"
@@ -31652,7 +31669,7 @@ msgstr "{0}必须首先设置"
msgid "{0} must be unique"
msgstr "{0}必须是唯一的"
-#: frappe/model/document.py:1568
+#: frappe/model/document.py:1582
msgid "{0} must be {1} {2}"
msgstr "{0}必须为{1}{2}"
@@ -31673,11 +31690,11 @@ msgid "{0} not found"
msgstr "{0}未找到"
#: frappe/core/doctype/report/report.py:427
-#: frappe/public/js/frappe/list/list_view.js:1213
+#: frappe/public/js/frappe/list/list_view.js:1222
msgid "{0} of {1}"
msgstr "第{0}项 / 共{1}项"
-#: frappe/public/js/frappe/list/list_view.js:1215
+#: frappe/public/js/frappe/list/list_view.js:1224
msgid "{0} of {1} ({2} rows with children)"
msgstr "{0} / {1} ({2} 行有子记录)"
@@ -31731,7 +31748,7 @@ msgstr ""
msgid "{0} role does not have permission on any doctype"
msgstr "角色 {0} 无单据类型权限"
-#: frappe/model/document.py:1799
+#: frappe/model/document.py:1813
msgid "{0} row #{1}:"
msgstr ""
@@ -31853,7 +31870,7 @@ msgstr "{0} {1}不能是一个叶节点,因为它有下级"
msgid "{0} {1} does not exist, select a new target to merge"
msgstr "{0} {1}不存在,选择一个新的目标合并"
-#: frappe/public/js/frappe/form/form.js:951
+#: frappe/public/js/frappe/form/form.js:954
msgid "{0} {1} is linked with the following submitted documents: {2}"
msgstr "{0} {1} 关联了下列已提交单据: {2}"
@@ -31861,7 +31878,7 @@ msgstr "{0} {1} 关联了下列已提交单据: {2}"
msgid "{0} {1} not found"
msgstr "{0} {1}未找到"
-#: frappe/model/delete_doc.py:288
+#: frappe/model/delete_doc.py:290
msgid "{0} {1}: Submitted Record cannot be deleted. You must {2} Cancel {3} it first."
msgstr "{0} {1}: 已提交单据不可被删除. 应 {2} 先取消 {3}."
@@ -31974,7 +31991,7 @@ msgstr "{0}:{1}"
msgid "{0}: {1} is set to state {2}"
msgstr "{0}:{1} 状态已变更为 {2}"
-#: frappe/public/js/frappe/views/reports/query_report.js:1291
+#: frappe/public/js/frappe/views/reports/query_report.js:1310
msgid "{0}: {1} vs {2}"
msgstr "{0}:{1}与{2}"
@@ -32006,7 +32023,7 @@ msgstr "已选择{count}行"
msgid "{{{0}}} is not a valid fieldname pattern. It should be {{field_name}}."
msgstr "{{{0}}}是不是一个有效的字段名模式。它应该是{{FIELD_NAME}}。"
-#: frappe/public/js/frappe/form/form.js:521
+#: frappe/public/js/frappe/form/form.js:524
msgid "{} Complete"
msgstr "已完成{}"
diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py
index e96e032784..bf3f09acac 100644
--- a/frappe/model/db_query.py
+++ b/frappe/model/db_query.py
@@ -8,7 +8,11 @@ import json
import re
from collections import Counter
from collections.abc import Mapping, Sequence
-from functools import cached_property
+from functools import cached_property, lru_cache
+
+import sqlparse
+from sqlparse import tokens
+from sqlparse.sql import Function, Parenthesis, Statement
import frappe
import frappe.defaults
@@ -33,6 +37,22 @@ from frappe.utils import (
)
from frappe.utils.data import DateTimeLikeObject, get_datetime, getdate, sbool
+
+@lru_cache(maxsize=128)
+def _parse_sql(field: str) -> Statement | None:
+ """
+ Parse a given SQL statement using `sqlparse`.
+
+ Args:
+ field (str): The SQL statement string to parse.
+
+ Returns:
+ Statement | None: A `sqlparse.sql.Statement` object if parsing succeeds, otherwise `None`.
+ """
+ if parsed := sqlparse.parse(field):
+ return parsed[0]
+
+
LOCATE_PATTERN = re.compile(r"locate\([^,]+,\s*[`\"]?name[`\"]?\s*\)", flags=re.IGNORECASE)
LOCATE_CAST_PATTERN = re.compile(r"locate\(([^,]+),\s*([`\"]?name[`\"]?)\s*\)", flags=re.IGNORECASE)
FUNC_IFNULL_PATTERN = re.compile(r"(strpos|ifnull|coalesce)\(\s*[`\"]?name[`\"]?\s*,", flags=re.IGNORECASE)
@@ -456,6 +476,46 @@ from {tables}
"sleep",
]
+ def _find_subqueries(parsed: Statement) -> list:
+ """
+ Recursively find all subqueries in a parsed SQL statement.
+ """
+ subqueries = []
+
+ for token in parsed.tokens:
+ if isinstance(token, Parenthesis):
+ # Check for DML token for subquery check
+ is_subquery = False
+ for sub_token in token.tokens:
+ if sub_token.ttype is tokens.DML:
+ is_subquery = True
+ break
+ if is_subquery:
+ subqueries.append(token)
+ # Recursively check for nested subqueries
+ subqueries.extend(_find_subqueries(token))
+ elif token.is_group:
+ subqueries.extend(_find_subqueries(token))
+
+ return subqueries
+
+ def _check_sql_token(statement: Statement) -> None:
+ """
+ Checks the output of `sqlparse.parse()` to detect blocked functions and subqueries.
+ """
+ if _find_subqueries(statement):
+ _raise_exception()
+
+ for token in statement.tokens:
+ if isinstance(token, Function):
+ if (name := (token.get_name())) and name.lower() in blacklisted_functions:
+ _raise_exception()
+ if token.ttype == tokens.Keyword:
+ if token.value.lower() in blacklisted_keywords:
+ _raise_exception()
+ if token.is_group:
+ _check_sql_token(token)
+
def _raise_exception():
frappe.throw(_("Use of sub-query or function is restricted"), frappe.DataError)
@@ -470,21 +530,8 @@ from {tables}
lower_field = field.lower().strip()
if SUB_QUERY_PATTERN.match(field):
- # Check for subquery anywhere in the field, not just at the beginning
- if "(" in lower_field:
- # Check all parentheses pairs, not just the first one
- paren_start = 0
- while True:
- location = lower_field.find("(", paren_start)
- if location == -1:
- break
- token = lower_field[location + 1 :].lstrip().split(" ", 1)[0]
- if any(
- re.search(r"\b" + re.escape(keyword) + r"\b", token)
- for keyword in blacklisted_keywords + blacklisted_functions
- ):
- _raise_exception()
- paren_start = location + 1
+ # Check all tokens for subquery detection
+ _check_sql_token(_parse_sql(field))
if "@" in lower_field:
# prevent access to global variables
diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js
index 9dfe87684f..7755636faa 100644
--- a/frappe/public/js/frappe/views/reports/report_view.js
+++ b/frappe/public/js/frappe/views/reports/report_view.js
@@ -1585,7 +1585,10 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
fields: this.get_dialog_fields(),
primary_action: (values) => {
// doctype fields
- let fields = values[this.doctype].map((f) => [f, this.doctype]);
+ let fields = (values[this.doctype] || []).map((f) => [
+ f,
+ this.doctype,
+ ]);
delete values[this.doctype];
// child table fields
@@ -1610,6 +1613,18 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
},
});
+ const $bulk = $(`
+
+
+
+
+ `);
+ const toggleAll = (checked) =>
+ d.$wrapper.find(":checkbox").prop("checked", checked).trigger("change");
+ $bulk.on("click", "[data-action=select_all]", () => toggleAll(true));
+ $bulk.on("click", "[data-action=unselect_all]", () => toggleAll(false));
+ d.$body.prepend($bulk);
+
d.$body.prepend(`