Sith/com/api.py

54 lines
1.6 KiB
Python
Raw Normal View History

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",
)