Example #1
0
def test_generate_save_meetings(minimal_database, subscription):
    pref_1 = SubscriptionDateTime(
        datetime=datetime.now() -
        timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1)).put()
    subscription = MeetingSubscription(title='all engineering weekly',
                                       datetime=[pref_1]).put()
    user_pref = UserSubscriptionPreferences(preference=pref_1,
                                            subscription=subscription).put()
    user1 = User(email='*****@*****.**',
                 metadata={
                     'department': 'dept'
                 },
                 subscription_preferences=[user_pref]).put()
    user2 = User(email='*****@*****.**',
                 metadata={
                     'department': 'dept2'
                 },
                 subscription_preferences=[user_pref]).put()
    meeting_spec = MeetingSpec(meeting_subscription=subscription,
                               datetime=pref_1.get().datetime)
    meeting_spec.put()
    MeetingRequest(user=user1, meeting_spec=meeting_spec.key).put()
    MeetingRequest(user=user2, meeting_spec=meeting_spec.key).put()

    matches, unmatched = generate_meetings(
        [user1.get(), user2.get()], meeting_spec)
    save_meetings(matches, meeting_spec)

    assert unmatched == []

    participants = [
        participant.user for participant in MeetingParticipant.query().fetch()
    ]

    assert participants == [user1, user2]
def test_delete_meeting_request(app, monkeypatch, database, fake_user):

    monkeypatch.setattr(meeting_requests, 'get_user', lambda: fake_user)

    meeting_spec_key = database.specs[0].key.urlsafe()
    meeting_request = MeetingRequest(
        meeting_spec=database.specs[0].key,
        user=fake_user.key
    )
    meeting_request_key = meeting_request.put()
    meeting_request_key = meeting_request_key.urlsafe()
    requests = MeetingRequest.query().fetch()
    assert len(requests) == 1

    with app.test_request_context(
            '/v1/meeting_request/',
            method='POST',
            data=json.dumps({
                'meeting_spec_key': meeting_spec_key,
                'meeting_request_key': meeting_request_key
            }),
            content_type='application/json'
    ):
        response = create_delete_meeting_request()
        assert json.loads(response) == {'key': ''}

    requests = MeetingRequest.query().fetch()
    assert len(requests) == 0
Example #3
0
def test_get_meeting_request(app, monkeypatch, database, fake_user):
    monkeypatch.setattr(meeting_requests, 'get_user', lambda (x): fake_user)

    meeting_spec_key = database.specs[0].key.urlsafe()
    meeting_request = MeetingRequest(meeting_spec=database.specs[0].key,
                                     user=fake_user.key)
    meeting_request_key = meeting_request.put()
    requests = MeetingRequest.query().fetch()
    assert len(requests) == 1

    with app.test_request_context('/v1/meeting_request/' + meeting_spec_key):
        response = get_meeting_request(meeting_spec_key).json
        assert response == {'key': meeting_request_key.urlsafe()}
Example #4
0
def create_delete_meeting_request():
    data = request.json
    meeting_spec_key = data['meeting_spec_key']
    meeting_request_key = data['meeting_request_key']
    user = get_user(data['email'])

    if meeting_request_key == '':
        meeting_spec = MeetingSpec.query.filter(
            MeetingSpec.id == meeting_spec_key).first()
        if not meeting_spec:
            return 400
        meeting_request = query_meeting_request(meeting_spec, user)

        if not meeting_request:
            meeting_request = MeetingRequest(meeting_spec=meeting_spec,
                                             user=user)
            db.session.add(meeting_request)
            db.session.commit()

        return jsonify({'key': meeting_request.id})
    else:
        meeting_request = MeetingRequest.query.filter(
            MeetingRequest.id == meeting_request_key).one()
        db.session.delete(meeting_request)
        db.session.commit()
        return jsonify({'key': ''})
Example #5
0
def test_delete_meeting_request(app, monkeypatch, database, fake_user, session):

    monkeypatch.setattr(meeting_requests, 'get_user', lambda x: fake_user)

    meeting_spec_key = database.specs[0].id
    meeting_request = MeetingRequest(
        meeting_spec=database.specs[0],
        user=fake_user
    )
    session.add(meeting_request)
    session.commit()

    meeting_request_key = meeting_request.id
    requests = MeetingRequest.query.all()
    assert len(requests) == 1

    with app.test_request_context(
            '/v1/meeting_request/',
            method='POST',
            data=json.dumps({
                'meeting_spec_key': meeting_spec_key,
                'meeting_request_key': meeting_request_key,
                'email': fake_user.email
            }),
            content_type='application/json'
    ):
        response = create_delete_meeting_request().json
        assert response == {'key': ''}

    requests = MeetingRequest.query.all()
    assert len(requests) == 0
