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
« 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 _
6from django_ical.views import ICalFeed
8from events.models import Event, FeedToken
11class EventFeed(ICalFeed):
12 """Output an iCal feed containing all published events."""
14 def __init__(self, lang="en"):
15 super().__init__()
16 self.lang = lang
17 self.user = None
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
25 return super().__call__(request, args, kwargs)
27 def product_id(self):
28 return f"-//{settings.SITE_DOMAIN}//EventCalendar//{self.lang.upper()}"
30 def file_name(self):
31 return f"thalia_{self.lang}.ics"
33 def title(self):
34 activate(self.lang)
35 return _("Study Association Thalia event calendar")
37 def items(self):
38 query = Q(published=True)
40 if self.user:
41 query &= Q(eventregistration__member=self.user) & Q(
42 eventregistration__date_cancelled=None
43 )
45 return Event.objects.filter(query).order_by("-start")
47 def item_title(self, item):
48 return item.title
50 def item_description(self, item):
51 return f'{item.description} <a href="{self.item_link(item)}">Website</a>'
53 def item_start_datetime(self, item):
54 return item.start
56 def item_end_datetime(self, item):
57 return item.end
59 def item_link(self, item):
60 return settings.BASE_URL + item.get_absolute_url()
62 def item_location(self, item):
63 return f"{item.location} - {item.map_location}"