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)
Exemple #2
0
    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)
Exemple #3
0
    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())
        }
    })
Exemple #7
0
 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'])
Exemple #9
0
    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))