8000 New metrics endpoints, flattened json by kentwills · Pull Request #107 · Yelp/beans · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

New metrics endpoints, flattened json #107

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 17, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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()] == ['darwin@yelp.com']


def test_get_subscribed_users_multiple(database, fake_user):
subscription2 = MeetingSubscription(title='test1').put( 8000 )
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': 'darwin@yelp.com'
}]

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='a@yelp.com',
metadata={'department': 'dept'},
subscription_preferences=[pref.key]
)
user1.put()
user2 = User(
email='b@yelp.com',
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': 'a@yelp.com',
'time': '04:00PM'
},
{
'date': '2017-10-27T23:00:00',
'meeting': 'agx0ZXN0YmVkLXRlc3RyDQsSB01lZXRpbmcYCgw',
'meeting_title': 'Yelp Weekly',
'participant': 'b@yelp.com',
'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'] == ['darwin@yelp.com']
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='a@yelp.com',
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': 'a@yelp.com'
}]
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