'List your Organizations
Return a list of organizations available to the authenticated
session.  This is particularly useful for requests with an
user bound context.  For API key based requests this will
only return the organization that belongs to the key.
:qparam bool member: restrict results to organizations which you have
membership
:auth: required'

@attach_scenarios([list_your_organizations_scenario])
def get(self, request):

    member_only = (request.GET.get('member') in ('1', 'true'))
    queryset = Organization.objects.filter(status=OrganizationStatus.VISIBLE)
    if (request.auth and (not request.user.is_authenticated())):
        if hasattr(request.auth, 'project'):
            queryset = queryset.filter(id=request.auth.project.organization_id)
        elif (request.auth.organization is not None):
            queryset = queryset.filter(id=request.auth.organization.id)
    elif (member_only or (not request.is_superuser())):
        queryset = queryset.filter(id__in=OrganizationMember.objects.filter(user=request.user).values('organization'))
    query = request.GET.get('query')
    if query:
        tokens = tokenize_query(query)
        for (key, value) in six.iteritems(tokens):
            if (key == 'query'):
                value = '    '.join(value)
                queryset = queryset.filter(((Q(name__icontains=value) | Q(slug__icontains=value)) | Q(members__email__iexact=value)))
            elif (key == 'slug'):
                queryset = queryset.filter(in_iexact('slug', value))
            elif (key == 'email'):
                queryset = queryset.filter(in_iexact('members__email', value))
            elif (key == 'platform'):
                queryset = queryset.filter(project__in=ProjectPlatform.objects.filter(platform__in=value).values('project_id'))
            elif (key == 'id'):
                queryset = queryset.filter(id__in=value)
    sort_by = request.GET.get('sortBy')
    if (sort_by == 'members'):
        queryset = queryset.annotate(member_count=Count('member_set'))
        order_by = '-member_count'
        paginator_cls = OffsetPaginator
    elif (sort_by == 'projects'):
        queryset = queryset.annotate(project_count=Count('project'))
        order_by = '-project_count'
        paginator_cls = OffsetPaginator
    elif (sort_by == 'events'):
        queryset = queryset.annotate(event_count=Sum('stats__events_24h')).filter(stats__events_24h__isnull=False)
        order_by = '-event_count'
        paginator_cls = OffsetPaginator
    else:
        order_by = '-date_added'
        paginator_cls = DateTimePaginator
    return self.paginate(request=request, queryset=queryset, order_by=order_by, on_results=(lambda x: serialize(x, request.user)), paginator_cls=paginator_cls)
