先说结论
Odoo Event 的公开入口不只是“打开活动页然后报名”。
从源码看,它至少提供了两种非常不同的外部入口:
- ICS 下载入口:把活动带到用户自己的日历系统;
- registration desk kiosk 入口:把活动带到现场签到接待场景。
所以它的本质不是“网站展示活动”,而是:
在活动前、中、现场三个阶段,把同一场活动翻译成不同入口形态。
一、为什么 get_kiosk_url() 这么短,却很关键
event_event.py 里的 get_kiosk_url() 只有一行:
- 返回
base_url + "/odoo/registration-desk"
看起来非常简单,但这行代码传达的设计意图很强:
- Odoo 不把 kiosk 理解成活动页里的某个按钮状态;
- 它把现场接待视为一个单独入口。
也就是说,网站报名、邮件通知、现场接待,并不是同一个页面不断变形,而是:
- 同一场活动在不同阶段有不同入口语义。
二、为什么 ICS 导出要走专门控制器,而不是模板下载
event/controllers/main.py 里有公开路由:
/event/<event>/ics
控制器 event_ics_file() 会:
- 处理语言上下文;
- 可选接入
slot_id; - 调
event._get_ics_file()生成二进制内容; - 以下载响应形式返回。
这说明 ICS 在 Odoo 里不是“模板上拼一段文本”,而是正式的导出能力。
尤其是它支持 slot_id 这一点,意味着:
- 同一场活动不只是有一个固定时间壳;
- 它还能把具体日程槽位翻译成不同的日历落点。
三、为什么 _get_external_description() 先做截断和净化
_get_external_description() 的处理非常值得看。
它会:
- 如果有
event_share_url,先把链接写进描述; - 再把 HTML description 转成内部文本内容;
- 最后压缩到大约 1900 字符,给外部渠道留空间。
这说明 Odoo 很清楚:
- 站内富文本描述,不等于外部日历系统能原样消化的内容;
- ICS / GCal / 外部 URL 渠道对长度和格式都更敏感。
所以这里不是简单“导出 description”,而是:
- 把站内活动描述改写成可外带的外部描述。
四、为什么 _get_ics_file() 是“活动翻译器”
_get_ics_file() 的工作并不只是组一个文件。
它会把活动翻译成日历语义里的这些字段:
dtstartdtendsummarydescriptionlocation
而且时间还会按 event.date_tz 做时区处理。
这意味着 Odoo 在这里做的不是“附送个文件”,而是:
- 把 event 模型翻译成外部日历能理解的事件对象。
这一步非常关键,因为用户点“加入日历”时,真正关心的不是 Odoo 内部字段长什么样,而是:
- 我的日历里会不会出现一条时间、地点、标题都正确的活动记录。
五、为什么 kiosk 和 ICS 是两种完全不同的外部化方式
虽然它们都属于“活动外部入口”,但服务的是两个截然不同阶段:
ICS
面向的是:
- 活动前提醒;
- 个人日程管理;
- 把活动带出 Odoo 进入用户自己的时间系统。
kiosk
面向的是:
- 活动当天;
- 现场接待;
- 把活动从网站语境切进签到和入口治理语境。
也就是说:
- ICS 是把活动外带到个人日历里;
- kiosk 是把活动落地到现场入口里。
六、为什么这能说明 Event 模块并不只是报名系统
如果一个活动系统只有报名页,那它解决的只是“来不来”。
但 Odoo 源码里这两条链说明它还在解决:
- 来之前,怎么加入个人时间安排;
- 到现场后,怎么进入接待与签到流程。
所以 Event 模块真正覆盖的是:
- 活动发现 → 报名 → 日历承接 → 现场接待
而不只是中间那一步表单提交。
七、最容易误解的几个点
误解 1:ICS 下载只是营销小功能
不对。它是活动进入外部日历系统的正式出口。
误解 2:kiosk 只是活动页上的一个按钮
不对。源码直接把它做成单独入口 URL。
误解 3:活动描述可以原样拿去做外部导出
不对。外部渠道需要被重新净化和截断。
误解 4:Event 主要就是报名模型
不对。它还要服务活动前后的外部入口链。
最后一句
理解 Odoo Event 的外部入口,重点不是“活动页怎么展示”,而是看懂这条主链:
_get_external_description()先把站内描述改写成外带内容 →_get_ics_file()把活动翻译成日历对象 →event_ics_file()把它作为公共下载入口导出;与此同时,get_kiosk_url()把活动切到现场 registration desk 入口。
看懂以后你就会知道,Odoo Event 提供的不是一张报名网页,而是一组贯穿活动前后和现场的入口系统。
DISCUSSION
评论区