add: галерея (7) Общая галерея с фильтрами

This commit is contained in:
2026-09-06 19:17:22 +03:00
parent 12474b9097
commit 60fda39bb3
6 changed files with 239 additions and 10 deletions
+73
View File
@@ -68,6 +68,79 @@ def get_floor_top(limit: int | None = 8, offset: int = 0):
return qs
def gallery_archive(request: HttpRequest) -> HttpResponse:
"""
Общий архив галереи транса с фильтрацией по этажам и сортировкой.
Пагинация по 16 карточек на страницу.
"""
floor = request.GET.get("floor", "all")
sort = request.GET.get("sort", "gravity")
# Базовый QuerySet
qs = TbHypn0Item.objects.filter(is_public=True)
# Фильтрация по этажам
if floor == "fresh":
qs = qs.filter(i_level__in=[TbHypn0Item.Level.CANDIDATE, TbHypn0Item.Level.LEVEL_1])
elif floor == "curated":
qs = qs.filter(i_level=TbHypn0Item.Level.LEVEL_2)
elif floor == "top":
qs = qs.filter(i_level=TbHypn0Item.Level.IMMORTAL)
else:
floor = "all"
# Применение сортировки
if sort == "new":
qs = qs.order_by("-d_created_at")
elif sort == "likes":
qs = qs.order_by("-i_likes_count", "-f_score", "-d_created_at")
elif sort == "views":
qs = qs.order_by("i_views_count", "-d_created_at")
elif sort == "popular":
qs = qs.order_by("-i_views_count", "-d_created_at")
else:
sort = "gravity"
qs = qs.order_by("-f_score", "-d_created_at")
# Подсчет количества работ для бейджей на табах
counts = {
"all": TbHypn0Item.objects.filter(is_public=True).count(),
"fresh": TbHypn0Item.objects.filter(
is_public=True,
i_level__in=[TbHypn0Item.Level.CANDIDATE, TbHypn0Item.Level.LEVEL_1]
).count(),
"curated": TbHypn0Item.objects.filter(
is_public=True,
i_level=TbHypn0Item.Level.LEVEL_2
).count(),
"top": TbHypn0Item.objects.filter(
is_public=True,
i_level=TbHypn0Item.Level.IMMORTAL
).count(),
}
paginator = Paginator(qs, 16)
page_number = request.GET.get("page", 1)
page_obj = paginator.get_page(page_number)
sort_options = [
{"id": "gravity", "title": "По гравитации (f_score)", "icon": "🌀"},
{"id": "new", "title": "Свежие (по дате)", "icon": ""},
{"id": "likes", "title": "По числу лайков", "icon": ""},
{"id": "views", "title": "Редкие (мало показов)", "icon": "👁"},
{"id": "popular", "title": "Популярные по показам", "icon": "🔥"},
]
context = {
"page_obj": page_obj,
"current_floor": floor,
"current_sort": sort,
"counts": counts,
"sort_options": sort_options,
}
return render(request, "gallery/archive.html", context)
def gallery_floor(request: HttpRequest, floor_slug: str) -> HttpResponse:
"""
Страница полного просмотра конкретного этажа галереи с пагинацией (по 16 карточек).