Coverage for website/events/feeds.py: 50.00%

40 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1from django.conf import settings 

2from django.db.models.query_utils import Q 

3from django.utils.translation import activate 

4from django.utils.translation import gettext as _ 

5 

6from django_ical.views import ICalFeed 

7 

8from events.models import Event, FeedToken 

9 

10 

11class EventFeed(ICalFeed): 

12 """Output an iCal feed containing all published events.""" 

13 

14 def __init__(self, lang="en"): 

15 super().__init__() 

16 self.lang = lang 

17 self.user = None 

18 

19 def __call__(self, request, *args, **kwargs): 

20 if "u" in request.GET: 

21 self.user = FeedToken.get_member(request.GET["u"]) 

22 else: 

23 self.user = None 

24 

25 return super().__call__(request, args, kwargs) 

26 

27 def product_id(self): 

28 return f"-//{settings.SITE_DOMAIN}//EventCalendar//{self.lang.upper()}" 

29 

30 def file_name(self): 

31 return f"thalia_{self.lang}.ics" 

32 

33 def title(self): 

34 activate(self.lang) 

35 return _("Study Association Thalia event calendar") 

36 

37 def items(self): 

38 query = Q(published=True) 

39 

40 if self.user: 

41 query &= Q(eventregistration__member=self.user) & Q( 

42 eventregistration__date_cancelled=None 

43 ) 

44 

45 return Event.objects.filter(query).order_by("-start") 

46 

47 def item_title(self, item): 

48 return item.title 

49 

50 def item_description(self, item): 

51 return f'{item.description} <a href="{self.item_link(item)}">Website</a>' 

52 

53 def item_start_datetime(self, item): 

54 return item.start 

55 

56 def item_end_datetime(self, item): 

57 return item.end 

58 

59 def item_link(self, item): 

60 return settings.BASE_URL + item.get_absolute_url() 

61 

62 def item_location(self, item): 

63 return f"{item.location} - {item.map_location}"