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-01-05 16:38 +0000

1from fastapi import APIRouter, Depends, Request 

2from fastapi.responses import HTMLResponse 

3from fastapi.templating import Jinja2Templates 

4from sqlalchemy.orm import Session 

5 

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 

22 

23LOGGER = HydLogger("Frontend") 

24 

25TEMPLATES = Jinja2Templates(directory=TEMPLATE_PATH) 

26 

27frontend_router = APIRouter(tags=["frontend"]) 

28footer_router = APIRouter(tags=["footer"]) 

29 

30#################################################################################################### 

31#### Simple API 

32#################################################################################################### 

33 

34 

35@frontend_router.get("/", response_class=HTMLResponse) 

36async def frontend_simple(request: Request, db: Session = Depends(get_db)): 

37 

38 project_entries = project_service.read_projects(db=db) 

39 

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 ) 

52 

53 

54@frontend_router.get("/{project_name}", response_class=HTMLResponse) 

55async def frontend_project(request: Request, project_name: NameStr, db: Session = Depends(get_db)): 

56 

57 project_entry = project_service.read_project_by_name(project_name=project_name, db=db) 

58 

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 ) 

72 

73 

74#################################################################################################### 

75#### Footer Endpoints 

76#################################################################################################### 

77 

78 

79@footer_router.get("/loader.js", response_class=HTMLResponse) 

80async def api_loader( 

81 request: Request, 

82 db: Session = Depends(get_db), 

83): 

84 

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 ) 

93 

94 

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 

104 

105 print(project_name, is_tag, tag_ver) 

106 

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 ) 

120 

121 

122#################################################################################################### 

123#### Util 

124#################################################################################################### 

125 

126 

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 

131 

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 }