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

1"""API v2 views of the announcements app.""" 

2 

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 

7 

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 

16 

17 

18class AnnouncementsAPIViewMixin: 

19 permission_classes = [ 

20 IsAuthenticatedOrTokenHasScope, 

21 ] 

22 required_scopes = ["announcements:read"] 

23 

24 

25class SlideListView(AnnouncementsAPIViewMixin, ListAPIView): 

26 """Returns an overview of all slides that are currently active.""" 

27 

28 serializer_class = SlideSerializer 

29 queryset = Slide.visible_objects.order_by("order") 

30 

31 

32class SlideDetailView(AnnouncementsAPIViewMixin, RetrieveAPIView): 

33 """Returns details of a slide.""" 

34 

35 serializer_class = SlideSerializer 

36 queryset = Slide.visible_objects.order_by("order") 

37 

38 

39class FrontpageArticleListView(AnnouncementsAPIViewMixin, ListAPIView): 

40 """Returns an overview of all frontpage articles that are currently active.""" 

41 

42 serializer_class = FrontpageArticleSerializer 

43 queryset = FrontpageArticle.visible_objects.all() 

44 

45 

46class FrontpageArticleDetailView(AnnouncementsAPIViewMixin, RetrieveAPIView): 

47 """Returns details of a frontpage article.""" 

48 

49 serializer_class = FrontpageArticleSerializer 

50 queryset = FrontpageArticle.visible_objects.all() 

51 

52 

53class AnnouncementListView(AnnouncementsAPIViewMixin, viewsets.ViewSet): 

54 """Returns a list of announcements.""" 

55 

56 serializer_class = AnnouncementSerializer 

57 

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) 

66 

67 

68class AnnouncementDetailView(AnnouncementsAPIViewMixin, viewsets.ViewSet): 

69 serializer_class = AnnouncementSerializer 

70 

71 def hide(self, request, pk): 

72 close_announcement(request, pk) 

73 return Response(status=204)