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