|
@@ -1,24 +1,33 @@
|
|
|
-from django.db.models import F
|
|
|
+from django.db.models import Avg, Count, F
|
|
|
from django.views.generic import DetailView, ListView
|
|
|
from django.views.generic.list import MultipleObjectMixin
|
|
|
|
|
|
from .models import Developer, Game, GameSystem, Genre, Publisher
|
|
|
|
|
|
+import logging
|
|
|
+
|
|
|
+logger = logging.Logger(__name__)
|
|
|
+
|
|
|
|
|
|
class RecentGameList(ListView):
|
|
|
model = Game
|
|
|
paginate_by = 20
|
|
|
- queryset = Game.objects.order_by("-created")[:20]
|
|
|
+ queryset = Game.objects.order_by("-created")[:200]
|
|
|
|
|
|
|
|
|
class LibraryGameList(ListView):
|
|
|
template_name = "games/game_library_list.html"
|
|
|
model = Game
|
|
|
- paginate_by = 200
|
|
|
+ paginate_by = 100
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
game_system_slug = self.request.GET.get("game_system")
|
|
|
- object_list = Game.objects.order_by(F("rating").desc(nulls_last=True))
|
|
|
+ order_by = self.request.GET.get("order_by", "name")
|
|
|
+ if order_by[0] == "-":
|
|
|
+ order_by = order_by[1:]
|
|
|
+ object_list = Game.objects.order_by(F(order_by).desc(nulls_last=True))
|
|
|
+ else:
|
|
|
+ object_list = Game.objects.order_by(F(order_by).asc(nulls_last=True))
|
|
|
if game_system_slug:
|
|
|
object_list = object_list.filter(
|
|
|
game_system__retropie_slug=game_system_slug
|
|
@@ -29,6 +38,39 @@ class LibraryGameList(ListView):
|
|
|
return context
|
|
|
|
|
|
|
|
|
+class FilterableBaseListView(ListView):
|
|
|
+ VALID_ORDERING = ["name", "num_games", "rating"]
|
|
|
+
|
|
|
+ def get_queryset(self, **kwargs):
|
|
|
+ order_by = self.request.GET.get("order_by", "name")
|
|
|
+ queryset = super().get_queryset(**kwargs)
|
|
|
+ queryset = queryset.annotate(num_games=Count("game")).annotate(
|
|
|
+ rating=Avg("game__rating")
|
|
|
+ )
|
|
|
+ if order_by.replace("-", "") not in self.VALID_ORDERING:
|
|
|
+ logger.warning(f"Received invalid filter {order_by}")
|
|
|
+ return queryset
|
|
|
+
|
|
|
+ if order_by[0] == "-":
|
|
|
+ order_by = order_by[1:]
|
|
|
+ queryset = queryset.order_by(F(order_by).desc(nulls_last=True))
|
|
|
+ else:
|
|
|
+ queryset = queryset.order_by(F(order_by).asc(nulls_last=True))
|
|
|
+ return queryset
|
|
|
+
|
|
|
+
|
|
|
+class PublisherList(FilterableBaseListView):
|
|
|
+ model = Publisher
|
|
|
+
|
|
|
+
|
|
|
+class DeveloperList(FilterableBaseListView):
|
|
|
+ model = Developer
|
|
|
+
|
|
|
+
|
|
|
+class GenreList(FilterableBaseListView):
|
|
|
+ model = Genre
|
|
|
+
|
|
|
+
|
|
|
class GameDetail(DetailView):
|
|
|
model = Game
|
|
|
|