Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1import json 

2from datasette.utils.asgi import Response 

3from .base import BaseView 

4import secrets 

5 

6 

7class JsonDataView(BaseView): 

8 name = "json_data" 

9 

10 def __init__(self, datasette, filename, data_callback, needs_request=False): 

11 self.ds = datasette 

12 self.filename = filename 

13 self.data_callback = data_callback 

14 self.needs_request = needs_request 

15 

16 async def get(self, request, as_format): 

17 await self.check_permission(request, "view-instance") 

18 if self.needs_request: 

19 data = self.data_callback(request) 

20 else: 

21 data = self.data_callback() 

22 if as_format: 

23 headers = {} 

24 if self.ds.cors: 

25 headers["Access-Control-Allow-Origin"] = "*" 

26 return Response( 

27 json.dumps(data), 

28 content_type="application/json; charset=utf-8", 

29 headers=headers, 

30 ) 

31 

32 else: 

33 return await self.render( 

34 ["show_json.html"], 

35 request=request, 

36 context={ 

37 "filename": self.filename, 

38 "data_json": json.dumps(data, indent=4), 

39 }, 

40 ) 

41 

42 

43class PatternPortfolioView(BaseView): 

44 name = "patterns" 

45 

46 def __init__(self, datasette): 

47 self.ds = datasette 

48 

49 async def get(self, request): 

50 await self.check_permission(request, "view-instance") 

51 return await self.render(["patterns.html"], request=request) 

52 

53 

54class AuthTokenView(BaseView): 

55 name = "auth_token" 

56 

57 def __init__(self, datasette): 

58 self.ds = datasette 

59 

60 async def get(self, request): 

61 token = request.args.get("token") or "" 

62 if not self.ds._root_token: 

63 return Response("Root token has already been used", status=403) 

64 if secrets.compare_digest(token, self.ds._root_token): 

65 self.ds._root_token = None 

66 response = Response.redirect("/") 

67 response.set_cookie( 

68 "ds_actor", self.ds.sign({"a": {"id": "root"}}, "actor") 

69 ) 

70 return response 

71 else: 

72 return Response("Invalid token", status=403) 

73 

74 

75class PermissionsDebugView(BaseView): 

76 name = "permissions_debug" 

77 

78 def __init__(self, datasette): 

79 self.ds = datasette 

80 

81 async def get(self, request): 

82 await self.check_permission(request, "view-instance") 

83 if not await self.ds.permission_allowed(request.actor, "permissions-debug"): 

84 return Response("Permission denied", status=403) 

85 return await self.render( 

86 ["permissions_debug.html"], 

87 request, 

88 {"permission_checks": reversed(self.ds._permission_checks)}, 

89 ) 

90 

91 

92class MessagesDebugView(BaseView): 

93 name = "messages_debug" 

94 

95 def __init__(self, datasette): 

96 self.ds = datasette 

97 

98 async def get(self, request): 

99 await self.check_permission(request, "view-instance") 

100 return await self.render(["messages_debug.html"], request) 

101 

102 async def post(self, request): 

103 await self.check_permission(request, "view-instance") 

104 post = await request.post_vars() 

105 message = post.get("message", "") 

106 message_type = post.get("message_type") or "INFO" 

107 assert message_type in ("INFO", "WARNING", "ERROR", "all") 

108 datasette = self.ds 

109 if message_type == "all": 

110 datasette.add_message(request, message, datasette.INFO) 

111 datasette.add_message(request, message, datasette.WARNING) 

112 datasette.add_message(request, message, datasette.ERROR) 

113 else: 

114 datasette.add_message(request, message, getattr(datasette, message_type)) 

115 return Response.redirect("/")