Example #1
0
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)
Example #2
0
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)