From 1f2fb9ec6fa8c6af54bd337c67c08bf0a0f713d3 Mon Sep 17 00:00:00 2001 From: Dominik George <dominik.george@teckids.org> Date: Mon, 21 Feb 2022 12:52:01 +0100 Subject: [PATCH] Add RSS feed of upcoming events --- CHANGELOG.rst | 1 + aleksis/apps/paweljong/models.py | 9 +++++++++ aleksis/apps/paweljong/urls.py | 1 + aleksis/apps/paweljong/views.py | 34 +++++++++++++++++++++++++++++++- 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 42ac856..c41a565 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,7 @@ Added ~~~~~ * Add link to public page to events list +* Add RSS feed of upcoming events Fixed ~~~~~ diff --git a/aleksis/apps/paweljong/models.py b/aleksis/apps/paweljong/models.py index 6148f13..ddb97fb 100644 --- a/aleksis/apps/paweljong/models.py +++ b/aleksis/apps/paweljong/models.py @@ -1,6 +1,8 @@ from datetime import datetime from django.db import models +from django.urls import reverse +from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from ckeditor.fields import RichTextField @@ -67,6 +69,9 @@ class Event(ExtensibleModel): return self.date_registration >= now return self.date_event > now + def get_absolute_url(self): + return reverse("event_by_name", kwargs={"slug": self.linked_group.short_name}) + @property def booked_percentage(self): return self.linked_group.members.count() / self.max_participants * 100 @@ -79,6 +84,10 @@ class Event(ExtensibleModel): def owners_persons(self): return self.linked_group.owners.all() + @classmethod + def upcoming_published_events(cls): + return Event.objects.filter(published=True, date_event__gte=now()) + class Voucher(ExtensibleModel): class Meta: diff --git a/aleksis/apps/paweljong/urls.py b/aleksis/apps/paweljong/urls.py index 7dd949c..b4a29e2 100644 --- a/aleksis/apps/paweljong/urls.py +++ b/aleksis/apps/paweljong/urls.py @@ -40,6 +40,7 @@ urlpatterns = [ name="register_event_by_slug_start", ), path("misc/set_email_needed/<slug:slug>", views.set_email_needed, name="set_email_needed"), + path("events/feed", views.UpcomingEventsRSSFeed.as_view(), name="upcoming_events_rss_feed"), path("events/create", views.CreateEventView.as_view(), name="create_event"), path("events/manage", views.manage_events, name="manage_events"), path("vouchers/create", views.VoucherCreateView.as_view(), name="create_vouchers"), diff --git a/aleksis/apps/paweljong/views.py b/aleksis/apps/paweljong/views.py index eb143d6..51abfdf 100644 --- a/aleksis/apps/paweljong/views.py +++ b/aleksis/apps/paweljong/views.py @@ -1,8 +1,9 @@ from django.conf import settings from django.contrib.auth import get_user_model +from django.contrib.syndication.views import Feed from django.http import HttpRequest, HttpResponse from django.shortcuts import redirect, render -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.utils import timezone from django.utils.decorators import method_decorator from django.utils.text import slugify @@ -664,3 +665,34 @@ class TermEditView(PermissionRequiredMixin, AdvancedEditView): template_name = "paweljong/term/edit.html" success_url = reverse_lazy("terms") success_message = _("The term has been saved.") + + +class UpcomingEventsRSSFeed(Feed): + """RSS feed for published, upcoming events.""" + + def title(self): + return _("Upcoming events") + + def link(self): + return reverse("index") + + def feed_url(self): + return reverse("upcoming_events_rss_feed") + + def description(self): + return _("Announcement feed of all upcoming events") + + def ttl(self): + date_event = Event.upcoming_published_events().order_by("-date_event").first().date_event + date_now = timezone.now() + + return (date_event - date_now).seconds + + def items(self): + return Event.upcoming_published_events() + + def item_title(self, item): + return item.display_name + + def item_description(self, item): + return item.description -- GitLab