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
7class JsonDataView(BaseView):
8 name = "json_data"
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
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 )
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 )
43class PatternPortfolioView(BaseView):
44 name = "patterns"
46 def __init__(self, datasette):
47 self.ds = datasette
49 async def get(self, request):
50 await self.check_permission(request, "view-instance")
51 return await self.render(["patterns.html"], request=request)
54class AuthTokenView(BaseView):
55 name = "auth_token"
57 def __init__(self, datasette):
58 self.ds = datasette
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)
75class PermissionsDebugView(BaseView):
76 name = "permissions_debug"
78 def __init__(self, datasette):
79 self.ds = datasette
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 )
92class MessagesDebugView(BaseView):
93 name = "messages_debug"
95 def __init__(self, datasette):
96 self.ds = datasette
98 async def get(self, request):
99 await self.check_permission(request, "view-instance")
100 return await self.render(["messages_debug.html"], request)
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("/")