Skip to content
Snippets Groups Projects
Commit 5d48fab7 authored by andi's avatar andi
Browse files

Merge branch 'fix/schedule_import' into 'develop'

fix schedule import

See merge request rc3/hub!217
parents dbb1d394 d1830bdf
No related branches found
No related tags found
No related merge requests found
from datetime import timedelta
import json import json
from django.test import TestCase from django.test import TestCase
...@@ -60,8 +61,13 @@ class ScheduleTest(TestCase): ...@@ -60,8 +61,13 @@ class ScheduleTest(TestCase):
event.refresh_from_db() event.refresh_from_db()
self.assertTrue('rC3' in event.name, f'Expected "rC3" in event name "{event.name}".') self.assertTrue('rC3' in event.name, f'Expected "rC3" in event name "{event.name}".')
self.assertEqual(timedelta(minutes=30), event.schedule_duration)
self.assertIsNotNone(event.schedule_end)
def test_push_new_event(self): def test_push_new_event(self):
another_room = Room(conference=self.conf, assembly=self.assembly, room_type=Room.RoomType.STAGE)
another_room.save()
update = { update = {
"url": "https://fahrplan.events.ccc.de/rc3/2020/Fahrplan/events/11583.html", "url": "https://fahrplan.events.ccc.de/rc3/2020/Fahrplan/events/11583.html",
"id": 11583, "id": 11583,
...@@ -69,8 +75,9 @@ class ScheduleTest(TestCase): ...@@ -69,8 +75,9 @@ class ScheduleTest(TestCase):
"logo": None, "logo": None,
"date": "2020-12-27T12:20:00+01:00", "date": "2020-12-27T12:20:00+01:00",
"start": "12:20", "start": "12:20",
"duration": "00:30", "duration": "01:30",
"room": "foo room", "room": "foo room",
"room_id": str(another_room.pk),
"slug": "rc3-11583-rc3_eroffnung", "slug": "rc3-11583-rc3_eroffnung",
"title": "#rC3 Er\u00f6ffnung", "title": "#rC3 Er\u00f6ffnung",
"subtitle": "", "subtitle": "",
...@@ -98,3 +105,7 @@ class ScheduleTest(TestCase): ...@@ -98,3 +105,7 @@ class ScheduleTest(TestCase):
self.assertTrue(Event.objects.filter(pk=update['guid']).exists()) self.assertTrue(Event.objects.filter(pk=update['guid']).exists())
event = Event.objects.get(pk=update['guid']) event = Event.objects.get(pk=update['guid'])
self.assertTrue('rC3' in event.name, f'Expected "rC3" in event name "{event.name}".') self.assertTrue('rC3' in event.name, f'Expected "rC3" in event name "{event.name}".')
self.assertEqual(timedelta(minutes=90), event.schedule_duration)
self.assertIsNotNone(event.schedule_end)
self.assertEqual(another_room.pk, event.room_id, 'Expected import to prefer "room_id" over "room".')
...@@ -10,6 +10,7 @@ from rest_framework.response import Response ...@@ -10,6 +10,7 @@ from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
import pytz import pytz
from core.models.assemblies import Assembly
from core.models.events import Event from core.models.events import Event
from core.models.rooms import Room from core.models.rooms import Room
from core.models.conference import ConferenceTrack from core.models.conference import ConferenceTrack
...@@ -71,7 +72,7 @@ def schedulexml_time_to_timedelta(s): ...@@ -71,7 +72,7 @@ def schedulexml_time_to_timedelta(s):
else: else:
hours, minutes = 0, s hours, minutes = 0, s
timedelta(hours=int(hours), minutes=int(minutes)) return timedelta(hours=int(hours), minutes=int(minutes))
class EventSchedule(ConferenceSlugMixin, APIView): class EventSchedule(ConferenceSlugMixin, APIView):
...@@ -97,39 +98,65 @@ class EventSchedule(ConferenceSlugMixin, APIView): ...@@ -97,39 +98,65 @@ class EventSchedule(ConferenceSlugMixin, APIView):
logger.warning('Event schedule POST: id %s did not exist yet, creating.', pk) logger.warning('Event schedule POST: id %s did not exist yet, creating.', pk)
try: try:
if 'guid' in event: if (event_guid := event.get('guid')) is not None:
if event['guid'] != str(obj.pk): if event_guid != str(obj.pk):
logger.warning('Attempted update of event %s with guid "%s".', obj.pk, event["guid"]) logger.warning('Attempted update of event %s with guid "%s".', obj.pk, event_guid)
return JsonResponse({'error': 'GUID mismatch.'}) return JsonResponse({'error': 'GUID mismatch.'}, status=400)
if 'slug' in event: if (event_slug := event.get('slug')) is not None:
obj.slug = event['slug'] obj.slug = event_slug
obj.room = Room.objects.get(conference=self.conference, name__iexact=event['room']) if (event_roomid := event.get('room_id')) is not None:
obj.room = Room.objects.get(conference=self.conference, pk=event_roomid)
elif (event_room := event.get('room')) is not None:
try:
obj.room = Room.objects.get(conference=self.conference, name__iexact=event_room)
except Room.MultipleObjectsReturned:
return JsonResponse({'error': 'Room name is not unique, please provide room_id!'}, status=400)
if (event_assemblyid := event.get('assembly_id')) is not None:
obj.assembly = Assembly.objects.get(conference=self.conference, pk=event_assemblyid)
elif (event_assemblyslug := event.get('assembly_slug')) is not None:
obj.assembly = Assembly.objects.get(conference=self.conference, slug__iexact=event_assemblyslug)
if obj.assembly_id is None:
if obj.room_id is not None:
obj.assembly = obj.room.assembly obj.assembly = obj.room.assembly
else:
return JsonResponse({'error': 'Assembly association missing, please provide assembly_id or a valid room.'}, status=400)
obj.kind = 'assembly' if not obj.room.assembly.is_official else 'official' obj.kind = 'assembly' if not obj.room.assembly.is_official else 'official'
obj.is_public = True obj.is_public = True
if 'title' in event: if (event_title := event.get('title')) is not None:
obj.name = event['title'] obj.name = event_title
if 'language' in event: if (event_language := event.get('language')) is not None:
obj.language = event['language'] obj.language = event_language
obj.description = str(event['abstract']) + "\n\n" + str(event['description']) if (event_abstract := event.get('abstract')) is not None and (event_description := event.get('description')) is not None:
obj.description = str(event_abstract) + '\n\n' + str(event_description)
obj.schedule_start = parse_datetime(event['date']) if (event_date := event.get('date')) is not None:
obj.schedule_duration = schedulexml_time_to_timedelta(event['duration']) obj.schedule_start = parse_datetime(event_date)
if (event_duration := event.get('duration')) is not None:
obj.schedule_duration = schedulexml_time_to_timedelta(event_duration)
obj.track = ConferenceTrack.objects.get(conference=self.conference, name__iexact=event['track']) if (event_track := event.get('track')) is not None:
obj.track = ConferenceTrack.objects.get(conference=self.conference, name__iexact=event_track)
obj.additional_data = filter_additional_data(event) obj.additional_data = filter_additional_data(event)
except Assembly.DoesNotExist:
return Response({'error': f'Assembly {event.get("assembly_id")}/{event.get("assembly_slug")} does not exist.'}, status=400)
except Room.DoesNotExist: except Room.DoesNotExist:
return Response({'error': 'Room {} does not exist'.format(event['room'])}, status=400) return Response({'error': f'Room {event.get("room_id")}/{event.get("room")} does not exist.'}, status=400)
except ConferenceTrack.DoesNotExist: except ConferenceTrack.DoesNotExist:
return Response({'error': 'Track {} does not exist'.format(event['track'])}, status=400) return Response({'error': f'Track {event.get("track_id")}/{event.get("track")} does not exist.'}, status=400)
obj.save() obj.save()
logger.info('Event %s updated via POST by %s', obj, request.user) logger.info('Event %s updated via POST by %s', obj, request.user)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment