键盘快捷键

键盘快捷键

键盘快捷键可以帮助你在 Frappe Desk 中快速操作,无需在键盘和鼠标之间来回切换。使用它们可以打开页面、搜索记录、保存表单、打开帮助,以及在 Desk 的任何位置查看完整的快捷键列表。

Desk 中显示的快捷键会跟随你的操作系统。在 macOS 上,Desk 将 Command 显示为 ⌘,将 Option 显示为 ⌥。在 Windows 和 Linux 上,请使用相应的 Ctrl 和 Alt 键。

查看键盘快捷键

按 Shift + / 打开键盘快捷键面板。该面板列出了 Desk 中可用的全局快捷键。

全局快捷键

快捷键 操作
⌘ + S 触发当前页面上的主要操作。在表单上,这通常是保存操作。
⌘ + K 打开 Awesomebar(全局搜索栏)。
⌘ + G 打开 Awesomebar(全局搜索栏)。
⌥ + S 打开设置。
Shift + / 显示键盘快捷键。
⌥ + H 打开帮助。
Shift + ⌘ + R 清除缓存并重新加载。
Shift + T 打开控制台。
Shift + ⌘ + G 切换主题。

按 Alt 键可以显示菜单和侧边栏中的更多快捷键。

使用 Awesomebar 打开页面

按 ⌘ + K 或 ⌘ + G 打开 Awesomebar。开始输入你想打开的页面、报表、文档类型或记录,然后使用方向键在结果中移动,按 Enter 键选择。

  • 使用 上 和 下 方向键在结果中移动。
  • 按 Enter 打开选中的结果。
  • 按 Esc 关闭 Awesomebar 或快捷键面板。

当快捷键不起作用时

某些浏览器、操作系统或扩展程序的快捷键可能会优先于 Desk 的快捷键。如果某个快捷键不起作用,请点击 Desk 页面内部,然后重试。如果光标位于文本字段内,请先关闭该字段或将焦点移回页面,然后再使用全局快捷键。

通知

Frappe 框架中的通知文档类型提供了一种强大的方式,可以在系统中发生特定事件时,通过不同渠道自动发送通知。本指南将介绍如何有效配置和使用通知功能。

常规设置

  • 启用:开关,用于激活或停用通知。
  • 渠道:选择通知的发送方式:
    • 电子邮件:通过电子邮件发送通知
    • Slack:发送通知到 Slack 频道
    • 系统通知:在 Frappe 界面内显示通知
    • 短信:通过短信发送通知(需要配置短信设置)
  • 标准:用于开发者模式;将通知标记为标准模块的一部分

事件触发器

通知可以根据各种事件触发:

文档事件

  • 新建:创建新文档时触发
  • 保存:保存文档时触发
  • 提交:提交文档时触发
  • 取消:取消文档时触发

基于日期的事件

  • 提前天数:在日期字段值之前的指定天数触发
  • 延后天数:在日期字段值之后的指定天数触发
  • 使用这些事件时:
    • 参考日期:选择要监控的日期字段
    • 提前或延后天数:指定触发日期之前/之后的天数

基于值的事件

  • 值变更:当特定字段的值发生变化时触发
    • 变更的字段:选择要监控变化的字段

基于方法的事件

  • 方法:当调用特定文档方法时触发
    • 触发方法:指定方法名称(例如 “before_insert”、”after_update”)

自定义事件

  • 自定义:用于通过编程方式触发的通知

条件触发器

您可以通过添加条件使通知更具针对性:

  • 条件:一个 Python 表达式,必须计算结果为 True 才会发送通知
  • 条件可以访问:
    • doc:触发通知的文档
    • nowdate():当前日期函数
    • frappe.utils:工具函数

示例

  • 文档的状态为”开放”

    doc.status=="Open"
    
  • 文档的截止日期与当前日期匹配

    doc.due_date==nowdate()
    
  • 总额大于 40,000

    doc.total > 40000
    

收件人配置

电子邮件、系统通知和短信渠道

使用收件人表格配置收件人:

  1. 接收者类型:

    • 按文档字段:选择包含电子邮件地址/电话号码的字段
    • 按角色:选择接收通知的用户角色
    • 自定义:指定自定义收件人
  2. 其他选项:

    • 抄送/密送:用于电子邮件通知
    • 条件:用于有条件地包含收件人的 Python 表达式
    • 发送给所有负责人:包括分配给该文档的所有用户

