diff --git a/seahub/api2/endpoints/admin/statistics.py b/seahub/api2/endpoints/admin/statistics.py index 164077e021..d61249c35c 100644 --- a/seahub/api2/endpoints/admin/statistics.py +++ b/seahub/api2/endpoints/admin/statistics.py @@ -10,8 +10,7 @@ from rest_framework import status from django.utils import timezone from seahub.utils import get_file_ops_stats, get_file_ops_stats_by_day, \ - get_total_storage_stats, get_total_storage_stats_by_day, \ - get_user_activity_stats, get_user_activity_stats_by_day, \ + get_total_storage_stats_by_day, get_user_activity_stats_by_day, \ is_pro_version, EVENTS_ENABLED from seahub.utils.timeutils import datetime_to_isoformat_timestr from seahub.settings import TIME_ZONE @@ -21,23 +20,18 @@ from seahub.api2.throttling import UserRateThrottle from seahub.api2.utils import api_error - def check_parameter(func): def _decorated(view, request, *args, **kwargs): if not is_pro_version() or not EVENTS_ENABLED: return api_error(status.HTTP_404_NOT_FOUND, 'Events not enabled.') start_time = request.GET.get("start", "") end_time = request.GET.get("end", "") - group_by = request.GET.get("group_by", "hour") if not start_time: error_msg = "Start time can not be empty" return api_error(status.HTTP_400_BAD_REQUEST, error_msg) if not end_time: error_msg = "End time can not be empty" return api_error(status.HTTP_400_BAD_REQUEST, error_msg) - if group_by.lower() not in ["hour", "day"]: - error_msg = "group_by can only be day or hour." - return api_error(status.HTTP_400_BAD_REQUEST, error_msg) try: start_time = datetime.datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S") @@ -51,7 +45,7 @@ def check_parameter(func): error_msg = "End time %s invalid" % end_time return api_error(status.HTTP_400_BAD_REQUEST, error_msg) - return func(view, request, start_time, end_time, group_by) + return func(view, request, start_time, end_time) return _decorated @@ -66,7 +60,7 @@ class FileOperationsView(APIView): permission_classes = (IsAdminUser,) @check_parameter - def get(self, request, start_time, end_time, group_by): + def get(self, request, start_time, end_time): """ Get records of the specified time range. param: @@ -76,6 +70,11 @@ class FileOperationsView(APIView): return: the list of file operations record. """ + group_by = request.GET.get("group_by", "hour") + if group_by.lower() not in ["hour", "day"]: + error_msg = "group_by can only be day or hour." + return api_error(status.HTTP_400_BAD_REQUEST, error_msg) + data = get_data_by_hour_or_day(group_by, start_time, end_time, get_file_ops_stats, get_file_ops_stats_by_day) ops_added_dict = get_init_data(start_time, end_time, group_by) ops_visited_dict = get_init_data(start_time, end_time, group_by) @@ -104,11 +103,11 @@ class TotalStorageView(APIView): permission_classes = (IsAdminUser,) @check_parameter - def get(self, request, start_time, end_time, group_by): - data = get_data_by_hour_or_day(group_by, start_time, end_time, get_total_storage_stats, get_total_storage_stats_by_day) + def get(self, request, start_time, end_time): + data = get_total_storage_stats_by_day(start_time, end_time, get_time_offset()) res_data = [] - init_data = get_init_data(start_time, end_time, group_by) + init_data = get_init_data(start_time, end_time, 'day') for e in data: init_data[e[0]] = e[1] for k, v in init_data.items(): @@ -123,11 +122,11 @@ class ActiveUsersView(APIView): permission_classes = (IsAdminUser,) @check_parameter - def get(self, request, start_time, end_time, group_by): - data = get_data_by_hour_or_day(group_by, start_time, end_time, get_user_activity_stats, get_user_activity_stats_by_day) + def get(self, request, start_time, end_time): + data = get_user_activity_stats_by_day(start_time, end_time, get_time_offset()) res_data = [] - init_data = get_init_data(start_time, end_time, group_by) + init_data = get_init_data(start_time, end_time, 'day') for e in data: init_data[e[0]] = e[1] for k, v in init_data.items(): @@ -154,11 +153,14 @@ def get_init_data(start_time, end_time, group_by): res[dt] = 0 return res - -def get_data_by_hour_or_day(parameter, start_time, end_time, func, func_by_day): +def get_time_offset(): timezone_name = timezone.get_current_timezone_name() offset = pytz.timezone(timezone_name).localize(datetime.datetime.now()).strftime('%z') - offset = offset[:3] + ':' + offset[3:] + return offset[:3] + ':' + offset[3:] + + +def get_data_by_hour_or_day(parameter, start_time, end_time, func, func_by_day): + offset = get_time_offset() if parameter == "hour": data = func(start_time, end_time, offset) elif parameter == "day": diff --git a/seahub/utils/__init__.py b/seahub/utils/__init__.py index b011efe029..ce71b06bfd 100644 --- a/seahub/utils/__init__.py +++ b/seahub/utils/__init__.py @@ -629,13 +629,6 @@ if EVENTS_CONFIG_FILE: """ return _get_events(username, start, count) - def get_user_activity_stats(start, end, offset): - """ Return user activity record of the specified time - """ - with _get_seafevents_session() as session: - res = seafevents.get_user_activity_stats(session, start, end, offset) - return res - def get_user_activity_stats_by_day(start, end, offset): """ """ @@ -706,13 +699,6 @@ if EVENTS_CONFIG_FILE: res = seafevents.get_file_ops_stats_by_day(session, start, end, offset) return res - def get_total_storage_stats(start, end, offset): - """ Return total storage record of specified time. - """ - with _get_seafevents_session() as session: - res = seafevents.get_total_storage_stats(session, start, end, offset) - return res - def get_total_storage_stats_by_day(start, end, offset): """ """ @@ -763,8 +749,6 @@ else: EVENTS_ENABLED = False def get_user_events(): pass - def get_user_activity_stats(): - pass def get_user_activity_stats_by_day(): pass def get_log_events_by_time(): @@ -781,8 +765,6 @@ else: pass def get_file_ops_stats_by_day(): pass - def get_total_storage_stats(): - pass def get_total_storage_stats_by_day(): pass def get_file_update_events(): diff --git a/tests/api/endpoints/admin/test_statistics.py b/tests/api/endpoints/admin/test_statistics.py index b5ec529564..f70cae4689 100644 --- a/tests/api/endpoints/admin/test_statistics.py +++ b/tests/api/endpoints/admin/test_statistics.py @@ -54,26 +54,15 @@ class FileOperationsInfoText(BaseTestCase): @patch("seahub.api2.endpoints.admin.statistics.EVENTS_ENABLED") @patch("seahub.api2.endpoints.admin.statistics.is_pro_version") - @patch("seahub.api2.endpoints.admin.statistics.get_user_activity_stats") @patch("seahub.api2.endpoints.admin.statistics.get_user_activity_stats_by_day") - def test_can_user_activity_stats(self, mock_stats_by_day, mock_stats, - mock_is_pro, mock_events_enabled): - mock_stats.return_value = [(datetime.datetime(2017, 6, 2, 7, 0), 2L), - (datetime.datetime(2017, 6, 2, 8, 0), 5L)] + def test_can_user_activity_stats(self, mock_stats_by_day, mock_is_pro, + mock_events_enabled): mock_stats_by_day.return_value = [(datetime.datetime(2017, 6, 2, 4, 0), 3L)] mock_is_pro.return_value = True mock_events_enabled = True url = reverse('api-v2.1-admin-statistics-active-users') - url += "?start=2017-06-01 07:00:00&end=2017-06-03 07:00:00&group_by=hour" - resp = self.client.get(url) - json_resp = json.loads(resp.content) - self.assertEqual(200, resp.status_code) - data = {'datetime': datetime_to_isoformat_timestr(datetime.datetime(2017, 6, 2, 7, 0)), 'count': 2} - assert data in json_resp - data = {'datetime': datetime_to_isoformat_timestr(datetime.datetime(2017, 6, 2, 8, 0)), 'count': 5} - assert data in json_resp - url += "?start=2017-06-01 07:00:00&end=2017-06-03 07:00:00&group_by=day" + url += "?start=2017-06-01 07:00:00&end=2017-06-03 07:00:00" resp = self.client.get(url) json_resp = json.loads(resp.content) self.assertEqual(200, resp.status_code) @@ -82,26 +71,14 @@ class FileOperationsInfoText(BaseTestCase): @patch("seahub.api2.endpoints.admin.statistics.EVENTS_ENABLED") @patch("seahub.api2.endpoints.admin.statistics.is_pro_version") - @patch("seahub.api2.endpoints.admin.statistics.get_total_storage_stats") @patch("seahub.api2.endpoints.admin.statistics.get_total_storage_stats_by_day") - def test_can_get_total_storage_stats(self, mock_stats_by_day, mock_stats, - mock_is_pro, mock_events_enabled): - mock_stats.return_value = [(datetime.datetime(2017, 6, 2, 7, 0), 2L), - (datetime.datetime(2017, 6, 2, 8, 0), 5L)] + def test_can_get_total_storage_stats(self, mock_stats_by_day, mock_is_pro, + mock_events_enabled): mock_stats_by_day.return_value = [(datetime.datetime(2017, 6, 2, 3, 0), 13L)] mock_is_pro.return_value = True mock_events_enabled = True url = reverse('api-v2.1-admin-statistics-total-storage') - url += "?start=2017-06-01 07:00:00&end=2017-06-03 07:00:00&group_by=hour" - resp = self.client.get(url) - - json_resp = json.loads(resp.content) - self.assertEqual(200, resp.status_code) - data = {'datetime': datetime_to_isoformat_timestr(datetime.datetime(2017, 6, 2, 7, 0)), 'total_storage': 2} - assert data in json_resp - data = {'datetime': datetime_to_isoformat_timestr(datetime.datetime(2017, 6, 2, 8, 0)), 'total_storage': 5} - assert data in json_resp - url += "?start=2017-06-01 07:00:00&end=2017-06-03 07:00:00&group_by=day" + url += "?start=2017-06-01 07:00:00&end=2017-06-03 07:00:00" resp = self.client.get(url) json_resp = json.loads(resp.content) self.assertEqual(200, resp.status_code)