def recipientlink(r): if isinstance(r, User): return userlink(r) elif isinstance(r, Group): return r.data else: return r
def chain_list(request, competition, data): chains = Chain.objects.filter(competition=competition) order_by_field = django_sorting.middleware.get_field(request) if len(order_by_field) > 1: chains = chains.order_by(order_by_field, 'category', 'position', 'name') else: chains = chains.order_by('category', 'position', 'name') chain_dict = {chain.id: chain for chain in chains} ctasks = list(CompetitionTask.objects.filter(competition=competition) \ .values_list('id', 'chain_id', 'task__author_id')) author_ids = [author_id for ctask_id, chain_id, author_id in ctasks] authors = User.objects.only('id', 'username', 'first_name', 'last_name') \ .in_bulk(set(author_ids)) verified_ctask_ids = set(Submission.objects \ .filter(team__competition_id=competition.id, team__team_type=Team.TYPE_ADMIN_PRIVATE, cache_is_correct=True) \ .values_list('ctask_id', flat=True)) for chain in chains: chain.competition = competition chain.t_ctask_count = 0 chain._author_ids = set() chain.t_is_verified = True for ctask_id, chain_id, author_id in ctasks: if chain_id is None: continue chain = chain_dict[chain_id] chain.t_ctask_count += 1 chain._author_ids.add(author_id) if ctask_id not in verified_ctask_ids: chain.t_is_verified = False from userprofile.templatetags.userprofile_tags import userlink for chain in chains: chain.t_authors = mark_safe(u", ".join(userlink(authors[author_id]) for author_id in chain._author_ids)) data['chains'] = chains return data