From 9c95d715d52251f14e6b3a63c03cfcad3ceb064d Mon Sep 17 00:00:00 2001 From: Julian Leucker <leuckerj@gmail.com> Date: Sun, 20 Mar 2022 22:56:47 +0100 Subject: [PATCH] Create a showcase feed for birthdays of persons --- aleksis/core/feeds.py | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/aleksis/core/feeds.py b/aleksis/core/feeds.py index 0ba3aed4d..546d7afa6 100644 --- a/aleksis/core/feeds.py +++ b/aleksis/core/feeds.py @@ -2,10 +2,14 @@ from typing import Any from django.conf import settings from django.core.handlers.wsgi import WSGIRequest +from django.utils.formats import date_format from django.utils.functional import classproperty +from django.utils.translation import gettext_lazy as _ +from django_ical.utils import build_rrule_from_text from django_ical.views import ICalFeed -from aleksis.core.util.core_helpers import get_site_preferences +from aleksis.core import models +from aleksis.core.util.core_helpers import get_site_preferences, queryset_rules_filter class PersonalICalFeedBase(ICalFeed): @@ -36,3 +40,40 @@ class PersonalICalFeedBase(ICalFeed): @classproperty def subclass_choices(cls): return [(subclass.__name__, f"{subclass.title} – {subclass.description}") for subclass in cls.subclasses_list] + + +class BirthdayFeed(PersonalICalFeedBase): + """ + Birthday calendar feed + """ + title = _("Birthday Calendar") + description = _("A Calendar of Birthdays") + file_name = "birthdays.ics" + + def items(self): + from aleksis.core.models import Person + + return queryset_rules_filter( + obj=self.person.user, + perm="core.view_personal_details_rule", + queryset=Person.objects.filter(date_of_birth__isnull=False), + ) + + def item_title(self, item: "models.Person"): + return _("%(first_name)s %(last_name)s's birthday") % { + "first_name": item.first_name, + "last_name": item.last_name, + } + + def item_description(self, item: "models.Person"): + return _("%(first_name)s %(last_name)s was born on %(birthday)s") % { + "first_name": item.first_name, + "last_name": item.last_name, + "birthday": date_format(item.date_of_birth), + } + + def item_start_datetime(self, item): + return item.date_of_birth + + def item_rrule(self, item): + return build_rrule_from_text("FREQ=YEARLY") -- GitLab