def index(request): # setup print(f" start at {round(time.time(),2)} ") query = request.GET.get('q', '') hours_new = 48 if not settings.DEBUG else 300 quests = [] selected_tab = 'Search' if query else 'Beginner' show_quests = request.GET.get('show_quests', False) show_loading = not show_quests focus_hackathon = request.GET.get('focus_hackathon', False) if show_quests: # hackathon tab if focus_hackathon: quest_qs = Quest.objects.filter(visible=True).filter(unlocked_by_hackathon__slug=focus_hackathon) quest_package = get_package_helper(quest_qs, request) package = ('Hackathon Quests', quest_package) quests.append(package) print(f" phase1.0 at {round(time.time(),2)} ") # search tab if query: quest_qs = Quest.objects.filter(visible=True).filter(Q(title__icontains=query) | Q(description__icontains=query) | Q(questions__icontains=query) | Q(game_schema__icontains=query) | Q(game_metadata__icontains=query)).order_by('-ui_data__success_pct') quest_package = get_package_helper(quest_qs, request) package = ('Search', quest_package) quests.append(package) print(f" phase1.1 at {round(time.time(),2)} ") # beaten/unbeaten if request.user.is_authenticated: attempts = request.user.profile.quest_attempts if attempts.exists(): beaten = Quest.objects.filter(pk__in=attempts.filter(success=True).values_list('quest', flat=True)) unbeaten = Quest.objects.filter(pk__in=attempts.filter(success=False).exclude(quest__in=beaten).values_list('quest', flat=True)) if unbeaten.exists(): quests.append(('Attempted', get_package_helper(unbeaten, request))) if selected_tab != 'Search': selected_tab = 'Attempted' if beaten.exists(): quests.append(('Beaten', get_package_helper(beaten, request))) created_quests = request.user.profile.quests_created.filter(visible=True) if created_quests: quests.append(('Created', get_package_helper(created_quests, request))) print(f" phase1.2 at {round(time.time(),2)} ") # difficulty tab for diff in Quest.DIFFICULTIES: quest_qs = Quest.objects.filter(difficulty=diff[0], visible=True).order_by('-ui_data__success_pct') quest_package = get_package_helper(quest_qs, request) package = (diff[0], quest_package) if quest_qs.exists(): quests.append(package) print(f" phase1.3 at {round(time.time(),2)} ") # new quests! new_quests = Quest.objects.filter(visible=True, created_on__gt=(timezone.now() - timezone.timedelta(hours=hours_new))).order_by('-ui_data__success_pct') if new_quests.exists(): quests.append(('New', get_package_helper(new_quests, request))) print(f" phase1.4 at {round(time.time(),2)} ") # popular quests popular = Quest.objects.filter(visible=True).order_by('-ui_data__attempts_count')[0:15] if popular.exists(): quests.append(('Popular', get_package_helper(popular, request))) # select focus if focus_hackathon: selected_tab = 'Hackathon Quests' print(f" phase2 at {round(time.time(),2)} ") rewards_schedule = [] for i in range(0, max_ref_depth): reward_denominator = 2 ** i layer = i if i else 'You' rewards_schedule.append({ 'layer': layer, 'reward_denominator': reward_denominator, 'reward_multiplier': 1/reward_denominator }) print(f" phase3 at {round(time.time(),2)} ") attempt_count = QuestAttempt.objects.count() success_count = QuestAttempt.objects.filter(success=True).count() print(f" phase3.1 at {round(time.time(),2)} ") leaderboard = {} for i in range(1, current_round_number+1): leaderboard[i] = get_leaderboard(round_number=i) print(f" phase3.2 at {round(time.time(),2)} ") point_history = request.user.profile.questpointawards.all() if request.user.is_authenticated else QuestPointAward.objects.none() point_value = sum(point_history.values_list('value', flat=True)) print(f" phase4 at {round(time.time(),2)} ") quests_attempts_per_day = (abs(round(QuestAttempt.objects.cache().count() / (QuestAttempt.objects.cache().first().created_on - timezone.now()).days, 1)) if QuestAttempt.objects.cache().count() else 0) success_ratio = int(success_count / attempt_count * 100) if attempt_count else 0 # community_created params = { 'profile': request.user.profile if request.user.is_authenticated else None, 'quests': quests, 'avg_play_count': round(QuestAttempt.objects.count()/(Quest.objects.count() or 1), 1), 'quests_attempts_total': QuestAttempt.objects.count(), 'quests_total': Quest.objects.cache().filter(visible=True).count(), 'quests_attempts_per_day': quests_attempts_per_day, 'total_visible_quest_count': Quest.objects.cache().filter(visible=True).count(), 'gitcoin_created': Quest.objects.cache().filter(visible=True).filter(creator=Profile.objects.filter(handle='gitcoinbot').first()).count(), 'community_created': Quest.objects.cache().filter(visible=True).exclude(creator=Profile.objects.filter(handle='gitcoinbot').first()).count(), 'country_count': 87, 'email_count': EmailSubscriber.objects.cache().count(), 'attempt_count': attempt_count, 'success_count': success_count, 'success_ratio': success_ratio, 'user_count': QuestAttempt.objects.cache().distinct('profile').count(), 'leaderboard': leaderboard, 'REFER_LINK': f'https://gitcoin.co/quests/?cb=ref:{request.user.profile.ref_code}' if request.user.is_authenticated else None, 'rewards_schedule': rewards_schedule, 'query': query, 'latest_round_winners': ['walidmujahid', 'nazariyv', 'cpix18'], 'selected_tab': selected_tab, 'title': f' {query.capitalize()} Quests', 'point_history': point_history, 'point_value': point_value, 'show_loading': show_loading, 'current_round_number': current_round_number, 'avatar_url': request.build_absolute_uri(static('v2/images/twitter_cards/tw_cards-05.png')), 'card_desc': 'Gitcoin Quests is a fun, gamified way to learn about the web3 ecosystem, compete with your friends, earn rewards, and level up your decentralization-fu!', } print(f" phase5 at {round(time.time(),2)} ") return TemplateResponse(request, 'quests/index.html', params)
def index(request): print(f" start at {round(time.time(),2)} ") query = request.GET.get('q', '') quests = [] if query: quest_qs = Quest.objects.filter(visible=True).filter( Q(title__icontains=query) | Q(description__icontains=query) | Q(questions__icontains=query) | Q(game_schema__icontains=query) | Q(game_metadata__icontains=query)) quest_package = get_package_helper(quest_qs, request) package = ('Search', quest_package) quests.append(package) for diff in Quest.DIFFICULTIES: quest_qs = Quest.objects.filter(difficulty=diff[0], visible=True) quest_package = get_package_helper(quest_qs, request) package = (diff[0], quest_package) if quest_qs.exists(): quests.append(package) print(f" phase2 at {round(time.time(),2)} ") rewards_schedule = [] for i in range(0, max_ref_depth): reward_denominator = 2**i layer = i if i else 'You' rewards_schedule.append({ 'layer': layer, 'reward_denominator': reward_denominator, 'reward_multiplier': 1 / reward_denominator }) print(f" phase3 at {round(time.time(),2)} ") attempt_count = QuestAttempt.objects.count() success_count = QuestAttempt.objects.filter(success=True).count() print(f" phase3.1 at {round(time.time(),2)} ") leaderboard = {} for i in range(1, current_round_number + 1): leaderboard[i] = get_leaderboard(round_number=i) print(f" phase3.2 at {round(time.time(),2)} ") point_history = request.user.profile.questpointawards.all( ) if request.user.is_authenticated else QuestPointAward.objects.none() point_value = sum(point_history.values_list('value', flat=True)) print(f" phase4 at {round(time.time(),2)} ") # community_created params = { 'profile': request.user.profile if request.user.is_authenticated else None, 'quests': quests, 'avg_play_count': round(QuestAttempt.objects.count() / Quest.objects.count(), 1), 'quests_attempts_total': QuestAttempt.objects.count(), 'quests_total': Quest.objects.filter(visible=True).count(), 'quests_attempts_per_day': abs( round( QuestAttempt.objects.count() / (QuestAttempt.objects.first().created_on - timezone.now()).days, 1)), 'total_visible_quest_count': Quest.objects.filter(visible=True).count(), 'gitcoin_created': Quest.objects.filter(visible=True).filter( creator=Profile.objects.filter( handle='gitcoinbot').first()).count(), 'community_created': Quest.objects.filter(visible=True).exclude( creator=Profile.objects.filter( handle='gitcoinbot').first()).count(), 'country_count': 87, 'email_count': EmailSubscriber.objects.count(), 'attempt_count': attempt_count, 'success_count': success_count, 'success_ratio': int(success_count / attempt_count * 100), 'user_count': QuestAttempt.objects.distinct('profile').count(), 'leaderboard': leaderboard, 'REFER_LINK': f'https://gitcoin.co/quests/?cb=ref:{request.user.profile.ref_code}' if request.user.is_authenticated else None, 'rewards_schedule': rewards_schedule, 'query': query, 'selected_tab': 'Search' if query else 'Beginner', 'title': f' {query.capitalize()} Quests', 'point_history': point_history, 'point_value': point_value, 'current_round_number': current_round_number, 'avatar_url': '/static/v2/images/quests/orb.png', 'card_desc': 'Gitcoin Quests is a fun, gamified way to learn about the web3 ecosystem, compete with your friends, earn rewards, and level up your decentralization-fu!', } print(f" phase5 at {round(time.time(),2)} ") return TemplateResponse(request, 'quests/index.html', params)