对于 Slack 频道

  • 从下拉菜单中选择预定义的 Slack Webhook URL

消息配置

主题(用于电子邮件、Slack 和系统通知)

  • 输入主题行文本
  • 支持 Jinja 模板:{{ doc.name }} Delivered

消息正文

  • 消息类型:选择 HTML、Markdown 或纯文本(仅在开发者模式下可用)
  • 消息:输入通知内容
  • 使用 Jinja 模板实现动态内容

模板变量

  • {{ doc }}:访问触发文档中的任何字段(例如 {{ doc.customer }})
  • {{ comments }}:访问文档评论(例如 {{ comments[-1].comment }})
  • {% if %}...{% endif %}:条件逻辑
  • {{ nowdate() }}:当前日期

模板示例

<h3>Order Overdue</h3>

<p>Transaction {{ doc.name }} has exceeded Due Date. Please take necessary action.</p>

<!-- show last comment -->
{% if comments %}
Last comment: {{ comments[-1].comment }} by {{ comments[-1].by }}
{% endif %}

<h4>Details</h4>

<ul>
<li>Customer: {{ doc.customer }}
</li>
<li>Amount: {{ doc.grand_total }}
</li></ul>

高级选项

附件设置

  • 附加打印件:附加文档的 PDF 打印件
    • 打印格式:为附加的 PDF 选择特定的打印格式
  • 附加文件:
    • “全部”:发送触发通知的记录所附加的所有文件
    • “来自字段”:从特定的附件字段发送文件
      • 来自附件字段:选择包含您要发送的附件的字段

通知后操作

  • 提醒后设置属性:发送通知后更新字段
  • 要设置的值:在指定字段中设置的值

最佳实践

  1. 测试您的通知:使用“获取今日提醒”按钮测试基于日期的通知。
  2. 保持条件具体明确:确保您的条件具有针对性,以避免通知疲劳。
  3. 合理使用模板:使消息清晰明了,仅包含相关信息。
  4. 验证收件人字段:确保字段包含有效的电子邮件地址或电话号码。
  5. 考虑权限级别:收件人必须具有访问通知中引用文档的权限。

故障排除

  • 如果通知未发送,请检查文档是否满足所有条件。
  • 对于电子邮件通知,请验证电子邮件设置是否正确配置。
  • 对于短信通知,请确保短信设置已配置。
  • 对于 Slack 通知,请验证 Webhook URL 是否有效且处于活动状态。
  • 检查服务器日志中是否有与通知发送相关的错误。

技术说明

  • 通知采用异步处理方式,以避免对系统性能产生影响。
  • 基于日期的事件通过计划任务每天检查。
  • 文档事件通知在相关操作发生时实时触发。
  • 条件和模板在受限环境中进行评估,以确保安全性。

通过有效配置通知文档类型,您可以及时告知用户重要事件,并在 Frappe 应用中实现通信自动化。

任务与待办事项

概述

Frappe Framework 中的 待办事项 文档类型可帮助用户跟踪和管理分配给自己或他人的任务。待办事项可以独立创建,也可以与系统中的其他文档关联,从而提供一个集中式的任务管理系统。

待办事项字段

  • 状态:可以是“未开始”、“已完成”或“已取消”
  • 优先级:设置为“高”、“中”或“低”(默认为“中”)
  • 颜色:可选的彩色标签,用于视觉识别
  • 截止日期:任务应完成的时间
  • 描述:任务的主要内容(必填)
  • 参考类型 和 名称:可选链接到相关文档(例如,特定的工单、线索等)
  • 角色:可选的角色分配
  • 分配人:创建或分配任务的用户
  • 负责人:负责完成任务的用户

创建待办事项

可以通过以下几种方式创建待办事项:

  1. 直接创建:

    • 导航到待办事项列表
    • 点击“添加待办事项”按钮
    • 填写必填信息并保存
  2. 通过分配功能:

    • 从任何文档(例如,工单、任务)中,使用“分配给”功能
    • 系统会创建一个待办事项并将其链接到该文档
  3. 通过电子邮件:

    • 使用适当的设置向系统发送电子邮件
    • 邮件内容会自动转换为待办事项(待办事项位于 email_append_to 设置中)
  4. 通过分配规则:

    • 根据条件设置自动分配
    • 当条件满足时,系统会自动创建待办事项(注意:不能对待办事项文档类型本身设置分配规则)

