Google Calendar 集成最容易被误解成“连上账号,会议就会自动同步”。但 enterprise/appointment_google_calendar/models/appointment_type.py 与 calendar_event.py 说明,真正难的不是连通,而是:系统有没有能力配置 Google、哪些用户其实还没同步、Meet 链接什么时候能拿到、同步后应该把什么值写回 Odoo。
一、有没有 Google 连接器,不是看用户感受,而是看系统状态
_get_calendars_possible_to_setup() 会检查 google.service 是否存在 calendar client id,并确认 google_calendar_sync_paused 没被暂停;_compute_connector_google() 再据此判断 connector_google。这说明“Google 能不能接”首先是系统配置问题,不是某个销售说“我已经登过谷歌账号了”。
二、用户没同步时,系统会明确提示 Meet 不会加进去
_compute_users_wo_google_calendar_msg() 会针对 event_videocall_source == 'google_meet' 的预约类型,检查 staff users 里哪些人还没同步 Google Calendar,并生成醒目的提示文本。如果整个 connector 都没准备好,还会直接告诉你 Google Sync 配置有问题。
这一步很重要,因为企业里最常见的误会就是:预约类型已经设置成 Google Meet,但只有部分员工真正同步了账号,结果客户有的预约有 Meet,有的没有。
三、Meet 链接并不是建 event 时立刻拿到
calendar_event.py 的 _compute_videocall_redirection() 注释已经说明:真正的 Google Meet URL 往往要等 Google 事件创建并同步后才可用。所以 Odoo 会先生成一个本地 videocall_redirection,让 chatter 里先有一个可显示入口。
换句话说,系统知道“同步后才能拿到最终 URL”,于是先给出一个临时重定向入口,而不是让用户在过渡阶段看到空白。
四、同步前后对 conferenceData 的处理是反着做的
_google_values() 的逻辑很精细:如果 appointment type 不是 google_meet,就主动移除 conferenceData,避免 Google 自动生成 Hangout;如果明确是 Google Meet 且当前还没有 videocall_location,则强制创建 conferenceData 请求。这不是技术细节,而是业务语义控制:谁该有 Meet、谁不该有,必须由 appointment type 决定。
同步完成后,_get_post_sync_values() 又会从 GoogleEvent 里取 hangoutLink,把真实 videocall_location 回写回来。于是前、中、后三个阶段才闭环。
实战注意事项
- 先确认 connector 能 setup,再谈预约体验。
- 把“用户已同步”当上线检查项:不是员工都连上,Meet 体验就不会一致。
- 区分 redirection 与真实 Meet URL:前者是过渡入口,后者要等同步成功。
- 让 appointment type 决定会议源:不要指望 Google 默认行为替你做业务判断。
新手误区
- 误以为只要个人 Google 账号可用,企业预约就算配置完成。
- 误以为 Meet URL 会在建事件瞬间出现。
- 误以为 Google 默认生成会议链接是好事。
- 误以为同步后的值不需要再写回 Odoo。
主要源码参考
enterprise/appointment_google_calendar/models/appointment_type.pyenterprise/appointment_google_calendar/models/calendar_event.py
DISCUSSION
评论区