Coverage for /usr/lib/python3.10/site-packages/hyd/backend/frontend.py: 68%
37 statements
« prev ^ index » next coverage.py v7.0.3, created at 2023-02-06 00:31 +0000
« prev ^ index » next coverage.py v7.0.3, created at 2023-02-06 00:31 +0000
1from fastapi import APIRouter, Depends, Request
2from fastapi.responses import HTMLResponse
3from fastapi.templating import Jinja2Templates
4from sqlalchemy.orm import Session
6import hyd.backend.project.service as project_service
7from hyd.backend.db import get_db
8from hyd.backend.project.models import ProjectEntry
9from hyd.backend.tag.models import TagEntry
10from hyd.backend.util.const import (
11 HTML_TITLE,
12 LINK_HOSTED_BY,
13 LINK_IMPRESS,
14 LINK_PRIVACY,
15 NAME_HOSTED_BY,
16 ROOT_PATH,
17 TEMPLATE_PATH,
18)
19from hyd.backend.util.logger import HydLogger
20from hyd.backend.util.models import NameStr
21from hyd.backend.version.models import VersionEntry
23LOGGER = HydLogger("Frontend")
25TEMPLATES = Jinja2Templates(directory=TEMPLATE_PATH)
27frontend_router = APIRouter(tags=["frontend"])
28footer_router = APIRouter(tags=["footer"])
30####################################################################################################
31#### Simple API
32####################################################################################################
35@frontend_router.get("/", response_class=HTMLResponse)
36async def frontend_simple(request: Request, db: Session = Depends(get_db)):
38 project_entries = project_service.read_projects(db=db)
40 return TEMPLATES.TemplateResponse(
41 "simple.html",
42 {
43 "request": request,
44 "html_title": HTML_TITLE,
45 "link_privacy": LINK_PRIVACY,
46 "link_impress": LINK_IMPRESS,
47 "link_hosted_by": LINK_HOSTED_BY,
48 "name_hosted_by": NAME_HOSTED_BY,
49 "projects": [entry.name for entry in project_entries],
50 },
51 )
54@frontend_router.get("/{project_name}", response_class=HTMLResponse)
55async def frontend_project(request: Request, project_name: NameStr, db: Session = Depends(get_db)):
57 project_entry = project_service.read_project_by_name(project_name=project_name, db=db)
59 return TEMPLATES.TemplateResponse(
60 "project.html",
61 {
62 "request": request,
63 "root_path": ROOT_PATH,
64 "html_title": HTML_TITLE,
65 "link_privacy": LINK_PRIVACY,
66 "link_impress": LINK_IMPRESS,
67 "link_hosted_by": LINK_HOSTED_BY,
68 "name_hosted_by": NAME_HOSTED_BY,
69 "project": _project_to_dict(project_entry),
70 },
71 )
74####################################################################################################
75#### Footer Endpoints
76####################################################################################################
79@footer_router.get("/loader.js", response_class=HTMLResponse)
80async def api_loader(
81 request: Request,
82 db: Session = Depends(get_db),
83):
85 return TEMPLATES.TemplateResponse(
86 "loader.js",
87 {
88 "request": request,
89 "root_path": ROOT_PATH,
90 "footer_content_path": "/footer/content.html",
91 },
92 )
95@footer_router.get("/content.html", response_class=HTMLResponse)
96async def api_loader(
97 request: Request,
98 project_name: str,
99 is_tag: bool,
100 tag_ver: str,
101 db: Session = Depends(get_db),
102):
103 tag_version_identifier = ("tag: " if is_tag else "version: ") + tag_ver
105 print(project_name, is_tag, tag_ver)
107 return TEMPLATES.TemplateResponse(
108 "footer.html",
109 {
110 "request": request,
111 "root_path": ROOT_PATH,
112 "link_privacy": LINK_PRIVACY,
113 "link_impress": LINK_IMPRESS,
114 "link_hosted_by": LINK_HOSTED_BY,
115 "name_hosted_by": NAME_HOSTED_BY,
116 "project_name": project_name,
117 "tag_version_identifier": tag_version_identifier,
118 },
119 )
122####################################################################################################
123#### Util
124####################################################################################################
127def _project_to_dict(project_entry: ProjectEntry) -> dict:
128 name = project_entry.name
129 tag_entries: list[TagEntry] = project_entry.tag_entries
130 version_entries: list[VersionEntry] = project_entry.version_entries
132 return {
133 "name": name,
134 "tags": [
135 {"link": f"project/{name}/t/{entry.tag}", "tag": entry.tag, "primary": entry.primary}
136 for entry in tag_entries
137 if entry.version
138 ],
139 "versions": [
140 {"link": f"project/{name}/v/{entry.version}", "version": entry.version}
141 for entry in version_entries
142 ],
143 }