先说结论
Odoo eLearning 里的认证,不是“课程里嵌了一份问卷”这么简单。
从 /home/ubuntu/odoo-temp/addons/website_slides_survey/models/slide_channel.py 与 survey_survey.py 看,官方真正处理的是三件事:
- 问卷认证如何回写到课程成员关系
- 课程成员退出后,为什么旧尝试不能继续算同一轮
- 已被课程用作认证的问卷,为什么不允许随便删除
这说明在 Odoo 里,课程认证不是孤立测试,而是课程生命周期的一部分。
第一层:为什么认证结果不直接只挂在问卷答卷上
理论上,认证通过这件事似乎只要看 survey.user_input 里的分数和是否通过就够了。
但 website_slides_survey 没停在这里。它还把 slide.channel.partner 扩展出了:
nbr_certificationsurvey_certification_success
这说明官方不满足于“某次答卷通过了”,而是希望把结果落到“某个人在某门课里的学习关系”上。
这层差别很重要。
因为课程运营真正常看的不是:
- 这份问卷今天有几条通过答卷
而是:
- 这门课程现在有多少成员已经完成认证
- 某个成员在课程维度上是否算 certified
前者是问卷数据,后者才是学习运营数据。
第二层:为什么课程要单独统计 certified members
SlideChannel 上新增了:
members_certified_countnbr_certification
而 members_certified_count 是通过 slide.channel.partner 中 survey_certification_success = True 来统计的。
这说明 Odoo 特别强调:
认证统计应该以课程成员为中心,而不是以问卷作答条数为中心。
这听起来像小细节,实际上非常关键。
因为如果你只统计 survey 通过次数,很快就会失真:
- 同一个人重试多次
- 一个人退课后再加课
- 一份认证问卷可能被多个课程复用
这时只有把统计锚定在 channel partner 这一层,课程看板上的“已认证人数”才有业务意义。
第三层:为什么退课时要把旧 user_input 和成员关系切开
SlideChannel._remove_membership() 有一段非常值得细读的注释:
删除成员关系时,要把
user_input和slide_partner_id的关联去掉。
官方甚至解释得很直接:
- 这么做是为了保留“自上次加入课程以来允许的尝试池”
- 只有仍然挂着
slide_partner_id的那些 user_input,才算当前这一轮课程关系下的尝试
这其实非常聪明。
因为 eLearning 的真实场景里,经常会出现:
- 学员退课
- 管理员重新邀请加入
- 同一人重新开始一轮课程
如果系统还把旧 user_input 全都当成当前课程成员关系的一部分,就会出现两个问题:
- 新一轮课程尝试被旧记录污染
- 学员明明重新加入,却被系统认定“已经用完次数”
所以 Odoo 的处理不是删除旧答卷,而是切断它与当前课程成员关系的直接关联。这样既保留历史,又给当前这轮课程新的边界。
第四层:为什么认证问卷不能随便删
SurveySurvey._unlink_except_linked_to_course() 做了一个很硬的限制:
如果某份 survey 正被某些 slide 作为 certification 使用,就不能删除。
而且报错文案还会列出:
- 是哪份认证
- 被哪些课程引用
这个限制非常有必要。
因为认证问卷一旦接入课程,它就不再是普通内容素材,而是课程毕业条件的一部分。
如果允许随手删掉,会直接带来几类严重问题:
- 已有课程失去认证入口
- 学员看到的课程要求突然失效
- 历史认证记录失去语义依托
换句话说,官方是在保护“课程的教学承诺”。
第五层:为什么一份认证问卷要反查自己被哪些课程使用
survey.survey 上新增了:
slide_idsslide_channel_idsslide_channel_count
这让问卷自己也知道:
- 我被哪些认证 slide 引用
- 我服务于哪些课程
这是个很典型的“反向可见性”设计。
因为一旦 survey 被复用在多个课程里,问题就不再只是问卷团队的内部调整,而会影响多个教学业务对象。
让 survey 端能直接看到课程引用关系,可以明显降低维护风险。
第六层:为什么认证挑战分类会改成 slides
_prepare_challenge_category() 里有个很有意思的判断:
- 如果这个 survey 是通过 slide 关联到课程认证的
- 它的 challenge category 会走
slides - 否则才走普通
certification
这说明 Odoo 不是单纯把“考试通过”当成抽象成就,而是进一步识别:
- 这是独立测验的认证
- 还是课程学习链路里的认证
对后续徽章、挑战、学习分析,这个区分很重要。
最容易误解的三个点
误区一:认证通过就只是一条 survey 答卷通过
不够。 课程真正关心的是“成员关系是否进入已认证状态”。
误区二:退课再重新加入,旧尝试本来就应该继续累计
未必。 对课程运营来说,重新加入往往意味着新一轮学习关系,需要新的尝试边界。
误区三:认证问卷和普通问卷一样,想删就删
不是。 一旦它被课程引用,就已经成了课程结构的一部分。
实施时怎么理解最稳
如果你在做 eLearning 认证实施,我建议这样把控:
- 课程认证分析优先看 channel partner 层,不要只看 survey 通过记录
- 处理退课、复课时,重点验证旧 user_input 与新成员关系是否正确切断
- 打算复用同一认证问卷给多门课程时,先评估改题对所有课程的影响
- 不要把“删除旧认证问卷”当成清理动作,先查清它是否仍被课程引用
- 做报表时区分“认证通过次数”和“已认证成员人数”,两者不是一回事
最后总结
Odoo 在线课程认证真正要维护的,不只是问卷分数,而是三层关系:
- 答卷是否通过
- 成员在课程里是否已认证
- 当前课程成员关系对应的是哪一池尝试记录
理解这一点后,你会发现 website_slides_survey 的重点根本不是“把 survey 放进课程”,而是把认证这件事做成可重复开课、可保留历史、又不混淆当前状态的长期机制。
DISCUSSION
评论区