管理待办事项

标记为已完成

要将 待办事项 标记为已完成:

  • 打开该待办事项
  • 将状态更改为“已完成”
  • 保存文档

只有被分配人(“负责人”字段中的用户)才能关闭分配给他们的待办事项。如果通过界面操作,当其他人试图完成他人的待办事项时,系统会显示错误提示。

取消待办事项

要取消 待办事项:

  • 打开该待办事项
  • 将状态更改为“已取消”
  • 保存文档

取消与完成不同,它表示该任务将不会被执行,而不是已经完成。

截止日期的影响

截止日期字段:

  • 有助于确定任务的优先级
  • 提供目标完成日期
  • 在列表视图中用于对待办事项进行排序和筛选
  • 分配规则会使用它进行自动化的截止日期管理

但是,系统不会在截止日期临近或已过时自动发送提醒。如果您需要此功能,请考虑创建自定义的 通知。

通知

系统在以下场景中会发送通知:

  1. 当文档被分配或分配被取消时:

    • 被分配人会收到通知
    • 通知中包含任务描述以及分配人或取消分配人的信息
  2. 全局通知计数器:

    • 未完成的待办事项会计入 Frappe 界面中的通知计数器
    • 该计数器可帮助用户一目了然地查看自己有多少未完成的任务

权限

  • 用户可以查看分配给自己或由自己创建的待办事项
  • 系统管理员可以访问所有待办事项
  • “所有”角色拥有创建、读取、写入和删除待办事项的权限

与其他文档的集成

当 待办事项 链接到其他文档时:

  • 分配待办事项时,会在被引用的文档中添加一条评论
  • 待办事项完成或取消时,也会添加一条评论
  • 被引用文档的 _assign 字段中的分配用户列表会更新
  • 查看被引用的文档时,用户可以查看该文档分配给了谁

使用分配规则

虽然不能为 待办事项 文档类型本身创建分配规则,但可以为其他文档类型创建规则来生成待办事项:

  • 根据文档条件创建规则
  • 使用轮询、负载均衡或基于字段的分配方式来分配任务
  • 根据文档字段自动设置截止日期
  • 当文档条件发生变化时,关闭或重新分配待办事项

分配规则为整个系统的任务管理提供了强大的自动化功能。

安全常见问题解答

此页面包含一些与安全相关的常见问题。在向 Frappe 团队提出安全问题之前,请先查看此页面。

Frappe 允许上传恶意文件,如 .EXE 文件

Frappe 不是杀毒软件,因此不会扫描上传的任何类型的文件。Frappe 内置了验证功能来阻止某些扩展名,您可以在“系统设置” > “文件” > “允许的文件扩展名”中进行调整。

Frappe 显示完整的错误回溯信息

错误追踪有助于开发人员更快地调试问题。在绝大多数情况下,它们不会泄露我们开源源代码中尚未公开的任何信息。如果您仍希望禁用回溯信息,请前往“系统设置”并取消勾选“显示完整错误并允许向开发者报告问题”。

Frappe 在发送请求时不加密密码

Frappe 建议在生产环境中正确设置 HTTPS(TLS),如果设置正确,每个请求都会在传输层进行加密,因此在此基础上再次手动加密请求内容的安全收益很小。

如果您使用像 Burp Suite 这样的工具,通过设置代理/证书来拦截加密请求,从而查看未加密的流量,那么您实际上并未处于真实的威胁模型中。在现实世界中,如果 TLS 被攻破,您将面临更大的问题。

此外,Frappe 使用 PBKDF2 + SHA256 哈希算法存储登录密码。一旦存储,就无法检索原始密码。需要可检索值的密码字段(例如 API 密钥)则使用 Fernet 进行对称加密存储。

Frappe 在密码字段上启用“自动完成”功能

自动完成和密码管理器被广泛认为是更安全且用户体验更好的选择。禁用自动完成是过时的做法,而且如果您禁用它,主流浏览器甚至不会尊重这一设置。参考:

