开发

Adjutant 围绕任务和动作构建。

动作是一种通用的数据库模型,它知道自己是什么“类型”的动作。从数据库中提取与任务相关的动作时,我们会将其包装成适当的类类型,该类型处理与该动作类型相关的所有逻辑。

一个动作既是其自身的简单数据库表示,也是一个更复杂的内存类,处理与其相关的全部逻辑。

每个动作类都具有“prepare”(准备)、“approve”(批准)和“submit”(提交)函数。这些与审批流程的阶段相关联,并且可以在这些函数中执行任何 Python 代码,其中一些理想情况下应该是验证。

多个动作可以链接在一起,置于一个任务之下,并按定义的顺序执行。动作可以通过任务对象上的内存缓存/字段传递信息,但这仅在同一执行阶段内安全。动作还可以将数据存储回数据库,如果其逻辑需要在后续执行步骤中传递某些信息。

请参阅 actions.modelsactions.v1 以更好地了解动作。

任务与动作一样,也是数据库表示和更复杂的内存类。这些类定义了任务具有哪些动作,以及定义其功能的其他元素。大部分任务和动作处理逻辑都在基本任务类中,并且大多数与任务的交互都通过 TaskManager 进行。

请参阅 tasks.modelstasks.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,可以补充您需要公开的任何管理员逻辑。