aboutsummaryrefslogtreecommitdiffstats
path: root/fatcat_scholar/web.py
diff options
context:
space:
mode:
Diffstat (limited to 'fatcat_scholar/web.py')
-rw-r--r--fatcat_scholar/web.py64
1 files changed, 45 insertions, 19 deletions
diff --git a/fatcat_scholar/web.py b/fatcat_scholar/web.py
index 2fd8b24..6c8a2e9 100644
--- a/fatcat_scholar/web.py
+++ b/fatcat_scholar/web.py
@@ -19,7 +19,9 @@ from fatcat_scholar.search import do_fulltext_search, FulltextQuery, FulltextHit
print(f"dynaconf settings: {settings.as_dict()}", file=sys.stderr)
I18N_LANG_TRANSLATIONS = ["de", "zh"]
-I18N_LANG_OPTIONS = I18N_LANG_TRANSLATIONS + [settings.I18N_LANG_DEFAULT,]
+I18N_LANG_OPTIONS = I18N_LANG_TRANSLATIONS + [
+ settings.I18N_LANG_DEFAULT,
+]
class LangPrefix:
@@ -32,14 +34,15 @@ class LangPrefix:
"""
def __init__(self, request: Request):
- self.prefix : str = ""
- self.code : str = settings.I18N_LANG_DEFAULT
+ self.prefix: str = ""
+ self.code: str = settings.I18N_LANG_DEFAULT
for lang_option in I18N_LANG_OPTIONS:
if request.url.path.startswith(f"/{lang_option}/"):
self.prefix = f"/{lang_option}"
self.code = lang_option
break
+
class ContentNegotiation:
"""
Choses a mimetype to return based on Accept header.
@@ -49,31 +52,40 @@ class ContentNegotiation:
def __init__(self, request: Request):
self.mimetype = "text/html"
- if request.headers.get('accept', '').startswith('application/json'):
+ if request.headers.get("accept", "").startswith("application/json"):
self.mimetype = "application/json"
+
api = APIRouter()
+
@api.get("/", operation_id="get_home")
async def home():
return {"endpoints": {"/": "this", "/search": "fulltext search"}}
+
@api.get("/search", operation_id="get_search")
async def search(query: FulltextQuery = Depends(FulltextQuery)):
return {"message": "search results would go here, I guess"}
+
web = APIRouter()
+
def locale_gettext(translations):
def gt(s):
return translations.ugettext(s)
+
return gt
+
def locale_ngettext(translations):
def ngt(s, n):
return translations.ungettext(s)
+
return ngt
+
def load_i18n_templates():
"""
This is a hack to work around lack of per-request translation
@@ -90,53 +102,68 @@ def load_i18n_templates():
d = dict()
for lang_opt in I18N_LANG_OPTIONS:
translations = babel.support.Translations.load(
- dirname="fatcat_scholar/translations",
- locales=[lang_opt],
+ dirname="fatcat_scholar/translations", locales=[lang_opt],
)
templates = Jinja2Templates(
- directory="fatcat_scholar/templates",
- extensions=["jinja2.ext.i18n"],
+ directory="fatcat_scholar/templates", extensions=["jinja2.ext.i18n"],
)
templates.env.install_gettext_translations(translations, newstyle=True)
templates.env.install_gettext_callables(
- locale_gettext(translations),
- locale_ngettext(translations),
- newstyle=True,
+ locale_gettext(translations), locale_ngettext(translations), newstyle=True,
)
# remove a lot of whitespace in HTML output with these configs
templates.env.trim_blocks = True
templates.env.istrip_blocks = True
# pass-through application settings to be available in templates
- templates.env.globals['settings'] = settings
+ templates.env.globals["settings"] = settings
d[lang_opt] = templates
return d
+
i18n_templates = load_i18n_templates()
@web.get("/", include_in_schema=False)
-async def web_home(request: Request, lang: LangPrefix = Depends(LangPrefix), content: ContentNegotiation = Depends(ContentNegotiation)):
+async def web_home(
+ request: Request,
+ lang: LangPrefix = Depends(LangPrefix),
+ content: ContentNegotiation = Depends(ContentNegotiation),
+):
if content.mimetype == "application/json":
return await home()
- return i18n_templates[lang.code].TemplateResponse("home.html", {"request": request, "locale": lang.code, "lang_prefix": lang.prefix})
+ return i18n_templates[lang.code].TemplateResponse(
+ "home.html",
+ {"request": request, "locale": lang.code, "lang_prefix": lang.prefix},
+ )
@web.get("/about", include_in_schema=False)
async def web_about(request: Request, lang: LangPrefix = Depends(LangPrefix)):
- return i18n_templates[lang.code].TemplateResponse("about.html", {"request": request, "locale": lang.code, "lang_prefix": lang.prefix})
+ return i18n_templates[lang.code].TemplateResponse(
+ "about.html",
+ {"request": request, "locale": lang.code, "lang_prefix": lang.prefix},
+ )
@web.get("/help", include_in_schema=False)
async def web_help(request: Request, lang: LangPrefix = Depends(LangPrefix)):
- return i18n_templates[lang.code].TemplateResponse("help.html", {"request": request, "locale": lang.code, "lang_prefix": lang.prefix})
+ return i18n_templates[lang.code].TemplateResponse(
+ "help.html",
+ {"request": request, "locale": lang.code, "lang_prefix": lang.prefix},
+ )
@web.get("/search", include_in_schema=False)
-async def web_search(request: Request, query: FulltextQuery = Depends(FulltextQuery), lang: LangPrefix = Depends(LangPrefix), content: ContentNegotiation = Depends(ContentNegotiation)):
+async def web_search(
+ request: Request,
+ query: FulltextQuery = Depends(FulltextQuery),
+ lang: LangPrefix = Depends(LangPrefix),
+ content: ContentNegotiation = Depends(ContentNegotiation),
+):
if content.mimetype == "application/json":
return await search(query)
- hits : Optional[FulltextHits] = None
+ hits: Optional[FulltextHits] = None
search_error: Optional[dict] = None
status_code: int = 200
if query.q is not None:
@@ -182,4 +209,3 @@ for lang_option in I18N_LANG_OPTIONS:
app.include_router(api)
app.mount("/static", StaticFiles(directory="fatcat_scholar/static"), name="static")
-