def test_insert_user_stats_mult_ranges_daily_activity(self): """ Test if multiple time range data is inserted correctly """ with open(self.path_to_data_file('user_daily_activity_db.json')) as f: daily_activity_data = json.load(f) daily_activity_data_year = deepcopy(daily_activity_data) daily_activity_data_year['stats_range'] = 'year' db_stats.insert_user_jsonb_data( user_id=self.user['id'], stats_type='daily_activity', stats=StatRange[UserDailyActivityRecord](**daily_activity_data)) db_stats.insert_user_jsonb_data( user_id=self.user['id'], stats_type='daily_activity', stats=StatRange[UserDailyActivityRecord]( **daily_activity_data_year)) result = db_stats.get_user_daily_activity(1, 'all_time') self.assertDictEqual( result.dict(exclude={'user_id', 'last_updated', 'count'}), daily_activity_data) result = db_stats.get_user_daily_activity(1, 'year') self.assertDictEqual( result.dict(exclude={'user_id', 'last_updated', 'count'}), daily_activity_data_year)
def test_insert_user_stats_mult_ranges_daily_activity(self): """ Test if multiple time range data is inserted correctly """ with open(self.path_to_data_file('user_daily_activity_db.json')) as f: daily_activity_data = json.load(f) db_stats.insert_user_daily_activity( user_id=self.user['id'], daily_activity=UserDailyActivityStatJson(**{'year': daily_activity_data})) db_stats.insert_user_daily_activity( self.user['id'], UserDailyActivityStatJson(**{'all_time': daily_activity_data})) result = db_stats.get_user_daily_activity(1, 'all_time') self.assertDictEqual(result.all_time.dict(), daily_activity_data) result = db_stats.get_user_daily_activity(1, 'year') self.assertDictEqual(result.year.dict(), daily_activity_data)
def test_insert_user_daily_activity(self): """ Test if daily activity stats are inserted correctly """ with open(self.path_to_data_file('user_daily_activity_db.json')) as f: daily_activity_data = json.load(f) db_stats.insert_user_daily_activity( user_id=self.user['id'], daily_activity=UserDailyActivityStatJson(**{'all_time': daily_activity_data})) result = db_stats.get_user_daily_activity(user_id=self.user['id'], stats_range='all_time') self.assertDictEqual(result.all_time.dict(), daily_activity_data)
def test_insert_user_daily_activity(self): """ Test if daily activity stats are inserted correctly """ with open(self.path_to_data_file('user_daily_activity_db.json')) as f: daily_activity_data = json.load(f) db_stats.insert_user_jsonb_data( user_id=self.user['id'], stats_type='daily_activity', stats=StatRange[DailyActivityRecord](**daily_activity_data) ) result = db_stats.get_user_daily_activity(user_id=self.user['id'], stats_range='all_time') self.assertDictEqual(result.dict(exclude={'user_id', 'last_updated', 'count'}), daily_activity_data)
def get_daily_activity(user_name: str): """ Get the daily activity for user ``user_name``. The daily activity shows the number of listens submitted by the user for each hour of the day over a period of time. We assume that all listens are in UTC. A sample response from the endpoint may look like:: { "payload": { "from_ts": 1587945600, "last_updated": 1592807084, "daily_activity": { "Monday": [ { "hour": 0 "listen_count": 26, }, { "hour": 1 "listen_count": 30, }, { "hour": 2 "listen_count": 4, }... ], "Tuesday": [...], ... }, "stats_range": "all_time", "to_ts": 1589155200, "user_id": "ishaanshah" } } .. note:: - This endpoint is currently in beta :param range: Optional, time interval for which statistics should be returned, possible values are ``week``, ``month``, ``year``, ``all_time``, defaults to ``all_time`` :type range: ``str`` :statuscode 200: Successful query, you have data! :statuscode 204: Statistics for the user haven't been calculated, empty response will be returned :statuscode 400: Bad request, check ``response['error']`` for more details :statuscode 404: User not found :resheader Content-Type: *application/json* """ user = db_user.get_by_mb_id(user_name) if user is None: raise APINotFound("Cannot find user: {}".format(user_name)) stats_range = request.args.get('range', default='all_time') if not _is_valid_range(stats_range): raise APIBadRequest("Invalid range: {}".format(stats_range)) stats = db_stats.get_user_daily_activity(user['id'], stats_range) if stats is None or getattr(stats, stats_range) is None: raise APINoContent('') daily_activity_unprocessed = [ x.dict() for x in getattr(stats, stats_range).daily_activity ] daily_activity = { calendar.day_name[day]: [{ "hour": hour, "listen_count": 0 } for hour in range(0, 24)] for day in range(0, 7) } for day, day_data in daily_activity.items(): for hour_data in day_data: hour = hour_data["hour"] for entry in daily_activity_unprocessed: if entry["hour"] == hour and entry["day"] == day: hour_data["listen_count"] = entry["listen_count"] break else: hour_data["listen_count"] = 0 return jsonify({ "payload": { "user_id": user_name, "daily_activity": daily_activity, "from_ts": int(getattr(stats, stats_range).from_ts), "to_ts": int(getattr(stats, stats_range).to_ts), "range": stats_range, "last_updated": int(stats.last_updated.timestamp()) } })
def get_daily_activity(user_name: str): """ Get the daily activity for user ``user_name``. The daily activity shows the number of listens submitted by the user for each hour of the day over a period of time. We assume that all listens are in UTC. A sample response from the endpoint may look like: .. code-block:: json { "payload": { "from_ts": 1587945600, "last_updated": 1592807084, "daily_activity": { "Monday": [ { "hour": 0 "listen_count": 26, }, { "hour": 1 "listen_count": 30, }, { "hour": 2 "listen_count": 4, }, "..." ], "Tuesday": ["..."], "..." }, "stats_range": "all_time", "to_ts": 1589155200, "user_id": "ishaanshah" } } .. note:: - This endpoint is currently in beta :param range: Optional, time interval for which statistics should be returned, possible values are :data:`~data.model.common_stat.ALLOWED_STATISTICS_RANGE`, defaults to ``all_time`` :type range: ``str`` :statuscode 200: Successful query, you have data! :statuscode 204: Statistics for the user haven't been calculated, empty response will be returned :statuscode 400: Bad request, check ``response['error']`` for more details :statuscode 404: User not found :resheader Content-Type: *application/json* """ user, stats_range = _validate_stats_user_params(user_name) stats = db_stats.get_user_daily_activity(user['id'], stats_range) if stats is None: raise APINoContent('') daily_activity_unprocessed = [x.dict() for x in stats.data.__root__] daily_activity = { calendar.day_name[day]: [{ "hour": hour, "listen_count": 0 } for hour in range(0, 24)] for day in range(0, 7) } for day, day_data in daily_activity.items(): for hour_data in day_data: hour = hour_data["hour"] for entry in daily_activity_unprocessed: if entry["hour"] == hour and entry["day"] == day: hour_data["listen_count"] = entry["listen_count"] break else: hour_data["listen_count"] = 0 return jsonify({ "payload": { "user_id": user_name, "daily_activity": daily_activity, "from_ts": stats.from_ts, "to_ts": stats.to_ts, "range": stats_range, "last_updated": int(stats.last_updated.timestamp()) } })
def test_get_user_daily_activity(self): data_inserted = self.insert_test_data() result = db_stats.get_user_daily_activity(self.user['id'], 'all_time') self.assertDictEqual(result.all_time.dict(), data_inserted['user_daily_activity'])
def test_get_user_daily_activity(self): data_inserted = self.insert_test_data() result = db_stats.get_user_daily_activity(self.user['id'], 'all_time') self.assertDictEqual(result.dict(exclude={'user_id', 'last_updated', 'count'}), data_inserted['user_daily_activity'])
def test_handle_user_daily_activity(self): data = { 'type': 'daily_activity', 'stats_range': 'all_time', 'from_ts': 1, 'to_ts': 10, 'data': [{ 'user_id': 1, 'data': [{ 'day': 'Monday', 'hour': 20, 'listen_count': 20, }] }, { 'user_id': 2, 'data': [{ 'day': 'Wednesday', 'hour': 10, 'listen_count': 25, }, { 'day': 'Friday', 'hour': 11, 'listen_count': 22, }] }], } handle_user_daily_activity(data) received = db_stats.get_user_daily_activity(1, 'all_time') self.assertEqual( received, StatApi[DailyActivityRecord]( user_id=1, to_ts=10, from_ts=1, stats_range='all_time', data=StatRecordList[DailyActivityRecord](__root__=[ DailyActivityRecord( day='Monday', hour=20, listen_count=20, ) ]), last_updated=received.last_updated)) received = db_stats.get_user_daily_activity(2, 'all_time') self.assertEqual( received, StatApi[DailyActivityRecord]( user_id=2, to_ts=10, from_ts=1, stats_range='all_time', data=StatRecordList[DailyActivityRecord](__root__=[ DailyActivityRecord( day='Wednesday', hour=10, listen_count=25, ), DailyActivityRecord( day='Friday', hour=11, listen_count=22, ), ]), last_updated=received.last_updated))