Frappe 不会每 30/90 天强制密码过期

定期更换密码并不一定安全,甚至可能产生有害的副作用:

如果您仍然需要此功能,可以在“系统设置” > “强制用户重置密码”中启用。

Frappe 不允许配置密码要求以包含大写、小写和特殊字符

硬性规定密码要求通常用户体验不佳。密码强度主要基于熵,请参阅此漫画以更好地理解:

Frappe 转而使用启发式算法来计算密码强度。默认情况下,我们要求密码具有合理的强度,但如果您想提高此强度,可以在“系统设置” > “密码” > “最低密码强度评分”中进行配置。

Frappe 不允许在不同路径上配置不同的应用程序。因此这种情况不会发生。默认情况下,您配置的域名/子域名下的所有页面均由 Frappe 提供服务。

Frappe 不会为 cookie 添加“Secure”标志

Frappe 仅在通过 HTTPS 协议访问时才会为 cookie 添加“Secure”标志。

我们建议在您的域名上启用 HSTS,以便阻止未加密的流量。

我们允许非 HTTPS 连接,以支持用户可能不想设置 TLS 的内部网络部署。

网站会暴露其运行在 Frappe 上

如果您了解应用程序的特征,就很容易判断一个网站运行在什么平台上。例如,预加载头、资源文件名和 API 路径。要掩盖所有这些信息是不可能的。

即使我们从用户界面隐藏品牌标识,也无需太多时间就能发现某个特定网站运行在 Frappe 上。

在像 Frappe 这样的协作环境中,链接到外部工具和资源通常是工作流程中必要的一部分,因此完全禁用它们并不现实。为了解决潜在的网络钓鱼风险,可以在用户离开工作台之前显示一个警告弹窗。此功能可以在“系统设置” > “显示外部链接警告”中启用。

打印格式或开发者字段中的 XSS 漏洞

诸如打印格式、自定义脚本及其他面向开发者的 HTML 字段,特意设计为允许使用原始 HTML/JavaScript 进行自定义。这些字段仅对受信任的用户(如系统管理员/开发者)开放,因此在此类上下文中渲染脚本属于预期行为,不视为 XSS 漏洞。除非不受信任或低权限用户能够利用这些字段,否则此类脚本执行的报告均视为无效。

邮件组

电子邮件群组是一个强大的工具,用于管理和自动化与订阅者、客户或任何联系人组群的电子邮件通信。

电子邮件群组在电子邮件模块下创建,并设置一个唯一的标题。每个电子邮件群组都会自动使用“标题”字段命名,确保易于识别和管理。主要由“新闻通讯管理员”角色管理,这确保了只有授权人员才能创建、修改或删除群组。

总订阅人数字段会动态显示群组中的订阅者数量,让您快速了解群组的覆盖范围。电子邮件群组与各个电子邮件群组成员相关联,便于管理和细分订阅者。

确认邮件模板字段关联到用于发送确认邮件的特定电子邮件模板。

欢迎邮件模板用于与新订阅者进行初次互动。它会在订阅者确认其电子邮件地址后立即发送,并为未来的沟通定下基调。

成功确认后,订阅者可以被引导至自定义的欢迎网址。这可以是一个着陆页或任何相关内容,以便与新订阅者进行即时互动。如果未设置欢迎网址,订阅者将被带到一个通用的确认页面。

向欢迎网址添加查询参数的功能,可以实现个性化互动并跟踪订阅者的参与情况。

自定义Frappe应用中的翻译

如何在自定义 Frappe 应用中添加和管理翻译:分步指南


1. 创建 translations 文件夹

步骤:
在您的自定义应用目录中,于以下位置创建一个名为 translations 的文件夹:

apps/your-app/your-app/translations/

为什么?
Frappe 会自动检测此文件夹。它遵循“约定优于配置”的原则,因此将翻译文件放在此处可确保它们无需额外设置即可被识别。


2. 添加翻译 CSV 文件

步骤:
在 translations 文件夹中为每种语言创建一个 CSV 文件。例如:

  • ar.csv(阿拉伯语)
  • es.csv(西班牙语)

CSV 结构:

"source_string","translated_string","context"
"agent","توكيل",""
"continue","إستكمال",""

