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 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 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 _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