views.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. from django.db.models import Avg, Count, F
  2. from django.views.generic import DetailView, ListView
  3. from django.views.generic.list import MultipleObjectMixin
  4. from .models import Developer, Game, GameSystem, Genre, Publisher
  5. import logging
  6. logger = logging.Logger(__name__)
  7. class RecentGameList(ListView):
  8. model = Game
  9. paginate_by = 20
  10. queryset = Game.objects.order_by("-created")[:200]
  11. class LibraryGameList(ListView):
  12. template_name = "games/game_library_list.html"
  13. model = Game
  14. paginate_by = 100
  15. def get_context_data(self, **kwargs):
  16. game_system_slug = self.request.GET.get("game_system")
  17. order_by = self.request.GET.get("order_by", "name")
  18. if order_by[0] == "-":
  19. order_by = order_by[1:]
  20. object_list = Game.objects.order_by(F(order_by).desc(nulls_last=True))
  21. else:
  22. object_list = Game.objects.order_by(F(order_by).asc(nulls_last=True))
  23. if game_system_slug:
  24. object_list = object_list.filter(
  25. game_system__retropie_slug=game_system_slug
  26. )
  27. context = super(LibraryGameList, self).get_context_data(
  28. object_list=object_list, **kwargs
  29. )
  30. return context
  31. class FilterableBaseListView(ListView):
  32. VALID_ORDERING = ["name", "num_games", "rating"]
  33. def get_queryset(self, **kwargs):
  34. order_by = self.request.GET.get("order_by", "name")
  35. queryset = super().get_queryset(**kwargs)
  36. queryset = queryset.annotate(num_games=Count("game")).annotate(
  37. rating=Avg("game__rating")
  38. )
  39. if order_by.replace("-", "") not in self.VALID_ORDERING:
  40. logger.warning(f"Received invalid filter {order_by}")
  41. return queryset
  42. if order_by[0] == "-":
  43. order_by = order_by[1:]
  44. queryset = queryset.order_by(F(order_by).desc(nulls_last=True))
  45. else:
  46. queryset = queryset.order_by(F(order_by).asc(nulls_last=True))
  47. return queryset
  48. class PublisherList(FilterableBaseListView):
  49. model = Publisher
  50. class DeveloperList(FilterableBaseListView):
  51. model = Developer
  52. class GenreList(FilterableBaseListView):
  53. model = Genre
  54. class GameDetail(DetailView):
  55. model = Game
  56. class GamePlayDetail(DetailView):
  57. template_name = "games/game_play_detail.html"
  58. model = Game
  59. class GameSystemDetail(DetailView, MultipleObjectMixin):
  60. model = GameSystem
  61. paginate_by = 20
  62. def get_context_data(self, **kwargs):
  63. object_list = Game.objects.filter(game_system=self.get_object())
  64. context = super(GameSystemDetail, self).get_context_data(
  65. object_list=object_list, **kwargs
  66. )
  67. return context
  68. class GenreDetail(DetailView, MultipleObjectMixin):
  69. model = Genre
  70. paginate_by = 20
  71. def get_context_data(self, **kwargs):
  72. object_list = Game.objects.filter(genre=self.get_object())
  73. context = super(GenreDetail, self).get_context_data(
  74. object_list=object_list, **kwargs
  75. )
  76. return context
  77. class PublisherDetail(DetailView):
  78. model = Publisher
  79. paginate_by = 20
  80. def get_context_data(self, **kwargs):
  81. object_list = Game.objects.filter(publisher=self.get_object())
  82. context = super(PublisherDetail, self).get_context_data(
  83. object_list=object_list, **kwargs
  84. )
  85. return context
  86. class DeveloperDetail(DetailView):
  87. model = Developer
  88. paginate_by = 20
  89. def get_context_data(self, **kwargs):
  90. object_list = Game.objects.filter(developer=self.get_object())
  91. context = super(DeveloperDetail, self).get_context_data(
  92. object_list=object_list, **kwargs
  93. )
  94. return context