为什么?

  • 第 1 列(source_string):代码中使用的原始字符串(例如:_("continue"))。
  • 第 2 列(translated_string):该字符串的翻译版本。
  • 第 3 列(context):可选。用于澄清翻译的上下文。

第三列是可选的,可以留空。


3. 在代码中使用可翻译字符串

步骤:
在您的 Python、HTML 或 JavaScript 代码中使用 _() 包裹字符串:

from frappe import _

def my_function():
    message = _("continue")  # Will be replaced with "إستكمال" for Arabic users

为什么?
_() 函数将字符串标记为可翻译。在运行时,Frappe 会根据用户的语言偏好替换它们。


4. 构建站点

仅当您在自定义前端 JS 中使用 __() 并更改了 JS 文件时才需要。

步骤:
运行构建命令:

bench --site your-site build

5. 验证翻译

步骤:

  • 在 Frappe 中将用户语言切换为阿拉伯语(或目标语言)。
  • 检查 _("continue") 现在是否显示为 "إستكمال"。

为什么?
这确认了 Frappe 能正确地将源字符串映射到其对应的翻译版本。


关键说明

语言代码

  • CSV 文件名必须与 Frappe 的语言代码匹配(例如:阿拉伯语为 ar)。
  • 您可以在 Frappe > 语言设置 中找到这些代码。

文件夹位置

  • translations 文件夹必须位于应用包目录的根目录(不能在子模块内)。

性能

  • 翻译在构建期间会被缓存。
  • 编辑翻译文件后,务必重启 bench。

回退行为

  • 如果某个字符串未被翻译,Frappe 将使用原始(源)字符串。

我需要构建或迁移站点吗?

不需要,Frappe 会根据登录用户的语言偏好,在运行时动态从您的 translations/lang.csv 文件中加载翻译。
您只需刷新浏览器或在必要时清除缓存即可。

仅当您在自定义前端 JS 中使用 __() 并更改了 JS 文件时,才需要 bench build。


示例工作流程

  1. 创建:

    apps/my_app/my_app/translations/ar.csv
    
  2. 添加条目:

    "welcome_message","مرحبا بك!",""
    
  3. 在代码中使用:

    _("welcome_message")
    
  4. 清除缓存:

  • 如果翻译未立即生效,请使用它
    bench --site my-site clear-cache
    
  1. 构建:
  • 仅当您在自定义前端 JS 中使用 __() 并更改了 JS 文件时才需要
    bench --site my-site build
    
  1. 在阿拉伯语界面中进行测试。

解释上下文?

上下文本质上是一种元数据,
用于向翻译使用者说明该翻译应在何时何地使用。
因为有时同一个词会有不同的含义。

例如:

"charge","شحن",""
"charge","رسوم",""

这里我们有相同的词,但含义不同(使用上下文不同)
因此,为了区分它们,我们需要为其提供上下文。

"charge","شحن","mobile phone charge"
"charge","رسوم","invoice line"

在代码中:

_("charge") # here we don't know which meaning (context to use)
_("charge", context="mobile phone charge") # here we mean شحن
_("charge", context="invoice line") # here we mean رسوم

站点

站点目录

Frappe 是一个多租户平台,每个租户被称为一个站点。站点存在于
名为 sites 的目录中,在运行 frappe 命令或其他服务(如 Celery worker 或 WSGI 服务器)时,该目录被视为当前工作目录。

您可以通过环境变量 SITES_DIR 设置 sites_dir,或者向 frappe 命令传递
--sites_dir 选项。

除了站点之外,sites_dir 还应包含以下内容。

apps.txt

apps.txt 包含一个 Python 包列表,这些包将被视为 Frappe 应用。您打算在站点中使用的每个
frappe 应用都应在此文件中有一条记录。
此外,这些应用还应位于 PYTHONPATH 中。有关更多信息,请参阅
Frappe 应用。

common_site_config.json

common_site_config.json 是一个可选文件。所有站点通用的配置
可以放在此文件中。

assets

assets 包含需要提供给浏览器客户端使用的文件。
这些文件通常包括 *.js、*.css、*.png 文件。此目录是使用
bench build 命令自动生成的。

languages.txt

languages.txt 是一个自动生成的文件,它将每种语言映射到其对应的代码。

站点

站点是 sites_dir 中的一个目录,代表 Frappe 平台中的一个租户。

