十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CVAT 组织(Organization)团队协作完全指南:创建工作区、成员角色与权限管理

CVAT 组织(Organization)团队协作完全指南:创建工作区、成员角色与权限管理 CVAT 组织Organization团队协作完全指南创建工作区、成员角色与权限管理【免费下载链接】cvatComputer Vision Annotation Tool (CVAT) is a leading platform for building high-quality visual datasets for vision AI. It offers open-source, cloud, and enterprise products, as well as labeling services, for image, video, and 3D annotation with AI-assisted labeling, quality assurance, team collaboration, analytics, and developer APIs.项目地址: https://gitcode.com/GitHub_Trending/cvat/cvatCVATComputer Vision Annotation Tool通过Organization组织功能让多名用户组成团队围绕共享项目、任务与标注工作流进行协作。本文是 CVAT 组织功能的技术实操指南覆盖个人工作区、组织创建、组织间切换、资源转移、成员邀请与角色体系、邀请管理以及组织删除的完整流程同时结合仓库源码cvat/apps/organizations剖析其背后的数据模型、OPA 权限策略与 REST API 实现帮助你从界面操作到底层机制全面掌握 CVAT 的团队协作能力。什么是 OrganizationOrganization是 CVAT 面向多用户团队的功能若干用户共同在项目上工作、共享任务。创建一个Organization邀请团队成员并为其分配角色即可让团队在共享任务上更高效地协作。在实现层面Organization 是一等公民的资源。从 cvat/apps/organizations/models.py 可以看到组织由以下字段构成字段类型说明slugSlugFieldmax_length16唯一组织的短名称即界面中显示的 Short namenameCharFieldmax_length64组织的全称Full namedescriptionTextField组织描述contactJSONField联系方式可存放 email、电话号码、地址等结构化信息ownerForeignKey → User组织创建者创建后不可通过序列化器直接修改见 OrganizationWriteSerializer 中read_only_fields [owner]围绕组织模型层还定义了Membership成员关系与Invitation邀请两类关键实体models.pyMembership通过unique_together (user, organization)保证同一用户在同一组织内只有一条成员记录并以role字段保存其在组织内的角色worker / supervisor / maintainer / owneris_active标记成员资格是否生效joined_date记录加入时间Invitation使用 64 位随机字符串作为主键key与被邀请人的Membership一对一关联并提供expired、accepted两个计算属性分别反映邀请是否过期、是否已被接受。邀请的有效期由设置项ORG_INVITATION_EXPIRY_DAYS控制默认 7 天见 cvat/settings/base.py。Personal workspace个人工作区账户的默认状态是未选择任何 Organization时的状态即个人工作区Personal workspace。如果没有选择 Organization系统会把所有新建资源直接关联到个人账户这会阻止资源与他人共享。当Personal workspace被选中时菜单中会以勾选标记进行标识如上图所示。从 REST API 角度看个人工作区对应请求中不带org查询参数的沙箱sandbox模式而一旦请求携带组织上下文IAM 中间件会将资源归属切换到对应组织。这一点在 cvat/apps/organizations/rules/invitations.rego 与 memberships.rego 中体现为utils.is_sandbox与utils.is_organization两种分支策略。创建新组织提示CVAT Online / 订阅相关在 Solo 计划下可以创建试用组织最多 2 名成员但依然保留 Free 计划的限制因为 Solo 并非面向真实协作Team 计划 会移除这些限制。无论哪种情况你的个人工作区都保持独立。创建组织的步骤如下登录 CVAT。在顶部菜单点击用户名Organization Create。填写以下字段并点击Submit。字段说明Short name组织名称将显示在 CVAT 菜单中对应模型中的slug限制 16 个字符必须唯一Full name可选。组织的完整名称对应name最长 64 字符Description可选。组织描述Email可选。你的邮箱Phone number可选。你的电话号码Location可选。组织地址说明Email、Phone number、Location在数据层统一由Organization.contact这个 JSON 字段承载。创建成功后组织页面会自动打开。此后如需再次访问组织导航至用户名Organization即可。从源码看组织的创建由OrganizationViewSet处理cvat/apps/organizations/views.py对应POST /api/organizations。创建过程中有两个值得注意的实现细节perform_create会把当前登录用户自动设为owner若未填写 Full name则直接用slug作为nameviews.py创建组织的同时序列化器会自动为该用户创建一条is_activeTrue、roleOWNER的成员记录即创建者默认成为 Ownerserializers.py。此外是否允许某个全局角色创建组织由环境变量CVAT_ORGANIZATIONS_MIN_ROLE_TO_CREATE控制默认值为user即普通用户即可创建对应 cvat/apps/organizations/default_settings.py并通过 OPA 策略organizations.rego中的utils.has_perm(input.settings.organizations_min_role_to_create)校验。在组织之间切换如果你拥有不止一个Organization可以随时在它们之间切换在顶部菜单选择用户名Organization。在下拉菜单的Personal space区域下选择目标Organization。提示如果你创建了超过 10 个组织下拉菜单中会出现Switch organization切换组织一行。点击该行即可打开Select organization对话框从下拉列表中选择组织。注意组织只有在被激活在下拉菜单中被勾选、且组织名显示在右上角用户名下方后其对应的组织页面才可访问详见下文Organization 页面。在组织与个人工作区之间转移任务和项目你可以将高层级资源项目以及单个任务在组织与个人工作区之间转移。转移资源的方法打开对应任务或项目的Actions菜单。在Actions菜单中选择Organization仅当资源可被转移时该选项才可见。在选择器中挑选目标工作区。弹出对话框后确认转移。如果资源关联了云存储需要选择 CVAT 对云存储的处理方式无论如何当前的云存储都会被解除关联detached因为它们在其他工作区不可用Move Detach转移完成后你可以手动为资源设置新的云存储仅适用于任务中的数据源云存储。源与目标云存储无法以这种方式配置Move Auto Match转移过程中CVAT 会尝试在目标工作区中查找参数相似的云存储并自动匹配。仅当资源配置了源或目标云存储时该选项才可用。Organization 页面组织管理页Organization 页面是编辑组织信息、管理组织成员的地方。提示要访问组织页面必须先激活组织参见在组织之间切换。未激活时组织页面不可访问。组织已激活的标准是在下拉菜单中被勾选且组织名显示在右上角用户名下方。进入Organization 页面的方法在顶部菜单点击用户名Organization。在下拉菜单中选择Organization。在下拉菜单中点击Settings。对应后端PATCH /api/organizations/{id}用于更新组织信息仅 Owner 可更新参见organizations.rego中UPDATE相关规则GET /api/organizations/{id}用于读取详情。邀请成员入口与角色体系邀请成员的表单可从 Organization 页面 进入包含以下字段字段说明Email被邀请加入Organization的用户的邮箱地址Role下拉列表定义用户角色决定其在组织内的访问级别Worker只能访问被分配给自己assignee的任务、项目和 Job。Supervisor可以创建 Job、任务、项目并将它们分配给组织成员。Maintainer与Supervisor能力相同但额外拥有对所有成员创建的任务和项目的完全可见性、对Cloud Storages的完整访问权限以及修改成员及其角色的能力。Owner默认分配给组织创建者的角色拥有最大权限且不能被更改或分配给其他用户。Invite more用于向Organization继续添加其他用户的按钮补充说明Owner 角色无法通过邀请授予——OPA 策略中明确禁止创建新的 ownerinvitations.rego中input.resource.role ! organizations.OWNER的约束Maintainer 可以邀请用户但不能邀请具备 Owner 或 Maintainer 角色的用户也不能修改/移除其他 Maintainer 或 Owner。组织成员会显示在Organization 页面上成员可以通过Organization 页面Leave organization离开组织组织所有者可以通过点击Bin图标移除成员。邀请成员加入组织进入Organization 页面点击Invite members。填写表单见上。点击OK。被邀请人会收到一封包含链接的邮件。被邀请人点击链接后如果被邀请人没有 CVAT 账户需要先注册账户如果已有 CVAT 账户则直接登录。从后端实现看邀请的创建对应POST /api/invitationsInvitationViewSet.create核心逻辑在InvitationWriteSerializer.createserializers.py以邮箱不区分大小写查找用户若不存在则自动创建一个无密码set_unusable_password的占位用户等待其通过邀请邮件注册使用get_or_create建立 Membership若用户已是组织成员则抛出校验错误生成 64 位随机key作为邀请标识随后依据设置ORG_INVITATION_CONFIRM默认No见 cvat/settings/base.py决定是自动接受邀请还是调用Invitation.send发送确认邮件邮件上下文包含邀请 key、站点域名与协议、邀请人用户名与组织名等信息models.py。被邀请人点击邮件链接后前端会调用POST /api/invitations/{key}/accept完成接受对应InvitationViewSet.accept见 views.py。该接口会校验邀请是否过期过期返回 400 Your invitation is expired...、是否已被接受随后将对应 Membership 置为激活并记录加入时间。由于邀请key是随机生成的 64 位字符串本身即充当了访问凭证因此接口不要求额外鉴权头。邀请列表用户可以查看当前有效的邀请列表。查看方式用户名OrganizationInvitations。打开后即可看到邀请列表页面。此外界面中也会弹出指向邀请列表页面的通知。对应后端接口为GET /api/invitations支持按owner、user_id、accepted等字段过滤并按created_date倒序排列views.py。邀请列表的可见性同样由 OPA 策略控制组织内的 staffOwner/Maintainer可以看到全部邀请普通成员只能看到自己相关的邀请invitations.rego 中的base_filter。重新发送与移除邀请组织 Owner 和 Maintainer 可以通过点击三个点更多操作菜单选择Remove invitation来移除邀请。对应后端重新发送POST /api/invitations/{key}/resendviews.py。该接口对已接受的邀请返回 400并使用ResendOrganizationInvitationThrottle做频率限制见 cvat/apps/organizations/throttle.py防止滥用邮件发送移除邀请DELETE /api/invitations/{key}由 Owner / Maintainer 执行。删除组织你可以删除自己创建的组织。警告删除组织将删除所有相关资源标注、Job、任务、项目、云存储等。删除步骤进入Organization 页面。在右上角点击ActionsRemove organization。在对话框输入组织的 Short name 确认。点击Remove。在数据层由于Membership.organization与Invitation.membership均配置了on_deletemodels.CASCADEmodels.py删除组织会级联删除全部成员关系与邀请记录而Organization.owner使用on_deletemodels.SET_NULL因此删除用户不会连带删除组织本身。对应后端接口为DELETE /api/organizations/{id}OrganizationViewSet.destroy只有 Owner 或管理员admin被允许执行见organizations.rego中DELETE规则。组织角色的权限机制源码视角角色的实际执行依赖OPAOpen Policy Agent策略文件它们位于 cvat/apps/organizations/rules 目录策略文件作用organizations.rego组织本身的增删改查、列表过滤invitations.rego邀请的创建、查看、重发、删除、接受/拒绝memberships.rego成员列表、成员角色变更、成员移除/退出策略中定义了一个直观的角色优先级get_priorityOwner0 Maintainer50 Supervisor75 Worker100权限判断即比较操作者角色与目标角色的优先级organizations.rego。例如Maintainer 可以变更/移除 Worker 和 Supervisor 的成员资格但不能动 Owner 和其他 MaintainerOwner 可以变更/移除除自己以外的任何成员但任何情况下都不能创建或变更 Owner 角色普通成员可以自行离开组织DELETE自己的 membership但 Owner 不能离开自己的组织。这套策略通过 permissions.py 中的OrganizationPermission、InvitationPermission、MembershipPermission挂接到 REST API 的每个 action 上并在 views.py 的三个 ViewSet 中通过iam_permission_class声明。REST API 的路由注册在 cvat/apps/organizations/urls.pyrouter.register(organizations, OrganizationViewSet) router.register(invitations, InvitationViewSet) router.register(memberships, MembershipViewSet)对于自托管self-hosted部署管理员可以直接编辑.rego文件来微调组织角色权限修改后需重新构建并重启 Docker Compose并带上docker-compose.dev.yml配置才能生效。自动化测试覆盖可参考 cvat/apps/organizations/tests/test_rest_api.py。小结CVAT 的 Organization 功能提供了完整的团队协作闭环个人工作区保证单人场景的隔离性创建组织 → 邀请成员 → 分配角色Worker / Supervisor / Maintainer / Owner构建协作单元组织间切换与资源转移支持跨工作区的资源调度邀请列表、重发与移除以及删除组织则覆盖了成员与组织的全生命周期管理。在底层这一套流程由Organization/Membership/Invitation三张数据模型、三个 REST ViewSet 以及 OPA 策略文件协同支撑角色之间的权限边界清晰、可审计、可自定义是 CVAT 面向团队标注与数据生产场景的核心基础设施。【免费下载链接】cvatComputer Vision Annotation Tool (CVAT) is a leading platform for building high-quality visual datasets for vision AI. It offers open-source, cloud, and enterprise products, as well as labeling services, for image, video, and 3D annotation with AI-assisted labeling, quality assurance, team collaboration, analytics, and developer APIs.项目地址: https://gitcode.com/GitHub_Trending/cvat/cvat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表