diff --git a/tests/conftest.py b/tests/conftest.py index e44fa6e9..59339697 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -34,6 +34,7 @@ 'srv0/yelp_large_assets/3f74899c069c' '/assets/img/illustrations/mascots/darwin@2x.png' ), + 'timezone': 'America/Los_Angeles', 'department': 'Consumer', 'business_title': 'Engineer', }] @@ -229,6 +230,7 @@ def _fake_user(): 'office': 'USA: CA SF New Montgomery Office', 'company_profile_url': 'https://www.yelp.com/user_details?userid=nkN_do3fJ9xekchVC-v68A', }, + timezone=user['timezone'], subscription_preferences=[preferences], ) user_entity.put() diff --git a/tests/logic/meeting_spec_test.py b/tests/logic/meeting_spec_test.py index e46427c1..f56c8414 100644 --- a/tests/logic/meeting_spec_test.py +++ b/tests/logic/meeting_spec_test.py @@ -14,3 +14,22 @@ def test_get_users_from_spec(database, fake_user): def test_get_meeting_datetime(database, subscription): assert get_meeting_datetime(database.specs[0]).hour == 15 + + +def test_get_meeting_datetime_user_timezone(database, fake_user): + fake_user.timezone = 'America/Edmonton' + meeting_time = get_meeting_datetime(database.specs[0], fake_user) + + assert meeting_time.tzinfo.zone == fake_user.timezone, ( + "The meeting time should be in the user's timezone" + ) + + +def test_get_meeting_datetime_user_no_timezone(database, fake_user): + fake_user.timezone = None + localtime = get_meeting_datetime(database.specs[0], fake_user) + + meeting_spec_timezone = database.specs[0].meeting_subscription.get().timezone + assert localtime.tzinfo.zone == meeting_spec_timezone, ( + 'User has no timezone, the meeting timezone should default to the meeting spec' + ) diff --git a/yelp_beans/logic/meeting_spec.py b/yelp_beans/logic/meeting_spec.py index 311c1c14..1aaf9c5a 100644 --- a/yelp_beans/logic/meeting_spec.py +++ b/yelp_beans/logic/meeting_spec.py @@ -55,7 +55,14 @@ def get_users_from_spec(meeting_spec): return users -def get_meeting_datetime(meeting_spec): +def get_meeting_datetime(meeting_spec, user=None): + ''' Get the meeting datetime for user. If user is specified, the timezone will be the user's + timezone preference. If not specified, the timezone will be the meeting spec's timezone. + ''' + if user and user.timezone: + meeting_timezone = user.timezone + else: + meeting_timezone = meeting_spec.meeting_subscription.get().timezone + meeting_datetime = meeting_spec.datetime - meeting_timezone = meeting_spec.meeting_subscription.get().timezone return meeting_datetime.replace(tzinfo=utc).astimezone(timezone(meeting_timezone)) diff --git a/yelp_beans/models.py b/yelp_beans/models.py index a026516e..6c6290f4 100644 --- a/yelp_beans/models.py +++ b/yelp_beans/models.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals from google.appengine.ext import ndb +from pytz import common_timezones class User(ndb.Model): @@ -20,6 +21,7 @@ class User(ndb.Model): last_name = ndb.StringProperty(indexed=False) photo_url = ndb.TextProperty() metadata = ndb.JsonProperty() + timezone = ndb.StringProperty(default='America/Los_Angeles', choices=common_timezones, required=True) terminated = ndb.BooleanProperty(default=False, required=True) subscription_preferences = ndb.KeyProperty( kind="UserSubscriptionPreferences", diff --git a/yelp_beans/send_email.py b/yelp_beans/send_email.py index aa9827f3..6f34106f 100644 --- a/yelp_beans/send_email.py +++ b/yelp_beans/send_email.py @@ -87,8 +87,9 @@ def send_batch_weekly_opt_in_email(meeting_spec): for user in users: if not user.terminated: + meeting_localdatetime = get_meeting_datetime(meeting_spec, user) logging.info(user) - logging.info(meeting_datetime) + logging.info(meeting_localdatetime) send_single_email( user.email, "Want a yelp-beans meeting this week?", @@ -97,8 +98,8 @@ def send_batch_weekly_opt_in_email(meeting_spec): 'first_name': user.first_name, 'office': subscription.office, 'location': subscription.location, - 'meeting_day': meeting_datetime.strftime('%A'), - 'meeting_time': meeting_datetime.strftime('%I:%M %p %Z'), + 'meeting_day': meeting_localdatetime.strftime('%A'), + 'meeting_time': meeting_localdatetime.strftime('%I:%M %p %Z'), 'meeting_url': create_url, 'link_to_change_pref': 'https://yelp-beans.appspot.com/' } @@ -129,7 +130,7 @@ def send_match_email(user, participants, meeting_spec): participants - other people in the meeting meeting_spec - meeting specification """ - meeting_datetime = get_meeting_datetime(meeting_spec) + meeting_datetime = get_meeting_datetime(meeting_spec, user) meeting_datetime_end = meeting_datetime + datetime.timedelta(minutes=30) subscription = meeting_spec.meeting_subscription.get()