Skip to content

Commit

Permalink
flattened json output with new metrics endpoints (#107)
Browse files Browse the repository at this point in the history
  • Loading branch information
kentwills authored Nov 17, 2017
1 parent 0845a1c commit 5f5ead3
Show file tree
Hide file tree
Showing 4 changed files with 152 additions and 60 deletions.
6 changes: 3 additions & 3 deletions tests/logic/metrics_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@
from __future__ import print_function
from __future__ import unicode_literals

from yelp_beans.logic.metrics import get_subscribed_users
from yelp_beans.logic.metrics import get_subscribers
from yelp_beans.models import MeetingSubscription


def test_get_subscribed_users(database, fake_user):
subscribed_users = get_subscribed_users()
subscribed_users = get_subscribers()
assert len(subscribed_users) == 1
assert subscribed_users[database.sub.key.urlsafe()] == ['[email protected]']


def test_get_subscribed_users_multiple(database, fake_user):
subscription2 = MeetingSubscription(title='test1').put()
subscribed_users = get_subscribed_users()
subscribed_users = get_subscribers()

assert len(subscribed_users) == 2
assert subscribed_users[subscription2.urlsafe()] == []
Expand Down
110 changes: 71 additions & 39 deletions tests/routes/api/v1/metrics_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,50 +5,82 @@

import json

from yelp_beans.models import MeetingSubscription
from yelp_beans.routes.api.v1.metrics import metrics_api
from yelp_beans.models import Meeting
from yelp_beans.models import MeetingParticipant
from yelp_beans.models import MeetingRequest
from yelp_beans.models import User
from yelp_beans.models import UserSubscriptionPreferences
from yelp_beans.routes.api.v1.metrics import meeting_participants
from yelp_beans.routes.api.v1.metrics import meeting_requests
from yelp_beans.routes.api.v1.metrics import meeting_subscribers


def test_get_metrics(app, minimal_database):
def test_get_subscribers_none(app, minimal_database):
with app.test_request_context('/v1/metrics/subscribers'):
subscribed = json.loads(meeting_subscribers())
assert subscribed == []

with app.test_request_context('/v1/metrics'):
response = metrics_api()
assert response == '[]'

new_subscription = MeetingSubscription(title='test1')
new_subscription.put()
def test_get_subscribers(app, database, subscription, fake_user):
with app.test_request_context('/v1/metrics/subscribers'):
subscribed = json.loads(meeting_subscribers())
assert subscribed == [{
'title': 'Yelp Weekly',
'subscriber': '[email protected]'
}]

with app.test_request_context('/v1/metrics'):
response = json.loads(metrics_api())
assert response[0]["title"] == new_subscription.title
assert response[0]["key"] == new_subscription.key.urlsafe()
assert response[0]["week_participants"] == 0
assert response[0]["subscribed"] == []

def test_get_meeting_participants(app, database):
pref = UserSubscriptionPreferences(subscription=database.sub.key, preference=database.prefs[0].key)
pref.put()
user1 = User(
email='[email protected]',
metadata={'department': 'dept'},
subscription_preferences=[pref.key]
)
user1.put()
user2 = User(
email='[email protected]',
metadata={'department': 'dept'},
subscription_preferences=[pref.key]
)
user2.put()
meeting1 = Meeting(meeting_spec=database.specs[0].key, cancelled=False).put()
MeetingParticipant(meeting=meeting1, user=user1.key).put()
MeetingParticipant(meeting=meeting1, user=user2.key).put()
with app.test_request_context('/v1/metrics/meeting_participants'):
participants = json.loads(meeting_participants())
assert participants == [
{
'date': '2017-10-27T23:00:00',
'meeting': 'agx0ZXN0YmVkLXRlc3RyDQsSB01lZXRpbmcYCgw',
'meeting_title': 'Yelp Weekly',
'participant': '[email protected]',
'time': '04:00PM'
},
{
'date': '2017-10-27T23:00:00',
'meeting': 'agx0ZXN0YmVkLXRlc3RyDQsSB01lZXRpbmcYCgw',
'meeting_title': 'Yelp Weekly',
'participant': '[email protected]',
'time': '04:00PM'
}
]

def test_get_metrics_multiple(app, database, subscription, fake_user):
with app.test_request_context('/v1/metrics'):
response = json.loads(metrics_api())
assert len(response) == 1
response = response[0]
assert response['key'] == database.sub.key.urlsafe()
assert response['subscribed'] == ['[email protected]']
assert response['title'] == database.sub.title
assert response['week_participants'] == 1

new_subscription = MeetingSubscription(title='test1')
new_subscription.put()

with app.test_request_context('/v1/metrics'):
response = json.loads(metrics_api())
assert len(response) == 2

assert response[0]['key'] == database.sub.key.urlsafe()
assert response[0]['subscribed'] == [fake_user.email]
assert response[0]['title'] == database.sub.title
assert response[0]['week_participants'] == 1

assert response[1]['key'] == new_subscription.key.urlsafe()
assert response[1]['subscribed'] == []
assert response[1]['title'] == new_subscription.title
assert response[1]['week_participants'] == 0
def test_get_meeting_requests(app, database):
pref = UserSubscriptionPreferences(subscription=database.sub.key, preference=database.prefs[0].key)
pref.put()
user = User(
email='[email protected]',
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': '[email protected]'
}]
54 changes: 53 additions & 1 deletion yelp_beans/logic/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@

