mirror of
https://github.com/ae-utbm/sith.git
synced 2025-01-08 16:11:17 +00:00
54 lines
1.6 KiB
Python
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",
|
|
)
|