Skip to content
Snippets Groups Projects

Calendar events and iCal feeds

Merged Jonathan Weth requested to merge calendar-object-feeds into master
4 files
+ 144
0
Compare changes
  • Side-by-side
  • Inline
Files
4
+ 72
0
@@ -22,6 +22,7 @@ from django.views.generic import CreateView, UpdateView
from django.views.generic.edit import DeleteView, ModelFormMixin
import reversion
from django_ical.feedgenerator import ITEM_EVENT_FIELD_MAP, ICal20Feed
from dynamic_preferences.settings import preferences_settings
from dynamic_preferences.types import FilePreference
from guardian.admin import GuardedModelAdmin
@@ -575,3 +576,74 @@ class RegistryObject:
@classmethod
def get_object_by_name(cls, name):
cls.registered_objects_dict.get(name)
class CalendarEventMixin(RegistryObject):
name: str = "" # The source name
verbose_name: str = "" # The shown name of the feed
link: str = ""
description: str = ""
@classmethod
def get_verbose_name(cls):
return cls.verbose_name
@classmethod
def get_link(cls):
return cls.link
@classmethod
def get_description(cls):
return cls.description
@classmethod
def get_language(cls):
return "en" # FIXME
@classmethod
def create_event(cls, reference_object, feed: ICal20Feed):
values = {}
for field in cls.get_event_field_names():
field_value = cls.get_event_field_value(reference_object, field)
if field_value is not None:
values[field] = field_value
feed.add_item(**values)
return values
@classmethod
def start_feed(cls):
feed = ICal20Feed(
title=cls.get_verbose_name(),
link=cls.get_link(),
description=cls.get_description(),
language=cls.get_language(),
)
return feed
@classmethod
def get_objects(cls):
raise NotImplementendError
@classmethod
def create_feed(cls):
feed = cls.start_feed()
for reference_object in cls.get_objects():
cls.create_event(reference_object, feed)
return feed
@classmethod
def get_event_field_names(cls):
return [field_map[0] for field_map in ITEM_EVENT_FIELD_MAP]
@classmethod
def get_event_field_value(cls, reference_object, field_name):
method_name = f"value_{field_name}"
if hasattr(cls, method_name) and callable(getattr(cls, method_name)):
return getattr(cls, method_name)(reference_object)
return None
@classmethod
def value_link(cls, reference_object):
return ""
Loading