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_track_events(request, track): conf, date = _live_conference() tid = cmodels.Track.objects\ .get(track=track, schedule__date=date).id tt = TimeTable2.fromTracks([tid]) output = [] for _, events in tt.iterOnTracks(): for e in events: if e.get('talk'): speakers = ', '.join([ x['name'] for x in e['talk']['speakers']]) else: speakers = None output.append({ 'name': e['name'], 'time': e['time'], 'duration': e['duration'], 'tags': e['tags'], 'speakers': speakers, }) return output
def live_track_events(request, track): conf, date = _live_conference() tid = cmodels.Track.objects\ .get(track=track, schedule__date=date).id tt = TimeTable2.fromTracks([tid]) output = [] for _, events in tt.iterOnTracks(): for e in events: if e.get('talk'): speakers = ', '.join( [x['name'] for x in e['talk']['speakers']]) else: speakers = None output.append({ 'name': e['name'], 'time': e['time'], 'duration': e['duration'], 'tags': e['tags'], 'speakers': speakers, }) 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 # 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 conference2ical(conf, user=None, abstract=False): from conference import dataaccess from conference import models as cmodels from datetime import timedelta curr = cmodels.Conference.objects.current() try: hotel = cmodels.SpecialPlace.objects.get(type='conf-hq') except cmodels.SpecialPlace.DoesNotExist: hotel = None else: if not hotel.lat or not hotel.lng: hotel = None def altf(data, component): if component == 'calendar': if user is None: url = reverse('p3-schedule', kwargs={'conference': conf}) else: url = reverse('p3-schedule-my-schedule', kwargs={'conference': conf}) data['uid'] = settings.DEFAULT_URL_PREFIX + url if curr.code == conf: data['ttl'] = timedelta(seconds=3600) else: data['ttl'] = timedelta(days=365) elif component == 'event': eid = data['uid'] data['uid'] = settings.DEFAULT_URL_PREFIX + '/p3/event/' + str( data['uid']) data['organizer'] = ('mailto:[email protected]', { 'CN': 'EuroPython' }) if hotel: data['coordinates'] = [hotel.lat, hotel.lng] if not isinstance(data['summary'], tuple): # this is a custom event, if it starts with an anchor I can # extract the reference import re m = re.match(r'<a href="(.*)">(.*)</a>', data['summary']) if m: url = m.group(1) if url.startswith('/'): url = settings.DEFAULT_URL_PREFIX + url data['summary'] = (m.group(2), {'ALTREP': url}) if abstract: e = dataaccess.event_data(eid) if e['talk']: from conference.templatetags.conference import name_abbrv speakers = [ name_abbrv(s['name']) for s in e['talk']['speakers'] ] speakers = ", ".join(speakers) data['summary'] = (data['summary'][0] + ' by ' + speakers, data['summary'][1]) ab = e['talk']['abstract'] if e['talk'] else e['abstract'] data['description'] = ab return data if user is None: from conference.utils import conference2ical as f cal = f(conf, altf=altf) else: from conference.utils import TimeTable2 from conference.utils import timetables2ical as f qs = cmodels.Event.objects\ .filter(eventinterest__user=user, eventinterest__interest__gt=0)\ .filter(schedule__conference=conf)\ .values('id', 'schedule') events = defaultdict(list) for x in qs: events[x['schedule']].append(x['id']) sids = sorted(events.keys()) timetables = [TimeTable2.fromEvents(x, events[x]) for x in sids] cal = f(timetables, altf=altf) return cal
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 conference2ical(conf, user=None, abstract=False): from conference import dataaccess from conference import models as cmodels from datetime import timedelta curr = cmodels.Conference.objects.current() try: hotel = cmodels.SpecialPlace.objects.get(type='conf-hq') except cmodels.SpecialPlace.DoesNotExist: hotel = None else: if not hotel.lat or not hotel.lng: hotel = None def altf(data, component): if component == 'calendar': if user is None: url = reverse('p3-schedule', kwargs={'conference': conf}) else: url = reverse('p3-schedule-my-schedule', kwargs={'conference': conf}) data['uid'] = settings.DEFAULT_URL_PREFIX + url if curr.code == conf: data['ttl'] = timedelta(seconds=3600) else: data['ttl'] = timedelta(days=365) elif component == 'event': eid = data['uid'] data['uid'] = settings.DEFAULT_URL_PREFIX + '/p3/event/' + str(data['uid']) data['organizer'] = ('mailto:[email protected]', {'CN': 'Python Italia'}) if hotel: data['coordinates'] = [hotel.lat, hotel.lng] if not isinstance(data['summary'], tuple): # questo รจ un evento custom, se inizia con un anchor posso # estrane il riferimento import re m = re.match(r'<a href="(.*)">(.*)</a>', data['summary']) if m: url = m.group(1) if url.startswith('/'): url = settings.DEFAULT_URL_PREFIX + url data['summary'] = (m.group(2), {'ALTREP': url}) if abstract: e = dataaccess.event_data(eid) if e['talk']: from conference.templatetags.conference import name_abbrv speakers = [ name_abbrv(s['name']) for s in e['talk']['speakers'] ] speakers = ", ".join(speakers) data['summary'] = (data['summary'][0] + ' by ' + speakers, data['summary'][1]) ab = e['talk']['abstract'] if e['talk'] else e['abstract'] data['description'] = ab return data if user is None: from conference.utils import conference2ical as f cal = f(conf, altf=altf) else: from conference.utils import TimeTable2 from conference.utils import timetables2ical as f qs = cmodels.Event.objects\ .filter(eventinterest__user=user, eventinterest__interest__gt=0)\ .filter(schedule__conference=conf)\ .values('id', 'schedule') events = defaultdict(list) for x in qs: events[x['schedule']].append(x['id']) sids = sorted(events.keys()) timetables = [ TimeTable2.fromEvents(x, events[x]) for x in sids ] cal = f(timetables, altf=altf) return cal
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