aboutsummaryrefslogtreecommitdiffstats
path: root/fatcat_covid19/webface.py
diff options
context:
space:
mode:
authorBryan Newbold <bnewbold@archive.org>2020-04-01 21:29:56 -0700
committerBryan Newbold <bnewbold@archive.org>2020-04-01 21:29:59 -0700
commit986ce7a38029f7fb20a51271f67d943678e17386 (patch)
tree35d0533b5cba7134dce1f626df5f9caeb741f33d /fatcat_covid19/webface.py
parentbacbad25b60bf585abb03d6d897061a3d872f2db (diff)
downloadfatcat-covid19-986ce7a38029f7fb20a51271f67d943678e17386.tar.gz
fatcat-covid19-986ce7a38029f7fb20a51271f67d943678e17386.zip
first iteration of web interface
Copied and tweaked from fatcat:python/fatcat_web LICENSE file for this repo is a TODO and will need to match that of fatcat.
Diffstat (limited to 'fatcat_covid19/webface.py')
-rw-r--r--fatcat_covid19/webface.py112
1 files changed, 112 insertions, 0 deletions
diff --git a/fatcat_covid19/webface.py b/fatcat_covid19/webface.py
new file mode 100644
index 0000000..5476884
--- /dev/null
+++ b/fatcat_covid19/webface.py
@@ -0,0 +1,112 @@
+
+"""
+This is the single-file Flask web application
+"""
+
+import os
+import subprocess
+
+from flask import Flask, Blueprint, g, app, render_template, request
+from flask_babel import Babel, gettext
+from flask.logging import create_logger
+
+import sentry_sdk
+from sentry_sdk.integrations.flask import FlaskIntegration
+
+
+class BaseConfig(object):
+
+ SUPPORTED_LANGUAGES = {'en': 'English', 'de': 'Deutsch'}
+ BABEL_DEFAULT_LOCALE = 'en'
+ BABEL_DEFAULT_TIMEZONE = 'UTC'
+ GIT_REVISION = subprocess.check_output(["git", "describe", "--always"]).strip().decode('utf-8')
+
+ ELASTICSEARCH_BACKEND = os.environ.get("ELASTICSEARCH_BACKEND", default="https://search.fatcat.wiki")
+ ELASTICSEARCH_FULLTEXT_INDEX = os.environ.get("ELASTICSEARCH_FULLTEXT_INDEX", default="covid19_fatcat_fulltext")
+
+ FATCAT_DOMAIN = "covid19.fatcat.wiki"
+
+ SENTRY_CONFIG = {
+ 'enable-threads': True, # for uWSGI
+ 'release': GIT_REVISION,
+ 'tags': {
+ 'service': 'covid19.fatcat.wiki',
+ },
+ }
+
+sentry_sdk.init(
+ # set SDN via environment variable SENTRY_DSN
+ integrations=[FlaskIntegration()]
+)
+
+app = Flask(__name__, static_url_path='/static')
+app.config.from_object(BaseConfig())
+app.log = create_logger(app)
+babel = Babel(app)
+
+from fatcat_covid19.search import *
+
+bp = Blueprint('search', __name__)
+
+@bp.url_defaults
+def add_language_code(endpoint, values):
+ if g.lang_code_set:
+ values.setdefault('lang_code', g.lang_code)
+
+@bp.url_value_preprocessor
+def pull_lang_code(endpoint, values):
+ g.lang_code_set = 'lang_code' in values
+ g.lang_code = values.pop('lang_code', app.config['BABEL_DEFAULT_LOCALE'])
+ if g.lang_code not in app.config['SUPPORTED_LANGUAGES']:
+ abort(404)
+
+@bp.route('/', methods=['GET'])
+def page_home():
+ return render_template('home.html')
+
+@bp.route('/fulltext/search', methods=['GET', 'POST'])
+def fulltext_search():
+
+ query = request.args.get('q')
+
+ offset = request.args.get('offset', '0')
+ offset = max(0, int(offset)) if offset.isnumeric() else 0
+
+ if 'q' in request.args.keys():
+ found = do_fulltext_search(query, offset=offset)
+ return render_template('fulltext_search.html', found=found, query=query)
+ else:
+ return render_template('fulltext_search.html', query=query)
+
+@bp.route('/about', methods=['GET'])
+def page_about():
+ return render_template('about_{}.html'.format(g.lang_code))
+
+@bp.route('/sources', methods=['GET'])
+def page_sources():
+ return render_template('sources.html')
+
+
+@bp.errorhandler(404)
+def page_not_found(e):
+ return render_template('404.html'), 404
+
+@bp.errorhandler(400)
+def page_bad_request(e):
+ return render_template('400.html'), 400
+
+@bp.errorhandler(502)
+@bp.errorhandler(503)
+@bp.errorhandler(504)
+@bp.errorhandler(500)
+def page_server_error(e):
+ return render_template('500.html'), 500
+
+@app.route('/robots.txt', methods=['GET'])
+def robots():
+ return send_from_directory(os.path.join(app.root_path, 'static'),
+ 'robots.txt',
+ mimetype='text/plain')
+
+app.register_blueprint(bp, url_prefix='/<string(length=2):lang_code>/')
+app.register_blueprint(bp, url_prefix='/')