Esempio n. 1
0
def test_generate_meeting_specs(database):
    # delete current specs
    keys = [key for key in MeetingSpec.query().iter(keys_only=True)]
    ndb.delete_multi(keys)
    meeting_specs = MeetingSpec.query().fetch()
    assert len(meeting_specs) == 0

    # ensure we create new specs
    generate_meeting_specs()
    meeting_specs = MeetingSpec.query().fetch()
    assert len(meeting_specs) == 2
Esempio n. 2
0
def get_previous_meetings(cooldown=MEETING_COOLDOWN_WEEKS):
    meetings = defaultdict(list)

    # get all meeting specs from x weeks ago til now
    time_threshold_for_meetings = datetime.now() - timedelta(weeks=cooldown)

    meeting_spec_keys = [
        spec.key for spec in MeetingSpec.query(
            MeetingSpec.datetime > time_threshold_for_meetings).fetch()
    ]

    logging.info('Previous Meeting History: ')
    logging.info([
        meeting.get().datetime.strftime("%Y-%m-%d %H:%M")
        for meeting in meeting_spec_keys
    ])

    if meeting_spec_keys == []:
        return set([])

    # get all meetings from meeting specs
    meeting_keys = [
        meeting.key for meeting in Meeting.query().filter(
            Meeting.meeting_spec.IN(meeting_spec_keys)).fetch()
    ]

    if meeting_keys == []:
        return set([])

    # get all participants from meetings
    participants = MeetingParticipant.query().filter(
        MeetingParticipant.meeting.IN(meeting_keys)).fetch()

    if participants == []:
        return set([])

    # group by meeting Id
    for participant in participants:
        meetings[participant.meeting.id()].append(participant.user)

    # ids are sorted, all matches should be in increasing order by id for the matching algorithm to work
    disallowed_meetings = set([
        tuple(sorted(meeting, key=lambda Key: Key.id()))
        for meeting in meetings.values()
    ])

    logging.info('Past Meetings')
    logging.info([
        tuple([meeting.get().get_username() for meeting in meeting])
        for meeting in disallowed_meetings
    ])

    disallowed_meetings = {
        tuple([meeting.id() for meeting in meeting])
        for meeting in disallowed_meetings
    }

    return disallowed_meetings
Esempio n. 3
0
def store_specs_from_subscription(subscription_key, week_start, specs):
    """
    Idempotent function to store meeting specs for this week.
    """
    try:
        current_specs = MeetingSpec.query(
            MeetingSpec.meeting_subscription == subscription_key,
            MeetingSpec.datetime > week_start).fetch()
    except NeedIndexError:
        current_specs = []

    if current_specs:
        return

    ndb.put_multi(specs)
    return specs
Esempio n. 4
0
def get_specs_for_current_week():
    week_start = datetime.now() - timedelta(days=datetime.now().weekday())
    week_start.replace(hour=0, minute=0, second=0, microsecond=0)
    return MeetingSpec.query(MeetingSpec.datetime > week_start).fetch()
Esempio n. 5
0
def test_store_specs_from_subscription(database):
    week_start, specs = get_specs_from_subscription(database.sub)
    store_specs_from_subscription(database.sub.key, week_start, specs)
    assert len(MeetingSpec.query().fetch()) == 2
Esempio n. 6
0
def test_generate_meeting_specs_idempotent(database):
    # ensure we don't create more specs
    generate_meeting_specs()
    meeting_specs = MeetingSpec.query().fetch()
    assert len(meeting_specs) == 2