mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-18 00:00:00 +00:00
del statistics by hour(user activity, total storage)
This commit is contained in:
@@ -10,8 +10,7 @@ from rest_framework import status
|
|||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
from seahub.utils import get_file_ops_stats, get_file_ops_stats_by_day, \
|
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_total_storage_stats_by_day, get_user_activity_stats_by_day, \
|
||||||
get_user_activity_stats, get_user_activity_stats_by_day, \
|
|
||||||
is_pro_version, EVENTS_ENABLED
|
is_pro_version, EVENTS_ENABLED
|
||||||
from seahub.utils.timeutils import datetime_to_isoformat_timestr
|
from seahub.utils.timeutils import datetime_to_isoformat_timestr
|
||||||
from seahub.settings import TIME_ZONE
|
from seahub.settings import TIME_ZONE
|
||||||
@@ -21,23 +20,18 @@ from seahub.api2.throttling import UserRateThrottle
|
|||||||
from seahub.api2.utils import api_error
|
from seahub.api2.utils import api_error
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def check_parameter(func):
|
def check_parameter(func):
|
||||||
def _decorated(view, request, *args, **kwargs):
|
def _decorated(view, request, *args, **kwargs):
|
||||||
if not is_pro_version() or not EVENTS_ENABLED:
|
if not is_pro_version() or not EVENTS_ENABLED:
|
||||||
return api_error(status.HTTP_404_NOT_FOUND, 'Events not enabled.')
|
return api_error(status.HTTP_404_NOT_FOUND, 'Events not enabled.')
|
||||||
start_time = request.GET.get("start", "")
|
start_time = request.GET.get("start", "")
|
||||||
end_time = request.GET.get("end", "")
|
end_time = request.GET.get("end", "")
|
||||||
group_by = request.GET.get("group_by", "hour")
|
|
||||||
if not start_time:
|
if not start_time:
|
||||||
error_msg = "Start time can not be empty"
|
error_msg = "Start time can not be empty"
|
||||||
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
if not end_time:
|
if not end_time:
|
||||||
error_msg = "End time can not be empty"
|
error_msg = "End time can not be empty"
|
||||||
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
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:
|
try:
|
||||||
start_time = datetime.datetime.strptime(start_time,
|
start_time = datetime.datetime.strptime(start_time,
|
||||||
"%Y-%m-%d %H:%M:%S")
|
"%Y-%m-%d %H:%M:%S")
|
||||||
@@ -51,7 +45,7 @@ def check_parameter(func):
|
|||||||
error_msg = "End time %s invalid" % end_time
|
error_msg = "End time %s invalid" % end_time
|
||||||
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
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
|
return _decorated
|
||||||
|
|
||||||
|
|
||||||
@@ -66,7 +60,7 @@ class FileOperationsView(APIView):
|
|||||||
permission_classes = (IsAdminUser,)
|
permission_classes = (IsAdminUser,)
|
||||||
|
|
||||||
@check_parameter
|
@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.
|
Get records of the specified time range.
|
||||||
param:
|
param:
|
||||||
@@ -76,6 +70,11 @@ class FileOperationsView(APIView):
|
|||||||
return:
|
return:
|
||||||
the list of file operations record.
|
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)
|
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_added_dict = get_init_data(start_time, end_time, group_by)
|
||||||
ops_visited_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,)
|
permission_classes = (IsAdminUser,)
|
||||||
|
|
||||||
@check_parameter
|
@check_parameter
|
||||||
def get(self, request, start_time, end_time, group_by):
|
def get(self, request, start_time, end_time):
|
||||||
data = get_data_by_hour_or_day(group_by, start_time, end_time, get_total_storage_stats, get_total_storage_stats_by_day)
|
data = get_total_storage_stats_by_day(start_time, end_time, get_time_offset())
|
||||||
|
|
||||||
res_data = []
|
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:
|
for e in data:
|
||||||
init_data[e[0]] = e[1]
|
init_data[e[0]] = e[1]
|
||||||
for k, v in init_data.items():
|
for k, v in init_data.items():
|
||||||
@@ -123,11 +122,11 @@ class ActiveUsersView(APIView):
|
|||||||
permission_classes = (IsAdminUser,)
|
permission_classes = (IsAdminUser,)
|
||||||
|
|
||||||
@check_parameter
|
@check_parameter
|
||||||
def get(self, request, start_time, end_time, group_by):
|
def get(self, request, start_time, end_time):
|
||||||
data = get_data_by_hour_or_day(group_by, start_time, end_time, get_user_activity_stats, get_user_activity_stats_by_day)
|
data = get_user_activity_stats_by_day(start_time, end_time, get_time_offset())
|
||||||
|
|
||||||
res_data = []
|
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:
|
for e in data:
|
||||||
init_data[e[0]] = e[1]
|
init_data[e[0]] = e[1]
|
||||||
for k, v in init_data.items():
|
for k, v in init_data.items():
|
||||||
@@ -154,11 +153,14 @@ def get_init_data(start_time, end_time, group_by):
|
|||||||
res[dt] = 0
|
res[dt] = 0
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def get_time_offset():
|
||||||
def get_data_by_hour_or_day(parameter, start_time, end_time, func, func_by_day):
|
|
||||||
timezone_name = timezone.get_current_timezone_name()
|
timezone_name = timezone.get_current_timezone_name()
|
||||||
offset = pytz.timezone(timezone_name).localize(datetime.datetime.now()).strftime('%z')
|
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":
|
if parameter == "hour":
|
||||||
data = func(start_time, end_time, offset)
|
data = func(start_time, end_time, offset)
|
||||||
elif parameter == "day":
|
elif parameter == "day":
|
||||||
|
@@ -629,13 +629,6 @@ if EVENTS_CONFIG_FILE:
|
|||||||
"""
|
"""
|
||||||
return _get_events(username, start, count)
|
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):
|
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)
|
res = seafevents.get_file_ops_stats_by_day(session, start, end, offset)
|
||||||
return res
|
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):
|
def get_total_storage_stats_by_day(start, end, offset):
|
||||||
"""
|
"""
|
||||||
"""
|
"""
|
||||||
@@ -763,8 +749,6 @@ else:
|
|||||||
EVENTS_ENABLED = False
|
EVENTS_ENABLED = False
|
||||||
def get_user_events():
|
def get_user_events():
|
||||||
pass
|
pass
|
||||||
def get_user_activity_stats():
|
|
||||||
pass
|
|
||||||
def get_user_activity_stats_by_day():
|
def get_user_activity_stats_by_day():
|
||||||
pass
|
pass
|
||||||
def get_log_events_by_time():
|
def get_log_events_by_time():
|
||||||
@@ -781,8 +765,6 @@ else:
|
|||||||
pass
|
pass
|
||||||
def get_file_ops_stats_by_day():
|
def get_file_ops_stats_by_day():
|
||||||
pass
|
pass
|
||||||
def get_total_storage_stats():
|
|
||||||
pass
|
|
||||||
def get_total_storage_stats_by_day():
|
def get_total_storage_stats_by_day():
|
||||||
pass
|
pass
|
||||||
def get_file_update_events():
|
def get_file_update_events():
|
||||||
|
@@ -54,26 +54,15 @@ class FileOperationsInfoText(BaseTestCase):
|
|||||||
|
|
||||||
@patch("seahub.api2.endpoints.admin.statistics.EVENTS_ENABLED")
|
@patch("seahub.api2.endpoints.admin.statistics.EVENTS_ENABLED")
|
||||||
@patch("seahub.api2.endpoints.admin.statistics.is_pro_version")
|
@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")
|
@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,
|
def test_can_user_activity_stats(self, mock_stats_by_day, mock_is_pro,
|
||||||
mock_is_pro, mock_events_enabled):
|
mock_events_enabled):
|
||||||
mock_stats.return_value = [(datetime.datetime(2017, 6, 2, 7, 0), 2L),
|
|
||||||
(datetime.datetime(2017, 6, 2, 8, 0), 5L)]
|
|
||||||
mock_stats_by_day.return_value = [(datetime.datetime(2017, 6, 2, 4, 0), 3L)]
|
mock_stats_by_day.return_value = [(datetime.datetime(2017, 6, 2, 4, 0), 3L)]
|
||||||
mock_is_pro.return_value = True
|
mock_is_pro.return_value = True
|
||||||
mock_events_enabled = True
|
mock_events_enabled = True
|
||||||
url = reverse('api-v2.1-admin-statistics-active-users')
|
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)
|
url += "?start=2017-06-01 07:00:00&end=2017-06-03 07:00:00"
|
||||||
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"
|
|
||||||
resp = self.client.get(url)
|
resp = self.client.get(url)
|
||||||
json_resp = json.loads(resp.content)
|
json_resp = json.loads(resp.content)
|
||||||
self.assertEqual(200, resp.status_code)
|
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.EVENTS_ENABLED")
|
||||||
@patch("seahub.api2.endpoints.admin.statistics.is_pro_version")
|
@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")
|
@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,
|
def test_can_get_total_storage_stats(self, mock_stats_by_day, mock_is_pro,
|
||||||
mock_is_pro, mock_events_enabled):
|
mock_events_enabled):
|
||||||
mock_stats.return_value = [(datetime.datetime(2017, 6, 2, 7, 0), 2L),
|
|
||||||
(datetime.datetime(2017, 6, 2, 8, 0), 5L)]
|
|
||||||
mock_stats_by_day.return_value = [(datetime.datetime(2017, 6, 2, 3, 0), 13L)]
|
mock_stats_by_day.return_value = [(datetime.datetime(2017, 6, 2, 3, 0), 13L)]
|
||||||
mock_is_pro.return_value = True
|
mock_is_pro.return_value = True
|
||||||
mock_events_enabled = True
|
mock_events_enabled = True
|
||||||
url = reverse('api-v2.1-admin-statistics-total-storage')
|
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"
|
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)
|
|
||||||
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"
|
|
||||||
resp = self.client.get(url)
|
resp = self.client.get(url)
|
||||||
json_resp = json.loads(resp.content)
|
json_resp = json.loads(resp.content)
|
||||||
self.assertEqual(200, resp.status_code)
|
self.assertEqual(200, resp.status_code)
|
||||||
|
Reference in New Issue
Block a user