OpenProject 新建项目默认配置:项目可见性、默认模块与创建者角色一次讲清
【免费下载链接】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 中,"Administration settings → Projects → New project"(管理设置 → 项目 → 新建项目)是实例管理员用来定义项目创建时刻自动生效的默认值的核心入口:它决定新项目默认是公开还是私有、创建时自动启用哪些功能模块、非管理员用户创建项目后自动获得哪个项目级角色,以及创建项目后是否向创建者发送确认通知。读完本文,你将掌握这组默认配置的每一项语义、保存后的生效边界(只影响之后创建的项目),以及从源码层面理解这些默认值是如何在 SetAttributesService 中落地到新项目记录上的。
适用场景与生效范围
这组设置面向实例管理员(instance administrator),用于统一组织内所有新项目的初始形态。根据官方文档说明:
- 在该页面所做的更改是全局的,作用于整个实例;
- 变更只影响设置保存之后创建的项目,已存在项目的配置不受影响、不会被回写。
这一点在源码中得到印证:默认值不是写在设置页保存时刻,而是在每个新项目走创建流程时,由 app/services/projects/set_attributes_service.rb 的set_default_attributes方法在记录初始化阶段按需读取Setting并填充,因此天然只作用于"新建"这一时点。
设置项一:新项目默认公开(New projects are public by default)
复选框New projects are public by default控制新项目的默认可见性:
- 启用(Enabled):项目创建后默认为 public(公开)。公开项目对其中的用户按全局权限可见;
- 禁用(Disabled):项目创建后默认为 private(私有),需要由项目管理员显式改为公开。
从源码看,该选项对应设置键default_projects_public,在 new_project_settings_form.rb 中以f.check_box(name: :default_projects_public)定义(界面文案来自 config/locales/en.yml 中的setting_default_projects_public: "New projects are public by default")。创建项目时的取值逻辑在 set_attributes_service.rb:
def set_default_public(provided) model.public = Setting.default_projects_public? unless provided end可以看到一个关键细节:只有当调用方没有显式提供public属性时,才会回退到该全局设置。也就是说,API 或创建向导中显式传入的可见性优先级更高,此设置仅作为"未指定时"的兜底默认值。
设置项二:新建项目默认启用的模块(Default enabled modules)
Default enabled modules for new projects定义项目创建时自动激活哪些项目模块(如工作包、时间跟踪、文档等):
- 勾选的模块会默认启用于所有新建项目;
- 项目管理员之后仍可随时在项目设置中增减模块可用性,该默认值不具锁定性。
表单实现上,这一组复选框并非硬编码,而是动态枚举实例中当前可用的全部项目模块:
f.check_box_group(name: :default_projects_modules) do |check_box_group| OpenProject::AccessControl.available_project_modules(sorted: true).each do |m| check_box_group.check_box(value: m.to_s, label: I18n.t("project_module_#{m}", default: m.to_s.humanize), checked: Setting.default_projects_modules.include?(m.to_s)) end end见 new_project_settings_form.rb。这意味着插件/模块装得越多,此处的勾选项越多,且标签随语言包本地化。落库时由 set_default_module_names 完成:
def set_default_module_names(provided) model.enabled_module_names = Setting.default_projects_modules if !provided && model.enabled_module_names.empty? end即同样遵循"调用方未提供且模型尚未指定模块"时才应用默认列表的原则,保证从模板复制或 API 显式指定的模块集合不被覆盖。
设置项三:授予非管理员创建者的角色(Role given to a non-admin user who creates a project)
Role given to a non-admin user who creates a project指定:当一个非实例管理员用户创建项目后,该用户在该项目中自动获得哪个项目级角色。官方文档标注其默认值为Project admin;所分配的角色决定了创建者创建项目立即可执行的权限集合。
从源码结构看,该选项对应设置键new_project_user_role_id,其下拉候选项并非所有角色,而是经过 new_project_settings_form.rb 中两层过滤的"可分配角色":
- 首先列出
ProjectRole.assignable_to_project_creator命中的角色——从命名与调用可以推断,这是要求角色具备创建者所需关键权限的过滤条件; - 若管理员当前配置的角色已不再满足该条件(例如后来删掉了角色的必要权限),它仍会被保留在下拉框中,并追加
label_role_missing_permissions的标签后缀,同时要求该角色仍在ProjectRole.givable(可分配)范围内。
这一设计避免了"角色被降级后设置项静默失效、管理员无从察觉"的问题——现有配置始终可见、可修正。相关行为有专门的功能级测试覆盖,见 edit_default_role_warning_spec.rb;非管理员创建项目时该角色是否被正确授予,则由 global_create_project_spec.rb 等特性测试验证。
设置项四:新建项目通知(New project notifications)
Notifications标签页控制项目创建后是否向创建者发送确认通知:启用后,创建者会收到一条确认项目创建成功的通知,并可自定义通知正文。
对应源码为 new_project_notifications_form.rb,包含两个设置键:
new_project_send_confirmation_email:总开关,决定是否发送确认邮件;new_project_notification_text:富文本编辑的通知正文,必填;未保存过自定义文本时回退到语言包默认文案(admin.settings.new_project.notification_text_default)。
表单中还有一处前端联动细节值得注意:富文本输入框通过 Stimulus 的show-when-checked-target数据属性与总开关绑定(源码),开关未勾选时正文编辑区隐藏(d-none),既节省界面空间,也从交互上表达"通知文本仅在开关打开时生效"。实际发送由 project_mailer.rb 承担,其行为在 project_mailer_spec.rb 中有针对"创建成功确认邮件"的断言。
创建时刻的完整默认值链路
理解"New project"设置的最佳方式,是把它们放回项目创建的初始化链路中。set_attributes_service.rb 的set_default_attributes在一次创建中统一处理多项默认值:
| 默认值 | 设置来源 | 应用条件 |
|---|---|---|
可见性public | Setting.default_projects_public? | 调用方未显式提供public |
启用模块enabled_module_names | Setting.default_projects_modules | 未提供且当前为空 |
| Wiki 初始页 | Setting.default_projects_wiki? | 模型尚无 Wiki 记录 |
项目类型project_types | TypeVariant.enabled_in_new_projects | 未提供且尚无项目类型 |
| 工作包自定义字段 | 已应用类型变体绑定的字段 | 未显式提供时按变体推导 |
从源码结构看,除文档列出的三项外,Wiki 默认、项目类型默认以及工作包自定义字段默认也走同一条"未提供才回填"的链路。这说明 OpenProject 的设计约定是:全局默认值一律让位于创建请求中的显式输入,设置页只是填补空位的最后一环。整条链路的服务层行为由 set_attributes_service_spec.rb 覆盖,设置页本身的读写(包括权限约束,仅管理员可改)由 new_project_settings_controller_spec.rb 验证。
小结与操作建议
- 修改"New project"设置后务必点击Save,改动即时全局生效,但仅约束此后创建的项目;
- 若组织要求"新项目默认私有 + 最小模块集",应关闭
default_projects_public并精简模块勾选,创建者角色可保留 Project admin 以便创建者完成初始配置; - 若担心创建者越权,可在角色管理中调整"创建者角色"的权限,随后回到该设置页确认下拉框中该角色的"权限不足"提示,再改选更保守的角色;
- 需要审计某项默认值为何未生效时,优先检查创建请求是否显式传入了对应字段——按上述"未提供才回填"规则,显式输入永远优先于全局默认。
【免费下载链接】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),仅供参考