Exemple #1
0
def _filter_repositories(request, param, extra):
    """
    Helper doing all sort/query stuff about repositories, for listing
    repositories owned/followed or contributed by the user
    """

    params = {param: request.user}

    owner_only = request.GET.get('owner-only', False) == 'y'
    if owner_only:
        params['owner__user'] = request.user

    all_repositories = Repository.for_user_list.filter(**params).extra(select=dict(current_user_account_id=extra))

    hide_forks = request.GET.get('hide-forks', False) == 'y'
    if hide_forks:
        all_repositories = all_repositories.exclude(is_fork=True)

    sort = get_repository_sort(request.GET.get('sort_by', None))
    if sort['key']:
        all_repositories = all_repositories.order_by(sort['db_sort'])

    accounts = accounts_dict(request)

    query = request.GET.get('q')
    if query:
        keywords = parse_keywords(query)
        search_queryset = make_query(RepositorySearchView.search_fields, keywords)
        search_queryset = search_queryset.models(RepositorySearchView.model)
        if owner_only:
            search_queryset = search_queryset.filter(owner_id__in=accounts.keys())
        if hide_forks:
            search_queryset = search_queryset.exclude(is_fork=True)
        # It's certainly not the best way to do it but.... :(
        sorted_ids = [r.id for r in all_repositories]
        if sorted_ids:
            search_queryset = search_queryset.filter(django_id__in=sorted_ids)
            found_ids = [int(r.pk) for r in search_queryset]
            all_repositories = [r for r in all_repositories if r.id in found_ids]

    distinct = request.GET.get('distinct', False) == 'y'
    if distinct:
        # try to keep one entry for each backend/slug
        uniq = []
        slugs = {}
        for repository in all_repositories:
            slug = '%s:%s' % (repository.backend, repository.slug)
            if slug in slugs:
                slugs[slug].append(repository)
                continue
            slugs[slug] = []
            uniq.append(repository)
        for repository in uniq:
            slug = '%s:%s' % (repository.backend, repository.slug)
            repository.distinct_others = slugs[slug]
        # try to keep the first non-fork for each one
        all_repositories = []
        sort_lambda = lambda r:r.official_created
        for repository in uniq:
            if not repository.distinct_others or repository.owner_id in accounts:
                good_repository = repository
            else:
                important_ones = [r for r in repository.distinct_others if not r.is_fork]
                owned = [r for r in important_ones if r.owner_id in accounts]
                if owned:
                    good_repository = owned[0]  # all are from the owner, take one
                else:
                    if important_ones:
                        if not repository.is_fork:
                            important_ones + [repository,]
                    else:
                        important_ones = repository.distinct_others + [repository,]

                    good_repository = sorted(important_ones, key=sort_lambda)[0]

                if good_repository != repository:
                    good_repository.distinct_others = [r for r in repository.distinct_others + [repository,] if r != good_repository]
                    delattr(repository, 'distinct_others')

                if hasattr(good_repository, 'distinct_others'):
                    good_repository.distinct_others = sorted(good_repository.distinct_others, key=sort_lambda)

            good_repository.current_user_account_id_list = set((good_repository.current_user_account_id,))
            if hasattr(good_repository, 'distinct_others'):
                for other_rep in good_repository.distinct_others:
                    good_repository.current_user_account_id_list.add(other_rep.current_user_account_id)

            all_repositories.append(good_repository)

    page = paginate(request, all_repositories, settings.REPOSITORIES_PER_PAGE)

    context = dict(
        all_repositories = all_repositories,
        page = page,
        sort = dict(
            key = sort['key'],
            reverse = sort['reverse'],
        ),
        accounts = accounts,
        owner_only = 'y' if owner_only else False,
        hide_forks = 'y' if hide_forks else False,
        distinct = 'y' if distinct else False,
        query = query or "",
    )
    return context
Exemple #2
0
def _filter_repositories(request, account, queryset):
    """
    Helper doing all sort/query stuff about repositories, for listing
    repositories owned/followed or contributed by an account,
    """
    sort_key = request.GET.get('sort_by', 'name')
    repository_supports_owner = account.get_backend().supports('repository_owner')
    repository_supports_parent_fork = account.get_backend().supports('repository_parent_fork')
    sort = get_repository_sort(sort_key, repository_supports_owner)

    sorted_repositories = queryset.order_by(sort['db_sort'])

    if repository_supports_owner:
        owner_only = request.GET.get('owner-only', False) == 'y'
    else:
        owner_only = False

    if owner_only:
        sorted_repositories = sorted_repositories.filter(owner=account)

    if repository_supports_parent_fork:
        hide_forks = request.GET.get('hide-forks', False) == 'y'
    else:
        hide_forks = False

    if hide_forks:
        sorted_repositories = sorted_repositories.exclude(is_fork=True)

    query = request.GET.get('q')
    if query:
        keywords = parse_keywords(query)
        search_queryset = make_query(RepositorySearchView.search_fields, keywords)
        search_queryset = search_queryset.models(RepositorySearchView.model)
        if owner_only:
            search_queryset = search_queryset.filter(owner_id=account.id)
        if hide_forks:
            search_queryset = search_queryset.exclude(is_fork=True)
        # It's certainly not the best way to do it but.... :(
        sorted_ids = [r.id for r in sorted_repositories]
        if sorted_ids:
            search_queryset = search_queryset.filter(django_id__in=sorted_ids)
            found_ids = [int(r.pk) for r in search_queryset]
            sorted_repositories = [r for r in sorted_repositories if r.id in found_ids]

    distinct = request.GET.get('distinct', False) == 'y'
    if distinct and not owner_only:
        # try to keep one entry for each slug
        uniq = []
        slugs = {}
        for repository in sorted_repositories:
            if repository.slug in slugs:
                slugs[repository.slug].append(repository)
                continue
            slugs[repository.slug] = []
            uniq.append(repository)
        for repository in uniq:
            repository.distinct_others = slugs[repository.slug]
        # try to keep the first non-fork for each one
        sorted_repositories = []
        sort_lambda = lambda r:r.official_created
        for repository in uniq:
            if not repository.distinct_others or repository.owner_id == account.id:
                good_repository = repository
            else:
                important_ones = [r for r in repository.distinct_others if not r.is_fork]
                owned = [r for r in important_ones if r.owner_id == account.id]
                if owned:
                    good_repository = owned[0]  # only one possible
                else:
                    if important_ones:
                        if not repository.is_fork:
                            important_ones + [repository,]
                    else:
                        important_ones = repository.distinct_others + [repository,]

                    good_repository = sorted(important_ones, key=sort_lambda)[0]

                if good_repository != repository:
                    good_repository.distinct_others = [r for r in repository.distinct_others + [repository,] if r != good_repository]
                    delattr(repository, 'distinct_others')

                if hasattr(good_repository, 'distinct_others'):
                    good_repository.distinct_others = sorted(good_repository.distinct_others, key=sort_lambda)

            sorted_repositories.append(good_repository)

    page = paginate(request, sorted_repositories, settings.REPOSITORIES_PER_PAGE)

    return dict(
        account = account,
        page = page,
        sort = dict(
            key = sort['key'],
            reverse = sort['reverse'],
        ),
        owner_only = 'y' if owner_only else False,
        hide_forks = 'y' if hide_forks else False,
        distinct = 'y' if distinct else False,
        query = query or "",
    )
