Coverage for website/announcements/api/v2/views.py: 82.86%
35 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1"""API v2 views of the announcements app."""
3from oauth2_provider.contrib.rest_framework import IsAuthenticatedOrTokenHasScope
4from rest_framework import viewsets
5from rest_framework.generics import ListAPIView, RetrieveAPIView
6from rest_framework.response import Response
8from announcements.api.v2.serializers import (
9 AnnouncementSerializer,
10 FrontpageArticleSerializer,
11 SlideSerializer,
12)
13from announcements.context_processors import announcements
14from announcements.models import FrontpageArticle, Slide
15from announcements.services import close_announcement, get_announcements
18class AnnouncementsAPIViewMixin:
19 permission_classes = [
20 IsAuthenticatedOrTokenHasScope,
21 ]
22 required_scopes = ["announcements:read"]
25class SlideListView(AnnouncementsAPIViewMixin, ListAPIView):
26 """Returns an overview of all slides that are currently active."""
28 serializer_class = SlideSerializer
29 queryset = Slide.visible_objects.order_by("order")
32class SlideDetailView(AnnouncementsAPIViewMixin, RetrieveAPIView):
33 """Returns details of a slide."""
35 serializer_class = SlideSerializer
36 queryset = Slide.visible_objects.order_by("order")
39class FrontpageArticleListView(AnnouncementsAPIViewMixin, ListAPIView):
40 """Returns an overview of all frontpage articles that are currently active."""
42 serializer_class = FrontpageArticleSerializer
43 queryset = FrontpageArticle.visible_objects.all()
46class FrontpageArticleDetailView(AnnouncementsAPIViewMixin, RetrieveAPIView):
47 """Returns details of a frontpage article."""
49 serializer_class = FrontpageArticleSerializer
50 queryset = FrontpageArticle.visible_objects.all()
53class AnnouncementListView(AnnouncementsAPIViewMixin, viewsets.ViewSet):
54 """Returns a list of announcements."""
56 serializer_class = AnnouncementSerializer
58 def list(self, request):
59 request._announcements = get_announcements(request)
60 announces = announcements(request)
61 serializer = self.serializer_class(
62 announces["announcements"] + announces["persistent_announcements"],
63 many=True,
64 )
65 return Response(serializer.data)
68class AnnouncementDetailView(AnnouncementsAPIViewMixin, viewsets.ViewSet):
69 serializer_class = AnnouncementSerializer
71 def hide(self, request, pk):
72 close_announcement(request, pk)
73 return Response(status=204)