Example #6
0
def test_no_re_matches(session):
    pref_1 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1))
    subscription = MeetingSubscription(title='all engineering weekly', datetime=[pref_1])
    user_pref = UserSubscriptionPreferences(preference=pref_1, subscription=subscription)
    meeting_spec = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.datetime)
    session.add(pref_1)
    session.add(subscription)
    session.add(user_pref)
    session.add(meeting_spec)

    users = []
    num_users = 20
    for i in range(0, num_users):
        user = User(email='{}@yelp.com'.format(i), meta_data={
                    'department': 'dept{}'.format(i)}, subscription_preferences=[user_pref])
        session.add(user)
        mr = MeetingRequest(user=user, meeting_spec=meeting_spec)
        session.add(mr)
        users.append(user)
    session.commit()

    previous_meetings = {pair for pair in itertools.combinations([user.id for user in users], 2)}
    previous_meetings = previous_meetings - {(users[0].id, users[1].id)}
    matches, unmatched = generate_meetings(users, meeting_spec, previous_meetings)
    assert len(unmatched) == num_users - 2
    assert [(match[0].id, match[1].id) for match in matches] == [(users[0].id, users[1].id)]
Example #7
0
def test_generate_group_meeting(session):
    pref_1 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1))
    subscription = MeetingSubscription(title='all engineering weekly', datetime=[pref_1])
    user_pref = UserSubscriptionPreferences(preference=pref_1, subscription=subscription)
    meeting_spec = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.datetime)
    session.add(pref_1)
    session.add(subscription)
    session.add(user_pref)
    session.add(meeting_spec)

    users = []
    num_users = 21
    for i in range(0, num_users):
        user = User(email='{}@yelp.com'.format(i), meta_data={
                    'department': 'dept{}'.format(i)}, subscription_preferences=[user_pref])
        session.add(user)
        mr = MeetingRequest(user=user, meeting_spec=meeting_spec)
        session.add(mr)
        users.append(user)

    session.commit()
    matches, unmatched = generate_meetings(users, meeting_spec, prev_meeting_tuples=None, group_size=3)
    assert(len(matches) == 7)
    assert (len(unmatched) == 0)
    matches, unmatched = generate_meetings(users, meeting_spec, prev_meeting_tuples=None, group_size=5)
    assert(len(matches) == 4)
    assert (len(unmatched) == 1)
Example #8
0
def test_no_re_matches(minimal_database):
    pref_1 = SubscriptionDateTime(
        datetime=datetime.now() -
        timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1)).put()
    subscription = MeetingSubscription(title='all engineering weekly',
                                       datetime=[pref_1]).put()
    user_pref = UserSubscriptionPreferences(preference=pref_1,
                                            subscription=subscription).put()
    meeting_spec = MeetingSpec(meeting_subscription=subscription,
                               datetime=pref_1.get().datetime)
    meeting_spec.put()

    users = []
    num_users = 20
    for i in range(0, num_users):
        user = User(email='{}@yelp.com'.format(i),
                    metadata={'department': 'dept{}'.format(i)},
                    subscription_preferences=[user_pref])
        user.put()
        MeetingRequest(user=user.key, meeting_spec=meeting_spec.key).put()
        users.append(user)

    previous_meetings = {
        pair
        for pair in itertools.combinations([user.key.id()
                                            for user in users], 2)
    }
    previous_meetings = previous_meetings - {
        (users[0].key.id(), users[1].key.id())
    }
    matches, unmatched = generate_meetings(users, meeting_spec,
                                           previous_meetings)
    assert len(unmatched) == num_users - 2
    assert [(match[0].key.id(), match[1].key.id())
            for match in matches] == [(users[0].key.id(), users[1].key.id())]
