diff --git a/src/api/schedule.py b/src/api/schedule.py index fdc57440f867889115ab6ab1134ded079cc37490..5721fdf8fdfc1ab7432abea95acc834405e0f77b 100644 --- a/src/api/schedule.py +++ b/src/api/schedule.py @@ -14,7 +14,7 @@ from django.conf import settings from django.db.models import Prefetch from core.models.assemblies import Assembly -from core.models.conference import Conference +from core.models.conference import Conference, ConferenceMember from core.models.events import Event, EventParticipant from core.models.rooms import Room from core.models.users import PlatformUser @@ -41,6 +41,7 @@ event_template = { 'type': 'other', 'abstract': None, 'description': None, + 'logo': None, 'persons': [], 'links': [], } @@ -103,59 +104,60 @@ class ScheduleEncoder(json.JSONEncoder): return f'{days}:{hours:02d}:{minutes:02d}' return f'{hours:02d}:{minutes:02d}' - def encode_person(self, person: PlatformUser | str | dict): - if isinstance(person, str): - return {'id': None, 'name': person, 'public_name': person} + def encode_person(self, p: EventParticipant | PlatformUser | str | dict): + if isinstance(p, str): + return {'id': None, 'name': p, 'public_name': p} - if isinstance(person, PlatformUser): - name = person.get_display_name() + if isinstance(p, PlatformUser): + name = p.get_display_name() return { - 'guid': person.uuid, + 'guid': p.uuid, 'name': name, 'public_name': name, - 'avatar': (settings.PLAINUI_BASE_URL + person.avatar.url) if person.avatar else None, - 'biography': person.description, + 'avatar': (settings.PLAINUI_BASE_URL + p.avatar.url) if p.avatar else None, + 'biography': p.description, # 'links': person.links, # TODO - 'url': person.get_absolute_url(), + 'url': p.get_absolute_url(), } - if isinstance(person, EventParticipant): - member = person.event.conference.users.filter(uuid=person.participant.uuid).first() - name = person.participant.get_display_name() + if isinstance(p, EventParticipant): + member: ConferenceMember = p.event.conference.users.filter(uuid=p.participant.uuid).first() + name = p.participant.get_display_name() return { - 'guid': person.participant.uuid, + 'guid': p.participant.uuid, 'name': name, 'public_name': name, - 'avatar': (settings.PLAINUI_BASE_URL + person.participant.avatar.url) if person.participant.avatar else None, + 'avatar': (settings.PLAINUI_BASE_URL + p.participant.avatar.url) if p.participant.avatar else None, 'biography': member.description if member else '', # 'links': person.participant.links, # TODO - 'url': person.participant.get_absolute_url(), + 'url': p.participant.get_absolute_url(), } # we assume it is a dict, but we normally should never get here return { - 'guid': person.get('guid', None), - 'id': person.get('id', None), - 'name': person.get('name', person.get('public_name')), - 'avatar': person.get('avatar', None), - 'biography': person.get('biography') or person.get('description', ''), - 'links': person.get('links', []), + 'guid': p.get('guid', None), + 'id': p.get('id', None), + 'name': p.get('name', p.get('public_name')), + 'avatar': p.get('avatar', None), + 'biography': p.get('biography') or p.get('description', ''), + 'links': p.get('links', []), } def collect_persons(self, event): persons = [] - if hasattr(event, 'speakers'): - # event is a QuerySet and already fetched speakers - persons = event.speakers - else: - # direct event lookup -> fetch persons via public_speakers - persons = event.public_speakers - # TODO remove this workaround once imported speakers are stored as participants + # and have links and biography=description if event.additional_data and 'persons' in event.additional_data and len(event.additional_data['persons']) > 0: - persons += event.additional_data['persons'] + persons = event.additional_data['persons'] + else: + if hasattr(event, 'speakers'): + # event is a QuerySet and already fetched speakers + persons = list(event.speakers) + else: + # direct event lookup -> fetch persons via public_speakers + persons = list(event.public_speakers) return [self.encode_person(person) for person in persons] @@ -315,6 +317,7 @@ class Schedule: def add_events(self, events: 'QuerySet[Event]'): events = events.select_related('track', 'room', 'assembly', 'conference').prefetch_related( Prefetch( + # TODO: we have to prefetch the conference members here, as we need the description for the speakers 'participants', queryset=EventParticipant.objects.filter(is_public=True, role=EventParticipant.Role.SPEAKER).select_related('participant'), to_attr='speakers',