2
2
3
3
import datetime
4
4
import logging
5
- from pathlib import Path
6
5
from typing import Dict , Final , List , Optional
7
6
from uuid import UUID
8
7
9
8
import pandas as pd
10
9
import plotly .express as px
11
10
from fastapi import APIRouter , Depends , HTTPException , Request
12
- from fastapi .templating import Jinja2Templates
13
11
from fastapimsal import RequiresLoginException , UserIdentityToken
12
+ from jinja2 import Environment , PackageLoader , select_autoescape
14
13
from jose import jwt
15
14
from pydantic import BaseModel , EmailStr , ValidationError
16
- from starlette .templating import _TemplateResponse
15
+ from starlette .templating import Jinja2Templates , _TemplateResponse
17
16
18
17
from rctab .constants import __version__
19
18
from rctab .crud .auth import check_user_access , user_authenticated_no_error
39
38
40
39
logger = logging .getLogger (__name__ )
41
40
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 )
45
43
router = APIRouter ()
46
44
47
45
BETA_ACCESS = False
@@ -115,9 +113,9 @@ async def home(
115
113
settings = get_settings ()
116
114
if not user :
117
115
return templates .TemplateResponse (
118
- "index.html" ,
119
- {
120
- "request" : request ,
116
+ request = request ,
117
+ name = "index.html" ,
118
+ context = {
121
119
"version" : __version__ ,
122
120
"organisation" : settings .organisation ,
123
121
"current_year" : datetime .date .today ().year ,
@@ -148,9 +146,9 @@ async def home(
148
146
# If we're in Beta release mode, only users with 'has_access' can access
149
147
if BETA_ACCESS and (not access_status .has_access ):
150
148
return templates .TemplateResponse (
151
- "index.html" ,
152
- {
153
- "request" : request ,
149
+ request = request ,
150
+ name = "index.html" ,
151
+ context = {
154
152
"version" : __version__ ,
155
153
"current_year" : datetime .date .today ().year ,
156
154
},
@@ -180,9 +178,9 @@ async def home(
180
178
subscriptions_with_access .append (sub )
181
179
break
182
180
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 = {
186
184
"name" : user_name ,
187
185
"version" : __version__ ,
188
186
"has_access" : access_to_span (access_status .has_access ),
@@ -202,7 +200,7 @@ async def subscription_details(
202
200
) -> _TemplateResponse :
203
201
"""The subscription details page."""
204
202
if not user :
205
- return templates .TemplateResponse ("index.html" , { "request" : request } )
203
+ return templates .TemplateResponse (request = request , name = "index.html" )
206
204
207
205
# Get the username from cached token
208
206
user_name = jwt .get_unverified_claims (user .token ["access_token" ])["name" ]
@@ -299,9 +297,9 @@ async def subscription_details(
299
297
# pylint: enable=line-too-long
300
298
301
299
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 = {
305
303
"name" : user_name ,
306
304
"version" : __version__ ,
307
305
"has_access" : access_to_span (access_status .has_access ),
@@ -328,7 +326,7 @@ async def subscription_details_1(
328
326
) -> _TemplateResponse :
329
327
"""Get html for the usage tab of the details page."""
330
328
if not user :
331
- return templates .TemplateResponse ("index.html" , { "request" : request } )
329
+ return templates .TemplateResponse (request = request , name = "index.html" )
332
330
333
331
# Get the username from cached token
334
332
# user_name = jwt.get_unverified_claims(user.token["access_token"])["name"]
@@ -363,9 +361,9 @@ async def subscription_details_1(
363
361
timeperiod = datetime .datetime .strptime (timeperiodstr , "%Y-%m-%d" )
364
362
except ValueError :
365
363
return templates .TemplateResponse (
366
- "azure_usage_info.html" ,
367
- {
368
- "request" : request ,
364
+ request = request ,
365
+ name = "azure_usage_info.html" ,
366
+ context = {
369
367
"cost_breakdown" : None ,
370
368
},
371
369
)
@@ -397,9 +395,9 @@ async def subscription_details_1(
397
395
"<div>" , '<div class="usageFigure">'
398
396
)
399
397
return templates .TemplateResponse (
400
- "azure_usage_info.html" ,
401
- {
402
- "request" : request ,
398
+ request = request ,
399
+ name = "azure_usage_info.html" ,
400
+ context = {
403
401
"cost_breakdown" : cost_breakdown ,
404
402
"all_usage" : all_usage ,
405
403
"time_frame_start" : time_frame_start ,
0 commit comments