Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
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
Exemple #5
0
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
Exemple #6
0
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
Exemple #7
0
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
Exemple #8
0
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
Exemple #9
0
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