progress on conversion to tailwind

This commit is contained in:
badblocks 2025-03-06 21:28:36 -08:00
parent 6a872124c6
commit 6e2843c60e
110 changed files with 4997 additions and 1691 deletions

View file

@ -1,22 +1,22 @@
from collections import defaultdict
from django.views.generic import TemplateView
from django.urls import reverse_lazy
from django.db.models import Count, Q
from django.db.models import Count, Q, Prefetch, Sum
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from trades.models import TradeOffer
from cards.models import Card, CardSet
from cards.models import Card, CardSet, Rarity
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.template.response import TemplateResponse
@method_decorator(cache_page(60), name='get') # Cache view for 60 seconds (smallest cache time in the template)
@method_decorator(cache_page(60), name='get') # Cache view for 60 seconds
class HomePageView(TemplateView):
template_name = "home/home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Use POST data if available, fallback to GET
# Use POST data if available, else fallback to GET
request_data = self.request.POST if self.request.method == "POST" else self.request.GET
# --- Search form logic ---
@ -25,22 +25,36 @@ class HomePageView(TemplateView):
context["offered_cards"] = offered_cards
context["wanted_cards"] = wanted_cards
# Define prefetch objects ordered by number of associated trade offers ascending,
# and by id secondarily.
have_cards_prefetch = Prefetch(
'have_cards',
queryset=Card.objects.annotate(
trade_offer_count=Count("trade_offers_have")
).order_by("trade_offer_count", "id")
)
want_cards_prefetch = Prefetch(
'want_cards',
queryset=Card.objects.annotate(
trade_offer_count=Count("trade_offers_want")
).order_by("trade_offer_count", "id")
)
search_results = None
if offered_cards or wanted_cards:
qs = TradeOffer.objects.filter(
state=TradeOffer.State.INITIATED
).prefetch_related(
"have_cards",
# Instead of filtering by a 'state' field (which no longer exists),
# we fetch all offers. You may later add logic to filter only "open" offers.
qs = TradeOffer.objects.all().prefetch_related(
have_cards_prefetch,
"have_cards__decks",
"have_cards__rarity",
"have_cards__cardset",
"want_cards",
want_cards_prefetch,
"want_cards__decks",
"want_cards__rarity",
"want_cards__cardset"
).select_related(
"initiated_by__user",
"accepted_by__user"
"initiated_by__user"
)
if offered_cards:
try:
@ -56,72 +70,90 @@ class HomePageView(TemplateView):
qs = qs.none()
else:
qs = qs.filter(have_cards__id__in=wanted_card_ids)
# Pagination: 3 results per page
page_number = request_data.get("page", 1)
paginator = Paginator(qs, 3)
paginator = Paginator(qs, 6)
try:
search_results = paginator.page(page_number)
except PageNotAnInteger:
search_results = paginator.page(1)
except EmptyPage:
search_results = paginator.page(paginator.num_pages)
context["search_results"] = search_results
# --- Recently posted offers (latest 5, newest first) ---
context["recent_offers"] = TradeOffer.objects.order_by("-created_at").prefetch_related(
"have_cards",
have_cards_prefetch,
"have_cards__decks",
"have_cards__rarity",
"have_cards__cardset",
"want_cards",
want_cards_prefetch,
"want_cards__decks",
"want_cards__rarity",
"want_cards__cardset"
).select_related(
"initiated_by__user",
"accepted_by__user"
"initiated_by__user"
)[:5]
# --- Most offered cards ---
context["most_offered_cards"] = Card.objects.annotate(
offer_count=Count("trade_offers_have")
context["most_offered_cards"] = Card.objects.filter(
tradeofferhavecard__isnull=False
).annotate(
offer_count=Sum("tradeofferhavecard__quantity")
).order_by("-offer_count").select_related("rarity", "cardset").prefetch_related("decks")[:5]
# --- Most wanted cards ---
context["most_wanted_cards"] = Card.objects.annotate(
offer_count=Count("trade_offers_want")
context["most_wanted_cards"] = Card.objects.filter(
tradeofferwantcard__isnull=False
).annotate(
offer_count=Sum("tradeofferwantcard__quantity")
).order_by("-offer_count").select_related("rarity", "cardset").prefetch_related("decks")[:5]
# --- Featured offers grouped by cardset ---
# --- Least offered cards ---
context["least_offered_cards"] = Card.objects.annotate(
offer_count=Sum("tradeofferhavecard__quantity")
).order_by("offer_count", "?")[:5]
# --- Featured offers grouped by rarity (using card.rarity.icon for tab names) ---
featured = {}
all_offers = list(
TradeOffer.objects.order_by("created_at").prefetch_related(
"have_cards",
have_cards_prefetch,
"have_cards__decks",
"have_cards__rarity",
"have_cards__cardset",
"want_cards",
want_cards_prefetch,
"want_cards__decks",
"want_cards__rarity",
"want_cards__cardset"
).select_related(
"initiated_by__user",
"accepted_by__user"
"initiated_by__user"
)
)
featured["All"] = all_offers[:5]
# Group offers by normalized rarity id from their have_cards
grouped = defaultdict(list)
for offer in all_offers:
cardsets_in_offer = set()
normalized_ids = set()
for card in offer.have_cards.all():
cardsets_in_offer.add(card.cardset.name)
for card in offer.want_cards.all():
cardsets_in_offer.add(card.cardset.name)
for cs_name in cardsets_in_offer:
grouped[cs_name].append(offer)
for cs_name, offers in grouped.items():
featured[cs_name] = offers[:5]
if card.rarity:
normalized_ids.add(card.rarity.normalized_id)
for norm in normalized_ids:
grouped[norm].append(offer)
# Map each normalized rarity id to a representative icon
norm_ids_available = list(grouped.keys())
rareness_qs = Rarity.objects.filter(pk__in=[6] + [nid for nid in norm_ids_available if nid != 6])
rarity_map = {rarity.pk: rarity.icons for rarity in rareness_qs}
# Order groups by descending normalized rarity id
for norm in sorted(grouped.keys(), reverse=True):
offers = grouped[norm]
icon_label = rarity_map.get(norm)
if icon_label:
featured[icon_label] = offers[:5]
context["featured_offers"] = featured