
❌ This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.

Overview
Add organizational support with two new models: Organization and OrganizationRole. These models enable organizations to own/manage channels and define user roles (with permissions and invitation workflow).
Complexity: Medium
Target branch: feature_organization_model
The Change
-
Add Organization model with metadata (name, description, tagline, website, email, thumbnail, public, deleted), FK to Channel, FK to OrganizationRole, JSON settings, and timestamps. Organization is a ForeignKey on the Channel model creating a many-to-one relationship: many channels can belong to one organization for ownership and management.
-
Add OrganizationRole as the through model linking User and Organization, storing role name, status (active/pending/etc.), joined_at, invitation_accepted_at, invited_by
-
Add Roles for access control
Admin (ORGANIZATION_ADMIN): Full org-level privileges (manage members, settings).
Editor (ORGANIZATION_EDITOR): Create/edit content and channels; no org-admin control.
Viewer (ORGANIZATION_VIEWER): Read-only access to organization content.
-
Add Statuses for consistent permission enforcement and simple state visibility
Active (ORGANIZATION_ROLE_STATUS_ACTIVE): Membership is active and permissions apply.
Inactive (ORGANIZATION_ROLE_STATUS_INACTIVE): Membership exists but is inactive (no access).
Pending (ORGANIZATION_ROLE_STATUS_PENDING): Membership awaiting approval/activation.
Suspended (ORGANIZATION_ROLE_STATUS_SUSPENDED): Temporarily revoked access.
Declined (ORGANIZATION_ROLE_STATUS_DECLINED): Membership/request was declined.
Acceptance Criteria
AI usage
Used AI to generate models but they were carefully reviewed
❌ This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.
Overview
Add organizational support with two new models: Organization and OrganizationRole. These models enable organizations to own/manage channels and define user roles (with permissions and invitation workflow).
Complexity: Medium
Target branch: feature_organization_model
The Change
Add Organization model with metadata (name, description, tagline, website, email, thumbnail, public, deleted), FK to Channel, FK to OrganizationRole, JSON settings, and timestamps. Organization is a ForeignKey on the Channel model creating a many-to-one relationship: many channels can belong to one organization for ownership and management.
Add OrganizationRole as the through model linking User and Organization, storing role name, status (active/pending/etc.), joined_at, invitation_accepted_at, invited_by
Add Roles for access control
Admin (ORGANIZATION_ADMIN): Full org-level privileges (manage members, settings).
Editor (ORGANIZATION_EDITOR): Create/edit content and channels; no org-admin control.
Viewer (ORGANIZATION_VIEWER): Read-only access to organization content.
Add Statuses for consistent permission enforcement and simple state visibility
Active (ORGANIZATION_ROLE_STATUS_ACTIVE): Membership is active and permissions apply.
Inactive (ORGANIZATION_ROLE_STATUS_INACTIVE): Membership exists but is inactive (no access).
Pending (ORGANIZATION_ROLE_STATUS_PENDING): Membership awaiting approval/activation.
Suspended (ORGANIZATION_ROLE_STATUS_SUSPENDED): Temporarily revoked access.
Declined (ORGANIZATION_ROLE_STATUS_DECLINED): Membership/request was declined.
Acceptance Criteria
Organization and OrganizationRole implemented in contentcuration/models.py
Unique constraint enforced: one role per (user, organization)
PR description updated and linked to this issue
AI usage
Used AI to generate models but they were carefully reviewed