Skip to content

Commit

Permalink
Fix feed (#907)
Browse files Browse the repository at this point in the history
* Fix feed

* Fix date fields in unpopulated

* Use isoformat

* Fix lint
  • Loading branch information
raymondjacobson committed Oct 9, 2020
1 parent c407cf8 commit 0079042
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 10 deletions.
1 change: 1 addition & 0 deletions discovery-provider/src/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
Base = declarative_base()
logger = logging.getLogger(__name__)


def validate_field_helper(field, value, model):
# TODO: need to write custom validator for these datetime fields as jsonschema
# validates datetime in format 2018-11-13T20:20:39+00:00, not a format we use
Expand Down
8 changes: 4 additions & 4 deletions discovery-provider/src/queries/get_feed.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,10 @@ def get_feed(args):
return api_helpers.error_response("Something caused the server to crash.")
max_timedelta = datetime.timedelta(
minutes=trackDedupeMaxMinutes)
if (track.owner_id == playlist.playlist_owner_id) and \
(track.created_at <= playlist.created_at) and \
(playlist.created_at - track.created_at <= max_timedelta):
tracks_to_dedupe.add(track.track_id)
if (track["owner_id"] == playlist.playlist_owner_id) and \
(track["created_at"] <= playlist.created_at) and \
(playlist.created_at - track["created_at"] <= max_timedelta):
tracks_to_dedupe.add(track["track_id"])
tracks_to_dedupe = list(tracks_to_dedupe)
else:
# No playlists to consider
Expand Down
15 changes: 13 additions & 2 deletions discovery-provider/src/queries/get_unpopulated_playlists.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import datetime
import json
from flask.json import dumps

Expand All @@ -16,14 +17,24 @@ def get_cached_playlists(playlist_ids):
redis_playlist_id_keys = map(get_playlist_id_cache_key, playlist_ids)
redis = redis_connection.get_redis()
cached_values = redis.mget(redis_playlist_id_keys)
return [json.loads(val) if val is not None else None for val in cached_values]

playlists = []
for val in cached_values:
if val is not None:
playlist = json.loads(val)
playlist["created_at"] = datetime.datetime.fromisoformat(playlist["created_at"])
playlist["updated_at"] = datetime.datetime.fromisoformat(playlist["updated_at"])
playlists.append(playlist)
else:
playlists.append(None)
return playlists


def set_playlists_in_cache(playlists):
redis = redis_connection.get_redis()
for playlist in playlists:
key = get_playlist_id_cache_key(playlist['playlist_id'])
serialized = dumps(playlist)
serialized = dumps(playlist, cls=helpers.DateTimeEncoder)
redis.set(key, serialized, ttl_sec)


Expand Down
15 changes: 13 additions & 2 deletions discovery-provider/src/queries/get_unpopulated_tracks.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import datetime
import json
from flask.json import dumps

Expand All @@ -16,14 +17,24 @@ def get_cached_tracks(track_ids):
redis_track_id_keys = map(get_track_id_cache_key, track_ids)
redis = redis_connection.get_redis()
cached_values = redis.mget(redis_track_id_keys)
return [json.loads(val) if val is not None else None for val in cached_values]

tracks = []
for val in cached_values:
if val is not None:
track = json.loads(val)
track["created_at"] = datetime.datetime.fromisoformat(track["created_at"])
track["updated_at"] = datetime.datetime.fromisoformat(track["updated_at"])
tracks.append(track)
else:
tracks.append(None)
return tracks


def set_tracks_in_cache(tracks):
redis = redis_connection.get_redis()
for track in tracks:
key = get_track_id_cache_key(track['track_id'])
serialized = dumps(track)
serialized = dumps(track, cls=helpers.DateTimeEncoder)
redis.set(key, serialized, ttl_sec)


Expand Down
15 changes: 13 additions & 2 deletions discovery-provider/src/queries/get_unpopulated_users.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import datetime
import json
from flask.json import dumps

Expand All @@ -16,14 +17,24 @@ def get_cached_users(user_ids):
redis_user_id_keys = map(get_user_id_cache_key, user_ids)
redis = redis_connection.get_redis()
cached_values = redis.mget(redis_user_id_keys)
return [json.loads(val) if val is not None else None for val in cached_values]

users = []
for val in cached_values:
if val is not None:
user = json.loads(val)
user["created_at"] = datetime.datetime.fromisoformat(user["created_at"])
user["updated_at"] = datetime.datetime.fromisoformat(user["updated_at"])
users.append(user)
else:
users.append(None)
return users


def set_users_in_cache(users):
redis = redis_connection.get_redis()
for user in users:
key = get_user_id_cache_key(user['user_id'])
serialized = dumps(user)
serialized = dumps(user, cls=helpers.DateTimeEncoder)
redis.set(key, serialized, ttl_sec)


Expand Down
11 changes: 11 additions & 0 deletions discovery-provider/src/utils/helpers.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import datetime
from json.encoder import JSONEncoder
import logging
import os
import json
Expand Down Expand Up @@ -286,3 +288,12 @@ def validate_arguments(req_args, expected_args):
(lambda acc, cur: cur in req_args and acc), expected_args, True)
if not all_exist:
raise exceptions.ArgumentError("Not all required arguments exist.")


# Subclass JSONEncoder to format dates in strict isoformat.
# Otherwise, it can behave differently on diffeent systems.
class DateTimeEncoder(JSONEncoder):
def default(self, o): # pylint: disable=method-hidden
if isinstance(o, (datetime.date, datetime.datetime)):
return o.isoformat()
return super(DateTimeEncoder, self).default(o)

0 comments on commit 0079042

Please sign in to comment.