def test_get_meeting_request_no_exist(app, monkeypatch, database, fake_user):
    monkeypatch.setattr(meeting_requests, 'get_user', lambda: fake_user)

    meeting_spec_key = database.specs[0].key.urlsafe()
    requests = MeetingRequest.query().fetch()
    assert len(requests) == 0

    with app.test_request_context('/v1/meeting_request/' + meeting_spec_key):
        response = get_meeting_request(meeting_spec_key)
        assert json.loads(response) == {'key': ''}
Example #10
0
def test_previous_meeting_penalty(minimal_database):
    pref_1 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1)).put()
    pref_2 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 2)).put()
    pref_3 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 3)).put()
    subscription = MeetingSubscription(title='all engineering weekly', datetime=[pref_1, pref_2, pref_3]).put()
    user_pref1 = UserSubscriptionPreferences(preference=pref_1, subscription=subscription).put()
    user_pref2 = UserSubscriptionPreferences(preference=pref_2, subscription=subscription).put()
    user_pref3 = UserSubscriptionPreferences(preference=pref_3, subscription=subscription).put()
    meeting_spec1 = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.get().datetime)
    meeting_spec1.put()
    meeting_spec2 = MeetingSpec(meeting_subscription=subscription, datetime=pref_2.get().datetime)
    meeting_spec2.put()
    meeting_spec3 = MeetingSpec(meeting_subscription=subscription, datetime=pref_3.get().datetime)
    meeting_spec3.put()

    users = []
    num_users = 20
    for i in range(0, num_users):
        user = User(email='{}@yelp.com'.format(i), metadata={
                    'department': 'dept{}'.format(i)}, subscription_preferences=[user_pref1, user_pref2, user_pref3])
        user.put()
        MeetingRequest(user=user.key, meeting_spec=meeting_spec1.key).put()
        MeetingRequest(user=user.key, meeting_spec=meeting_spec2.key).put()
        MeetingRequest(user=user.key, meeting_spec=meeting_spec3.key).put()
        users.append(user)

    meeting1 = Meeting(meeting_spec=meeting_spec1.key, cancelled=False).put()
    MeetingParticipant(meeting=meeting1, user=users[1].key).put()
    MeetingParticipant(meeting=meeting1, user=users[0].key).put()
    meeting2 = Meeting(meeting_spec=meeting_spec2.key, cancelled=False).put()
    MeetingParticipant(meeting=meeting2, user=users[1].key).put()
    MeetingParticipant(meeting=meeting2, user=users[0].key).put()
    meeting3 = Meeting(meeting_spec=meeting_spec3.key, cancelled=False).put()
    MeetingParticipant(meeting=meeting3, user=users[1].key).put()
    MeetingParticipant(meeting=meeting3, user=users[0].key).put()

    for run in range(10):
        matches, unmatched = generate_meetings(users, meeting_spec1, prev_meeting_tuples=None, group_size=3)
        assert(len(matches) == 6)
        assert (len(unmatched) == 2)
        for matched_group in matches:
            assert(not (users[0] in matched_group and users[1] in matched_group))
Example #11
0
def test_get_meeting_requests(app, database):
    pref = UserSubscriptionPreferences(subscription=database.sub.key,
                                       preference=database.prefs[0].key)
    pref.put()
    user = User(email='*****@*****.**',
                metadata={'department': 'dept'},
                subscription_preferences=[pref.key])
    user.put()
    MeetingRequest(user=user.key, meeting_spec=database.specs[0].key).put()
    with app.test_request_context('/v1/metrics/meeting_requests'):
        requests = json.loads(meeting_requests())
    assert requests == [{'title': 'Yelp Weekly', 'user': '******'}]
Example #12
0
def get_meeting_requests():
    requests = []
    for spec in get_specs_for_current_week():
        users = [
            request.user.get().email for request in MeetingRequest.query(
                MeetingRequest.meeting_spec == spec.key).fetch()
        ]
        for user in users:
            requests.append({
                'title': spec.meeting_subscription.get().title,
                'user': user,
            })
    return requests
