from collections import defaultdict, OrderedDict from django.views.generic import TemplateView from django.urls import reverse_lazy from django.db.models import Count, Q, Prefetch, Sum, F, IntegerField, Value, BooleanField, Case, When from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from trades.models import TradeOffer, TradeAcceptance, TradeOfferHaveCard, TradeOfferWantCard from cards.models import Card from django.utils.decorators import method_decorator from django.views.decorators.cache import cache_page from django.template.response import TemplateResponse from django.http import HttpResponseRedirect #from silk.profiling.profiler import silk_profile class HomePageView(TemplateView): template_name = "home/home.html" #@silk_profile(name='Home Page') def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["cards"] = Card.objects.all().order_by("name") # Reuse base trade offer queryset for market stats base_offer_qs = TradeOffer.objects.filter(is_closed=False) # Recent Offers recent_offers_qs = base_offer_qs.order_by("-created_at") context["recent_offers"] = recent_offers_qs[:6] # Most Offered Cards context["most_offered_cards"] = ( Card.objects.filter(tradeofferhavecard__isnull=False) .annotate(offer_count=Sum("tradeofferhavecard__quantity")) .order_by("-offer_count")[:6] ) # Most Wanted Cards context["most_wanted_cards"] = ( Card.objects.filter(tradeofferwantcard__isnull=False) .annotate(offer_count=Sum("tradeofferwantcard__quantity")) .order_by("-offer_count")[:6] ) # Least Offered Cards context["least_offered_cards"] = ( Card.objects.annotate(offer_count=Sum("tradeofferhavecard__quantity")) .order_by("offer_count")[:6] ) # Build featured offers with custom ordering featured = OrderedDict() # Featured "All" offers remains fixed at the top featured["All"] = base_offer_qs.order_by("created_at")[:6] # Pull out distinct (rarity_level, rarity_icon) tuples distinct_rarities = base_offer_qs.values_list("rarity_level", "rarity_icon").distinct() # Prepare a list that holds tuples of (rarity_level, rarity_icon, offers) rarity_offers = [] for rarity_level, rarity_icon in distinct_rarities: offers = base_offer_qs.filter(rarity_level=rarity_level).order_by("created_at")[:6] rarity_offers.append((rarity_level, rarity_icon, offers)) print(rarity_offers) # Sort by rarity_level (from greatest to least) rarity_offers.sort(key=lambda x: x[0], reverse=True) # Add the sorted offers to the OrderedDict for rarity_level, rarity_icon, offers in rarity_offers: featured[rarity_icon] = offers context["featured_offers"] = featured return context