2017-10-26 14:13:28 +00:00
|
|
|
"""Render recent responses and logs."""
|
|
|
|
import calendar
|
2022-11-11 19:12:48 +00:00
|
|
|
import datetime
|
2022-11-05 22:12:26 +00:00
|
|
|
from itertools import islice
|
2019-12-26 06:20:57 +00:00
|
|
|
import urllib.parse
|
2017-10-26 14:13:28 +00:00
|
|
|
|
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
|
2021-09-09 05:14:11 +00:00
|
|
|
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
|
2017-10-26 04:32:59 +00:00
|
|
|
|
2021-07-13 15:06:35 +00:00
|
|
|
from app import app, cache
|
2022-11-08 14:56:19 +00:00
|
|
|
import common
|
2017-10-26 04:32:59 +00:00
|
|
|
from models import Response
|
|
|
|
|
|
|
|
|
2022-11-11 19:12:48 +00:00
|
|
|
@app.route('/')
|
|
|
|
@flask_util.cached(cache, datetime.timedelta(days=1))
|
|
|
|
def front_page():
|
|
|
|
"""View for the front page."""
|
|
|
|
return render_template('index.html')
|
|
|
|
|
|
|
|
|
2021-07-11 23:30:14 +00:00
|
|
|
@app.get('/responses')
|
2022-11-08 14:56:19 +00:00
|
|
|
@app.get(f'/responses/<regex("{common.DOMAIN_RE}"):domain>')
|
|
|
|
def responses(domain=None):
|
2017-10-26 04:32:59 +00:00
|
|
|
"""Renders recent Responses, with links to logs."""
|
2022-11-05 22:12:26 +00:00
|
|
|
query = Response.query()\
|
2022-05-03 05:50:40 +00:00
|
|
|
.filter(Response.status.IN(('new', 'complete', 'error')))\
|
2022-11-05 22:12:26 +00:00
|
|
|
.order(-Response.updated)
|
2017-10-26 04:32:59 +00:00
|
|
|
|
2022-11-08 14:56:19 +00:00
|
|
|
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))
|
2021-07-07 15:07:20 +00:00
|
|
|
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()),
|
|
|
|
})
|
2017-10-26 04:32:59 +00:00
|
|
|
|
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')
|
2021-09-09 05:14:11 +00:00
|
|
|
@flask_util.cached(cache, logs.CACHE_TIME)
|
2021-07-13 15:06:35 +00:00
|
|
|
def log():
|
2021-08-06 17:30:50 +00:00
|
|
|
return logs.log()
|