Example #13
0
def test_generate_save_meetings(session, subscription):
    pref_1 = SubscriptionDateTime(datetime=datetime.now() -
                                  timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1))
    subscription = MeetingSubscription(title='all engineering weekly',
                                       datetime=[pref_1])
    user_pref = UserSubscriptionPreferences(preference=pref_1,
                                            subscription=subscription)
    user1 = User(email='*****@*****.**',
                 meta_data={'department': 'dept'},
                 subscription_preferences=[user_pref])
    user2 = User(email='*****@*****.**',
                 meta_data={'department': 'dept2'},
                 subscription_preferences=[user_pref])
    meeting_spec = MeetingSpec(meeting_subscription=subscription,
                               datetime=pref_1.datetime)
    mr1 = MeetingRequest(user=user1, meeting_spec=meeting_spec)
    mr2 = MeetingRequest(user=user2, meeting_spec=meeting_spec)

    session.add(pref_1)
    session.add(subscription)
    session.add(user_pref)
    session.add(user1)
    session.add(user2)
    session.add(meeting_spec)
    session.add(mr1)
    session.add(mr2)
    session.commit()

    matches, unmatched = generate_meetings([user1, user2], meeting_spec)
    save_meetings(matches, meeting_spec)

    assert unmatched == []

    participants = [
        participant.user for participant in MeetingParticipant.query.all()
    ]

    assert participants == [user1, user2]
Example #14
0
def test_get_meeting_requests(app, database, session):
    pref = UserSubscriptionPreferences(subscription=database.sub,
                                       preference=database.prefs[0])
    user = User(email='*****@*****.**',
                meta_data={'department': 'dept'},
                subscription_preferences=[pref])
    mr = MeetingRequest(user=user, meeting_spec=database.specs[0])

    session.add(pref)
    session.add(user)
    session.add(mr)
    session.commit()

    with app.test_request_context('/v1/metrics/meeting_requests'):
        requests = meeting_requests().json
    assert requests == [{'title': 'Yelp Weekly', 'user': '******'}]
Example #15
0
def test_get_meeting_request(app, monkeypatch, database, fake_user, session):
    monkeypatch.setattr(meeting_requests, 'get_user', lambda x: fake_user)

    meeting_spec_key = database.specs[0].id
    meeting_request = MeetingRequest(
        meeting_spec=database.specs[0],
        user=fake_user
    )
    session.add(meeting_request)
    session.commit()

    meeting_request_key = meeting_request.id
    requests = MeetingRequest.query.all()
    assert len(requests) == 1

    with app.test_request_context('/v1/meeting_request/{}'.format(meeting_spec_key)):
        response = get_meeting_request(meeting_spec_key).json
        assert response == {'key': meeting_request_key}
Example #16
0
def test_generate_group_meeting_invalid_number_of_users(minimal_database):
    pref_1 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1)).put()
    subscription = MeetingSubscription(title='all engineering weekly', datetime=[pref_1]).put()
    user_pref = UserSubscriptionPreferences(preference=pref_1, subscription=subscription).put()
    meeting_spec = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.get().datetime)
    meeting_spec.put()

    users = []
    for i in range(0, 2):
        user = User(email='{}@yelp.com'.format(i), metadata={
            'department': 'dept{}'.format(i)}, subscription_preferences=[user_pref])
        user.put()
        MeetingRequest(user=user.key, meeting_spec=meeting_spec.key).put()
        users.append(user)

    matches, unmatched = generate_meetings(users, meeting_spec, prev_meeting_tuples=None, group_size=3)
    assert(len(matches) == 0)
    assert (len(unmatched) == 2)
Example #17
0
def match_employees():
    specs = get_specs_for_current_week()

    for spec in specs:
        logging.info('Spec Datetime: ')
        logging.info(get_meeting_datetime(spec).strftime("%Y-%m-%d %H:%M"))

        users = [
            request.user.get() for request in MeetingRequest.query(
                MeetingRequest.meeting_spec == spec.key).fetch()
        ]
        logging.info('Users: ')
        logging.info([user.get_username() for user in users])

        matches, unmatched = generate_meetings(users, spec)
        save_meetings(matches, spec)

        send_batch_unmatched_email(unmatched)
        send_batch_meeting_confirmation_email(matches, spec)
    return "OK"
Example #18
0
def test_create_meeting_request(app, monkeypatch, database, fake_user):

    monkeypatch.setattr(meeting_requests, 'get_user', lambda (x): fake_user)

    meeting_spec_key = database.specs[0].key.urlsafe()
    with app.test_request_context('/v1/meeting_request/',
                                  method='POST',
                                  data=json.dumps({
                                      'meeting_spec_key': meeting_spec_key,
                                      'meeting_request_key': '',
                                      'email': fake_user.email
                                  }),
                                  content_type='application/json'):
        response = create_delete_meeting_request().json
        assert response['key'] != ''

    requests = MeetingRequest.query().fetch()
    assert len(requests) == 1
    assert requests[0].user == fake_user.key
    assert requests[0].meeting_spec == database.specs[0].key
