我在 youtrack 中创建了一个简单的状态机工作流来反映我们的流程。它使用三个状态值(已提交、进行中、已修复)并允许按顺序移动它们。
是否可以限制特定角色的某些状态更改?例如,角色 Reporter 应该只能在出现问题时创建问题并从“已修复”移动到“进行中”。
我在 youtrack 中创建了一个简单的状态机工作流来反映我们的流程。它使用三个状态值(已提交、进行中、已修复)并允许按顺序移动它们。
是否可以限制特定角色的某些状态更改?例如,角色 Reporter 应该只能在出现问题时创建问题并从“已修复”移动到“进行中”。
更新:执行此任务的更好方法是在状态机中执行以下操作:
initial state Submitted {
on Approve[always] do {
assert loggedInUser.hasRole("Project Admin"): "Only Project Admins can Approve tasks.";
} transit to Open
}
旧答案:直截了当的方式(在状态机本身内部):
initial state Submitted {
on Approve[loggedInUser.hasRole("Project Admin")] do {<define statements>} transit to Open
}
虽然它会起作用,但它会默默地失败,所以用户不会知道它为什么不起作用。
更好的方法如下所示(为此,您必须创建无状态规则):
when State.oldValue == {Submitted} && State.becomes({Open}) {
assert loggedInUser.hasRole("Project Admin"): "Only Project Admins can Approve tasks.";
}
在这种情况下,用户将收到您指定的错误消息。
请记住删除状态机中的条件,因为它已被提前检查,并且您不会收到任何错误消息,因为断言根本不会运行。
一个很老的问题,但我会尽力回答。您可以指定将在转换到/从特定状态时调用的保护表达式。在此表达式中,您可以验证用户权限。