Initial working version with minor bugs

This commit is contained in:
badblocks 2025-02-26 00:06:42 -08:00
parent f946e4933a
commit 71b3993326
83 changed files with 34485 additions and 173 deletions

0
home/__init__.py Normal file
View file

1
home/admin.py Normal file
View file

@ -0,0 +1 @@
from django.contrib import admin

5
home/apps.py Normal file
View file

@ -0,0 +1,5 @@
from django.apps import AppConfig
class HomeConfig(AppConfig):
name = "home"

View file

1
home/models.py Normal file
View file

@ -0,0 +1 @@
from django.db import models

3
home/tests.py Normal file
View file

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

7
home/urls.py Normal file
View file

@ -0,0 +1,7 @@
from django.urls import path
from .views import HomePageView
urlpatterns = [
path("", HomePageView.as_view(), name="home"),
]

135
home/views.py Normal file
View file

@ -0,0 +1,135 @@
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.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from trades.models import TradeOffer
from cards.models import Card, CardSet
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)
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
request_data = self.request.POST if self.request.method == "POST" else self.request.GET
# --- Search form logic ---
offered_cards = request_data.getlist("offered_cards")
wanted_cards = request_data.getlist("wanted_cards")
context["offered_cards"] = offered_cards
context["wanted_cards"] = wanted_cards
search_results = None
if offered_cards or wanted_cards:
qs = TradeOffer.objects.filter(
state=TradeOffer.State.INITIATED
).prefetch_related(
"have_cards",
"have_cards__decks",
"have_cards__rarity",
"have_cards__cardset",
"want_cards",
"want_cards__decks",
"want_cards__rarity",
"want_cards__cardset"
).select_related(
"initiated_by__user",
"accepted_by__user"
)
if offered_cards:
try:
offered_card_ids = [int(card) for card in offered_cards]
except ValueError:
qs = qs.none()
else:
qs = qs.filter(want_cards__id__in=offered_card_ids)
if wanted_cards:
try:
wanted_card_ids = [int(card) for card in wanted_cards]
except ValueError:
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)
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__decks",
"have_cards__rarity",
"have_cards__cardset",
"want_cards",
"want_cards__decks",
"want_cards__rarity",
"want_cards__cardset"
).select_related(
"initiated_by__user",
"accepted_by__user"
)[:5]
# --- Most offered cards ---
context["most_offered_cards"] = Card.objects.annotate(
offer_count=Count("trade_offers_have")
).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")
).order_by("-offer_count").select_related("rarity", "cardset").prefetch_related("decks")[:5]
# --- Featured offers grouped by cardset ---
featured = {}
all_offers = list(
TradeOffer.objects.order_by("created_at").prefetch_related(
"have_cards",
"have_cards__decks",
"have_cards__rarity",
"have_cards__cardset",
"want_cards",
"want_cards__decks",
"want_cards__rarity",
"want_cards__cardset"
).select_related(
"initiated_by__user",
"accepted_by__user"
)
)
featured["All"] = all_offers[:5]
grouped = defaultdict(list)
for offer in all_offers:
cardsets_in_offer = 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]
context["featured_offers"] = featured
return context
def post(self, request, *args, **kwargs):
# If the request is AJAX, return only the search results fragment
context = self.get_context_data(**kwargs)
if request.headers.get('x-requested-with') == 'XMLHttpRequest':
return TemplateResponse(request, "home/_search_results.html", context)
return self.render_to_response(context)