From c0e7ac3fd98339def26a7c28eee203d9f7dec22b Mon Sep 17 00:00:00 2001 From: _aandres Date: Thu, 14 Jul 2022 04:03:00 +0200 Subject: [PATCH] feat [server]: calendar view grouped by projection month --- server/myapi/views/std_views.py | 30 ++++++++++++++++++++--- server/ulm_cine_club_api/settings/base.py | 3 +++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/server/myapi/views/std_views.py b/server/myapi/views/std_views.py index 6d98f0c..7adf893 100644 --- a/server/myapi/views/std_views.py +++ b/server/myapi/views/std_views.py @@ -1,7 +1,10 @@ # from django.shortcuts import render from datetime import datetime +from itertools import groupby from typing import Callable +from django.db.models import Q +from django.db.models.functions import TruncMonth from rest_framework import viewsets, mixins from rest_framework.decorators import action from rest_framework.renderers import StaticHTMLRenderer @@ -50,8 +53,27 @@ class FilmViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, GenericViewS serializer_class = FilmSerializer def get_queryset(self): - queryset = Film.objects.all().filter(is_confirmed=True).order_by("projection_date") + queryset = Film.objects.all().filter(is_confirmed=True) past = self.request.query_params.get("past", False) - if past: - return queryset.filter(projection_date__date__lt=datetime.now()) - return queryset.filter(projection_date__date__gte=datetime.now()) + date_filter = ( + Q(projection_date__date__lt=datetime.now()) + if past + else Q(projection_date__date__gte=datetime.now()) + ) + ordering = f"{'-' if past else ''}projection_date" + return queryset.filter(date_filter).order_by(ordering) + + @action(detail=False, methods=["GET"]) + def calendar(self, request): + qs = self.get_queryset().annotate( + projection_month=TruncMonth("projection_date") + ) + grouped = groupby(qs, lambda f: f.projection_month) + data = [ + { + "projection_month": month.strftime("%B %Y"), + "films": FilmSerializer(monthly_data, many=True).data, + } + for (month, monthly_data) in grouped + ] + return Response(data) diff --git a/server/ulm_cine_club_api/settings/base.py b/server/ulm_cine_club_api/settings/base.py index b35b49e..0ec01fe 100644 --- a/server/ulm_cine_club_api/settings/base.py +++ b/server/ulm_cine_club_api/settings/base.py @@ -9,6 +9,8 @@ https://docs.djangoproject.com/en/3.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/3.2/ref/settings/ """ +import locale + import getconf from pathlib import Path @@ -97,6 +99,7 @@ DATETIME_FORMAT = "%Y-%m-%dT%H:%M" TIME_ZONE = "Europe/Paris" USE_I18N = True USE_L10N = True +locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8") # ManifestStaticFilesStorage is recommended in production, to prevent outdated # JavaScript / CSS assets being served from cache (e.g. after a Wagtail upgrade).