HumanSignal/label-studio · error · ValueError

No memberships found for user {user}

Error message

No memberships found for user {user}

What it means

Organization.find_by_user looks up the OrganizationMember rows for a user and raises ValueError if the user has no membership in any organization. Label Studio expects every active user to belong to at least one organization, so an account without memberships cannot resolve an active organization.

Source

Thrown at label_studio/organizations/models.py:130

    created_at = models.DateTimeField(_('created at'), auto_now_add=True)
    updated_at = models.DateTimeField(_('updated at'), auto_now=True)

    contact_info = models.EmailField(_('contact info'), blank=True, null=True)

    def __str__(self):
        return self.title + ', id=' + str(self.pk)

    @classmethod
    def create_organization(cls, created_by=None, title='Your Organization', **kwargs):
        _create_organization = load_func(settings.CREATE_ORGANIZATION)
        return _create_organization(title=title, created_by=created_by, **kwargs)

    @classmethod
    def find_by_user(cls, user, check_deleted=False):
        memberships = OrganizationMember.objects.filter(user=user).prefetch_related('organization')
        if not memberships.exists():
            raise ValueError(f'No memberships found for user {user}')
        membership = memberships.first()
        if check_deleted:
            return (membership.organization, True) if membership.deleted_at else (membership.organization, False)

        return membership.organization

    @classmethod
    def find_by_invite_url(cls, url):
        token = url.strip('/').split('/')[-1]
        if len(token):
            return Organization.objects.get(token=token)
        else:
            raise KeyError(f"Can't find Organization by welcome URL: {url}")

    def has_user(self, user):
        return self.users.filter(pk=user.pk).exists()

    def has_deleted(self, user):

View on GitHub (pinned to 0b49e9b539)

Solutions

  1. Check the user has at least one OrganizationMember row before calling find_by_user
  2. Re-create the membership: OrganizationMember.objects.create(user=user, organization=org)
  3. Invite the user to an organization via the API to create the membership
  4. If the user should be self-hosted solo, create a new organization for them

Example fix

// before
org = Organization.find_by_user(user)
// after
if OrganizationMember.objects.filter(user=user).exists():
    org = Organization.find_by_user(user)
else:
    org = _create_organization(title=f"{user.email}'s organization", created_by=user)
Defensive patterns

Strategy: try-catch

Validate before calling

if not OrganizationMember.objects.filter(user=user).exists():
    raise Skip("user has no organization membership")

Try / catch

try:
    org = Organization.find_by_user(user)
except ValueError:
    org = _create_organization(title=f"{user.email}'s org", created_by=user)

Prevention

When it happens

Trigger: Calling Organization.find_by_user(user) when OrganizationMember.objects.filter(user=user).exists() is False — e.g. user was deleted from their only organization, was soft-deleted everywhere, or was created without a default org.

Common situations: Users removed from their sole organization then logging in; scripts creating users directly in the DB bypassing org creation hooks; test fixtures with users but no memberships; user accounts imported from backups without membership rows.

Related errors


AI-assisted analysis of HumanSignal/label-studio@0b49e9b539 (2026-08-29). Data as JSON: /api/errors/21ad0fa1c7685071. Report an issue: GitHub.