尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
OpenProject 7.2.3 “Assigned to“ 过滤器行为修复:新增 “Assignee or belonging group“ 过滤器实战解析
OpenProject 7.2.3 Assigned to 过滤器行为修复新增 Assignee or belonging group 过滤器实战解析【免费下载链接】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 7.2.3 版本中工作包Work Package过滤器的一次关键行为变更修复自 7.0 起Assigned to指派给过滤器按单个用户筛选时会顺带返回分配给该用户所属用户组的工作包导致部分依赖精确指派语义的团队无法正确筛选。本版本恢复了原有精确行为并新增 Assignee or belonging group指派人或所属组 过滤器以保留扩展语义。读完本文你将掌握这两个过滤器的语义差异、使用场景、底层实现原理与测试验证方式。修复背景7.0 引入的组指派行为变更在 OpenProject 7.0 之前当用户在过滤器Assigned to中选择单个用户时系统只返回直接分配给该用户的工作包。从 7.0 起开发团队有意做了一处行为调整为了让按用户筛选时也能覆盖指派给组的场景过滤器被改为同时返回分配给所选用户本人的工作包分配给该用户所属任意用户组的工作包。这一改动在组指派协作场景下是便利的例如组内成员应能看到分配给本组的工作包但对另一些团队而言却打破了原有预期——他们依赖只返回分配给单一用户的工作包这一精确语义例如用于个人待办统计、绩效考核或跨组职责隔离。该问题被记录为 bug #26207此处仅作引用标识不展开外部链接。修复方案恢复原行为 新增独立过滤器7.2.3 的修复采用兼容与取舍并存的策略而不是简单回退Assigned to 过滤器恢复 7.0 之前的精确行为选择单个用户时只返回分配给该用户本人的工作包不再隐式包含其所属组的工作包。新增 Assignee or belonging group 过滤器对于仍然需要用户 其所属组扩展语义的团队可以使用这个新过滤器语义更加明确、可控。这种设计让两类用户各取所需需要精确指派的团队恢复原有习惯需要组扩展语义的团队获得一个语义显式、可独立配置的过滤入口。新过滤器 Assignee or belonging group 的语义根据官方发布说明新过滤器在两种取值场景下的行为如下筛选单个用户时返回分配给该用户的工作包以及分配给该用户所属任意用户组的工作包筛选一个用户组时返回分配给该组的工作包以及分配给组内任意用户的工作包。也就是说该过滤器在用户 ⇄ 组两个方向上做双向扩展选用户则带上其所属组选组则带上其成员。这与旧的 Assigned to 行为相比更完整且方向性明确。源码级解析AssigneeOrGroupFilter 的实现原理新过滤器在仓库中的核心实现位于 app/models/queries/work_packages/filter/assignee_or_group_filter.rb类定义为Queries::WorkPackages::Filter::AssigneeOrGroupFilter继承自PrincipalBaseFilterprincipal_base_filter.rb。关键设计点过滤器键keyself.key返回:assignee_or_group这是它在查询系统中的唯一标识也是 API 与前端引用它的依据。过滤器类型type返回:list_optional即可选列表类型——可以不填值也可以选择多个 principal用户/组/占位用户。显示名称human_name读取国际化键query_fields.assignee_or_group在 config/locales/en.yml 中定义为Assignee or belonging group。SQL 生成where方法基于assigned_to_id字段构造条件即过滤底层仍是工作包的指派字段只是传入的取值集合被动态扩展。取值扩展的核心逻辑values_replaced该过滤器语义的关键在values_replaced方法同文件第 55-59 行它对用户选择的每个值做双向扩展def values_replaced vals super vals group_members_added(vals) vals user_groups_added(vals) endgroup_members_added(vals)当选中值是用户组 ID时通过User.joins(:groups).where(groups_users: { id: vals })查出这些组的所有成员用户 ID一并加入取值集合——对应选组则含成员。user_groups_added(vals)当选中值是用户 ID时通过Group.joins(:users).where(users_users: { id: vals })查出这些用户所属的所有组 ID一并加入取值集合——对应选用户则含其所属组。最终生成的 SQL 条件即assigned_to_id IN (选中值 扩展出的组/成员 ID)。这一实现直接印证了发布说明中双向扩展的语义描述。与 AssignedToFilter 的对比原有的 assigned_to_filter.rb 中AssignedToFilter与新版过滤器同继承自PrincipalBaseFilter但没有覆写values_replaced因此取值集合不被扩展assigned_to_id严格等于用户所选值——这就是 7.2.3 恢复的精确行为。两者共享基类提供的公共能力包括allowed_values由me_allowed_value我与principal_loader.principal_values当前项目可选的 principal 列表构成available?仅当用户已登录或存在可选值时才可用autocomplete_options渲染服务端自动补全组件opce-user-autocompleter资源指向 API v3 的 principals 端点并按当前项目成员范围过滤。过滤器注册机制工作包过滤器通过统一注册表接入查询系统注册位置在 app/models/queries/work_packages.rb::Queries::Register.register(Query) do filter Filter::AncestorFilter filter Filter::AssignedToFilter filter Filter::AssigneeOrGroupFilter # ... end只要在此注册新过滤器即自动出现在工作包查询的可用过滤器集合中供列表视图、保存的查询Saved Query以及 API 使用。API v3 层的支持新过滤器在 API v3 查询 Schema 层有对应的依赖描述器lib/api/v3/queries/schemas/assignee_or_group_filter_dependency_representer.rb 中的AssigneeOrGroupFilterDependencyRepresenter继承自ProjectMembersFilterDependencyRepresenter。从 filter_dependency_representer_factory.rb 的分发逻辑可以看到AssignedToFilter被映射为ProjectMembersFilter依赖描述器第 59 行而AssigneeOrGroupFilter因为存在同名专属描述器类会通过filter_specific_representer_class优先命中专属类。这说明该过滤器在 API 表单中同样表现为项目成员类型的候选值选择器与旧过滤器在交互层保持一致仅语义不同。测试验证行为即契约仓库为新过滤器提供了完整的单元测试spec/models/queries/work_packages/filter/assignee_or_group_filter_spec.rb覆盖了全部关键分支是理解语义最直观的契约文档测试场景过滤取值预期结果用户值工作包直接指派给该用户[assignee.id]返回该工作包me值当前登录用户即被指派人[me]返回该工作包me值但当前登录的是另一用户[me]不返回组值工作包直接指派给该组[group.id]返回该工作包组值工作包指派给组内成员[group.id]返回该工作包组成员被扩展占位用户placeholder user值[placeholder_user.id]返回指派给它的工作包组值组内无人被指派[group.id]不返回用户值工作包指派给该用户所属的组[user.id]返回该工作包所属组被扩展用户值该用户不属于被指派的组[user.id]不返回无效值[0]不返回此外测试还验证了valid_values!会剔除不在候选集中的非法值如99999保证过滤器取值始终落在合法 principal 集合内。这些测试用例与 发布说明 中描述的两种语义完全对应。使用建议与注意事项明确需求再选择过滤器如果团队工作流严格依赖按人精确指派请继续使用 Assigned to如果需要人 其所属组的聚合视图请改用 Assignee or belonging group。前端使用注意在部分按需定制的前端页面中该过滤器会被主动隐藏。例如团队规划器Team Planner页面在 team-planner-page.component.ts 中将assigneeOrGroup、assignee、memberOfGroup等过滤器加入隐藏列表避免与规划器自身的筛选机制冲突。自定义查询时需留意此类隐藏逻辑。语义只影响过滤不改变指派字段两个过滤器底层都作用于assigned_to_id字段扩展逻辑仅发生在查询取值阶段不会改动工作包的实际指派数据。版本前提本修复及新过滤器随 OpenProject 7.2.32017-09-04 发布引入若你的实例早于该版本则无法获得新过滤器与修复后的精确行为升级前请先在测试环境验证过滤结果是否符合预期。延伸阅读发布说明原文docs/release-notes/7/7-2-3/README.md新过滤器实现app/models/queries/work_packages/filter/assignee_or_group_filter.rb原过滤器实现app/models/queries/work_packages/filter/assigned_to_filter.rb过滤器公共基类app/models/queries/work_packages/filter/principal_base_filter.rb过滤器注册表app/models/queries/work_packages.rbAPI 依赖描述器lib/api/v3/queries/schemas/assignee_or_group_filter_dependency_representer.rb单元测试spec/models/queries/work_packages/filter/assignee_or_group_filter_spec.rb【免费下载链接】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),仅供参考
RELATED

