svthalia/concrexit

View on GitHub
website/events/feeds.py

Summary

Maintainability
A
0 mins
Test Coverage
"""The feeds defined by the events package."""
from django.conf import settings
from django.db.models.query_utils import Q
from django.utils.translation import activate
from django.utils.translation import gettext as _

from django_ical.views import ICalFeed

from events.models import Event, FeedToken


class EventFeed(ICalFeed):
    """Output an iCal feed containing all published events."""

    def __init__(self, lang="en"):
        super().__init__()
        self.lang = lang
        self.user = None

    def __call__(self, request, *args, **kwargs):
        if "u" in request.GET:
            self.user = FeedToken.get_member(request.GET["u"])
        else:
            self.user = None

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

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

    def file_name(self):
        return f"thalia_{self.lang}.ics"

    def title(self):
        activate(self.lang)
        return _("Study Association Thalia event calendar")

    def items(self):
        query = Q(published=True)

        if self.user:
            query &= Q(eventregistration__member=self.user) & Q(
                eventregistration__date_cancelled=None
            )

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

    def item_title(self, item):
        return item.title

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

    def item_start_datetime(self, item):
        return item.start

    def item_end_datetime(self, item):
        return item.end

    def item_link(self, item):
        return settings.BASE_URL + item.get_absolute_url()

    def item_location(self, item):
        return f"{item.location} - {item.map_location}"