Fix logs view and API

- We needed to use an engine-agnostic way to extract the days
- Joining with the LogEntryKind table has *horrible* performance in MySQL, so do it ourselves
- Limit to 50 logs per page
This commit is contained in:
Joseph Schorr 2015-08-05 17:36:17 -04:00
parent d480a204f5
commit d34afde954
3 changed files with 39 additions and 14 deletions

View file

@ -14,11 +14,11 @@ from data import model
from auth import scopes
from app import avatar
LOGS_PER_PAGE = 500
LOGS_PER_PAGE = 50
def log_view(log):
def log_view(log, kinds):
view = {
'kind': log.kind.name,
'kind': kinds[log.kind_id],
'metadata': json.loads(log.metadata_json),
'ip': log.ip,
'datetime': format_date(log.datetime),
@ -34,9 +34,9 @@ def log_view(log):
return view
def aggregated_log_view(log):
def aggregated_log_view(log, kinds):
view = {
'kind': log.kind.name,
'kind': kinds[log.kind_id],
'count': log.count,
'datetime': format_date(log.datetime)
}
@ -73,13 +73,14 @@ def _validate_logs_arguments(start_time, end_time, performer_name):
def get_logs(start_time, end_time, performer_name=None, repository=None, namespace=None, page=None):
(start_time, end_time, performer) = _validate_logs_arguments(start_time, end_time, performer_name)
page = page if page else 1
kinds = model.log.get_log_entry_kinds()
logs = model.log.list_logs(start_time, end_time, performer=performer, repository=repository,
namespace=namespace, page=page, count=LOGS_PER_PAGE + 1)
return {
'start_time': format_date(start_time),
'end_time': format_date(end_time),
'logs': [log_view(log) for log in logs[0:LOGS_PER_PAGE]],
'logs': [log_view(log, kinds) for log in logs[0:LOGS_PER_PAGE]],
'page': page,
'has_additional': len(logs) > LOGS_PER_PAGE,
}
@ -87,11 +88,12 @@ def get_logs(start_time, end_time, performer_name=None, repository=None, namespa
def get_aggregate_logs(start_time, end_time, performer_name=None, repository=None, namespace=None):
(start_time, end_time, performer) = _validate_logs_arguments(start_time, end_time, performer_name)
kinds = model.log.get_log_entry_kinds()
aggregated_logs = model.log.get_aggregated_logs(start_time, end_time, performer=performer,
repository=repository, namespace=namespace)
return {
'aggregated': [aggregated_log_view(log) for log in aggregated_logs]
'aggregated': [aggregated_log_view(log, kinds) for log in aggregated_logs]
}