其他深度

Odoo 在线课程认证为什么不能只看“通过没通过”:成员关系、认证记录与退课重置讲透

很多人在 Odoo eLearning 里看到认证测验,只会关注考试是否通过。但从 website_slides_survey 的 slide_channel.py 和 survey_survey.py 看,真正关键的是“认证记录如何挂到课程成员关系上、退课时为什么要切断旧 user_input、认证问卷为什么不能随便删”。理解这条链,课程认证才能长期可维护。

其他
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 5 阅读

先说结论

Odoo eLearning 里的认证,不是“课程里嵌了一份问卷”这么简单。

/home/ubuntu/odoo-temp/addons/website_slides_survey/models/slide_channel.pysurvey_survey.py 看,官方真正处理的是三件事:

  • 问卷认证如何回写到课程成员关系
  • 课程成员退出后,为什么旧尝试不能继续算同一轮
  • 已被课程用作认证的问卷,为什么不允许随便删除

这说明在 Odoo 里,课程认证不是孤立测试,而是课程生命周期的一部分

第一层:为什么认证结果不直接只挂在问卷答卷上

理论上,认证通过这件事似乎只要看 survey.user_input 里的分数和是否通过就够了。

但 website_slides_survey 没停在这里。它还把 slide.channel.partner 扩展出了:

  • nbr_certification
  • survey_certification_success

这说明官方不满足于“某次答卷通过了”,而是希望把结果落到“某个人在某门课里的学习关系”上。

这层差别很重要。

因为课程运营真正常看的不是:

  • 这份问卷今天有几条通过答卷

而是:

  • 这门课程现在有多少成员已经完成认证
  • 某个成员在课程维度上是否算 certified

前者是问卷数据,后者才是学习运营数据。

第二层:为什么课程要单独统计 certified members

SlideChannel 上新增了:

  • members_certified_count
  • nbr_certification

members_certified_count 是通过 slide.channel.partnersurvey_certification_success = True 来统计的。

这说明 Odoo 特别强调:

认证统计应该以课程成员为中心,而不是以问卷作答条数为中心。

这听起来像小细节,实际上非常关键。

因为如果你只统计 survey 通过次数,很快就会失真:

  • 同一个人重试多次
  • 一个人退课后再加课
  • 一份认证问卷可能被多个课程复用

这时只有把统计锚定在 channel partner 这一层,课程看板上的“已认证人数”才有业务意义。

第三层:为什么退课时要把旧 user_input 和成员关系切开

SlideChannel._remove_membership() 有一段非常值得细读的注释:

删除成员关系时,要把 user_inputslide_partner_id 的关联去掉。

官方甚至解释得很直接:

  • 这么做是为了保留“自上次加入课程以来允许的尝试池”
  • 只有仍然挂着 slide_partner_id 的那些 user_input,才算当前这一轮课程关系下的尝试

这其实非常聪明。

因为 eLearning 的真实场景里,经常会出现:

  • 学员退课
  • 管理员重新邀请加入
  • 同一人重新开始一轮课程

如果系统还把旧 user_input 全都当成当前课程成员关系的一部分,就会出现两个问题:

  1. 新一轮课程尝试被旧记录污染
  2. 学员明明重新加入,却被系统认定“已经用完次数”

所以 Odoo 的处理不是删除旧答卷,而是切断它与当前课程成员关系的直接关联。这样既保留历史,又给当前这轮课程新的边界。

第四层:为什么认证问卷不能随便删

SurveySurvey._unlink_except_linked_to_course() 做了一个很硬的限制:

如果某份 survey 正被某些 slide 作为 certification 使用,就不能删除。

而且报错文案还会列出:

  • 是哪份认证
  • 被哪些课程引用

这个限制非常有必要。

因为认证问卷一旦接入课程,它就不再是普通内容素材,而是课程毕业条件的一部分。

如果允许随手删掉,会直接带来几类严重问题:

  • 已有课程失去认证入口
  • 学员看到的课程要求突然失效
  • 历史认证记录失去语义依托

换句话说,官方是在保护“课程的教学承诺”。

第五层:为什么一份认证问卷要反查自己被哪些课程使用

survey.survey 上新增了:

  • slide_ids
  • slide_channel_ids
  • slide_channel_count

这让问卷自己也知道:

  • 我被哪些认证 slide 引用
  • 我服务于哪些课程

这是个很典型的“反向可见性”设计。

因为一旦 survey 被复用在多个课程里,问题就不再只是问卷团队的内部调整,而会影响多个教学业务对象。

让 survey 端能直接看到课程引用关系,可以明显降低维护风险。

第六层:为什么认证挑战分类会改成 slides

_prepare_challenge_category() 里有个很有意思的判断:

  • 如果这个 survey 是通过 slide 关联到课程认证的
  • 它的 challenge category 会走 slides
  • 否则才走普通 certification

这说明 Odoo 不是单纯把“考试通过”当成抽象成就,而是进一步识别:

  • 这是独立测验的认证
  • 还是课程学习链路里的认证

对后续徽章、挑战、学习分析,这个区分很重要。

最容易误解的三个点

误区一:认证通过就只是一条 survey 答卷通过

不够。 课程真正关心的是“成员关系是否进入已认证状态”。

误区二:退课再重新加入,旧尝试本来就应该继续累计

未必。 对课程运营来说,重新加入往往意味着新一轮学习关系,需要新的尝试边界。

误区三:认证问卷和普通问卷一样,想删就删

不是。 一旦它被课程引用,就已经成了课程结构的一部分。

实施时怎么理解最稳

如果你在做 eLearning 认证实施,我建议这样把控:

  1. 课程认证分析优先看 channel partner 层,不要只看 survey 通过记录
  2. 处理退课、复课时,重点验证旧 user_input 与新成员关系是否正确切断
  3. 打算复用同一认证问卷给多门课程时,先评估改题对所有课程的影响
  4. 不要把“删除旧认证问卷”当成清理动作,先查清它是否仍被课程引用
  5. 做报表时区分“认证通过次数”和“已认证成员人数”,两者不是一回事

最后总结

Odoo 在线课程认证真正要维护的,不只是问卷分数,而是三层关系:

  • 答卷是否通过
  • 成员在课程里是否已认证
  • 当前课程成员关系对应的是哪一池尝试记录

理解这一点后,你会发现 website_slides_survey 的重点根本不是“把 survey 放进课程”,而是把认证这件事做成可重复开课、可保留历史、又不混淆当前状态的长期机制。

DISCUSSION

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。