Example #19
0
def create_delete_meeting_request():
    user = get_user()
    data = request.json
    meeting_spec_key = data['meeting_spec_key']
    meeting_request_key = data['meeting_request_key']

    if meeting_request_key == '':
        meeting_spec = ndb.Key(urlsafe=meeting_spec_key)
        if not meeting_spec:
            return 400
        meeting_request = query_meeting_request(meeting_spec, user)

        if not meeting_request:
            meeting_request = MeetingRequest(meeting_spec=meeting_spec, user=user.key)
            meeting_request.put()

        return json.dumps({'key': meeting_request.key.urlsafe()})
    else:
        meeting_request = ndb.Key(urlsafe=meeting_request_key)
        meeting_request.delete()
        return json.dumps({'key': ''})
Example #20
0
def test_previous_meeting_penalty(session):
    pref_1 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1))
    pref_2 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 2))
    pref_3 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 3))
    subscription = MeetingSubscription(title='all engineering weekly', datetime=[pref_1, pref_2, pref_3])
    user_pref1 = UserSubscriptionPreferences(preference=pref_1, subscription=subscription)
    user_pref2 = UserSubscriptionPreferences(preference=pref_2, subscription=subscription)
    user_pref3 = UserSubscriptionPreferences(preference=pref_3, subscription=subscription)
    meeting_spec1 = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.datetime)
    meeting_spec2 = MeetingSpec(meeting_subscription=subscription, datetime=pref_2.datetime)
    meeting_spec3 = MeetingSpec(meeting_subscription=subscription, datetime=pref_3.datetime)
    session.add(pref_1)
    session.add(pref_2)
    session.add(pref_3)
    session.add(subscription)
    session.add(user_pref1)
    session.add(user_pref2)
    session.add(user_pref3)
    session.add(meeting_spec1)
    session.add(meeting_spec2)
    session.add(meeting_spec3)

    users = []
    num_users = 20
    for i in range(0, num_users):
        user = User(email='{}@yelp.com'.format(i), meta_data={
                    'department': 'dept{}'.format(i)}, subscription_preferences=[user_pref1, user_pref2, user_pref3])
        session.add(user)
        mr1 = MeetingRequest(user=user, meeting_spec=meeting_spec1)
        mr2 = MeetingRequest(user=user, meeting_spec=meeting_spec2)
        mr3 = MeetingRequest(user=user, meeting_spec=meeting_spec3)
        session.add(mr1)
        session.add(mr2)
        session.add(mr3)
        users.append(user)

    meeting1 = Meeting(meeting_spec=meeting_spec1, cancelled=False)
    mp1 = MeetingParticipant(meeting=meeting1, user=users[1])
    mp2 = MeetingParticipant(meeting=meeting1, user=users[0])
    session.add(meeting1)
    session.add(mp1)
    session.add(mp2)

    meeting2 = Meeting(meeting_spec=meeting_spec2, cancelled=False)
    mp1 = MeetingParticipant(meeting=meeting2, user=users[1])
    mp2 = MeetingParticipant(meeting=meeting2, user=users[0])
    session.add(meeting2)
    session.add(mp1)
    session.add(mp2)

    meeting3 = Meeting(meeting_spec=meeting_spec3, cancelled=False)
    mp1 = MeetingParticipant(meeting=meeting3, user=users[1])
    mp2 = MeetingParticipant(meeting=meeting3, user=users[0])
    session.add(meeting3)
    session.add(mp1)
    session.add(mp2)

    session.commit()

    for run in range(10):
        matches, unmatched = generate_meetings(users, meeting_spec1, prev_meeting_tuples=None, group_size=3)
        assert(len(matches) == 6)
        assert (len(unmatched) == 2)
        for matched_group in matches:
            assert(not (users[0] in matched_group and users[1] in matched_group))
Example #21
0
def query_meeting_request(meeting_spec, user):
    return MeetingRequest().query(MeetingRequest.meeting_spec == meeting_spec,
                                  MeetingRequest.user == user.key).get()