Fix pagination controls, move mixin to common app, fix pagination invocation on all views, and other random bug fixes

This commit is contained in:
badblocks 2025-04-01 23:01:05 -07:00
parent 7edefe23c3
commit 6a61b79bbe
425 changed files with 51656 additions and 243 deletions

View file

@ -1,31 +1,21 @@
from django.views.generic import TemplateView, DeleteView, CreateView, ListView, DetailView, UpdateView, FormView
from django.views.generic import DeleteView, CreateView, ListView, DetailView, UpdateView
from django.views import View
from django.urls import reverse_lazy
from django.http import HttpResponseRedirect, JsonResponse
from django.http import HttpResponseRedirect
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import get_object_or_404, render
from django.shortcuts import render
from django.core.exceptions import PermissionDenied, ValidationError
from django.views.generic.edit import FormMixin
from django.utils import timezone
from django.db.models import Q, Case, When, Value, BooleanField, Prefetch, F
from django.utils.decorators import method_decorator
from django.views.decorators.http import require_http_methods
from django.core.paginator import Paginator
from django.contrib import messages
from django.views.decorators.cache import cache_page
from meta.views import Meta
from .models import TradeOffer, TradeAcceptance
from .forms import (TradeOfferAcceptForm,
TradeAcceptanceCreateForm, TradeOfferCreateForm, TradeAcceptanceTransitionForm)
from cards.models import Card
import imgkit
from django.http import HttpResponse, Http404
from .forms import (TradeAcceptanceCreateForm, TradeOfferCreateForm, TradeAcceptanceTransitionForm)
from django.template.loader import render_to_string
from trades.templatetags.trade_offer_tags import render_trade_offer
from django.template import RequestContext
from playwright.sync_api import sync_playwright
from django.conf import settings
from .mixins import FriendCodeRequiredMixin
from common.mixins import ReusablePaginationMixin
class TradeOfferCreateView(LoginRequiredMixin, CreateView):
http_method_names = ['get'] # restricts this view to GET only
@ -65,47 +55,46 @@ class TradeOfferCreateView(LoginRequiredMixin, CreateView):
context["selected_friend_code"] = selected_friend_code
return context
class TradeOfferAllListView(ListView):
class TradeOfferAllListView(ReusablePaginationMixin, ListView):
model = TradeOffer
template_name = "trades/trade_offer_all_list.html"
#@silk_profile(name="Trade Offer All List- Get Context Data")
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
request = self.request
show_closed = request.GET.get("show_closed", "false").lower() == "true"
context["show_closed"] = show_closed
# Build the queryset with our related objects.
queryset = TradeOffer.objects
queryset = TradeOffer.objects.all()
if show_closed:
queryset = queryset.filter(is_closed=True)
else:
queryset = queryset.filter(is_closed=False)
# On initial load, use the 'offers_page' parameter.
offers_page = request.GET.get("offers_page")
offers_paginator = Paginator(queryset, 10)
context["all_trade_offers_paginated"] = offers_paginator.get_page(offers_page)
page_number = self.get_page_number()
self.per_page = 10
paginated_offers, pagination_context = self.paginate_data(queryset, page_number)
context["offers"] = paginated_offers
# Set pagination context using the key expected in the template
context["page_obj"] = pagination_context
return context
#@silk_profile(name="Trade Offer All List- Render to Response")
def render_to_response(self, context, **response_kwargs):
# For AJAX requests, return only the paginated fragment.
if self.request.headers.get("X-Requested-With") == "XMLHttpRequest":
page = self.request.GET.get("page")
show_closed = self.request.GET.get("show_closed", "false").lower() == "true"
queryset = TradeOffer.objects
queryset = TradeOffer.objects.all()
if show_closed:
queryset = queryset.filter(is_closed=True)
else:
queryset = queryset.filter(is_closed=False)
paginated_offers = Paginator(queryset, 10).get_page(page)
page_number = self.get_page_number()
self.per_page = 10
paginated_offers, pagination_context = self.paginate_data(queryset, page_number)
return render(
self.request,
"trades/_trade_offer_list.html",
{"offers": paginated_offers}
{"offers": paginated_offers, "page_obj": pagination_context}
)
return super().render_to_response(context, **response_kwargs)
@ -445,7 +434,7 @@ class TradeAcceptanceCreateView(LoginRequiredMixin, FriendCodeRequiredMixin, Cre
return super().form_invalid(form)
def get_success_url(self):
return reverse_lazy("trade_offer_detail", kwargs={"pk": self.trade_offer.pk})
return reverse_lazy("trade_acceptance_update", kwargs={"pk": self.object.pk})
class TradeAcceptanceUpdateView(LoginRequiredMixin, FriendCodeRequiredMixin, UpdateView):
"""
@ -487,7 +476,7 @@ class TradeAcceptanceUpdateView(LoginRequiredMixin, FriendCodeRequiredMixin, Upd
return HttpResponseRedirect(self.get_success_url())
def get_success_url(self):
return reverse_lazy("trade_offer_detail", kwargs={"pk": self.object.trade_offer.pk})
return reverse_lazy("trade_acceptance_update", kwargs={"pk": self.object.pk})
class TradeOfferPNGView(View):
"""
@ -523,8 +512,6 @@ class TradeOfferPNGView(View):
trade_offer.image.open()
return HttpResponse(trade_offer.image.read(), content_type="image/png")
# Generate PNG using Playwright as before.
from trades.templatetags import trade_offer_tags
tag_context = trade_offer_tags.render_trade_offer_png(
{'request': request}, trade_offer, show_friend_code=True
)
@ -534,7 +521,6 @@ class TradeOfferPNGView(View):
raise ValueError("Could not determine image dimensions from tag_context")
html = render_to_string("templatetags/trade_offer_png.html", tag_context)
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
headless=True,