Switch to using an aggregated logs query and infinite scrolling
This should allow users to work with large logs set. Fixes #294
This commit is contained in:
parent
572d6ba53c
commit
3d6c92901c
15 changed files with 270 additions and 99 deletions
|
@ -5,18 +5,13 @@ from datetime import datetime, timedelta, date
|
|||
|
||||
from data.database import LogEntry, LogEntryKind, User
|
||||
|
||||
|
||||
def list_logs(start_time, end_time, performer=None, repository=None, namespace=None):
|
||||
Performer = User.alias()
|
||||
def _logs_query(selections, start_time, end_time, performer=None, repository=None, namespace=None):
|
||||
joined = (LogEntry
|
||||
.select(LogEntry, LogEntryKind, User, Performer)
|
||||
.join(User)
|
||||
.switch(LogEntry)
|
||||
.join(Performer, JOIN_LEFT_OUTER,
|
||||
on=(LogEntry.performer == Performer.id).alias('performer'))
|
||||
.select(*selections)
|
||||
.switch(LogEntry)
|
||||
.join(LogEntryKind)
|
||||
.switch(LogEntry))
|
||||
.switch(LogEntry)
|
||||
.where(LogEntry.datetime >= start_time, LogEntry.datetime < end_time))
|
||||
|
||||
if repository:
|
||||
joined = joined.where(LogEntry.repository == repository)
|
||||
|
@ -25,10 +20,32 @@ def list_logs(start_time, end_time, performer=None, repository=None, namespace=N
|
|||
joined = joined.where(LogEntry.performer == performer)
|
||||
|
||||
if namespace:
|
||||
joined = joined.where(User.username == namespace)
|
||||
joined = joined.join(User).where(User.username == namespace)
|
||||
|
||||
return list(joined.where(LogEntry.datetime >= start_time,
|
||||
LogEntry.datetime < end_time).order_by(LogEntry.datetime.desc()))
|
||||
return joined
|
||||
|
||||
|
||||
def get_aggregated_logs(start_time, end_time, performer=None, repository=None, namespace=None):
|
||||
selections = [LogEntryKind, fn.date(LogEntry.datetime, '%d'), fn.Count(LogEntry.id).alias('count')]
|
||||
query = _logs_query(selections, start_time, end_time, performer, repository, namespace)
|
||||
return query.group_by(fn.date(LogEntry.datetime, '%d'), LogEntryKind)
|
||||
|
||||
|
||||
def list_logs(start_time, end_time, performer=None, repository=None, namespace=None, page=None,
|
||||
count=None):
|
||||
|
||||
Performer = User.alias()
|
||||
selections = [LogEntry, LogEntryKind, Performer]
|
||||
|
||||
query = _logs_query(selections, start_time, end_time, performer, repository, namespace)
|
||||
query = (query.switch(LogEntry)
|
||||
.join(Performer, JOIN_LEFT_OUTER,
|
||||
on=(LogEntry.performer == Performer.id).alias('performer')))
|
||||
|
||||
if page and count:
|
||||
query = query.paginate(page, count)
|
||||
|
||||
return list(query.order_by(LogEntry.datetime.desc()))
|
||||
|
||||
|
||||
def log_action(kind_name, user_or_organization_name, performer=None, repository=None,
|
||||
|
|
Reference in a new issue