def _build_timetables(schedules, events=None, partner=None): """ Dati un elenco di schedule ids/eventi e partner program ritorna una lista di TimeTable relative ai dati passati. _build_timetables([1,2]) Restituisce due TimeTable relative agli schedule 1 e 2 (gli eventi vengono recuperati dal db) _build_timetables([1,2], events=...) Restituisce due TimeTable relative agli schedule 1 e 2 usando solo gli eventi specificati (in questo caso events deve essere un dict che mappa all'id dello schedule una lista con gli id degli eventi). _build_timetables([1,2], partner=...) Restituisce almeno due TimeTable (altre potrebbero essere aggiunte a causa di partner program non coperti dagli schedule elencati). `partner` deve essere compatibile con l'output di `_partner_as_event`. """ tts = [] if schedules and not events: for row in schedules: tt = TimeTable2.fromSchedule(row['id']) tts.append((row['id'], tt)) else: for row in schedules: tt = TimeTable2.fromEvents(row['id'], events[row['id']]) tts.append((row['id'], tt)) if partner: for date, evts in partner.items(): for ix, row in enumerate(schedules): if row['date'] == date: sid, tt = tts[ix] break else: try: sid = cmodels.Schedule.objects.get(date=date).id except cmodels.Schedule.DoesNotExist: # it would be better to be able to show it anyway continue tt = TimeTable2.fromEvents(sid, []) tts.append((sid, tt)) for e in evts: e['schedule_id'] = sid tt.addEvents([e]) def key(o): # timetable has an indirect reference to the day, I need to get it # from one of the events. tt = o[1] ev0 = tt.events.values()[0][0] return ev0['time'] tts.sort(key=key) return tts
def _build_timetables(schedules, events=None, partner=None): """ Dati un elenco di schedule ids/eventi e partner program ritorna una lista di TimeTable relative ai dati passati. _build_timetables([1,2]) Restituisce due TimeTable relative agli schedule 1 e 2 (gli eventi vengono recuperati dal db) _build_timetables([1,2], events=...) Restituisce due TimeTable relative agli schedule 1 e 2 usando solo gli eventi specificati (in questo caso events deve essere un dict che mappa all'id dello schedule una lista con gli id degli eventi). _build_timetables([1,2], partner=...) Restituisce almeno due TimeTable (altre potrebbero essere aggiunte a causa di partner program non coperti dagli schedule elencati). `partner` deve essere compatibile con l'output di `_partner_as_event`. """ tts = [] if schedules and not events: for row in schedules: tt = TimeTable2.fromSchedule(row['id']) tts.append((row['id'], tt)) else: for row in schedules: tt = TimeTable2.fromEvents(row['id'], events[row['id']]) tts.append((row['id'], tt)) if partner: for date, evts in partner.items(): for ix, row in enumerate(schedules): if row['date'] == date: sid, tt = tts[ix] break else: try: sid = cmodels.Schedule.objects.get(date=date).id except cmodels.Schedule.DoesNotExist: # sarebbe meglio riuscire a mostrarlo lo stesso continue tt = TimeTable2.fromEvents(sid, []) tts.append((sid, tt)) for e in evts: e['schedule_id'] = sid tt.addEvents([e]) def key(o): # la timetable ha un riferimento indiretto al giorno, devo andare a # prenderlo da uno degli eventi tt = o[1] ev0 = tt.events.values()[0][0] return ev0['time'] tts.sort(key=key) return tts
def live_events(request): conf, date = _live_conference() sid = cmodels.Schedule.objects\ .values('id')\ .get(conference=conf.code, date=date) tt = TimeTable2.fromSchedule(sid['id']) tt.removeEventsByTag('special') t0 = datetime.datetime.now().time() tracks = settings.P3_LIVE_TRACKS.keys() events = {} for track, tevts in tt.iterOnTracks(start=('current', t0)): curr = None try: curr = dict(tevts[0]) curr['next'] = dict(tevts[1]) except IndexError: pass # I've deleted all special events, t0 could be on one of them if curr and (curr['time'] + datetime.timedelta( seconds=curr['duration'] * 60)).time() < t0: curr = None if track not in tracks: continue events[track] = curr def event_url(event): if event.get('talk'): return reverse('conference-talk', kwargs={'slug': event['talk']['slug']}) else: return None output = {} for track, event in events.items(): if event is None: output[track] = { 'id': None, 'embed': settings.P3_LIVE_EMBED(request, track=track), } continue url = event_url(event) if event.get('talk'): speakers = [(reverse('conference-speaker', kwargs={'slug': s['slug']}), s['name'], dataaccess.profile_data(s['id'])['image']) for s in event['talk']['speakers']] else: speakers = None if event.get('next'): next = { 'name': event['next']['name'], 'url': event_url(event['next']), 'time': event['next']['time'], } else: next = None output[track] = { 'id': event['id'], 'name': event['name'], 'url': url, 'speakers': speakers, 'start': event['time'], 'end': event['time'] + datetime.timedelta(seconds=event['duration'] * 60), 'tags': event['talk']['tags'] if event.get('talk') else [], 'embed': settings.P3_LIVE_EMBED(request, event=event), 'next': next, } return output
def live_events(request): conf, date = _live_conference() sid = cmodels.Schedule.objects\ .values('id')\ .get(conference=conf.code, date=date) tt = TimeTable2.fromSchedule(sid['id']) tt.removeEventsByTag('special') t0 = datetime.datetime.now().time() tracks = settings.P3_LIVE_TRACKS.keys() events = {} for track, tevts in tt.iterOnTracks(start=('current', t0)): curr = None try: curr = dict(tevts[0]) curr['next'] = dict(tevts[1]) except IndexError: pass # Ho eliminato gli eventi special, t0 potrebbe cadere su uno di questi if curr and (curr['time'] + datetime.timedelta(seconds=curr['duration']*60)).time() < t0: curr = None if track not in tracks: continue events[track] = curr def event_url(event): if event.get('talk'): return reverse('conference-talk', kwargs={'slug': event['talk']['slug']}) else: return None output = {} for track, event in events.items(): if event is None: output[track] = { 'id': None, 'embed': settings.P3_LIVE_EMBED(request, track=track), } continue url = event_url(event) if event.get('talk'): speakers = [ ( reverse('conference-speaker', kwargs={'slug': s['slug']}), s['name'], dataaccess.profile_data(s['id'])['image'] ) for s in event['talk']['speakers'] ] else: speakers = None if event.get('next'): next = { 'name': event['next']['name'], 'url': event_url(event['next']), 'time': event['next']['time'], } else: next = None output[track] = { 'id': event['id'], 'name': event['name'], 'url': url, 'speakers': speakers, 'start': event['time'], 'end': event['time'] + datetime.timedelta(seconds=event['duration'] * 60), 'tags': event['talk']['tags'] if event.get('talk') else [], 'embed': settings.P3_LIVE_EMBED(request, event=event), 'next': next, } return output
def _build_timetables(schedules, events=None, partner=None): """ Given a list of schedule ids / events and partner program returns a list of TimeTable of relating to past data. _build_timetables([1,2]) Return two TimeTable relating to schedules 1 and 2 (events are retrieved from db). _build_timetables([1,2], events=...) Return two TimeTable relating to schedules 1 and 2 using only events specified (in this case events must be a dict that map id of the schedule list with the id of the events). _build_timetables([1,2], partner=...) Return least two TimeTable (others might be added to Because of partner program not covered by listed schedule). `Partner` must be compatible with the output of` _partner_as_event`. """ tts = [] if schedules and not events: for row in schedules: tt = TimeTable2.fromSchedule(row['id']) tts.append((row['id'], tt)) else: for row in schedules: tt = TimeTable2.fromEvents(row['id'], events[row['id']]) tts.append((row['id'], tt)) if partner: for date, evts in partner.items(): for ix, row in enumerate(schedules): if row['date'] == date: sid, tt = tts[ix] break else: try: sid = cmodels.Schedule.objects.get(date=date).id except cmodels.Schedule.DoesNotExist: # it would be better to be able to show it anyway continue tt = TimeTable2.fromEvents(sid, []) tts.append((sid, tt)) for e in evts: e['schedule_id'] = sid tt.addEvents([e]) # Remove empty timetables def not_empty(o): tt = o[1] events = tt.events.values() return bool(events and events[0]) tts = filter(not_empty, tts) # Sort timetables by date def key(o): # timetable has an indirect reference to the day, I need to get it # from one of the events. tt = o[1] events = tt.events.values() ev0 = events[0][0] return ev0['time'] tts.sort(key=key) return tts