bridgy-fed/pages.py

97 wiersze
3.1 KiB
Python
Czysty Zwykły widok Historia

"""Render recent responses and logs."""
import calendar
2022-11-05 22:12:26 +00:00
from itertools import islice
import urllib.parse
2022-11-05 22:12:26 +00:00
from flask import render_template, request
2022-11-09 15:53:00 +00:00
from google.cloud.ndb.stats import KindStat
from oauth_dropins.webutil import flask_util, logs, util
2022-11-05 22:12:26 +00:00
from oauth_dropins.webutil.flask_util import error
2021-07-13 15:06:35 +00:00
from app import app, cache
import common
from models import Response
@app.get('/responses')
@app.get(f'/responses/<regex("{common.DOMAIN_RE}"):domain>')
def responses(domain=None):
"""Renders recent Responses, with links to logs."""
2022-11-05 22:12:26 +00:00
query = Response.query()\
.filter(Response.status.IN(('new', 'complete', 'error')))\
2022-11-05 22:12:26 +00:00
.order(-Response.updated)
if domain:
query = query.filter(Response.domain == domain)
2022-11-05 22:12:26 +00:00
# if there's a paging param (responses_before or responses_after), update
# query with it
# TODO: unify this with Bridgy's user page
def get_paging_param(param):
val = request.values.get(param)
try:
return util.parse_iso8601(val.replace(' ', '+')) if val else None
except BaseException:
error(f"Couldn't parse {param}, {val!r} as ISO8601")
before = get_paging_param('responses_before')
after = get_paging_param('responses_after')
if before and after:
error("can't handle both responses_before and responses_after")
elif after:
query = query.filter(Response.updated > after).order(Response.updated)
elif before:
query = query.filter(Response.updated < before).order(-Response.updated)
else:
query = query.order(-Response.updated)
query_iter = query.iter()
responses = list(islice(query_iter, 0, 20))
for r in responses:
r.source_link = util.pretty_link(r.source())
r.target_link = util.pretty_link(r.target())
2021-07-13 15:06:35 +00:00
r.log_url_path = '/log?' + urllib.parse.urlencode({
'key': r.key.id(),
'start_time': calendar.timegm(r.updated.timetuple()),
})
2022-11-09 05:22:20 +00:00
vars = {
'domain': domain,
'responses': sorted(responses, key=lambda r: r.updated, reverse=True),
}
2022-11-05 22:12:26 +00:00
# calculate new paging param(s)
new_after = (
before if before
else responses[0].updated
if responses and query_iter.probably_has_next() and (before or after)
else None)
if new_after:
vars['responses_after_link'] = f'?responses_after={new_after.isoformat()}#responses'
new_before = (
after if after else
responses[-1].updated if
responses and query_iter.probably_has_next()
else None)
if new_before:
vars['responses_before_link'] = f'?responses_before={new_before.isoformat()}#responses'
return render_template('responses.html', **vars)
2021-07-13 15:06:35 +00:00
2022-11-09 15:53:00 +00:00
@app.get('/stats')
def stats():
return render_template(
'stats.html',
users=KindStat.query(KindStat.kind_name == 'MagicKey').get().count,
responses=KindStat.query(KindStat.kind_name == 'Response').get().count,
followers=KindStat.query(KindStat.kind_name == 'Follower').get().count,
)
2021-07-13 15:06:35 +00:00
@app.get('/log')
@flask_util.cached(cache, logs.CACHE_TIME)
2021-07-13 15:06:35 +00:00
def log():
return logs.log()