OpenProject 16.0.0 版本详解:会议积压、内部评论、自动主题与全新时间跟踪模块
【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject
导读:本文基于 OpenProject 16.0.0(发布于 2025-05-21)的官方发布说明,系统梳理该大版本引入的企业级功能与关键技术变更。你将了解到会议积压(Meeting backlogs)如何重构会议议程管理、内部评论如何实现工作包内的安全沟通、自动生成的工作包主题如何统一命名规范,以及独立时间跟踪模块与强制起止时间如何满足法定工时记录要求;同时涵盖 Nextcloud 基于 OIDC/JWT 的无缝会话集成与 APIv3 的 breaking change。文中穿插对应源码实现(如
modules/meeting/app/models/meeting_section.rb、app/models/journal.rb、modules/costs/app/models/time_entry.rb),帮助读者理解功能背后的设计原理。
版本概览与重要更新
OpenProject 16.0.0 是一个主版本(major release),包含大量新功能与缺陷修复,官方建议所有用户升级到最新版本。本次发布的 Enterprise 计划(Basic、Professional、Premium、Corporate)也进行了调整:每个计划现在包含一组特定的 Enterprise 附加组件(add-ons),支持级别与定价保持不变。
对于现有 Enterprise 客户,原有计划继续有效,可访问当时已发布的所有 Enterprise 附加组件,没有任何功能被移除。但从本版本起,新的 Enterprise 附加组件可能只包含在更高档位的计划中——例如下文介绍的「内部评论」功能就属于 Professional 计划。低档位计划用户若想体验高档位计划的新附加组件,可以申请新的 Enterprise 试用令牌(on-premises 环境)或启动新的 Cloud 试用实例。
会议积压(Meeting backlogs):更灵活的议程管理
会议组织在 16.0 中变得更加轻松:会议积压允许用户更灵活地收集、管理和准备议程事项(agenda items),既适用于一次性会议,也适用于周期性会议系列。
一次性会议的 Agenda backlog
在一次性会议中,新增的Agenda backlog(议程积压区)用于存放尚未分配到当前会议、但后续可能加入的话题。用户可以随时把积压中的议程事项拖入会议,反之,若某个议程事项需要推迟,也可以从会议移回积压区。
周期性会议的 Series backlog
在周期性会议中,共享的Series backlog(系列积压区)帮助用户跨所有会议场次追踪未决事项,并随着优先级变化在各场次会议之间移动事项。
从源码看,积压功能建立在会议区块(meeting section)模型之上:MeetingSection模型通过backlog布尔字段标识积压区块,并提供了scope :backlog用于查询,且积压区块不参与普通区块的位置排序(acts_as_list scope: [:meeting_id, { backlog: false }])。积压区块的标题文案也做了区分:周期性会议的积压显示为「Series backlog」,一次性会议则显示「Agenda backlog」(见 modules/meeting/app/models/meeting_section.rb)。
议程事项(MeetingAgendaItem)通过acts_as_list scope: :meeting_section在各自区块内排序,并关联到work_package,这意味着工作包可以直接添加到积压区——即使当前会议没有任何议程事项,也能维护一份重要话题的积压清单(见 modules/meeting/app/models/meeting_agenda_item.rb)。
更多细节可参考 一次性会议用户指南 与 周期性会议用户指南。
经典会议的终结
自 16.0 起,创建新会议时不再提供「classic」经典模式选项。随着会议成果(meeting outcomes)与会议积压功能的发布,经典会议被认为已过时。升级过程中不会丢失任何数据,唯一的例外是经典会议的Meeting history(会议历史)。
工作包内部评论(Enterprise 附加组件)
Professional 及以上计划用户现在可以在工作包的Activity(活动)标签页中进行内部沟通。使用该功能的前提是项目管理员先启用内部评论:默认情况下内部评论仅对项目管理员角色可见,但管理员可以将一组新的权限授予任意数量的角色。
拥有相应权限的用户在添加新评论时,会看到一个"Internal comment"(内部评论)复选框;勾选后,该评论只有同样拥有这些权限的人可见。内部评论通过不同的背景颜色与普通评论区分。
[!TIP] 想确认谁能看到你的内部评论?输入
@即可看到所有具备内部评论查看权限的用户列表。如果某位用户不在此列表中,你将无法在内部评论中 @ 提及他。
[!NOTE] 自 16.0 起,在 Activity 标签页上传的文件不再出现在 Files 标签页。尽管内部评论是这一变化的技术触发点,但它对普通评论和内部评论都生效。
源码视角:内部评论的实现
内部评论本质上是一条被标记为「受限」(restricted)的评论记录。在Journal模型中,internal是restricted的别名(alias_attribute :internal, :restricted),可见性判断则由权限控制:
- 评论内容可见性:
journable.attachments_visible?(user) && user.allowed_in_project?(:view_internal_comments, project) - 评论本身可见性:
journable.visible?(user) && user.allowed_in_project?(:view_internal_comments, project)
(见 app/models/journal.rb)
也就是说,「谁能看到内部评论」完全由view_internal_comments权限决定,这正好解释了管理员可以为多个角色授予内部评论权限的设计。而项目级开关则存储在项目设置中:Project模型通过store_attribute :settings, :enabled_internal_comments, :boolean持久化「是否启用内部评论」(见 app/models/project.rb)。此外,internal_mentionable_on_work_package_filter过滤类保证了 @ 提及列表只包含有权限的用户(见 app/models/queries/principals/filters/internal_mentionable_on_work_package_filter.rb)。
完整使用说明见 Activity 用户指南。
自动生成的工作包主题(Enterprise 附加组件)
OpenProject 16.0 支持为工作包自动生成主题(subject)。这一 Professional 计划中的新附加组件允许管理员为每种工作包类型定义主题模式(subject pattern)。启用后,主题字段在创建工作包及后续更新过程中都会被自动填充且不可编辑。
该功能尤其适合请假申请、IT 工单、维护报告等需要统一命名规范的结构化流程。主题模式可包含静态文本与动态占位符,例如项目名称、工作包类型或自定义字段值。
主题模式的常见示例
| 场景 | 模式示例 |
|---|---|
| 请假申请 | [Author] [Start date] - [Finish date] |
| 候选人面试 | [Custom Field: Candidate] with [Assignee] on [Start date] |
| 供应商发票 | [Author] Invoice [Creation date] - [Custom Field: Invoice ID] |
使用方式与注意事项
- 创建或编辑:像普通工作包一样填写各项详情,唯一例外是主题字段保持为空;
- 主题只读:主题由系统自动生成,无法手动编辑;
- 属性变化触发更新:任何工作包属性的修改都会触发主题自动更新——即使被修改的属性并未出现在主题模式中;
- 锁定主题的含义:如果主题字段被锁定,说明管理员对该工作包类型启用了自动主题模式;但也可能意味着你缺少编辑该特定工作包的权限。
属性在主题中的呈现规则
主题反映的是管理员配置中引用的属性实际值:
- 日期:如
[Start date]、[Finish date] - 用户:如
[Author]、[Assignee] - 属性:如
[Priority]、[Category]、[Custom Field: X] - 项目信息:如
[Project name]、[Project identifier]
两条重要的显示规则:
- 若引用的属性不可用,主题显示"N/A";
- 若引用的属性当前无值,主题显示[属性名](即方括号中的占位符本身)。
常见 FAQ
- 主题如何更新?当主题模式中引用的属性(如日期、自定义字段)发生变化时,保存工作包后主题自动更新,无需额外操作。
- 引用了父工作包或项目属性会怎样?这些属性的变化不会立即反映到子工作包的主题上,只有更新并保存子工作包后主题才会刷新。官方计划在后续版本改进此行为。
- 为什么出现 "N/A"?表示引用的属性不可用,常见原因包括:模式引用了父属性但未分配父工作包;父工作包存在但引用的属性在该父类型中不可用;引用的属性未在当前项目中激活。属性可用并填充后,保存工作包即自动刷新主题。例如模式
INVOICE: [Custom Field: Invoice ID] - [Start date],当 "Invoice ID" 不可用时将显示INVOICE: N/A - 2025-01-23。 - 为什么出现 [属性名]?表示引用的属性尚未被填充或设置。
更详细的介绍见 Automatic subjects 用户指南。
独立的时间跟踪模块与日历视图
OpenProject 16.0 提供了独立的时间跟踪模块,并带有日历视图,可从全局视图进入,在左侧边栏导航中称为My time tracking(我的时间跟踪)。用户可以在其中查看和编辑带有开始/结束时间(start/end times)的已记录工时,可在日、周、工作周、月四种视图间切换,也可以直接点击日历空白处快速记录新的时间条目。
每个日期列都会显示该日记录工时的总和;在周视图和月视图中,总计时间显示在右下角。
管理员激活步骤
该模块需要管理员先进行激活:导航到管理(Administration)→ 工时与成本(Time and costs)→ 默认设置(Defaults),勾选"Allow exact time tracking"(允许精确时间跟踪)以启用开始/结束日期记录。
- 若启用 "Allow exact time tracking",日历将成为 My time tracking 模块的默认视图;
- 若勾选"Require exact times"(要求精确时间),用户记录工时必须同时提供开始和结束时间;
- 否则列表视图保持为默认视图;在日历视图中,所有条目显示在对应日期列的顶部。
从源码看,时间条目模型位于 costs 模块:TimeEntry对start_time存在校验逻辑,并且spent_on、start_time、comments等字段都被注册为 journal 格式化字段(register_journal_formatted_fields "comments", "spent_on", "start_time", formatter_key: :plaintext),即开始/结束时间会被纳入活动历史追踪(见 modules/costs/app/models/time_entry.rb)。同时,hours赋值支持字符串转小时的处理(value.to_hours),为工时录入提供了友好的格式解析(见 modules/costs/app/models/time_entry.rb)。
完整说明见 My time tracking 用户指南。
带法定必填字段的时间条目:开始时间与结束时间
工时报告现在包含明确的开始与结束时间,以应对常见的法定记录要求。16.0 之前,工时报告只显示记录工时的总时长;现在则额外包含开始和结束时间以提高准确性。这一变化适用于所有支持时间跟踪的功能,例如新的时间跟踪模块、PDF 时间表(timesheet)或 My spent time 小组件。
PDF 时间表:按日、按用户的工时概览
导出的 PDF 时间表现在在报告开头以表格视图展示每位用户每天记录的工时概览。如果列表包含超过 5 位用户,视图将拆分为多个表格。
项目概览页图表:面向社区版发布
有时某个 Enterprise 附加组件会向免费社区版发布。16.0 中,项目概览页的图表(graphs)现在对所有版本可用——社区版用户可以直接在项目概览页展示图表,以可视化重要的项目信息,向团队和管理层传达项目状态。
工作包图表小组件(work package graph widgets)展示项目内工作包的信息,支持柱状图、饼图等多种展示形式。
详见 项目小组件用户指南中的工作包图表小组件章节。
其他重要功能改进
关系标签页中显示父级关系
应众多用户请求,现在可以直接在Relations(关系)标签页的下拉菜单中选择父工作包来建立父级关系。此前的方式(点击工作包左上角的Set parent)依然有效。两种方式都会让相关的工作包成为当前(子)工作包的父级。
保存工作包导出配置
在导出(公开或私有的)工作包表格时,用户可以保存其配置设置,例如特定的列顺序与显示、长文本字段等。这节省了重复配置的时间,也允许用户与团队共享导出设置(例如用于缺陷与审批报告)。请注意:该设置是全局性的,并非个人偏好——保存后会改变该特定格式与类型对所有用户的默认配置。
详见 工作包导出用户指南。
存储健康状态:多项可见检查与下载选项
文件存储(file storages)的 Health check(健康检查)在 16.0 中得到扩展。管理员现在可以查看多项可见结果,分为**基础配置(base configuration)、认证(authentication)、自动管理文件夹(automatically-managed folders)**三组。每组显示简短摘要,表明所有检查是否通过、是否存在警告或检测到故障;如发现问题,会提供指向详细文档的链接。
最近的健康检查摘要仍显示在侧边栏中;新增选项允许管理员打开完整详细报告以直接查看所有单项检查。此外,管理员还可以将完整的健康检查报告下载为文本文件,例如附加到支持请求中。
项目快速搜索中默认选中收藏项目标签页
在项目下拉菜单中选中Favorites(收藏)标签页后,OpenProject 会记住该偏好,并在下次打开下拉菜单时默认显示该标签页。这是个人设置,直到用户切回All之前一直生效。这一小的可用性改进为经常使用收藏项目的用户节省了时间。
重要技术变更
Nextcloud 与 OpenProject 用户会话的无缝集成:OIDC 与 JWT(Enterprise 附加组件)
16.0 为使用 Enterprise Corporate 计划且同时使用 Nextcloud 与 OpenProject 的客户带来重大改进。通过基于 OpenID Connect(OIDC)和 JSON Web Token(JWT)的新配置,OpenProject 与 Nextcloud 可以无缝集成用户会话,而无需在每个应用中分别显示同意(consent)界面。
关键变化在于:两者不再互为 OAuth 服务器与客户端,而是共同向一个统一的身份提供商(IDP)进行认证。这使得 OpenProject 可以直接复用用户会话来调用 Nextcloud API——改善了用户体验并降低了日常工作的复杂度。这是 OpenProject 首个支持该 Nextcloud 集成方式的版本;由于该功能尚未在大规模安装环境中充分验证,官方仍将其视为实验性功能,欢迎用户反馈以推动后续增强。
Breaking change:OIDC 提供商签发的 API JWT 必须携带 scope
在 OpenProject 14.4.0 中,OpenProject 引入了通过 OpenID Connect 提供商创建的 JWT 访问 OpenProject API 的能力。当时该能力仅计划用于 APIv3 上下文;随着 OpenProject 持续演进,官方希望将其扩展到更多上下文。自 16.0.0 起,所有令牌在进行 APIv3 的 API 请求时都必须携带名为api_v3的 scope,这与 OpenProject 自身签发的其他令牌保持一致。
16.0.0 完整变更与缺陷修复清单
以下是 16.0.0 中值得关注的功能与缺陷修复条目(编号对应官方 community 工作包 ID)。
重点功能(Feature)
会议与会话
- Meeting backlogs(会议积压)[#54751]
- 迁移经典会议功能到动态会议 [#62621]
- 会议模块的权限保持一致 [#62175]
- 向会议添加工作包对话框的会议字段标签修正 [#63692]
内部评论与活动
- 引入内部评论 [#60977]
- 移除内部评论功能开关 [#63635]
- 内部评论的 Enterprise/Professional 升级横幅 [#61061]
- 在评论访问点提供内部评论的额外保护 [#62988]
- 取消内部评论复选框但评论框已有内容时显示警告 [#62785]
- 将工作包评论锚点从
#activity-<journal-sequence>调整为#comment-<journal-id>,并向后兼容旧链接 [#60875] - 移除工作包评论 ID URL 功能开关 [#63646]
- 不在 Files 标签页展示工作包评论的行内附件 [#62356]
自动主题
- 在工作包类型设置中定义主题模式 [#59909]
- 防止在创建和更新时编辑主题 [#59910]
- 阻止用户在表格视图中编辑受管工作包主题 [#59911]
- 校验主题模式 [#61692]
- 为主题配置添加 Enterprise 横幅 [#59929]
- 在模式输入框添加前置字符以触发搜索 [#62150]
- 记录「自动主题」的当前限制信息 [#62368]
时间跟踪
- 独立的时间跟踪模块,带日历视图,记录带开始与结束时间的工时 [#59376]
- 在 Log time 对话框中记录开始时间、结束时间与时长 [#59038]
- 在成本报告与导出中添加工时时间 [#59914]
- 在 API 中添加开始与结束时间 [#60633]
- 时间跟踪列表视图 [#63336]
- 在时间跟踪日历与列表的视图选择器中提供「工作周」选项 [#63621]
- 为强制开始/结束时间跟踪引入 Enterprise 横幅 [#62624]
- PDF 时间表:恢复之前的概览表格并添加标题 [#63526]
- PDF 时间表中按日、按用户展示工时概览 [#61896]
Nextcloud / OIDC / 存储
- Nextcloud 与 OpenProject 用户会话无缝集成(OIDC & JWT)[#52828]
- Nextcloud 类型文件存储设置:允许基于 OIDC 的连接替代 OAuth2 [#55284]
- 扩展 Nextcloud 文件存储以使用 SSO 访问令牌 [#57056]
- 在 OIDC 提供程序上存储令牌交换能力 [#58862]
- 在存储健康状态中支持 OIDC [#60161]
- 允许配置 SSO 认证 + 双向 OAuth 2 [#61532]
- Nextcloud Hub 场景的受众(audience)选择 [#61623]
- 允许通过 API 设置认证方法与存储受众 [#62191]
- 为「带回退的 SSO」隐藏认证方法 [#62192]
- 校验 JWT 的 scope [#62360]
- 存储健康状态:多项可见检查 [#61556]
- 下载存储健康状态报告 [#63467]
- 为健康检查结果添加错误码 [#63518]
- Corporate 计划(Nextcloud SSO 认证)的 Enterprise 横幅 [#60612]
- 存储设置中链接到新的 OIDC 文档 [#61839]
UI 组件与界面
- 在缺失的 Rails 页面中应用标准化的 PageHeaders 与 SubHeaders 组件 [#58155]
- 更新(Rails)项目页面的 PageHeaders 与 SubHeaders(第 2 部分)[#59915]
- 表单输入:为日期/时间引入更小的输入尺寸 [#61779]
- Primerize 项目设置 > 信息表单 [#61889]
- 创建
BorderBox::CollapsibleHeader组件 [#62577] - 创建 CollapsibleSectionComponent [#62754]
- 检查 CollapsibleSectionComponent 与 CollapsibleHeaderComponent 的可访问性 [#63275]
- 创建项目状态组件 [#63482]
- 实现中等横幅组件 [#63525]
- Primerize 管理 > 认证设置 [#63567]
其他功能
- 引入企业计划(Enterprise plans)[#62469]
- 将父项添加到关系(relations)[#38030]
- 在项目快速搜索中默认选中收藏项目标签页 [#55792]
- 保存工作包表格导出配置以供下次导出使用 [#57388]
- 以 Prometheus 格式导出指标 [#60181]
- 触发浏览器确认对话框(点击「全部标记为已读」时)[#61309]
- 表情反应的 UI 微调 [#61402]
- 实现跨计划升级(cross-plan upsale)[#62471]
- 在 enterprise-tokens 仓库中支持生成企业计划令牌 [#62548]
- 允许在 SaaS 中预订 Premium 计划 [#62573]
- 将 SaaS 试用计划升级为 Premium [#63532]
- 属性为空时显示属性名而非 N/A [#63660]
- 实现新的首页 Enterprise 横幅样式 [#63727]
- 使用 Chargebee 自定义字段(Domain)生成新版 5 Enterprise 令牌 [#63845]
- 将 legacy_enterprise 自定义字段与计划名合并 [#63905]
- 沟通自动自我注册(automatic self registration)的风险 [#63379]
- 项目侧边栏中的存储按钮在所有场景下表现正确 [#62758]
- 在项目概览页发布 Enterprise 附加组件「图表」至社区版 [#63619]
缺陷修复(Bugfix)
- 搜索显示浏览器自动填充 [#57836]
- 用户能够编辑他人的评论 [#58511]
- Boards 的工作包搜索框过小 [#58702]
- 顶部栏搜索的快速修复 [#58704]
- 搜索中的 "All" 字符串无法翻译 [#59247]
- 通知铃铛与进行中时间跟踪的红色使用不一致 [#59379]
- 批量编辑工作包时出现 Error 500 [#60580]
- Primer Dialog 关闭按钮的 ARIA 标签未本地化 [#61631]
- 客户端 ID 含特殊字符时令牌刷新与交换失败 [#61694]
- 缺少空的 audience 翻译 [#61855]
- SSO 用户在项目存储成员页无法连接存储 [#61880]
- 模式输入框的自动补全下拉缺少默认条目 [#61935]
- 无法通过存储管理视图将存储关联到项目 [#61936]
- 带尖括号的输入保存后消失但实际已保存 [#62040]
- 用户无法认证时通过 SSO 链接项目存储失败 [#62166]
- 项目缺少自定义字段时,更新带生成主题的工作包失败 [#62217]
- 即使 audience 配置错误,存储仍显示健康 [#62237]
- PDF 导出未导出所有内嵌截图 [#62293]
- 当没有其他属性是必填字段时,无法行内创建带自动生成主题的工作包 [#62318]
- 项目属性列表条目作为筛选条件时未显示 [#62386]
- 主题模式中缺少属性 [#62429]
- 侧边面板中显示错误的会议日期 [#62441]
- OpenProject 企业密钥的域名检查区分大小写 [#62520]
- 工作包信息行在新标签页中打开 [#62545]
- 将通知标记为已读后自动选中第一条通知 [#62604]
- 长代码块破坏会议成果 [#62689]
- 求和查询(∑)不显示当前项目外的子项 [#62847]
- 轮询时暴露受限评论 [#62978]
- 会议议程备注与成果之间间距不足 [#63108]
- 自动计时按钮在计时器运行中持续改变宽度 [#63345]
- Gantt 模块工作包列表仍使用旧术语 "follower" [#63351]
- 议程事项的下边距不一致 [#63353]
- 拥有特定权限组合的用户更新工作包日期时出错 [#63434]
- 生成主题的缺失属性显示错误 [#63441]
- 多个 CollapsibleSection 垂直排列时缺少间距 [#63442]
- 折叠预览不工作 [#63443]
- My page 的收藏项目小组件中项目按字母排序 [#63444]
- 在日历中移动单日期工作包时无意添加第二个日期 [#63475]
- 主题模式中缺少父属性 [#63483]
- 无管理会议纪要权限的用户仍看到「添加成果」选项 [#63535]
- My time tracking 日历视图在暗色模式下显示异常 [#63548]
- 阿拉伯语与拉脱维亚语中 "All checks passed" 翻译不佳 [#63568]
- 工作包添加到模板时会议标签页出现差异 [#63571]
- My sessions 页面加载极慢 [#63587]
- SAML 使用元数据 URL 配置时未填充 IdP 证书 [#63610]
- SAML 认证:即使存在 IdP 证书仍使用过时指纹 [#63612]
- 主题模式不支持布尔自定义字段 [#63641]
- xls 导出时间字段格式错误(应为 10 h 而非 1 d 2h)[#63739]
- 添加至 Backlog/meeting 区块时焦点未设置在议程项标题上 [#63784]
- 批量删除相关工作包时 Error 500 [#63831]
- SaaS 上应隐藏杀毒软件设置 [#64034]
致谢与社区贡献
本版本特别感谢 Cologne 市、Deutsche Bahn 与 ZenDiS 对已发布或即将发布功能的赞助。同时感谢社区成员在缺陷报告与修复中的贡献,特别鸣谢 alex e、Klaas vT、Daniel Elkeles、Marcel Carvalho、Regina Schikora、Çağlar Yeşilyurt 与 Александр Татаринцев。此外,还要感谢 Crowdin 上的翻译贡献者,本版本特别致谢 Сергей Баранов(俄语)、Gzyyy(简体中文)与 rlmpereira(葡萄牙语)。如果你也愿意参与翻译工作,可参阅 翻译指南。
【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考