|
1 | | -from src.models.europython import EuroPythonSession, EuroPythonSpeaker |
2 | | -from src.models.pretalx import PretalxSpeaker, PretalxSubmission |
| 1 | +from src.models.europython import ( |
| 2 | + EuroPythonScheduleBreak, |
| 3 | + EuroPythonScheduleSession, |
| 4 | + EuroPythonSession, |
| 5 | + EuroPythonSpeaker, |
| 6 | + Schedule, |
| 7 | +) |
| 8 | +from src.models.pretalx import PretalxScheduleBreak, PretalxSpeaker, PretalxSubmission |
3 | 9 | from src.utils.timing_relationships import TimingRelationships |
4 | 10 | from src.utils.utils import Utils |
5 | 11 |
|
@@ -50,6 +56,7 @@ def pretalx_submissions_to_europython_sessions( |
50 | 56 | ), |
51 | 57 | next_session=TimingRelationships.get_next_session(submission.code), |
52 | 58 | prev_session=TimingRelationships.get_prev_session(submission.code), |
| 59 | + slot_count=submission.slot_count, |
53 | 60 | ) |
54 | 61 | ep_sessions[code] = ep_session |
55 | 62 |
|
@@ -81,3 +88,65 @@ def pretalx_speakers_to_europython_speakers( |
81 | 88 | ep_speakers[code] = ep_speaker |
82 | 89 |
|
83 | 90 | return ep_speakers |
| 91 | + |
| 92 | + @staticmethod |
| 93 | + def pretalx_schedule_to_europython_schedule( |
| 94 | + breaks: list[PretalxScheduleBreak], |
| 95 | + ep_sessions: dict[str, EuroPythonSession], |
| 96 | + ep_speakers: dict[str, EuroPythonSpeaker], |
| 97 | + ) -> Schedule: |
| 98 | + """ |
| 99 | + Transforms the given Pretalx schedule to EuroPython schedule |
| 100 | + """ |
| 101 | + |
| 102 | + speakers_values = ep_speakers.values() |
| 103 | + speaker_code_to_name = {s.code: s.name for s in speakers_values} |
| 104 | + speaker_code_to_slug = {s.code: s.slug for s in speakers_values} |
| 105 | + speaker_code_to_website_url = {s.code: s.website_url for s in speakers_values} |
| 106 | + |
| 107 | + # Merge breaks with the same start and end times |
| 108 | + breaks = Utils.merge_breaks(breaks) |
| 109 | + ep_breaks = [] |
| 110 | + for title, duration, rooms, start in breaks: |
| 111 | + ep_break = EuroPythonScheduleBreak( |
| 112 | + title=title, |
| 113 | + duration=duration, |
| 114 | + rooms=rooms, |
| 115 | + start=start, |
| 116 | + ) |
| 117 | + ep_breaks.append(ep_break) |
| 118 | + |
| 119 | + # Split the sessions that covers multiple slots |
| 120 | + ep_schedule_sessions_split = [] |
| 121 | + for session in ep_sessions.values(): |
| 122 | + # Skip the sessions that are not assigned in the schedule |
| 123 | + if not session.start or not session.room: |
| 124 | + continue |
| 125 | + start_times = Utils.start_times(session) |
| 126 | + for start_time in start_times: |
| 127 | + ep_schedule_session = EuroPythonScheduleSession( |
| 128 | + code=session.code, |
| 129 | + slug=session.slug, |
| 130 | + title=session.title, |
| 131 | + session_type=session.session_type, |
| 132 | + speakers=[ |
| 133 | + { |
| 134 | + "code": speaker_code, |
| 135 | + "name": speaker_code_to_name[speaker_code], |
| 136 | + "slug": speaker_code_to_slug[speaker_code], |
| 137 | + "website_url": speaker_code_to_website_url[speaker_code], |
| 138 | + } |
| 139 | + for speaker_code in session.speakers |
| 140 | + ], |
| 141 | + tweet=session.tweet, |
| 142 | + level=session.level, |
| 143 | + total_duration=int(session.duration), |
| 144 | + rooms=[session.room], |
| 145 | + start=start_time, |
| 146 | + website_url=session.website_url, |
| 147 | + slot_count=session.slot_count, |
| 148 | + ) |
| 149 | + |
| 150 | + ep_schedule_sessions_split.append(ep_schedule_session) |
| 151 | + |
| 152 | + return Schedule.from_events(ep_breaks + ep_schedule_sessions_split) |
0 commit comments