Skip to content

Commit d1fba77

Browse files
committed
Fix deprecation warnings from Jinja
1 parent aa2eda1 commit d1fba77

File tree

2 files changed

+34
-32
lines changed

2 files changed

+34
-32
lines changed

rctab/routers/frontend.py

+24-26
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@
22

33
import datetime
44
import logging
5-
from pathlib import Path
65
from typing import Dict, Final, List, Optional
76
from uuid import UUID
87

98
import pandas as pd
109
import plotly.express as px
1110
from fastapi import APIRouter, Depends, HTTPException, Request
12-
from fastapi.templating import Jinja2Templates
1311
from fastapimsal import RequiresLoginException, UserIdentityToken
12+
from jinja2 import Environment, PackageLoader, select_autoescape
1413
from jose import jwt
1514
from pydantic import BaseModel, EmailStr, ValidationError
16-
from starlette.templating import _TemplateResponse
15+
from starlette.templating import Jinja2Templates, _TemplateResponse
1716

1817
from rctab.constants import __version__
1918
from rctab.crud.auth import check_user_access, user_authenticated_no_error
@@ -39,9 +38,8 @@
3938

4039
logger = logging.getLogger(__name__)
4140

42-
templates = Jinja2Templates(
43-
directory=str((Path(__file__).parent.parent / "templates").absolute())
44-
)
41+
jinja_env = Environment(loader=PackageLoader("rctab"), autoescape=select_autoescape())
42+
templates = Jinja2Templates(env=jinja_env)
4543
router = APIRouter()
4644

4745
BETA_ACCESS = False
@@ -115,9 +113,9 @@ async def home(
115113
settings = get_settings()
116114
if not user:
117115
return templates.TemplateResponse(
118-
"index.html",
119-
{
120-
"request": request,
116+
request=request,
117+
name="index.html",
118+
context={
121119
"version": __version__,
122120
"organisation": settings.organisation,
123121
"current_year": datetime.date.today().year,
@@ -148,9 +146,9 @@ async def home(
148146
# If we're in Beta release mode, only users with 'has_access' can access
149147
if BETA_ACCESS and (not access_status.has_access):
150148
return templates.TemplateResponse(
151-
"index.html",
152-
{
153-
"request": request,
149+
request=request,
150+
name="index.html",
151+
context={
154152
"version": __version__,
155153
"current_year": datetime.date.today().year,
156154
},
@@ -180,9 +178,9 @@ async def home(
180178
subscriptions_with_access.append(sub)
181179
break
182180
return templates.TemplateResponse(
183-
"signed_in_azure_info.html",
184-
{
185-
"request": request,
181+
request=request,
182+
name="signed_in_azure_info.html",
183+
context={
186184
"name": user_name,
187185
"version": __version__,
188186
"has_access": access_to_span(access_status.has_access),
@@ -202,7 +200,7 @@ async def subscription_details(
202200
) -> _TemplateResponse:
203201
"""The subscription details page."""
204202
if not user:
205-
return templates.TemplateResponse("index.html", {"request": request})
203+
return templates.TemplateResponse(request=request, name="index.html")
206204

207205
# Get the username from cached token
208206
user_name = jwt.get_unverified_claims(user.token["access_token"])["name"]
@@ -299,9 +297,9 @@ async def subscription_details(
299297
# pylint: enable=line-too-long
300298

301299
return templates.TemplateResponse(
302-
"signed_in_azure_info_details.html",
303-
{
304-
"request": request,
300+
request=request,
301+
name="signed_in_azure_info_details.html",
302+
context={
305303
"name": user_name,
306304
"version": __version__,
307305
"has_access": access_to_span(access_status.has_access),
@@ -328,7 +326,7 @@ async def subscription_details_1(
328326
) -> _TemplateResponse:
329327
"""Get html for the usage tab of the details page."""
330328
if not user:
331-
return templates.TemplateResponse("index.html", {"request": request})
329+
return templates.TemplateResponse(request=request, name="index.html")
332330

333331
# Get the username from cached token
334332
# user_name = jwt.get_unverified_claims(user.token["access_token"])["name"]
@@ -363,9 +361,9 @@ async def subscription_details_1(
363361
timeperiod = datetime.datetime.strptime(timeperiodstr, "%Y-%m-%d")
364362
except ValueError:
365363
return templates.TemplateResponse(
366-
"azure_usage_info.html",
367-
{
368-
"request": request,
364+
request=request,
365+
name="azure_usage_info.html",
366+
context={
369367
"cost_breakdown": None,
370368
},
371369
)
@@ -397,9 +395,9 @@ async def subscription_details_1(
397395
"<div>", '<div class="usageFigure">'
398396
)
399397
return templates.TemplateResponse(
400-
"azure_usage_info.html",
401-
{
402-
"request": request,
398+
request=request,
399+
name="azure_usage_info.html",
400+
context={
403401
"cost_breakdown": cost_breakdown,
404402
"all_usage": all_usage,
405403
"time_frame_start": time_frame_start,

tests/test_routes/test_frontend.py

+10-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from databases import Database
99
from fastapi import HTTPException
1010
from fastapi.templating import Jinja2Templates
11-
from jinja2 import StrictUndefined
11+
from jinja2 import Environment, PackageLoader, StrictUndefined, select_autoescape
1212
from pytest_mock import MockerFixture
1313

1414
import rctab
@@ -95,7 +95,10 @@ async def test_no_username_no_subscriptions(
9595
await home(mock_request, mock_user)
9696

9797
# Check that no subscriptions are passed to the template
98-
assert mock_templates.TemplateResponse.call_args.args[1]["azure_sub_data"] == []
98+
assert (
99+
mock_templates.TemplateResponse.call_args.kwargs["context"]["azure_sub_data"]
100+
== []
101+
)
99102

100103

101104
@pytest.mark.asyncio
@@ -129,10 +132,11 @@ async def test_render_home_page(mocker: MockerFixture, test_db: Database) -> Non
129132
mocker.patch(
130133
"rctab.routers.frontend.templates",
131134
Jinja2Templates(
132-
(
133-
Path(rctab.routers.frontend.__file__).parent.parent / "templates"
134-
).absolute(),
135-
undefined=StrictUndefined,
135+
env=Environment(
136+
loader=PackageLoader("rctab"),
137+
autoescape=select_autoescape(),
138+
undefined=StrictUndefined,
139+
)
136140
),
137141
)
138142
subscription_id = UUID(int=random.randint(0, (2**32) - 1))

0 commit comments

Comments
 (0)