from collections import defaultdict

from yelp_beans.logic.meeting_spec import get_meeting_datetime
from yelp_beans.logic.meeting_spec import get_specs_for_current_week
from yelp_beans.logic.meeting_spec import get_users_from_spec
from yelp_beans.models import MeetingParticipant
from yelp_beans.models import MeetingRequest
from yelp_beans.models import MeetingSubscription
from yelp_beans.models import User


def get_subscribed_users():
def get_subscribers():
users = User.query().fetch()
subscriptions = MeetingSubscription.query().fetch()

Expand All @@ -37,3 +40,52 @@ def get_current_week_participation():
]

return participation


def get_meeting_participants():
meetings = defaultdict(list)
participants = MeetingParticipant.query().fetch()
for participant in participants:
try:
email = participant.user.get().email
meeting = participant.meeting
meetings[meeting].append(email)
except AttributeError:
pass

metrics = []
for meeting_key in meetings.keys():
meeting_spec = meeting_key.get().meeting_spec.get()
meeting_title = meeting_spec.meeting_subscription.get().title
participants = meetings[meeting_key]
for participant in participants:
metrics.append(
{
'participant': participant,
'meeting': meeting_key.urlsafe(),
'meeting_title': meeting_title,
'date': meeting_spec.datetime.isoformat(),
'time': get_meeting_datetime(meeting_spec).strftime('%I:%M%p'),
}
)
return metrics


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
42 changes: 25 additions & 17 deletions yelp_beans/routes/api/v1/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,39 @@

from flask import Blueprint

from yelp_beans.logic.metrics import get_current_week_participation
from yelp_beans.logic.metrics import get_subscribed_users
from yelp_beans.logic.metrics import get_meeting_participants
from yelp_beans.logic.metrics import get_meeting_requests
from yelp_beans.logic.metrics import get_subscribers
from yelp_beans.models import MeetingSubscription


metrics_blueprint = Blueprint('metrics', __name__)


@metrics_blueprint.route('/', methods=['GET'])
def metrics_api():
@metrics_blueprint.route('/subscribers', methods=['GET'])
def meeting_subscribers():
metrics = []
subscribed_users = get_subscribed_users()
participation = get_current_week_participation()
subscribed_users = get_subscribers()
subscriptions = MeetingSubscription.query().fetch()

for subscription in subscriptions:
metric = {
'key': subscription.key.urlsafe(),
'title': subscription.title,
'subscribed': subscribed_users[subscription.key.urlsafe()],
'total_subscribed': len(subscribed_users[subscription.key.urlsafe()]),
'week_participants': sum(
len(spec) for spec in
participation.get(subscription.key.urlsafe(), {}).values()
),
}
metrics.append(metric)
subscribed = set(subscribed_users[subscription.key.urlsafe()])

for subscriber in subscribed:
metrics.append(
{
'title': subscription.title,
'subscriber': subscriber,
}
)
return json.dumps(metrics)


@metrics_blueprint.route('/meetings', methods=['GET'])
def meeting_participants():
return json.dumps(get_meeting_participants())


@metrics_blueprint.route('/requests', methods=['GET'])
def meeting_requests():
return json.dumps(get_meeting_requests())

0 comments on commit 5f5ead3

Please sign in to comment.