Exemple #3
0
def _filter_repositories(request, param, extra):
    """
    Helper doing all sort/query stuff about repositories, for listing
    repositories owned/followed or contributed by the user
    """

    params = {param: request.user}

    owner_only = request.GET.get('owner-only', False) == 'y'
    if owner_only:
        params['owner__user'] = request.user

    all_repositories = Repository.for_user_list.filter(**params).extra(
        select=dict(current_user_account_id=extra))

    hide_forks = request.GET.get('hide-forks', False) == 'y'
    if hide_forks:
        all_repositories = all_repositories.exclude(is_fork=True)

    sort = get_repository_sort(request.GET.get('sort_by', None))
    if sort['key']:
        all_repositories = all_repositories.order_by(sort['db_sort'])

    accounts = accounts_dict(request)

    query = request.GET.get('q')
    if query:
        keywords = parse_keywords(query)
        search_queryset = make_query(RepositorySearchView.search_fields,
                                     keywords)
        search_queryset = search_queryset.models(RepositorySearchView.model)
        if owner_only:
            search_queryset = search_queryset.filter(
                owner_id__in=accounts.keys())
        if hide_forks:
            search_queryset = search_queryset.exclude(is_fork=True)
        # It's certainly not the best way to do it but.... :(
        sorted_ids = [r.id for r in all_repositories]
        if sorted_ids:
            search_queryset = search_queryset.filter(django_id__in=sorted_ids)
            found_ids = [int(r.pk) for r in search_queryset]
            all_repositories = [
                r for r in all_repositories if r.id in found_ids
            ]

    distinct = request.GET.get('distinct', False) == 'y'
    if distinct:
        # try to keep one entry for each backend/slug
        uniq = []
        slugs = {}
        for repository in all_repositories:
            slug = '%s:%s' % (repository.backend, repository.slug)
            if slug in slugs:
                slugs[slug].append(repository)
                continue
            slugs[slug] = []
            uniq.append(repository)
        for repository in uniq:
            slug = '%s:%s' % (repository.backend, repository.slug)
            repository.distinct_others = slugs[slug]
        # try to keep the first non-fork for each one
        all_repositories = []
        sort_lambda = lambda r: r.official_created
        for repository in uniq:
            if not repository.distinct_others or repository.owner_id in accounts:
                good_repository = repository
            else:
                important_ones = [
                    r for r in repository.distinct_others if not r.is_fork
                ]
                owned = [r for r in important_ones if r.owner_id in accounts]
                if owned:
                    good_repository = owned[
                        0]  # all are from the owner, take one
                else:
                    if important_ones:
                        if not repository.is_fork:
                            important_ones + [
                                repository,
                            ]
                    else:
                        important_ones = repository.distinct_others + [
                            repository,
                        ]

                    good_repository = sorted(important_ones,
                                             key=sort_lambda)[0]

                if good_repository != repository:
                    good_repository.distinct_others = [
                        r for r in repository.distinct_others + [
                            repository,
                        ] if r != good_repository
                    ]
                    delattr(repository, 'distinct_others')

                if hasattr(good_repository, 'distinct_others'):
                    good_repository.distinct_others = sorted(
                        good_repository.distinct_others, key=sort_lambda)

            good_repository.current_user_account_id_list = set(
                (good_repository.current_user_account_id, ))
            if hasattr(good_repository, 'distinct_others'):
                for other_rep in good_repository.distinct_others:
                    good_repository.current_user_account_id_list.add(
                        other_rep.current_user_account_id)

            all_repositories.append(good_repository)

    page = paginate(request, all_repositories, settings.REPOSITORIES_PER_PAGE)

    context = dict(
        all_repositories=all_repositories,
        page=page,
        sort=dict(
            key=sort['key'],
            reverse=sort['reverse'],
        ),
        accounts=accounts,
        owner_only='y' if owner_only else False,
        hide_forks='y' if hide_forks else False,
        distinct='y' if distinct else False,
        query=query or "",
    )
    return context