aboutsummaryrefslogtreecommitdiffstats
path: root/python/fatcat_web/routes.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/fatcat_web/routes.py')
-rw-r--r--python/fatcat_web/routes.py277
1 files changed, 142 insertions, 135 deletions
diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py
index e6963dbc..17921f30 100644
--- a/python/fatcat_web/routes.py
+++ b/python/fatcat_web/routes.py
@@ -1,5 +1,6 @@
import json
import os
+from typing import Any, Callable, Dict, List, Optional
import citeproc_styles
from fatcat_openapi_client import EditgroupAnnotation
@@ -30,7 +31,7 @@ from fatcat_tools.normal import (
clean_sha256,
)
from fatcat_tools.transforms import citeproc_csl, release_to_csl
-from fatcat_web import Config, api, app, auth_api, mwoauth, priv_api
+from fatcat_web import AnyResponse, Config, api, app, auth_api, mwoauth, priv_api
from fatcat_web.auth import (
handle_ia_xauth,
handle_logout,
@@ -73,7 +74,7 @@ from fatcat_web.search import (
@app.route("/container/<string(length=26):ident>/history", methods=["GET"])
-def container_history(ident):
+def container_history(ident: str) -> AnyResponse:
try:
entity = api.get_container(ident)
history = api.get_container_history(ident)
@@ -86,7 +87,7 @@ def container_history(ident):
@app.route("/creator/<string(length=26):ident>/history", methods=["GET"])
-def creator_history(ident):
+def creator_history(ident: str) -> AnyResponse:
try:
entity = api.get_creator(ident)
history = api.get_creator_history(ident)
@@ -98,7 +99,7 @@ def creator_history(ident):
@app.route("/file/<string(length=26):ident>/history", methods=["GET"])
-def file_history(ident):
+def file_history(ident: str) -> AnyResponse:
try:
entity = api.get_file(ident)
history = api.get_file_history(ident)
@@ -110,7 +111,7 @@ def file_history(ident):
@app.route("/fileset/<string(length=26):ident>/history", methods=["GET"])
-def fileset_history(ident):
+def fileset_history(ident: str) -> AnyResponse:
try:
entity = api.get_fileset(ident)
history = api.get_fileset_history(ident)
@@ -122,7 +123,7 @@ def fileset_history(ident):
@app.route("/webcapture/<string(length=26):ident>/history", methods=["GET"])
-def webcapture_history(ident):
+def webcapture_history(ident: str) -> AnyResponse:
try:
entity = api.get_webcapture(ident)
history = api.get_webcapture_history(ident)
@@ -134,7 +135,7 @@ def webcapture_history(ident):
@app.route("/release/<string(length=26):ident>/history", methods=["GET"])
-def release_history(ident):
+def release_history(ident: str) -> AnyResponse:
try:
entity = api.get_release(ident)
history = api.get_release_history(ident)
@@ -146,7 +147,7 @@ def release_history(ident):
@app.route("/work/<string(length=26):ident>/history", methods=["GET"])
-def work_history(ident):
+def work_history(ident: str) -> AnyResponse:
try:
entity = api.get_work(ident)
history = api.get_work_history(ident)
@@ -157,7 +158,9 @@ def work_history(ident):
)
-def generic_lookup_view(entity_type, lookup_template, extid_types, lookup_lambda):
+def generic_lookup_view(
+ entity_type: str, lookup_template: str, extid_types: List[str], lookup_lambda: Callable
+) -> AnyResponse:
extid = None
for key in extid_types:
if request.args.get(key):
@@ -195,48 +198,48 @@ def generic_lookup_view(entity_type, lookup_template, extid_types, lookup_lambda
@app.route("/container/lookup", methods=["GET"])
-def container_lookup():
+def container_lookup() -> AnyResponse:
return generic_lookup_view(
"container",
"container_lookup.html",
- ("issn", "issne", "issnp", "issnl", "wikidata_qid"),
+ ["issn", "issne", "issnp", "issnl", "wikidata_qid"],
lambda p: api.lookup_container(**p),
)
@app.route("/creator/lookup", methods=["GET"])
-def creator_lookup():
+def creator_lookup() -> AnyResponse:
return generic_lookup_view(
"creator",
"creator_lookup.html",
- ("orcid", "wikidata_qid"),
+ ["orcid", "wikidata_qid"],
lambda p: api.lookup_creator(**p),
)
@app.route("/file/lookup", methods=["GET"])
-def file_lookup():
+def file_lookup() -> AnyResponse:
return generic_lookup_view(
- "file", "file_lookup.html", ("md5", "sha1", "sha256"), lambda p: api.lookup_file(**p)
+ "file", "file_lookup.html", ["md5", "sha1", "sha256"], lambda p: api.lookup_file(**p)
)
@app.route("/fileset/lookup", methods=["GET"])
-def fileset_lookup():
+def fileset_lookup() -> AnyResponse:
abort(404)
@app.route("/webcapture/lookup", methods=["GET"])
-def webcapture_lookup():
+def webcapture_lookup() -> AnyResponse:
abort(404)
@app.route("/release/lookup", methods=["GET"])
-def release_lookup():
+def release_lookup() -> AnyResponse:
return generic_lookup_view(
"release",
"release_lookup.html",
- (
+ [
"doi",
"wikidata_qid",
"pmid",
@@ -249,20 +252,20 @@ def release_lookup():
"mag",
"oai",
"hdl",
- ),
+ ],
lambda p: api.lookup_release(**p),
)
@app.route("/work/lookup", methods=["GET"])
-def work_lookup():
+def work_lookup() -> AnyResponse:
abort(404)
### More Generic Entity Views ###############################################
-def generic_entity_view(entity_type, ident, view_template):
+def generic_entity_view(entity_type: str, ident: str, view_template: str) -> AnyResponse:
entity = generic_get_entity(entity_type, ident)
if entity.state == "redirect":
@@ -288,7 +291,9 @@ def generic_entity_view(entity_type, ident, view_template):
)
-def generic_entity_revision_view(entity_type, revision_id, view_template):
+def generic_entity_revision_view(
+ entity_type: str, revision_id: str, view_template: str
+) -> AnyResponse:
entity = generic_get_entity_revision(entity_type, revision_id)
metadata = entity.to_dict()
@@ -300,7 +305,9 @@ def generic_entity_revision_view(entity_type, revision_id, view_template):
)
-def generic_editgroup_entity_view(editgroup_id, entity_type, ident, view_template):
+def generic_editgroup_entity_view(
+ editgroup_id: Optional[str], entity_type: str, ident: str, view_template: str
+) -> AnyResponse:
try:
editgroup = api.get_editgroup(editgroup_id)
except ApiException as ae:
@@ -323,40 +330,40 @@ def generic_editgroup_entity_view(editgroup_id, entity_type, ident, view_templat
@app.route("/container/<string(length=26):ident>", methods=["GET"])
-def container_view(ident):
+def container_view(ident: str) -> AnyResponse:
return generic_entity_view("container", ident, "container_view.html")
@app.route("/container_<string(length=26):ident>", methods=["GET"])
-def container_underscore_view(ident):
+def container_underscore_view(ident: str) -> AnyResponse:
return redirect("/container/{}".format(ident))
@app.route("/container/<string(length=26):ident>/coverage", methods=["GET"])
-def container_view_coverage(ident):
+def container_view_coverage(ident: str) -> AnyResponse:
# note: there is a special hack to add entity._type_preservation for this endpoint
return generic_entity_view("container", ident, "container_view_coverage.html")
@app.route("/container/<string(length=26):ident>/metadata", methods=["GET"])
-def container_view_metadata(ident):
+def container_view_metadata(ident: str) -> AnyResponse:
return generic_entity_view("container", ident, "entity_view_metadata.html")
@app.route("/container/rev/<uuid:revision_id>", methods=["GET"])
-def container_revision_view(revision_id):
+def container_revision_view(revision_id: str) -> AnyResponse:
return generic_entity_revision_view("container", str(revision_id), "container_view.html")
@app.route("/container/rev/<uuid:revision_id>/metadata", methods=["GET"])
-def container_revision_view_metadata(revision_id):
+def container_revision_view_metadata(revision_id: str) -> AnyResponse:
return generic_entity_revision_view(
"container", str(revision_id), "entity_view_metadata.html"
)
@app.route("/editgroup/<editgroup_id>/container/<string(length=26):ident>", methods=["GET"])
-def container_editgroup_view(editgroup_id, ident):
+def container_editgroup_view(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(
editgroup_id, "container", ident, "container_view.html"
)
@@ -365,160 +372,160 @@ def container_editgroup_view(editgroup_id, ident):
@app.route(
"/editgroup/<editgroup_id>/container/<string(length=26):ident>/metadata", methods=["GET"]
)
-def container_editgroup_view_metadata(editgroup_id, ident):
+def container_editgroup_view_metadata(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(
editgroup_id, "container", ident, "entity_view_metadata.html"
)
@app.route("/creator/<string(length=26):ident>", methods=["GET"])
-def creator_view(ident):
+def creator_view(ident: str) -> AnyResponse:
return generic_entity_view("creator", ident, "creator_view.html")
@app.route("/creator_<string(length=26):ident>", methods=["GET"])
-def creator_underscore_view(ident):
+def creator_underscore_view(ident: str) -> AnyResponse:
return redirect("/creator/{}".format(ident))
@app.route("/creator/<string(length=26):ident>/metadata", methods=["GET"])
-def creator_view_metadata(ident):
+def creator_view_metadata(ident: str) -> AnyResponse:
return generic_entity_view("creator", ident, "entity_view_metadata.html")
@app.route("/creator/rev/<uuid:revision_id>", methods=["GET"])
-def creator_revision_view(revision_id):
+def creator_revision_view(revision_id: str) -> AnyResponse:
return generic_entity_revision_view("creator", str(revision_id), "creator_view.html")
@app.route("/creator/rev/<uuid:revision_id>/metadata", methods=["GET"])
-def creator_revision_view_metadata(revision_id):
+def creator_revision_view_metadata(revision_id: str) -> AnyResponse:
return generic_entity_revision_view(
"creator", str(revision_id), "entity_view_metadata.html"
)
@app.route("/editgroup/<editgroup_id>/creator/<string(length=26):ident>", methods=["GET"])
-def creator_editgroup_view(editgroup_id, ident):
+def creator_editgroup_view(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(editgroup_id, "creator", ident, "creator_view.html")
@app.route(
"/editgroup/<editgroup_id>/creator/<string(length=26):ident>/metadata", methods=["GET"]
)
-def creator_editgroup_view_metadata(editgroup_id, ident):
+def creator_editgroup_view_metadata(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(
editgroup_id, "creator", ident, "entity_view_metadata.html"
)
@app.route("/file/<string(length=26):ident>", methods=["GET"])
-def file_view(ident):
+def file_view(ident: str) -> AnyResponse:
return generic_entity_view("file", ident, "file_view.html")
@app.route("/file_<string(length=26):ident>", methods=["GET"])
-def file_underscore_view(ident):
+def file_underscore_view(ident: str) -> AnyResponse:
return redirect("/file/{}".format(ident))
@app.route("/file/<string(length=26):ident>/metadata", methods=["GET"])
-def file_view_metadata(ident):
+def file_view_metadata(ident: str) -> AnyResponse:
return generic_entity_view("file", ident, "entity_view_metadata.html")
@app.route("/file/rev/<uuid:revision_id>", methods=["GET"])
-def file_revision_view(revision_id):
+def file_revision_view(revision_id: str) -> AnyResponse:
return generic_entity_revision_view("file", str(revision_id), "file_view.html")
@app.route("/file/rev/<uuid:revision_id>/metadata", methods=["GET"])
-def file_revision_view_metadata(revision_id):
+def file_revision_view_metadata(revision_id: str) -> AnyResponse:
return generic_entity_revision_view("file", str(revision_id), "entity_view_metadata.html")
@app.route("/editgroup/<editgroup_id>/file/<string(length=26):ident>", methods=["GET"])
-def file_editgroup_view(editgroup_id, ident):
+def file_editgroup_view(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(editgroup_id, "file", ident, "file_view.html")
@app.route("/editgroup/<editgroup_id>/file/<string(length=26):ident>/metadata", methods=["GET"])
-def file_editgroup_view_metadata(editgroup_id, ident):
+def file_editgroup_view_metadata(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(
editgroup_id, "file", ident, "entity_view_metadata.html"
)
@app.route("/fileset/<string(length=26):ident>", methods=["GET"])
-def fileset_view(ident):
+def fileset_view(ident: str) -> AnyResponse:
return generic_entity_view("fileset", ident, "fileset_view.html")
@app.route("/fileset_<string(length=26):ident>", methods=["GET"])
-def fileset_underscore_view(ident):
+def fileset_underscore_view(ident: str) -> AnyResponse:
return redirect("/fileset/{}".format(ident))
@app.route("/fileset/<string(length=26):ident>/metadata", methods=["GET"])
-def fileset_view_metadata(ident):
+def fileset_view_metadata(ident: str) -> AnyResponse:
return generic_entity_view("fileset", ident, "entity_view_metadata.html")
@app.route("/fileset/rev/<uuid:revision_id>", methods=["GET"])
-def fileset_revision_view(revision_id):
+def fileset_revision_view(revision_id: str) -> AnyResponse:
return generic_entity_revision_view("fileset", str(revision_id), "fileset_view.html")
@app.route("/fileset/rev/<uuid:revision_id>/metadata", methods=["GET"])
-def fileset_revision_view_metadata(revision_id):
+def fileset_revision_view_metadata(revision_id: str) -> AnyResponse:
return generic_entity_revision_view(
"fileset", str(revision_id), "entity_view_metadata.html"
)
@app.route("/editgroup/<editgroup_id>/fileset/<string(length=26):ident>", methods=["GET"])
-def fileset_editgroup_view(editgroup_id, ident):
+def fileset_editgroup_view(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(editgroup_id, "fileset", ident, "fileset_view.html")
@app.route(
"/editgroup/<editgroup_id>/fileset/<string(length=26):ident>/metadata", methods=["GET"]
)
-def fileset_editgroup_view_metadata(editgroup_id, ident):
+def fileset_editgroup_view_metadata(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(
editgroup_id, "fileset", ident, "entity_view_metadata.html"
)
@app.route("/webcapture/<string(length=26):ident>", methods=["GET"])
-def webcapture_view(ident):
+def webcapture_view(ident: str) -> AnyResponse:
return generic_entity_view("webcapture", ident, "webcapture_view.html")
@app.route("/webcapture_<string(length=26):ident>", methods=["GET"])
-def webcapture_underscore_view(ident):
+def webcapture_underscore_view(ident: str) -> AnyResponse:
return redirect("/webcapture/{}".format(ident))
@app.route("/webcapture/<string(length=26):ident>/metadata", methods=["GET"])
-def webcapture_view_metadata(ident):
+def webcapture_view_metadata(ident: str) -> AnyResponse:
return generic_entity_view("webcapture", ident, "entity_view_metadata.html")
@app.route("/webcapture/rev/<uuid:revision_id>", methods=["GET"])
-def webcapture_revision_view(revision_id):
+def webcapture_revision_view(revision_id: str) -> AnyResponse:
return generic_entity_revision_view("webcapture", str(revision_id), "webcapture_view.html")
@app.route("/webcapture/rev/<uuid:revision_id>/metadata", methods=["GET"])
-def webcapture_revision_view_metadata(revision_id):
+def webcapture_revision_view_metadata(revision_id: str) -> AnyResponse:
return generic_entity_revision_view(
"webcapture", str(revision_id), "entity_view_metadata.html"
)
@app.route("/editgroup/<editgroup_id>/webcapture/<string(length=26):ident>", methods=["GET"])
-def webcapture_editgroup_view(editgroup_id, ident):
+def webcapture_editgroup_view(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(
editgroup_id, "webcapture", ident, "webcapture_view.html"
)
@@ -527,72 +534,72 @@ def webcapture_editgroup_view(editgroup_id, ident):
@app.route(
"/editgroup/<editgroup_id>/webcapture/<string(length=26):ident>/metadata", methods=["GET"]
)
-def webcapture_editgroup_view_metadata(editgroup_id, ident):
+def webcapture_editgroup_view_metadata(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(
editgroup_id, "webcapture", ident, "entity_view_metadata.html"
)
@app.route("/release/<string(length=26):ident>", methods=["GET"])
-def release_view(ident):
+def release_view(ident: str) -> AnyResponse:
return generic_entity_view("release", ident, "release_view.html")
@app.route("/release_<string(length=26):ident>", methods=["GET"])
-def release_underscore_view(ident):
+def release_underscore_view(ident: str) -> AnyResponse:
return redirect("/release/{}".format(ident))
@app.route("/release/<string(length=26):ident>/contribs", methods=["GET"])
-def release_view_contribs(ident):
+def release_view_contribs(ident: str) -> AnyResponse:
return generic_entity_view("release", ident, "release_view_contribs.html")
@app.route("/release/<string(length=26):ident>/references", methods=["GET"])
-def release_view_references(ident):
+def release_view_references(ident: str) -> AnyResponse:
return generic_entity_view("release", ident, "release_view_references.html")
@app.route("/release/<string(length=26):ident>/metadata", methods=["GET"])
-def release_view_metadata(ident):
+def release_view_metadata(ident: str) -> AnyResponse:
return generic_entity_view("release", ident, "entity_view_metadata.html")
@app.route("/release/rev/<uuid:revision_id>", methods=["GET"])
-def release_revision_view(revision_id):
+def release_revision_view(revision_id: str) -> AnyResponse:
return generic_entity_revision_view("release", str(revision_id), "release_view.html")
@app.route("/release/rev/<uuid:revision_id>/contribs", methods=["GET"])
-def release_revision_view_contribs(revision_id):
+def release_revision_view_contribs(revision_id: str) -> AnyResponse:
return generic_entity_revision_view(
"release", str(revision_id), "release_view_contribs.html"
)
@app.route("/release/rev/<uuid:revision_id>/references", methods=["GET"])
-def release_revision_view_references(revision_id):
+def release_revision_view_references(revision_id: str) -> AnyResponse:
return generic_entity_revision_view(
"release", str(revision_id), "release_view_references.html"
)
@app.route("/release/rev/<uuid:revision_id>/metadata", methods=["GET"])
-def release_revision_view_metadata(revision_id):
+def release_revision_view_metadata(revision_id: str) -> AnyResponse:
return generic_entity_revision_view(
"release", str(revision_id), "entity_view_metadata.html"
)
@app.route("/editgroup/<editgroup_id>/release/<string(length=26):ident>", methods=["GET"])
-def release_editgroup_view(editgroup_id, ident):
+def release_editgroup_view(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(editgroup_id, "release", ident, "release_view.html")
@app.route(
"/editgroup/<editgroup_id>/release/<string(length=26):ident>/contribs", methods=["GET"]
)
-def release_editgroup_view_contribs(editgroup_id, ident):
+def release_editgroup_view_contribs(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(
editgroup_id, "release", ident, "release_view_contribs.html"
)
@@ -601,7 +608,7 @@ def release_editgroup_view_contribs(editgroup_id, ident):
@app.route(
"/editgroup/<editgroup_id>/release/<string(length=26):ident>/references", methods=["GET"]
)
-def release_editgroup_view_references(editgroup_id, ident):
+def release_editgroup_view_references(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(
editgroup_id, "release", ident, "release_view_references.html"
)
@@ -610,44 +617,44 @@ def release_editgroup_view_references(editgroup_id, ident):
@app.route(
"/editgroup/<editgroup_id>/release/<string(length=26):ident>/metadata", methods=["GET"]
)
-def release_editgroup_view_metadata(editgroup_id, ident):
+def release_editgroup_view_metadata(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(
editgroup_id, "release", ident, "entity_view_metadata.html"
)
@app.route("/work/<string(length=26):ident>", methods=["GET"])
-def work_view(ident):
+def work_view(ident: str) -> AnyResponse:
return generic_entity_view("work", ident, "work_view.html")
@app.route("/work_<string(length=26):ident>", methods=["GET"])
-def work_underscore_view(ident):
+def work_underscore_view(ident: str) -> AnyResponse:
return redirect("/work/{}".format(ident))
@app.route("/work/<string(length=26):ident>/metadata", methods=["GET"])
-def work_view_metadata(ident):
+def work_view_metadata(ident: str) -> AnyResponse:
return generic_entity_view("work", ident, "entity_view_metadata.html")
@app.route("/work/rev/<uuid:revision_id>", methods=["GET"])
-def work_revision_view(revision_id):
+def work_revision_view(revision_id: str) -> AnyResponse:
return generic_entity_revision_view("work", str(revision_id), "work_view.html")
@app.route("/work/rev/<uuid:revision_id>/metadata", methods=["GET"])
-def work_revision_view_metadata(revision_id):
+def work_revision_view_metadata(revision_id: str) -> AnyResponse:
return generic_entity_revision_view("work", str(revision_id), "entity_view_metadata.html")
@app.route("/editgroup/<editgroup_id>/work/<string(length=26):ident>", methods=["GET"])
-def work_editgroup_view(editgroup_id, ident):
+def work_editgroup_view(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(editgroup_id, "work", ident, "work_view.html")
@app.route("/editgroup/<editgroup_id>/work/<string(length=26):ident>/metadata", methods=["GET"])
-def work_editgroup_view_metadata(editgroup_id, ident):
+def work_editgroup_view_metadata(editgroup_id: str, ident: str) -> AnyResponse:
return generic_editgroup_entity_view(
editgroup_id, "work", ident, "entity_view_metadata.html"
)
@@ -657,7 +664,7 @@ def work_editgroup_view_metadata(editgroup_id, ident):
@app.route("/editgroup/<string(length=26):ident>", methods=["GET"])
-def editgroup_view(ident):
+def editgroup_view(ident: str) -> AnyResponse:
try:
eg = api.get_editgroup(str(ident))
eg.editor = api.get_editor(eg.editor_id)
@@ -684,7 +691,7 @@ def editgroup_view(ident):
@app.route("/editgroup/<string(length=26):ident>/annotation", methods=["POST"])
@login_required
-def editgroup_create_annotation(ident):
+def editgroup_create_annotation(ident: str) -> AnyResponse:
if not app.testing:
app.csrf.protect()
comment_markdown = request.form.get("comment_markdown")
@@ -710,7 +717,7 @@ def editgroup_create_annotation(ident):
@app.route("/editgroup/<string(length=26):ident>/accept", methods=["POST"])
@login_required
-def editgroup_accept(ident):
+def editgroup_accept(ident: str) -> AnyResponse:
if not app.testing:
app.csrf.protect()
# on behalf of user...
@@ -728,7 +735,7 @@ def editgroup_accept(ident):
@app.route("/editgroup/<string(length=26):ident>/unsubmit", methods=["POST"])
@login_required
-def editgroup_unsubmit(ident):
+def editgroup_unsubmit(ident: str) -> AnyResponse:
if not app.testing:
app.csrf.protect()
# on behalf of user...
@@ -746,7 +753,7 @@ def editgroup_unsubmit(ident):
@app.route("/editgroup/<string(length=26):ident>/submit", methods=["POST"])
@login_required
-def editgroup_submit(ident):
+def editgroup_submit(ident: str) -> AnyResponse:
if not app.testing:
app.csrf.protect()
# on behalf of user...
@@ -763,7 +770,7 @@ def editgroup_submit(ident):
@app.route("/editor/<string(length=26):ident>", methods=["GET"])
-def editor_view(ident):
+def editor_view(ident: str) -> AnyResponse:
try:
entity = api.get_editor(ident)
except ApiException as ae:
@@ -772,7 +779,7 @@ def editor_view(ident):
@app.route("/editor/<string(length=26):ident>/editgroups", methods=["GET"])
-def editor_editgroups(ident):
+def editor_editgroups(ident: str) -> AnyResponse:
try:
editor = api.get_editor(ident)
editgroups = api.get_editor_editgroups(ident, limit=50)
@@ -785,7 +792,7 @@ def editor_editgroups(ident):
@app.route("/editor/<string(length=26):ident>/annotations", methods=["GET"])
-def editor_annotations(ident):
+def editor_annotations(ident: str) -> AnyResponse:
try:
editor = api.get_editor(ident)
annotations = api.get_editor_annotations(ident, limit=50)
@@ -795,7 +802,7 @@ def editor_annotations(ident):
@app.route("/u/<string:username>", methods=["GET", "HEAD"])
-def editor_username_redirect(username):
+def editor_username_redirect(username: str) -> AnyResponse:
try:
editor = api.lookup_editor(username=username)
except ApiException as ae:
@@ -804,7 +811,7 @@ def editor_username_redirect(username):
@app.route("/changelog", methods=["GET"])
-def changelog_view():
+def changelog_view() -> AnyResponse:
try:
# limit = int(request.args.get('limit', 10))
entries = api.get_changelog() # TODO: expand="editors"
@@ -814,7 +821,7 @@ def changelog_view():
@app.route("/changelog/<int:index>", methods=["GET"])
-def changelog_entry_view(index):
+def changelog_entry_view(index: int) -> AnyResponse:
try:
entry = api.get_changelog_entry(int(index))
entry.editgroup.editor = api.get_editor(entry.editgroup.editor_id)
@@ -827,7 +834,7 @@ def changelog_entry_view(index):
@app.route("/reviewable", methods=["GET"])
-def reviewable_view():
+def reviewable_view() -> AnyResponse:
try:
# limit = int(request.args.get('limit', 10))
entries = api.get_editgroups_reviewable(expand="editors")
@@ -837,7 +844,7 @@ def reviewable_view():
@app.route("/release/<string(length=26):ident>/save", methods=["GET", "POST"])
-def release_save(ident):
+def release_save(ident: str) -> AnyResponse:
form = SavePaperNowForm()
@@ -902,7 +909,7 @@ def release_save(ident):
@app.route("/search", methods=["GET", "POST"])
-def generic_search():
+def generic_search() -> AnyResponse:
if "q" not in request.args.keys():
return redirect("/release/search")
query = request.args.get("q").strip()
@@ -932,7 +939,7 @@ def generic_search():
@app.route("/release/search", methods=["GET", "POST"])
-def release_search():
+def release_search() -> AnyResponse:
if "q" not in request.args.keys():
return render_template("release_search.html", query=ReleaseQuery(), found=None)
@@ -960,7 +967,7 @@ def release_search():
@app.route("/container/search", methods=["GET", "POST"])
-def container_search():
+def container_search() -> AnyResponse:
if "q" not in request.args.keys():
return render_template("container_search.html", query=GenericQuery(), found=None)
@@ -977,7 +984,7 @@ def container_search():
@app.route("/coverage/search", methods=["GET", "POST"])
-def coverage_search():
+def coverage_search() -> AnyResponse:
if "q" not in request.args.keys():
return render_template(
@@ -1032,7 +1039,7 @@ def coverage_search():
)
-def get_changelog_stats():
+def get_changelog_stats() -> Dict[str, Any]:
stats = {}
latest_changelog = api.get_changelog(limit=1)[0]
stats["changelog"] = {
@@ -1045,7 +1052,7 @@ def get_changelog_stats():
@app.route("/stats", methods=["GET"])
-def stats_page():
+def stats_page() -> AnyResponse:
try:
stats = get_elastic_entity_stats()
stats.update(get_changelog_stats())
@@ -1060,7 +1067,7 @@ def stats_page():
@app.route("/stats.json", methods=["GET", "OPTIONS"])
@crossdomain(origin="*", headers=["access-control-allow-origin", "Content-Type"])
-def stats_json():
+def stats_json() -> AnyResponse:
try:
stats = get_elastic_entity_stats()
stats.update(get_changelog_stats())
@@ -1072,7 +1079,7 @@ def stats_json():
@app.route("/container/issnl/<issnl>/stats.json", methods=["GET", "OPTIONS"])
@crossdomain(origin="*", headers=["access-control-allow-origin", "Content-Type"])
-def container_issnl_stats(issnl):
+def container_issnl_stats(issnl: str) -> AnyResponse:
if not (len(issnl) == 9 and issnl[4] == "-"):
abort(400, "Not a valid ISSN-L: {}".format(issnl))
try:
@@ -1089,7 +1096,7 @@ def container_issnl_stats(issnl):
@app.route("/container/<string(length=26):ident>/stats.json", methods=["GET", "OPTIONS"])
@crossdomain(origin="*", headers=["access-control-allow-origin", "Content-Type"])
-def container_ident_stats(ident):
+def container_ident_stats(ident: str) -> AnyResponse:
try:
container = api.get_container(ident)
except ApiException as ae:
@@ -1106,7 +1113,7 @@ def container_ident_stats(ident):
"/container/<string(length=26):ident>/ia_coverage_years.json", methods=["GET", "OPTIONS"]
)
@crossdomain(origin="*", headers=["access-control-allow-origin", "Content-Type"])
-def container_ident_ia_coverage_years_json(ident):
+def container_ident_ia_coverage_years_json(ident: str) -> AnyResponse:
try:
container = api.get_container(ident)
except ApiException as ae:
@@ -1124,7 +1131,7 @@ def container_ident_ia_coverage_years_json(ident):
"/container/<string(length=26):ident>/ia_coverage_years.svg", methods=["GET", "OPTIONS"]
)
@crossdomain(origin="*", headers=["access-control-allow-origin", "Content-Type"])
-def container_ident_ia_coverage_years_svg(ident):
+def container_ident_ia_coverage_years_svg(ident: str) -> AnyResponse:
try:
container = api.get_container(ident)
except ApiException as ae:
@@ -1141,7 +1148,7 @@ def container_ident_ia_coverage_years_svg(ident):
"/container/<string(length=26):ident>/preservation_by_year.json", methods=["GET", "OPTIONS"]
)
@crossdomain(origin="*", headers=["access-control-allow-origin", "Content-Type"])
-def container_ident_preservation_by_year_json(ident):
+def container_ident_preservation_by_year_json(ident: str) -> AnyResponse:
try:
container = api.get_container(ident)
except ApiException as ae:
@@ -1159,7 +1166,7 @@ def container_ident_preservation_by_year_json(ident):
"/container/<string(length=26):ident>/preservation_by_year.svg", methods=["GET", "OPTIONS"]
)
@crossdomain(origin="*", headers=["access-control-allow-origin", "Content-Type"])
-def container_ident_preservation_by_year_svg(ident):
+def container_ident_preservation_by_year_svg(ident: str) -> AnyResponse:
try:
container = api.get_container(ident)
except ApiException as ae:
@@ -1181,7 +1188,7 @@ def container_ident_preservation_by_year_svg(ident):
methods=["GET", "OPTIONS"],
)
@crossdomain(origin="*", headers=["access-control-allow-origin", "Content-Type"])
-def container_ident_preservation_by_volume_json(ident):
+def container_ident_preservation_by_volume_json(ident: str) -> AnyResponse:
try:
container = api.get_container(ident)
except ApiException as ae:
@@ -1199,7 +1206,7 @@ def container_ident_preservation_by_volume_json(ident):
methods=["GET", "OPTIONS"],
)
@crossdomain(origin="*", headers=["access-control-allow-origin", "Content-Type"])
-def container_ident_preservation_by_volume_svg(ident):
+def container_ident_preservation_by_volume_svg(ident: str) -> AnyResponse:
try:
container = api.get_container(ident)
except ApiException as ae:
@@ -1216,7 +1223,7 @@ def container_ident_preservation_by_volume_svg(ident):
@app.route("/release/<string(length=26):ident>.bib", methods=["GET"])
-def release_bibtex(ident):
+def release_bibtex(ident: str) -> AnyResponse:
try:
entity = api.get_release(ident)
except ApiException as ae:
@@ -1227,7 +1234,7 @@ def release_bibtex(ident):
@app.route("/release/<string(length=26):ident>/citeproc", methods=["GET"])
-def release_citeproc(ident):
+def release_citeproc(ident: str) -> AnyResponse:
style = request.args.get("style", "harvard1")
is_html = request.args.get("html", False)
if is_html and is_html.lower() in ("yes", "1", "true", "y", "t"):
@@ -1254,7 +1261,7 @@ def release_citeproc(ident):
@app.route("/health.json", methods=["GET", "OPTIONS"])
@crossdomain(origin="*", headers=["access-control-allow-origin", "Content-Type"])
-def health_json():
+def health_json() -> AnyResponse:
return jsonify({"ok": True})
@@ -1262,7 +1269,7 @@ def health_json():
@app.route("/auth/login")
-def login():
+def login() -> AnyResponse:
# show the user a list of login options
if not priv_api:
app.log.warn(
@@ -1272,7 +1279,7 @@ def login():
@app.route("/auth/ia/login", methods=["GET", "POST"])
-def ia_xauth_login():
+def ia_xauth_login() -> AnyResponse:
if "email" in request.form:
# if a login attempt...
return handle_ia_xauth(request.form.get("email"), request.form.get("password"))
@@ -1281,7 +1288,7 @@ def ia_xauth_login():
@app.route("/auth/token_login", methods=["GET", "POST"])
-def token_login():
+def token_login() -> AnyResponse:
# show the user a list of login options
if "token" in request.args:
return handle_token_login(request.args.get("token"))
@@ -1292,7 +1299,7 @@ def token_login():
@app.route("/auth/change_username", methods=["POST"])
@login_required
-def change_username():
+def change_username() -> AnyResponse:
if not app.testing:
app.csrf.protect()
# show the user a list of login options
@@ -1315,7 +1322,7 @@ def change_username():
@app.route("/auth/create_token", methods=["POST"])
@login_required
-def create_auth_token():
+def create_auth_token() -> AnyResponse:
if not app.testing:
app.csrf.protect()
@@ -1346,14 +1353,14 @@ def create_auth_token():
@app.route("/auth/logout")
-def logout():
+def logout() -> AnyResponse:
handle_logout()
return render_template("auth_logout.html")
@app.route("/auth/account")
@login_required
-def auth_account():
+def auth_account() -> AnyResponse:
# auth check on account page
user_api = auth_api(session["api_token"])
resp = user_api.auth_check()
@@ -1365,7 +1372,7 @@ def auth_account():
@app.route("/auth/wikipedia/auth")
-def wp_oauth_rewrite():
+def wp_oauth_rewrite() -> AnyResponse:
"""
This is a dirty hack to rewrite '/auth/wikipedia/auth' to '/auth/wikipedia/oauth-callback'
"""
@@ -1376,7 +1383,7 @@ def wp_oauth_rewrite():
@app.route("/auth/wikipedia/finish-login")
-def wp_oauth_finish_login():
+def wp_oauth_finish_login() -> AnyResponse:
wp_username = mwoauth.get_current_user(cached=True)
assert wp_username
return handle_wmoauth(wp_username)
@@ -1386,33 +1393,33 @@ def wp_oauth_finish_login():
@app.errorhandler(404)
-def page_not_found(e):
+def page_not_found(e: Exception) -> AnyResponse:
return render_template("404.html"), 404
@app.errorhandler(401)
@app.errorhandler(403)
-def page_not_authorized(e):
+def page_not_authorized(e: Exception) -> AnyResponse:
return render_template("403.html"), 403
@app.errorhandler(405)
-def page_method_not_allowed(e):
+def page_method_not_allowed(e: Exception) -> AnyResponse:
return render_template("405.html"), 405
@app.errorhandler(400)
-def page_bad_request(e):
+def page_bad_request(e: Exception) -> AnyResponse:
return render_template("400.html", err=e), 400
@app.errorhandler(409)
-def page_edit_conflict(e):
+def page_edit_conflict(e: Exception) -> AnyResponse:
return render_template("409.html"), 409
@app.errorhandler(500)
-def page_server_error(e):
+def page_server_error(e: Exception) -> AnyResponse:
app.log.error(e)
return render_template("500.html"), 500
@@ -1420,13 +1427,13 @@ def page_server_error(e):
@app.errorhandler(502)
@app.errorhandler(503)
@app.errorhandler(504)
-def page_server_down(e):
+def page_server_down(e: Exception) -> AnyResponse:
app.log.error(e)
return render_template("503.html"), 503
@app.errorhandler(ApiException)
-def page_fatcat_api_error(ae):
+def page_fatcat_api_error(ae: ApiException) -> AnyResponse:
"""
Generic error handler for fatcat API problems. With this error handler,
don't need to explicitly catch API exceptions: they should get caught and
@@ -1450,7 +1457,7 @@ def page_fatcat_api_error(ae):
@app.errorhandler(ApiValueError)
-def page_fatcat_api_value_error(ae):
+def page_fatcat_api_value_error(ae: ApiValueError) -> AnyResponse:
ae.status = 400
ae.error_name = "ValueError"
ae.message = str(ae)
@@ -1458,27 +1465,27 @@ def page_fatcat_api_value_error(ae):
@app.errorhandler(CSRFError)
-def page_csrf_error(e):
+def page_csrf_error(e: CSRFError) -> AnyResponse:
return render_template("csrf_error.html", reason=e.description), 400
@app.route("/", methods=["GET"])
-def page_home():
+def page_home() -> AnyResponse:
return render_template("home.html")
@app.route("/about", methods=["GET"])
-def page_about():
+def page_about() -> AnyResponse:
return render_template("about.html")
@app.route("/rfc", methods=["GET"])
-def page_rfc():
+def page_rfc() -> AnyResponse:
return render_template("rfc.html")
@app.route("/robots.txt", methods=["GET"])
-def page_robots_txt():
+def page_robots_txt() -> AnyResponse:
if app.config["FATCAT_DOMAIN"] == "fatcat.wiki":
robots_path = "robots.txt"
else:
@@ -1489,7 +1496,7 @@ def page_robots_txt():
@app.route("/sitemap.xml", methods=["GET"])
-def page_sitemap_xml():
+def page_sitemap_xml() -> AnyResponse:
return send_from_directory(
os.path.join(app.root_path, "static"), "sitemap.xml", mimetype="text/xml"
)