目录结构

site
├── locks
├── private
│   └── backups
├── public
│   └── files
│ └── testfile.txt
└── site_config.json

  • locks 目录由调度器使用,通过
    文件锁机制来同步各种任务。

  • private 目录包含需要认证才能访问的文件。
    目前,该目录仅限于备份文件。

  • public 目录包含可以直接提供的文件。在上述
    示例中,testfile.txt 可以通过 URL 访问,
    http://site/files/testfile.txt

  • site_config.json 包含站点特定的配置

站点配置

请参阅 site_config.json 的配置选项

站点解析

在响应 HTTP 请求时,系统会根据以下条件自动选择一个站点:

  • HTTP 请求中的 Host 头与某个站点匹配
  • HTTP 请求中的 X-Frappe-Site-Name 头与某个站点匹配

也可以通过以下命令启动开发服务器,强制其提供特定站点:
bench --site SITENAME serve

添加新站点

要添加新站点,请在您的 bench 实例中执行以下命令:

bench new-site SITENAME

将站点设置为当前站点

要强制将某个站点用作默认站点,请执行以下操作:

bench use SITENAME

为确保设置成功,请检查 currentsite.txt 的内容(位于 bench 实例的 sites 文件夹中),其中应包含 SITENAME。

如何启用备份加密

备份过程中创建的文件可以使用自动生成的密钥进行加密。

系统要求

对于 MacOS,请确保系统中已安装 gnupg。使用以下命令安装 gnupg:

brew install gnupg

大多数 Linux 发行版已经预装了 GnuPG,当前版本很可能默认使用 GnuPG 2.0。

加密备份选项

  1. 打开系统设置表单。
  2. 在备份部分中,勾选加密备份复选框。

系统使用由站点配置提供的自动生成的密钥。如果找不到此类密钥,则会生成一个新密钥。任何系统管理员之后都可以在下载备份页面查看该密钥。

它会对公共文件、私有文件以及部分备份文件进行加密。

备份加密状态

  1. 加密备份存储在常规备份的相同位置:YOUR_BENCH/sites/{site}/private/backups。
  2. 加密备份可以从下载备份页面下载。
  3. 加密备份通过 key icon 进行区分。

备份加密密钥

  1. 要获取备份加密密钥,请前往下载备份页面。
  2. 点击“获取加密密钥”按钮并验证您的密码。

复制该密钥以恢复加密的备份文件。

恢复加密的备份文件

  1. 可以使用 bench restore SQL_FILE_PATH 恢复文件,无需 --backup-encryption-key,因为它会自动从站点配置中获取。
  2. 如果因密钥错误导致恢复失败,可以使用 --backup-encryption-key 提供密钥来恢复文件。
  3. 用法:
    对于完整备份文件
    bench --site {site} restore --backup-encryption-key {key} [OPTIONS]
    对于部分备份文件
    bench --site {site} partial-restore --backup-encryption-key {key} [OPTIONS]

手动解密加密的备份文件

gpg --yes --passphrase $BACKUP_ENCRYPTION_KEY --pinentry-mode loopback -o $OUTPUT_FILE -d $INPUT_FILE

Frappe 异步请求

在 Frappe Framework 中,你可以通过 frappe.call 来管理 ajax 调用。frappe.call 以异步方式工作,即发送请求并通过回调机制处理响应。

frappe.call 结构

frappe.call({
 method: "",
 type: "POST",
 args: {},
 success: function(r) {},
 error: function(r) {},
 always: function(r) {},
 btn: opts.btn,
 freeze: false,
 freeze_message: "",
 async: true,
 url: "" || frappe.request.url,
});

参数说明

  • method:白名单后端方法的点分路径
  • type:字符串参数,HTTP 请求类型 “GET”、”POST”、”PUT”、”DELETE”。默认设置为 “POST”。
  • args:关联数组,随请求传递的参数。
  • success:函数参数,代码片段,在请求成功执行后运行
  • error:函数参数,代码片段,在请求失败后执行
  • always:函数参数,代码片段,无论成功或失败都会执行
  • btn:对象参数,触发对象
  • freeze:布尔参数,如果设置为 true,则在收到响应前冻结实例
  • freeze_message:字符串参数,屏幕处于冻结状态时显示的消息。
  • async:布尔参数,默认设置为 true。因此每次 frappe.call 都是异步的。若要使调用同步,请将参数值设置为 false
  • url:字符串参数,发起请求的位置