相关推荐

RocketMQ与Kafka核心差异:日志系统 vs 业务消息中间件

RocketMQ与Kafka核心差异:日志系统 vs 业务消息中间件

1. 为什么“RocketMQ vs Kafka”不是一道选择题,而是一张能力坐标图刚入行那会儿,我被拉进一个电商大促保障项目,需求文档里写着:“消息系统要扛住每秒50万订单,支持事务消息,延迟不能超200ms,还…

📅 2026/9/17 13:42:30
MySQL关系表设计实战:一对多与多对多的正确建模方法

MySQL关系表设计实战:一对多与多对多的正确建模方法

1. 为什么必须亲手建好一对多、多对多关系表——不是语法会了就能跑通业务你写过SELECT * FROM user JOIN order ON user.id order.user_id,也背过“外键约束保证参照完整性”,但上线后订单数据错乱、用户重复扣款、报表统计总数对不上——问题往往不出…

📅 2026/9/17 13:42:30
高压LDO选型实战:24V转5V低噪声稳压与工业控制板设计

高压LDO选型实战:24V转5V低噪声稳压与工业控制板设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/17 13:37:30
MORE NEWS

更多资讯

📰

数据中心机房建设方案:从容量定义到供配电制冷与运维验证

简介:面向大型企业信息化建设者与数据中心运维团队的一份完整机房建设方案文档,直击业务增长、法规遵从与运营效率提升等核心诉求。内容从项目背景、建设原则到总体需求逐项拆解,细致规划机房布局、室内装修、空气调节、供配电及照明、环境监…

