
Odoo 平台深度解析与开发指南
Odoo 提供了一个全面的 ERP 平台,其模块化的架构、灵活的定制能力和强大的开发工具使其成为企业资源规划的强大选择。从架构概览到模块开发、用户界面设计、高级字段和关系管理,再到云平台部署与管理,Odoo 都提供了详细的指导和工具。
Odoo 平台深度解析与开发指南
1. Odoo 架构概览
Odoo 是一个采用三层架构的软件系统,包括:
- 表现层(Presentation Tier):用户界面,由 HTML5、JavaScript 和 CSS 构成,负责用户交互。
- 逻辑层(Logic Tier):核心业务逻辑,使用 Python 编写,处理系统内部运作。
- 数据层(Data Tier):数据存储,通过 PostgreSQL 数据库管理所有重要信息。
Odoo 的核心扩展机制是模块(Modules)。每个模块都是一个独立的功能单元,可以增加新特性或扩展现有功能。模块可以包含以下元素:
- 业务对象(Business Objects):定义为 Python 类,通过对象关系映射 (ORM) 与数据库交互。
- 对象视图(Object Views):定义信息如何显示给用户(如列表视图、表单视图)。
- 数据文件(Data Files):XML 或 CSV 格式,用于存储系统运行所需的基础数据或视图定义。
- Web 控制器(Web Controllers):处理 HTTP 请求和响应。
- 静态 Web 数据(Static Web Data):如图片和脚本等。
Odoo 提供两个版本:**Enterprise(企业版)**和 Community(社区版)。企业版提供额外功能,但从技术角度看,这些功能也只是在社区版基础上增加的附加模块。
2. Odoo 开发环境与项目搭建
2.1. 本地开发环境配置
推荐从源代码安装 Odoo 以便进行开发。使用 Docker 进行容器化部署是更便捷的方式,通过 docker-compose.yml 文件进行配置。
2.2. 创建新模块
创建 Odoo 模块是为了构建新的应用程序或扩展现有功能。
模块基础:
- 模块目录:将模块放置在 ./addons 目录中。
- 核心文件:每个模块至少需要 __init__.py 和 __manifest__.py 文件。
- __init__.py: Python 包初始化文件。
- __manifest__.py:定义模块名称、依赖、数据文件等元数据。
- 注册为 App:在 __manifest__.py 中设置 'application': True 使模块在 Odoo Apps 列表中可见。
示例:房地产管理系统模块
- 目标:创建一个房地产管理系统模块,处理房产信息、报价和交易流程。
- 核心功能概览:
- 主列表视图:展示房产广告及其关键信息。
- 表单视图:显示房产的详细信息(卧室数量、花园等)。
- 第二标签页:展示报价列表,包括潜在买家出价、预期售价等。
- 工作流:通过视频展示模块工作流程(待实现)。
2.3. 模型与基础字段
对象关系映射 (ORM):
- Odoo 使用 ORM 连接 Python 代码和 PostgreSQL 数据库。
- 通过继承 Model 类定义业务对象为 Python 类。
- Odoo 自动化持久化系统无缝集成模型。
创建房地产属性模型:
- 定义模型:在模块中创建文件和文件夹以定义模型,如 estate_property。
- 基本字段:添加 name (Char), description (Text), price (Float) 等字段。
- 字段类型:Odoo 提供 15 种技术字段类型(Odoo Studio 扩展至 20 种),包括 Char, Text, Integer, Float, Boolean, Date, DateTime, Binary, Selection, Reference, Many2one, One2many, Many2many 等。
- 字段属性:定义 required 属性确保数据完整性。
- 自动字段:了解 id, create_date, write_user 等自动生成字段。
- 连接数据库:通过 docker exec -it postgres_odoo17Learning psql -U admin -d learning_db 连接到 PostgreSQL 容器查看数据。
2.4. 模块数据定义 (CSV / XML)
Odoo 中的数据分为主数据 (Master Data) 和 演示数据 (Demo Data)。
- 主数据:模块正常运行所需的核心数据,如视图、动作、国家、货币等,自动安装。
- 演示数据:用于演示和测试,通常在演示模式下加载。
数据声明方式:
- CSV 文件:适用于简单、冗长的数据列表,易于创建和维护。
- 示例:id,field_a,field_b,related_id:id
- XML 文件:更灵活和强大,适用于复杂数据结构、视图定义或邮件模板。
- 示例:<record id="id1" model="tutorial.example"><field name="field_a">valueA1</field></record>
扩展现有数据:
- 使用现有记录的 xml_id 无缝集成新信息。
- 通过 noupdate="1" 标志防止模块升级时更新特定记录。
3. 用户界面 (UI) 与视图
3.1. 视图类型
视图是 Odoo 应用程序的窗口,以有意义和直观的方式组织和呈现数据。Odoo Studio 将视图分为通用、多记录、时间轴和报告四类。
- 表单视图 (Form View) ✍:用于创建和编辑单个记录,通过标签页和列组织字段。
- 列表视图 (List View) 📑:以表格形式显示多条记录,便于扫描、搜索和批量编辑。
- 搜索视图 (Search View) 🔍:帮助过滤、分组和搜索记录,支持自定义过滤器和自动补全。
- 看板视图 (Kanban View) 🗂:以卡片形式显示记录,适用于工作流管理,移动端默认视图。
- 地图视图 (Map View) 🗺:在地图上显示记录,适用于现场服务。
- 日历视图 (Calendar View) 📆:以日历格式管理和显示记录,适用于日程安排。
- 同期群视图 (Cohort View) 📈:分析记录随时间变化的生命周期,适用于趋势分析。
- 甘特视图 (Gantt View) 📅:以时间线显示记录,用于项目规划和进度跟踪。
- 数据透视表视图 (Pivot View) 📊:用于汇总和分析数据。
- 图表视图 (Graph View) 📉:以条形图、折线图或饼图显示数据。
- 仪表板视图 (Dashboard View) 📊:结合多个报告视图和关键绩效指标,提供全面概览。
3.2. 操作与菜单
- 动作 (Actions):在界面中实现导航和功能,如在列表和表单之间切换。
- 菜单 (Menus):遵循层次结构,引导用户导航到应用程序的不同部分,通过 XML 文件定义。
- 字段属性与视图:
- 设置字段的默认值、只读状态、重复行为。
- 理解并利用 Odoo 的保留字段及其预定义行为。
4. 模型关系与高级字段
4.1. 模型关系
模型关系是 Odoo 中连接不同数据实体的方式,构建动态数据生态系统。
- 多对一 (Many2one) 🌐:在属性和类型、买家、卖家之间建立清晰的链接。例如,一个房产可以有一个买家。
- 多对多 (Many22many) 🔗:通过标签丰富属性,例如,一个房产可以有多个标签(“舒适”、“翻新”)。
- 一对多 (One2many) 🔄:捕获属性和报价之间的动态交换,例如,一个房产可以有多个报价。
4.2. 计算字段 (Computed Fields) 与 Onchange 机制
- 计算字段 🧮:根据其他字段动态计算值。例如,总面积 = 居住面积 + 花园面积。
- 使用 @api.depends 装饰器指定字段依赖,确保计算值随基础数据自动更新。
- Onchange 方法 🎩:在不保存到数据库的情况下,实时响应用户输入执行操作。
- 例如,当“花园”字段被勾选时,自动将花园面积设置为 10,方向设置为“北”。
4.3. 动作按钮 (Action Buttons)
- 在用户界面中嵌入按钮,触发特定的业务逻辑。
- 例如,“取消”房产、“标记为已售”、“接受”或“拒绝”报价。
- 按钮与 Python 方法关联,通过将方法标记为 public 即可实现。
- 示例:<button type="action" name="your_module.action_name" string="Button Label"/>
4.4. 约束 (Constraints)
约束是确保数据完整性的工具,防止不正确的数据进入系统。
- SQL 约束 🛡:在数据库层面强制执行规则,例如确保金额为正数、名称唯一。
- Python 约束 📜:使用 Odoo 逻辑编写更复杂的规则,例如确保报价不低于预期价格的 90%。
- 浮点数处理:处理浮点数比较和精度时需谨慎。
4.5. 界面美化与用户体验 (UI Enhancements)
- 视觉效果:使用颜色装饰 (color decorations) 为列表视图中的房产添加颜色,直观显示状态(有报价、已接受、已售、已取消)。
- 交互优化:根据上下文条件动态调整按钮和字段的可见性 (conditional visibility attributes),减少认知负荷。
- 高效搜索:添加默认过滤器和自定义搜索域,使用户能根据特定条件(如居住面积)快速筛选房产。
- 数据展示:利用内联视图 (inline views) 和小部件 (widgets) 提升表单和列表的数据呈现,提供上下文洞察。
- 统计按钮 (Stat Buttons):展示关键指标,如与特定房产类型相关的报价数量。
5. 继承与模块交互
5.1. 继承 (Inheritance)
Odoo 通过继承机制实现创新和功能扩展,同时保持代码完整性和系统稳定性。
- Python 继承:通过扩展标准方法(如数据创建、读取、写入、删除)来添加新功能。
- 例如,阻止删除非新建或非取消状态的重要房产。
- 模型继承:向现有模型添加新字段以丰富系统功能。
- 视图继承:通过继承现有视图并根据特定需求进行调整,自定义用户界面的外观。
- 例如,在用户视图中添加一个新标签页,显示可用房产列表。
5.2. 与其他模块交互
Odoo 模块可以无缝集成,解锁新功能并简化工作流程。
- 集成发票模块:设计一个“链接模块”来连接房地产和会计功能。
- 通过模型继承,覆盖房产售出时触发的动作,实现自动化发票创建。
- 精确制作发票,填充客户 ID、移动类型等详细信息。
- 添加发票行,确保财务记录清晰准确。
5.3. QWeb 模板 (QWeb Templates)
QWeb 是 Odoo 中用于设计动态模板和界面的强大工具。
- Kanban 视图设计:使用 QWeb 为房产创建引人入胜的 Kanban 视图。
- 条件显示:通过 t-if 指令实现动态且响应式的界面。
- Kanban 视图改进:添加预期价格、最佳价格、销售价格和标签等信息,增强卡片的信息量。
- 默认分组:根据房产类型进行分组,提高信息组织性。
6. Odoo.sh:云平台部署与管理
Odoo.sh 是一个综合的平台即服务 (PaaS),专为 Odoo 应用程序的部署、管理和扩展而设计。
6.1. 主要特性
- 自动化部署 🚀:一键将更改推送到预演环境或生产环境。
- 持续集成 (CI) 🔄:每次代码提交都会自动进行测试,及早发现并修复问题。
- 备份与安全 🔐:自动每日备份和强大的安全措施。
- 可扩展性 📈:根据业务需求轻松调整资源。
- 协作工具 🤝:分支管理、合并请求和自动化测试环境。
6.2. 项目创建与管理
创建项目:
- 在 Odoo.sh 上点击“部署您的平台”。
- 使用 GitHub 账户登录并授权 Odoo.sh 访问您的仓库。
- 选择从头开始或使用现有仓库,命名仓库并选择 Odoo 版本。
- 输入订阅代码(如果适用)。
数据库导入:
- 可以导入兼容版本的本地或 Odoo Online 数据库。
- 导入后,默认禁用出站邮件服务器和计划动作。
- 生产环境需要重新启用必要的计划动作并注册订阅。
模块推送至生产环境:
- 将自定义或社区模块添加到 GitHub 仓库的分支中。
- Odoo.sh 会检测包含 Odoo 插件的文件夹。
6.3. 分支管理与工作流
Odoo.sh 将分支分为三个主要阶段:
- 生产分支 (Production Branch) ❤:实时运行项目的主分支。推送更改后,服务器会自动更新并重启。
- 预演分支 (Staging Branch) 🧪:测试新功能的安全区域,使用真实数据但不会影响主生产环境。计划动作暂停,邮件被拦截,服务设置为测试模式。
- 开发分支 (Development Branch) 🛠:开发工作区,使用演示数据运行测试,确保新更改不会破坏现有功能。每次推送更新,都会从头创建新环境,加载演示数据并自动运行所有测试。
合并分支 🔄:可以通过拖放或 git merge 命令将分支合并。
6.4. 构建 (Builds)
- 定义 🏗:构建是对项目进行测试运行,涉及在容器化环境中加载数据库。
- 触发 📅:通常在推送 GitHub 仓库分支更新、导入数据库或手动触发重建时创建。
- 状态 🚦:
- 绿色 (🟢):成功,无错误或警告。
- 红色 (🔴):失败,发生错误。
- 黄色 (🟡):几乎成功,有警告但无关键错误。
- 工作原理 🌍:生产构建更新现有数据库;预演构建创建生产数据库的副本;开发构建创建新数据库并运行单元测试。
6.5. Odoo.sh 在线编辑器
Odoo.sh 提供一个强大的在线编辑器,直接从 Web 浏览器访问。
- 功能 🌐:修改源代码、打开终端、Python 控制台、Odoo Shell 控制台和 Notebooks。
- 工作目录 🗂:
- ~/src/:包含 Odoo Community、Enterprise、Themes 和您的仓库分支的源代码。
- ~/data/:保存数据库附件和用户会话文件。
- ~/logs/:保存数据库安装、服务器运行、数据库更新和 Python 包安装的日志。
- 代码编辑与保存 📝:双击文件编辑,通过 Ctrl+S 保存。Python 文件更改会自动重新加载。
- 提交与推送 📤:
- 打开终端。
- 导航到 ~/src/user。
- 暂存更改:git add。
- 提交更改:git commit -m "My first module"。
- 推送更改:git push https HEAD:<branch>。
6.6. 使用外部 Python 库
要在 Odoo 模块中使用外部 Python 库,例如 Unidecode:
- 创建 requirements.txt:在模块根目录添加 unidecode。
- 在模块中使用:from unidecode import unidecode。
- 更新模块版本:在 __manifest__.py 中更新版本号。
- 提交并推送。
7. Odoo 核心模块功能详解
Odoo 已从“Tiny ERP”演变为“Open ERP”,再到现在的“Odoo”,它是一个品牌全新的专业 ERP 软件,旨在满足现代企业的复杂需求。
7.1. Odoo 作为 ERP 解决方案的优势
- 全面而易用:拥有 5000 多个模块和应用,Odoo 提供广泛的解决方案,同时用户只需安装所需模块,避免系统臃肿。
- 持续更新与升级:基于现代化技术栈,Odoo 定期提供更新,整合电子商务、移动商务、商业智能、云辅助等最新功能。
- 可定制与可扩展:作为开源解决方案,Odoo 允许用户根据自身需求进行定制。Odoo 应用商店提供超过 10000 个免费和付费应用。
- 成本效益:适用于从大型企业到小型组织的各类客户,成本可控。
- 强大活跃的社区:拥有 20000 多名成员和开发者,提供强大的社区支持。
- 商业智能:提供丰富的报告和分析工具,支持决策制定,并不断集成 AI 应用和插件。
7.2. Odoo 核心模块概览
Odoo 的核心模块相互集成,提供全面的业务管理能力:
- 会计与财务:简单而强大,支持快速处理交易,自动创建所有日记账分录,支持双重记账法、权责发生制与现金制报告,多公司、多币种管理,并提供丰富的财务报告。
- 关键配置:图表账户、会计年度、默认公司货币、分析会计、资产管理、预算管理、税务现金制。
- 操作:创建与处理发票、支付、手动支付与发票匹配、银行对账单、资产管理、分析会计、预算管理。
- 客户关系管理 (CRM):与销售、采购等模块深度集成,有效管理客户关系。提供销售管道跟踪、会议安排、仪表板、客户沟通、潜在客户推广、机会分析、潜在客户评分、自定义警报等功能。
- 工作流:从潜在客户 (Lead) 到机会 (Opportunity),再到报价 (Quotation)、销售订单 (Sale Order) 和发票。
- 管理:客户管理(合作伙伴),产品管理,售前跟踪(潜在客户生成、机会创建、销售管道配置)。
- 采购管理:简化采购操作,支持 RFQ(询价请求)、采购招标、采购订单生成、供应商账单管理、背单处理和采购分析。
- 自动化采购工作流:根据库存水平自动发送 RFQ。
- 供应商价格表与产品可用性:高效的采购决策。
- 最佳报价:通过采购招标获取最佳价格。
- 统计分析:获取供应商绩效统计。
- 多公司管理:在单一 Odoo 实例中同步多公司操作。
- 完全集成:与库存、发票、会计模块集成。
- 库存管理:业务的核心,有效跟踪产品移动,支持基本操作(发货单、入库单、盘点)、高级路由(直接发货、交叉转运、上架与移库策略)、补货(最小库存、采购建议)、可追溯性(批次跟踪、序列号)、产品管理(产品类型、套件、多级变体、多单位、过期日期、多条形码)和商业智能报告。
- 管理:产品管理、一般配置(单位、变体、可追溯性)、仪表板、仓库配置、库位、操作类型、路线、单位。
- 操作:补货规则、库存更新、报废、调度、报告。
- 生产制造 (Manufacturing):高效管理生产订单,物料清单 (BOM),工序中心 (Work Center),工艺路线 (Routing),工单管理,报废和反向拆解订单。
- 管理:生产订单、工单、维修订单。
- 调度与计划:生产计划、工单组织、物料清单管理、工序中心能力。
- 灵活主数据:多级物料清单、可选工艺路线、版本变更。
- 质量:控制点、质量检查、质量警报。
- 维护:预防性维护、纠正性维护。
- 控制面板:平板电脑支持、生产记录、作业指导书。
- 人力资源 (HR):全面的 HR 管理包,包括员工目录、考勤、请假、薪资、费用报销和工时单管理。
- 管理:创建员工档案、合同管理、工时单、考勤、请假。
- 协作:企业社交网络、游戏化。
- 招聘:自动化招聘流程,职位发布、阶段定义、招聘表单。
- 销售点 (POS):快速且用户友好的销售点模块,与库存、会计和 CRM 模块集成。
- 功能:支付方式、价格与折扣、并行订单、自定义收据、库存管理、客户与会员、餐馆管理、产品管理、Web 应用。
- 配置:支付方式、产品类别、销售点创建。
- 操作:下单、报告。
- 网站与电子商务:强大的网站构建器和电子商务功能,无需第三方应用即可创建网站、在线商店。
- 设计与配置:在线编辑、模块化构建块、数字产品销售、产品变体、价格表。
- 集成工具:交叉销售、追加销售、促销码。
- 购物体验:简易搜索、客户引导、访客与注册用户、在线聊天。
- 支付与计费:多种支付方式集成、自动计算运费、集成会计包、税率、图表账户。
- 报告:销售数据分析。
- 项目管理:全面的项目管理解决方案,包括项目创建、任务分配、工时单、问题跟踪和客户门户访问。
- 功能:现代用户界面、移动支持、过滤器和分组、任务管理、日历、甘特图、图表、数据透视表分析、时间跟踪、存档任务。
- 问题:客户工单、邮件集成、服务级别协议 (SLA)、自动化操作。
- 客户服务:工时单、客户满意度、预测、门户前端。
- 多用途:内部项目、售后服务、支持合同、客户项目。
8. Odoo 开发规范与最佳实践
8.1. 代码质量与 Linting
遵循 Odoo 官方编码指南是提升代码质量的关键。
- PEP8 规范:Python 代码应遵循 PEP8 规范。
- Lint 工具:使用 autopep8、oca-autopep8、autoflake、fixmyjs 等工具进行代码检查和格式化。
- 常见 Lint 修正:
- 修正换行符、文件末尾添加换行、去除尾随空格。
- Tab 键替换为 4 个空格。
- 修复 CamelCase 命名。
- 移除未使用的 import。
- Python 注释格式修正。
- XML 文件中废弃属性的修正。
8.2. Git 与 GitHub
- 初始配置:配置 GitHub SSH 密钥、GPG 密钥(用于签署提交)、Git 邮件和编辑器。
- .gitignore:配置全局 .gitignore 以忽略不必要的文件(如 *.pyc)。
- 模块移植 (Porting):
- 前向移植 (Forward-port):将旧分支(如 8.0)的提交合并到新分支(如 9.0)。
- 后向移植 (Back-port):使用 git cherry-pick 将新分支的特性移植到旧分支。
- 冲突解决:手动编辑文件或使用 git checkout --ours/--theirs 解决合并冲突。
- 取消错误提交:使用 git reset HEAD~1 --soft 后重新提交,再 git push origin <branch> -f 强制推送。
- Pull Request:可以通过控制台使用 hub 工具创建 Pull Request。
- Squash Commits:使用 git commit --amend 或 git rebase -i 将多个提交合并为一个。
8.3. 单元测试 (Unit Tests)
单元测试是代码稳定性和可靠性的基础。
- 测试目的:确保更改不破坏现有功能、明确代码范围、提供用例文档、技术文档和目标设定。
- 运行测试:
- 使用 odoo-bin --test-enable 激活测试。
- 使用 --test-file=TEST_FILE 运行特定测试文件。
- 使用 --test-tags=TEST_TAGS 过滤测试。
- 持续集成 (CI):每次提交到 GitHub 都会通过 Runbot 等工具自动运行测试,确保代码稳定无 bug。
- 编写测试:
- 测试应独立且不留痕迹。
- 测试文件以 test_ 开头,并导入到 tests/__init__.py 中。
- 测试类继承 odoo.tests.common.TransactionCase,并通常定义 setUpClass 方法来创建测试数据。
- 编写测试以防止不正确的操作,例如“已售房产不能创建报价”。
8.4. 模块清单 (Module Manifests)
__manifest__.py 文件是模块的“护照”,声明模块身份和关键属性。
- 核心字段:name、version、description、author、website、license、category、depends、data、demo。
- 高级字段:auto_install、external_dependencies(Python 库或二进制文件)、application、assets、installable、maintainer。
- Hooks:pre_init_hook、post_init_hook、uninstall_hook 允许在模块生命周期的不同阶段执行自定义逻辑。
8.5. Web 控制器 (Web Controllers)
Web 控制器是处理 HTTP 请求和响应的“守门人”。
- 创建控制器:继承 odoo.http.Controller 类,使用 @route() 装饰器定义路由。
- 示例:@route('/some_url', auth='public') def handler(self): return "Hello, World!"
- 扩展控制器:通过继承现有控制器并覆盖其方法来扩展功能。
- 路由参数:route (URL路径), type ('json'/'http'), auth ('user'/'public'/'none'), methods (HTTP方法), csrf (CSRF保护), cors (CORS设置)。
- 请求对象 (Request Object):访问反序列化参数、会话管理等。
- 响应处理:返回字符串、使用 make_json_response() 生成 JSON 数据或使用 Response 类处理 Cookie 和自定义头。
- 调度器 (Dispatchers):HttpDispatcher 处理标准 HTTP 请求,JsonRPCDispatcher 管理 JSON-RPC 调用。
8.6. 支付方法与支付提供商
支付方法 (Payment Methods):
- PaymentMethod 类:管理不同支付方法的中心枢纽。
- _get_compatible_payment_methods:根据提供商、国家、主要方法和额外过滤器查找兼容支付方法。
- _get_from_code:根据提供商特定代码识别支付方法。
- Tokenization (令牌化):增强支付安全性的关键过程,将敏感数据替换为唯一标识符,提高 PCI DSS 合规性。
支付提供商 (Payment Providers):
- _compute_feature_support_fields:计算提供商支持的特性,如快捷支付、手动捕获、退款、令牌化。
- _compute_view_configuration_fields:管理提供商表单视图中特定元素的可见性。
- _get_compatible_providers:根据公司 ID、合作伙伴 ID、金额、货币等查找兼容提供商。
- _get_redirect_form_view:决定重定向表单使用的模板。
- 验证操作:get_validation_amount、_get_validation_currency、_is_tokenization_required。
- _should_build_inline_form:决定是否创建内联支付表单。
- _get_removal_values:返回提供商模块卸载时更新的值。
支付令牌 (Payment Tokens):
- _get_available_tokens:获取与特定提供商和合作伙伴关联的可用令牌。
- _build_display_name:为令牌创建用户友好的显示名称(如“•••• 1234”)。
- _get_specific_create_values:在令牌创建时添加提供商特定详细信息。
- _handle_archiving:管理令牌归档过程,确保安全存储或处置。
9. Odoo Studio:可视化定制工具
Odoo Studio 是一个强大的可视化工具,允许用户在不编写代码的情况下定制 Odoo 应用程序。
9.1. 字段与小部件 (Fields and Widgets)
- 字段:数据库模型中的列,存储特定类型的数据。
- 小部件:定义字段在用户界面中的显示方式和功能。
- 简单字段:Text (char), Multiline Text (text), Integer, Decimal (float), Monetary, Html, Date, Date & Time, Checkbox, Selection, Priority, File (binary), Image (binary), Sign (binary)。
- 关系字段:Many2One, One2Many, Lines (one2many), Many2Many, Tags (many2many), Related Field。
- 字段属性:Invisible, Required, Read only, Label, Help Tooltip, Placeholder, Widget, Default value, Limit visibility to groups。
9.2. 视图 (Views)
Odoo Studio 允许用户轻松定制和配置各种视图:
- 通用视图:表单视图、活动视图、搜索视图。
- 多记录视图:看板视图、列表视图、地图视图。
- 时间轴视图:日历视图、同期群视图、甘特视图。
- 报告视图:数据透视表视图、图表视图、仪表板视图。
- 修改视图技巧:可以通过 Studio 切换模型的默认视图,或在开发者模式下使用内置 XML 编辑器进行高级定制。建议创建和编辑继承视图,而不是直接修改标准视图,以确保更新后的兼容性。
9.3. 模型、模块与应用
- 模型:数据库的骨架,定义数据结构以及如何存储和操作数据。
- 模块与应用:构建系统,包含模型、视图、数据文件、Web 控制器和静态 Web 数据。
- 建议功能 (Suggested Features):Odoo Studio 提供多达 14 种功能(如联系方式、用户分配、日期与日历、管道阶段、标签、图片、行、笔记、货币价值、公司、自定义排序、聊天器、归档),可加速模型和应用的开发。
- 导出与导入定制:可以将 Studio 定制导出为“Studio customizations”模块,方便在不同数据库之间迁移。
9.4. 自动化规则 (Automation Rules)
自动化规则允许用户设置基于用户操作、邮件事件、时间条件或外部事件触发的自动更改。
- 触发器:值更新、邮件事件、时序条件、自定义、外部(通过 Webhook)。
- 动作:更新记录、创建活动、发送邮件和短信、添加/删除关注者、创建记录、执行代码、发送 Webhook 通知、执行现有动作。
- 高级功能:更新前域、额外条件、日志记录。
- Webhook:连接 Odoo 与外部系统,基于其他应用的数据实现自动化。
9.5. PDF 报告
Odoo Studio 允许用户创建和定制专业的 PDF 报告。
- 默认布局:配置公司文档布局,选择字体、颜色、背景、公司 Logo、标语和详细信息。
- 创建新报告:选择报告类型(外部、内部、空白)。
- 编辑现有报告:建议复制标准报告后再编辑。可以重命名报告、更改纸张格式、设置可见性。
- 报告编辑器:直接修改格式和内容,使用命令(/)添加字段、表格、图片。
- 条件块与动态内容:根据条件显示或隐藏内容,蓝色高亮文本会自动更新字段值。
- 高级定制:直接编辑 XML(需谨慎)。
10. Odoo 管理与调试
10.1. 数据库管理
- 创建数据库:在 Odoo 安装时或通过 /web/database/manager 页面创建。可以加载演示数据。
- 删除、备份、恢复、复制数据库。
- 主密码 (Master Password):控制所有 Odoo 数据库的关键元素,用于数据库创建、删除、复制等操作。
10.2. 用户管理与安全规则
- 用户类型:管理员(对系统有完全访问权限)和普通用户。
- 创建用户:填写用户信息、设置每个应用的访问权限。
- 用户组:Odoo 的重要安全模块,用于实现组织层次结构并对一组用户实施访问控制。
- 安全规则:
- 字段访问控制:perm_read (读), perm_write (写), perm_create (创建), perm_unlink (删除)。
- 记录规则 (Record Rules):对单个记录的访问进行更精细的控制,确保用户只能查看或修改其管理的属性。
- 安全覆盖 (Security Override):使用 sudo() 暂时绕过安全检查,但需配合显式安全检查。
- 多公司安全:限制用户只能访问其所属公司的记录。
- 可见性 vs. 安全性:可见性控制界面显示,安全性限制数据访问。
10.3. 日志与调试
- 终端日志:开发环境下的主要信息来源,通过 --log-handler 控制输出级别。
- 浏览器控制台:包含客户端部分的有用日志。
- 浏览器开发者工具:
- Sources 标签页:检查加载的客户端文件,需开启调试模式 (debug=assets)。
- Network 标签页:查找 HTTP 请求和响应信息。
- Preserve log:保存控制台输出以跨页面刷新。
- QWeb 调试:
- t-log:在渲染时记录表达式结果到控制台。
- t-debug:在模板渲染时触发调试器断点。
- t-js:在模板渲染时执行 JavaScript 代码。
10.4. 典型错误
- Error: Failed modules:JavaScript 模块加载失败,需检查 boot.js 中的详细错误。
- Error: Missing dependencies:缺少依赖模块,通常是 XML 文件中未正确包含。
- AccessError: Please contact your system administrator:用户不满足 ir.rule 中定义的访问要求。
- Exception: bus.Bus unavailable:Longpolling 未正确配置,用于即时通知和更新。
- ValueError: External ID not found in the system: web.login:数据库初始化存在问题,可能需要重新创建数据库。
10.5. Odoo 后端模型
- ir.config_parameter:用于存储系统配置参数,可以通过 XML (<record>, <function>) 或 Python/YAML 动态创建。
- res.users, res.groups:管理用户和用户组。
- ir.model.access:定义对整个模型的访问权限(读、写、创建、删除)。
- ir.rule:定义对模型中特定记录子集的访问条件(记录规则)。
- product.template, product.product:管理产品模板和具体产品变体。
- ir.actions.todo:用于执行自动化动作,如模块安装后的初始化向导。
- bus.bus:用于 Longpolling 即时通知。
- ir.cron:创建自动化动作(定时任务)。
- mail.message:通过消息子类型 (mail.message.subtype) 和 _track 属性跟踪文档(如项目任务)的更改。
10.6. Odoo Python 编码规范
- 装饰器:@api.one (已废弃,改用 @api.multi),@api.multi (默认,处理多条记录),@api.model (处理模型本身而非特定记录)。
- res.config.settings:应用程序配置向导,支持设置默认值、分配用户组和安装模块。
- One2one 字段:Odoo ORM 不直接支持,但可以通过在一方设置 Many2one 字段,在另一方设置 One2many 字段,并添加计算和反向虚拟 Many2one 字段来实现。
- x2many 字段填充:使用 fields.Command (Odoo 15.0+) 或三元组命令 (Odoo 14.0-) 填充或操作 One2many/Many2many 字段。
- 字段定义:fields.Char, fields.Text, fields.Integer, fields.Float 等。
- selection_add 与 ondelete (Odoo 14.0+ 选择字段扩展)。
- delegate=True (Many2one 字段,对应 _inherits)。
- copy=False (WIP,防止复制字段)。
- 计算字段:使用 compute kwarg 定义,可以有 search kwarg 提供搜索功能。
- _sql_constraints 与 @api.constrains:定义 SQL 约束和 Python 约束以强制执行数据不变量。
- PostgreSQL 视图报告:创建 _auto=False 的模型,并定义 init(self, cr) 方法来创建 PostgreSQL 视图。
- 外部依赖:在 Python 文件中使用 try-except ImportError 捕获外部库导入错误,并在 __manifest__.py 中声明 external_dependencies。
10.7. Hooks
- post_load:在任何模型或数据初始化之前调用模块的后加载钩子,用于服务器范围的功能,特别是 Monkey Patch。
- pre_init_hook / post_init_hook / uninstall_hook:在模块安装前/后或卸载时执行自定义逻辑。
11. 总结
Odoo 提供了一个全面的 ERP 平台,其模块化的架构、灵活的定制能力和强大的开发工具使其成为企业资源规划的强大选择。从架构概览到模块开发、用户界面设计、高级字段和关系管理,再到云平台部署与管理,Odoo 都提供了详细的指导和工具。遵循其编码规范、利用 Studio 进行可视化定制,并掌握调试技巧,将能有效地构建、部署和维护 Odoo 应用程序。Odoo 以它的易用性、可扩展性和社区支持,成为了一个不断发展且充满活力的生态系统。



