Sith/com/api.py

54 lines
1.6 KiB
Python

from datetime import timedelta
import urllib3
from django.core.cache import cache
from django.http import HttpResponse
from django.utils import timezone
from ics import Calendar, Event
from ninja_extra import ControllerBase, api_controller, route
from com.models import NewsDate
@api_controller("/calendar")
class CalendarController(ControllerBase):
@route.get("/external.ics")
def calendar_external(self):
CACHE_KEY = "external_calendar"
if cached := cache.get(CACHE_KEY):
return HttpResponse(
cached,
content_type="text/calendar",
status=200,
)
calendar = urllib3.request(
"GET",
"https://calendar.google.com/calendar/ical/ae.utbm%40gmail.com/public/basic.ics",
)
if calendar.status == 200:
cache.set(CACHE_KEY, calendar.data, 3600) # Cache for one hour
return HttpResponse(
calendar.data,
content_type="text/calendar",
status=calendar.status,
)
@route.get("/internal.ics")
def calendar_internal(self):
calendar = Calendar()
for news_date in NewsDate.objects.filter(
news__is_moderated=True,
start_date__lte=timezone.now() + timedelta(days=30),
).prefetch_related("news"):
event = Event(
name=news_date.news.title,
begin=news_date.start_date,
end=news_date.end_date,
)
calendar.events.add(event)
return HttpResponse(
calendar.serialize().encode("utf-8"),
content_type="text/calendar",
)