开发¶
Adjutant 围绕任务和动作构建。
动作是一种通用的数据库模型,它知道自己是什么“类型”的动作。从数据库中提取与任务相关的动作时,我们会将其包装成适当的类类型,该类型处理与该动作类型相关的所有逻辑。
一个动作既是其自身的简单数据库表示,也是一个更复杂的内存类,处理与其相关的全部逻辑。
每个动作类都具有“prepare”(准备)、“approve”(批准)和“submit”(提交)函数。这些与审批流程的阶段相关联,并且可以在这些函数中执行任何 Python 代码,其中一些理想情况下应该是验证。
多个动作可以链接在一起,置于一个任务之下,并按定义的顺序执行。动作可以通过任务对象上的内存缓存/字段传递信息,但这仅在同一执行阶段内安全。动作还可以将数据存储回数据库,如果其逻辑需要在后续执行步骤中传递某些信息。
请参阅 actions.models 和 actions.v1 以更好地了解动作。
任务与动作一样,也是数据库表示和更复杂的内存类。这些类定义了任务具有哪些动作,以及定义其功能的其他元素。大部分任务和动作处理逻辑都在基本任务类中,并且大多数与任务的交互都通过 TaskManager 进行。
请参阅 tasks.models 和 tasks.v1 以更好地了解任务。
主要工作流程由三个可能的步骤组成,这些步骤可以在不同的时间点执行,具体取决于任务及其内部动作的定义。
基本用例是三个阶段
- 接收请求
根据动作序列化器验证请求数据。
如果有效,则设置任务以表示请求,以及与该任务指定的动作。
服务在所有动作上运行“prepare”函数,该函数应执行任何自验证,以将动作标记为有效或无效,并根据此在任务中填充备注。
- 自动或管理员审批
- 任务被设置为自动批准,或者管理员查看它以决定。
- 如果他们决定可以批准,他们就执行批准操作。
如果存在任何无效动作,批准将不会执行任何操作,直到更新动作数据并重新运行初始验证为止。
服务在所有动作上运行“approve”函数。
如果任何动作需要颁发并发送包含其他数据的 Token(例如用户密码),那么将发生这种情况。
如果不需要 Token,则任务将运行提交动作,并标记为完成。
- Token 提交
用户提交 Token 数据。
服务在所有动作上运行提交函数,传递 Token 数据,通常是密码。
动作将使用给定的最终数据完成。
任务标记为完成。
有些任务会自动批准,因此在第一个阶段之后立即自动执行中间步骤。还有一些任务不需要 Token,因此在第二个阶段运行提交步骤,甚至一次性完成所有三个步骤。确切的“步骤”数量以及它们之间的时间间隔取决于任务的定义。
动作本身也可以有效地在这些三个阶段内执行任何操作,并且甚至可以链接多个动作在一起,并将数据传递给其他动作。
有关添加任务和动作的详细信息,请参阅 为 Adjutant 创建功能集 页面。
什么是动作?¶
动作是一种通用的数据库模型,它知道自己是什么“类型”的动作。从数据库中提取与任务相关的动作时,我们会将其包装成适当的类类型,该类型处理与该动作类型相关的所有逻辑。
一个动作既是其自身的简单数据库表示,也是一个更复杂的内存类,处理与其相关的全部逻辑。
每个动作类都具有“prepare”(准备)、“approve”(批准)和“submit”(提交)函数。这些与审批流程的阶段相关联,并且可以在这些函数中执行任何 Python 代码。
什么是任务?¶
任务是工作流程的顶级模型表示。与动作类似,它也是其自身的简单数据库表示,以及处理与其相关的全部逻辑的更复杂的内存类。
任务定义了任务中包含哪些动作,并处理处理它们的逻辑。
什么是 Token?¶
Token 是链接到任务的唯一标识符,以便提交 Token 的任何人都会提交到与该任务相关的动作。
什么是 DelegateAPI?¶
DelegateAPI 是扩展基本 DelegateAPI 类的类。
它们主要用于将底层任务作为 API 公开,并且它们通过使用 TaskManager 来处理工作流程来做到这一点。TaskManager 将处理数据验证,并为用户应该看到的错误引发错误响应。如果有效,TaskManager 将处理传入数据并将其构建到任务和相关的动作类中。
DelegateAPI 还可以用于小的任意查询,或构建完整的查询和任务 API。它们被构建为灵活且易于插入 Adjutant 的。
DelegateAPI 的唯一约束是它们不应该自己执行任何资源创建/更改/删除。如果您需要使用资源,请使用任务层并为它定义任务和动作。构建仅查询其他 API 且不更改资源的 DelegateAPI 是可以的,但需要返回其他系统中资源的信息是有用的。这些是有用的小的 API,可以补充您需要公开的任何管理员逻辑。