Exemplo n.º 1
0
def landing(request):
    stats = cache.get("landing_stats")
    if not stats:
        stats = {
            "users":
            User.registered_members().count(),
            "countries":
            User.registered_members().values("country").annotate(
                total=Count("country")).order_by().count() + 1,
        }
        cache.set("landing_stats", stats, settings.LANDING_CACHE_TIMEOUT)

    return render(request, "landing.html", {"stats": stats})
Exemplo n.º 2
0
def stats(request):
    achievements = Achievement.objects\
        .annotate(user_count=Count('users'))\
        .filter(is_visible=True)\
        .filter(user_count__gt=0)\
        .exclude(code__in=["old", "parliament_member"])\
        .order_by('-user_count')

    latest_badges = UserBadge.objects\
        .select_related("badge", "to_user")\
        .order_by('-created_at')[:20]

    top_badges = list(
        filter(
            None.__ne__,
            [
                User.registered_members().filter(id=to_user).first()
                for to_user, _ in UserBadge.objects.filter(
                    created_at__gte=datetime.utcnow() - timedelta(days=150)).
                values_list("to_user").annotate(
                    sum_price=Sum("badge__price_days")).order_by("-sum_price")
                [:7]  # select more in case someone gets deleted
            ]))[:5]  # filter None

    moderators = User.objects\
        .filter(Q(roles__contains=[User.ROLE_MODERATOR]) | Q(roles__contains=[User.ROLE_GOD]))

    parliament = User.objects.filter(
        achievements__achievement_id="parliament_member")

    top_users = User.objects\
        .filter(
            moderation_status=User.MODERATION_STATUS_APPROVED,
            membership_expires_at__gte=datetime.utcnow() + timedelta(days=70)
        )\
        .order_by("-membership_expires_at")[:64]

    return render(
        request, "pages/stats.html", {
            "achievements": achievements,
            "latest_badges": latest_badges,
            "top_badges": top_badges,
            "top_users": top_users,
            "moderators": moderators,
            "parliament": parliament,
        })
Exemplo n.º 3
0
def api_search_users(request):
    if request.method != "GET":
        raise Http404()

    prefix = request.GET.get("prefix", "")

    if len(prefix) < MIN_PREFIX_LENGTH or len(prefix) > MAX_PREFIX_LENGTH:
        return JsonResponse({
            "users": []
        })

    suggested_users = User.registered_members().filter(slug__startswith=prefix)[:5]

    return JsonResponse({
        "users": [{
            "slug": user.slug,
            "full_name": user.full_name
        } for user in suggested_users],
    })
Exemplo n.º 4
0
def people(request):
    users = User.registered_members().order_by("-created_at").select_related(
        "geo")

    query = request.GET.get("query")
    if query:
        users = users.filter(index__index=SearchQuery(query, config="russian"))

    tags = request.GET.getlist("tags")
    if tags:
        users = users.filter(index__tags__contains=tags)

    country = request.GET.get("country")
    if country:
        users = users.filter(country=country)

    filters = request.GET.getlist("filters")
    if filters:
        if "faang" in filters:
            users = users.filter(company__in=[
                "Facebook", "Apple", "Google", "Amazon", "Netflix",
                "Microsoft", "Фейсбук", "Гугл", "Амазон", "Нетфликс",
                "Майкрософт", "Микрософт"
            ])

        if "same_city" in filters:
            users = users.filter(city=request.me.city)

        if "activity" in filters:
            users = users.filter(last_activity_at__gte=datetime.utcnow() -
                                 timedelta(days=30))

    tags_with_stats = Tag.tags_with_stats()
    tag_stat_groups = group_by(tags_with_stats, "group", todict=True)
    tag_stat_groups.update({
        "travel": [
            tag for tag in tag_stat_groups[Tag.GROUP_CLUB] if tag.code in {
                "can_coffee",
                "can_city",
                "can_beer",
                "can_office",
                "can_sleep",
            }
        ],
        "grow": [
            tag for tag in tag_stat_groups[Tag.GROUP_CLUB] if tag.code in {
                "can_advice", "can_project", "can_teach", "search_idea",
                "can_idea", "can_invest", "search_mentor", "can_mentor",
                "can_hobby"
            }
        ],
        "work": [
            tag for tag in tag_stat_groups[Tag.GROUP_CLUB] if tag.code in {
                "can_refer", "search_employees", "search_job", "search_remote",
                "search_relocate"
            }
        ],
    })

    active_countries = User.registered_members().filter(country__isnull=False)\
        .values("country")\
        .annotate(country_count=Count("country"))\
        .order_by("-country_count")

    map_stat_groups = {
        "💼 Топ компаний":
        top(users, "company")[:5],
        "🏰 Города":
        top(users, "city")[:5],
        "🎬 Экспертиза":
        top(UserExpertise.objects.filter(user_id__in=[u.id for u in users]),
            "name")[:5],
    }

    return render(
        request, "users/people.html", {
            "people_query": {
                "query": query,
                "country": country,
                "tags": tags,
                "filters": filters,
            },
            "users":
            users,
            "users_paginated":
            paginate(request, users, page_size=settings.PEOPLE_PAGE_SIZE),
            "tag_stat_groups":
            tag_stat_groups,
            "max_tag_user_count":
            max(tag.user_count for tag in tags_with_stats),
            "active_countries":
            active_countries,
            "map_stat_groups":
            map_stat_groups,
        })