📰

DDR5内存SPD读取实战:用i2c-tools解析SPD5118 Hub数据

简介:JESD300-5A(2022年6月,版本1.4)是JEDEC发布的SPD5118/SPD5108 Hub与串行存在检测(SPD)设备标准,为内存模组与硬件设计人员提供统一的接口、操作流程和兼容性要求,旨在减少厂商与…

📰

基于DeepSeek与RAG构建酒店投诉处理知识库的落地实践

简介:这份PDF是一份聚焦酒店业智能化转型的实战方案文档,适合酒店信息化负责人、AI解决方案工程师及服务管理从业者研读。文档围绕DeepSeek构建服务知识库展开,从行业背景与需求谈起,系统阐述DeepSeek技术原理、知识图谱构建、投诉…

📰

Redis INCR命令深度解析:高并发计数器的原子性原理与工程实践

1. 项目概述:为什么一个简单的INCR命令值得我们花一整篇干货来深挖?你有没有在秒杀系统里看到过“剩余库存:999”这个数字,点进去却显示“已售罄”?有没有在抢演唱会门票时,页面上明明还剩3张,刷…

📰

CV800大巴空调驱动器:CAN通讯、参数烧录与EMI排错

简介:《CV800松芝大巴空调驱动器用户手册》中文PDF面向大巴空调电控系统的安装调试人员、整车电气工程师及售后维修技术员,用于解决三合一驱动器在装车、配线、运行与维护各环节的安全规范与操作依据问题。资源包仅1个PDF文件,约4.1MB&#x…

📰

ROS2+Docker+VS Code机器人Python开发实战

1. 项目概述:这不是一门“Python语法课”,而是一张通往真实机器人开发现场的入场券如果你在搜索引擎里输入“Python入门”,跳出来的大多是打印“Hello World”、写个九九乘法表、再做个简易计算器——这没错,但离真正的机器人开发…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