如何使用 frappe.call?

调用标准 API

frappe.call({
 method: 'frappe.client.get_value',
 args: {
 'doctype': 'Item',
 'filters': {'name': item_code},
 'fieldname': [
 'item_name',
 'web_long_description',
 'description',
 'image',
 'thumbnail'
 ]
 },
 callback: function(r) {
 if (!r.exc) {
 // code snippet
 }
 }
});
  • 参数说明:

  • doctype:你要获取信息的 DocType 名称

  • filters:条件限定符

  • fieldname:你可以在数组中指定希望在响应中返回的字段

调用白名单方法

  • 在客户端,我们指定要调用的服务端 method。这是通过服务端 Python 模块的点分路径,最后一部分是方法名。
frappe.call({
method: "frappe.core.doctype.user.user.get_all_roles", //dotted path to server method
callback: function(r) {
// code snippet
}
});
  • 上述请求调用服务端方法 get_all_roles,该方法位于文件 $MY_BENCH/apps/frappe/frappe/core/doctype/user/user.py 中:
@frappe.whitelist()
def get_all_roles():
// business logic
return value

注意:任何需要通过 frappe.call() 访问的服务端方法都必须使用装饰器 @frappe.whitelist() 进行白名单授权。

Frappe 应用

Frappe 应用是使用 Frappe 平台的 Python 包。它们可以存放在 Python 路径
中的任何位置,
并且必须在 apps.txt 文件中有一个条目。

创建应用

Frappe 自带一个新应用的样板。命令 bench new-app app-name 通过启动一个交互式 shell 来帮助你开始创建新应用。

 % bench new-app sample_app
 App Name: sample_app
 App Title: Sample App
 App Description: This is a sample app.
 App Publisher: Acme Inc.
 App Icon: icon-linux
 App Color: #6DAFC9
 App Email: [email protected]
 App URL: http://example.com
 App License: MIT

上述命令将创建一个具有以下目录结构的应用。

 sample_app
 ├── license.txt
 ├── MANIFEST.in
 ├── README.md
 ├── sample_app
 │   ├── __init__.py
 │   ├── sample_app
 │   │   └── __init__.py
 │   ├── config
 │   │   ├── desktop.py
 │   │   └── __init__.py
 │   ├── hooks.py
 │   ├── modules.txt
 │   ├── patches.txt
 │   └── templates
 │   ├── generators
 │   │   └── __init__.py
 │   ├── __init__.py
 │   ├── pages
 │   │   └── __init__.py
 │   └── statics
 └── setup.py

该样板包含的文件刚好足以在 [工作台] 上显示你的应用图标。

应用中的文件

hooks.py

hooks.py 文件定义了你的应用的元数据以及它与 Frappe 或 Frappe 应用
其他部分的集成点。这些部分的示例包括任务调度或监听系统中不同文档的更新。
目前,它只包含你在创建应用时输入的详细信息。

 app_name = "sample-app"
 app_title = "Sample App"
 app_publisher = "Acme Inc."
 app_description = "This is a sample app."
 app_icon = "fa-linux"
 app_color = "black"
 app_email = "[email protected]"
 app_url = "http://example.com"
 app_version = 0.0.1

modules.txt

Frappe 中的模块帮助你组织 Frappe 中的文档,它们定义在
你的应用的 modules.txt 文件中。每个 [DocType] 都必须
归属于一个模块。默认情况下,会添加一个以你的应用名称命名的模块。
此外,每个模块在 [工作台] 上都会有一个图标。例如,[ERPNext] 应用
按以下模块进行组织。

accounts(账户)
buying(采购)
home(首页)
hr(人力资源)
manufacturing(制造)
projects(项目)
selling(销售)
setup(设置)
stock(库存)
support(支持)
utilities(工具)
contacts(联系人)

将应用添加到站点

一旦你有了一个应用,无论是你刚刚创建的还是你下载的其他应用,
你都需要执行以下操作。

通过 git 下载应用

bench get-app https://github.com/org/app_name

将应用安装到你的站点

bench --site site_name install-app app_name