Skip to content

Commit d2df1eb

Browse files
committed
refactor how astro args are passed
1 parent 4a6dc71 commit d2df1eb

File tree

12 files changed

+50
-81
lines changed

12 files changed

+50
-81
lines changed

backend/conferences/admin/conference.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import json
21
from django.template.response import TemplateResponse
32
from pathlib import Path
43
from django.core.files.storage import storages
@@ -11,7 +10,6 @@
1110
from django.shortcuts import redirect, render
1211
from django.urls import path, reverse
1312
from django.utils.translation import gettext_lazy as _
14-
from django.utils.safestring import mark_safe
1513
from ordered_model.admin import (
1614
OrderedInlineModelAdminMixin,
1715
OrderedModelAdmin,
@@ -215,13 +213,9 @@ def schedule_builder(self, request, object_id):
215213
conference = Conference.objects.get(pk=object_id)
216214
context = dict(
217215
self.admin_site.each_context(request),
218-
arguments={
219-
"conference_id": object_id,
220-
"conference_code": conference.code,
221-
"breadcrumbs": mark_safe(
222-
json.dumps(self._build_schedule_builder_breadcrumbs(conference))
223-
),
224-
},
216+
conference_id=object_id,
217+
conference_code=conference.code,
218+
breadcrumbs=self._build_schedule_builder_breadcrumbs(conference),
225219
title="Schedule Builder",
226220
)
227221
return TemplateResponse(request, "astro/schedule-builder.html", context)

backend/custom_admin/src/components/invitation-letter-document-builder/local-state.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useInvitationLetterDocumentSuspenseQuery } from "./invitation-letter-do
44
import { useUpdateInvitationLetterDocumentMutation } from "./update-invitation-letter-document.generated";
55

66
import { createContext } from "react";
7+
import { getArg } from "../shared/get-arg";
78

89
type State = {
910
header: string;
@@ -160,7 +161,7 @@ const removeTypenames = (obj) => {
160161
};
161162

162163
const useLoadRemoteData = (dispatch) => {
163-
const documentId = (window as any).documentId;
164+
const documentId = getArg("document_id");
164165

165166
const { data } = useInvitationLetterDocumentSuspenseQuery({
166167
variables: {
@@ -192,7 +193,7 @@ const useSaveRemoteData = (): [(newData) => void, boolean, boolean] => {
192193
updateInvitationLetter({
193194
variables: {
194195
input: {
195-
id: (window as any).documentId,
196+
id: getArg("document_id"),
196197
dynamicDocument: newData,
197198
},
198199
},

backend/custom_admin/src/components/shared/base.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ type Props = {
1111
};
1212

1313
const client = new ApolloClient({
14-
uri: (window as any).apolloGraphQLUrl,
14+
uri: "/admin/graphql",
1515
cache: new InMemoryCache(),
1616
});
1717

backend/custom_admin/src/components/shared/django-admin-layout.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import clsx from "clsx";
22
import React, { Fragment } from "react";
3+
import { getArg } from "./get-arg";
34

45
type Breadcrumb = {
56
title: string;
@@ -11,7 +12,7 @@ type Props = {
1112
};
1213

1314
export const DjangoAdminLayout = ({ children }: Props) => {
14-
const breadcrumbs: Breadcrumb[] = JSON.parse((window as any).breadcrumbs);
15+
const breadcrumbs: Breadcrumb[] = getArg("breadcrumbs");
1516
return (
1617
<div>
1718
<Header />
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const CACHED_ARGS: Record<string, any> = {};
2+
3+
export const getArg = (arg: string) => {
4+
if (!CACHED_ARGS[arg]) {
5+
const tag = document.querySelector(`#arg-${arg}`);
6+
CACHED_ARGS[arg] = JSON.parse(tag?.innerHTML);
7+
}
8+
9+
return CACHED_ARGS[arg];
10+
};
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import { getArg } from "../shared/get-arg";
2+
13
export const useCurrentConference = (): {
24
conferenceCode: string;
35
conferenceId: string;
46
} => {
57
return {
6-
conferenceId: (window as any).conferenceId,
7-
conferenceCode: (window as any).conferenceCode,
8+
conferenceId: getArg("conference_id"),
9+
conferenceCode: getArg("conference_code"),
810
};
911
};

backend/custom_admin/src/pages/invitation-letter-document-builder.astro

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,16 @@ import { InvitationLetterDocumentBuilderRoot } from "../components/invitation-le
44
---
55
<html>
66
<head>
7-
<title>PDF Editor</title>
7+
<title>Invitation Letter Document Builder</title>
88
</head>
99

1010
<body class="text-sm">
1111
<InvitationLetterDocumentBuilderRoot client:only />
1212

13-
<script>
14-
const getArg = (name, value) => {
15-
const cleanedValue = value.replace("{" + "{ " + name + " }" + "}", "")
16-
if (cleanedValue) {
17-
return cleanedValue;
18-
}
19-
const url = new URL(window.location.href);
20-
return url.searchParams.get(name);
21-
}
13+
<Fragment set:html={`
14+
{{ document_id|json_script:"arg-document_id" }}
15+
{{ breadcrumbs|json_script:"arg-breadcrumbs" }}
16+
`} />
2217

23-
window.apolloGraphQLUrl = '/admin/graphql';
24-
window.documentId = getArg('document_id', "{{ document_id }}");
25-
window.breadcrumbs = getArg('breadcrumbs', "{{ breadcrumbs }}");
26-
</script>
2718
</body>
2819
</html>

backend/custom_admin/src/pages/schedule-builder.astro

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,11 @@ import { ScheduleBuilderRoot } from "../components/schedule-builder/root";
99
<body class="text-sm">
1010
<ScheduleBuilderRoot client:only />
1111

12-
<script>
13-
const getArg = (name, value) => {
14-
const cleanedValue = value.replace("{" + "{ " + name + " }" + "}", "")
15-
if (cleanedValue) {
16-
return cleanedValue;
17-
}
18-
const url = new URL(window.location.href);
19-
return url.searchParams.get(name);
20-
}
12+
<Fragment set:html={`
13+
{{ conference_id|json_script:"arg-conference_id" }}
14+
{{ conference_code|json_script:"arg-conference_code" }}
15+
{{ breadcrumbs|json_script:"arg-breadcrumbs" }}
16+
`} />
2117

22-
window.apolloGraphQLUrl = '/admin/graphql';
23-
window.conferenceId = getArg('conference_id', "{{ conference_id }}");
24-
window.conferenceCode = getArg('conference_code', "{{ conference_code }}");
25-
window.breadcrumbs = getArg('breadcrumbs', "{{ breadcrumbs }}");
26-
</script>
2718
</body>
2819
</html>
Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,24 @@
1+
import requests
12
from django.template import TemplateDoesNotExist
2-
from django.template.backends.django import DjangoTemplates
3-
from django.template.backends.django import reraise, Template as BaseTemplate
3+
from django.template.backends.django import (
4+
DjangoTemplates,
5+
reraise,
6+
Template as BaseTemplate,
7+
)
8+
from django.template import Template
9+
410
from django.conf import settings
5-
from urllib.parse import urlencode
611

712

813
class CustomAdminDjangoTemplate(DjangoTemplates):
914
def get_template(self, template_name):
10-
if not template_name.startswith("astro/"):
15+
if not template_name.startswith("astro/") or not settings.DEBUG:
1116
return super().get_template(template_name)
1217

13-
astro_path = template_name.split("/")[1].replace(".html", "")
14-
15-
if settings.DEBUG:
16-
template_name = "admin/iframe.html"
18+
# Proxy the request to Astro
19+
response = requests.get(f"http://127.0.0.1:8000/{template_name}")
1720

1821
try:
19-
return Template(
20-
template=self.engine.get_template(template_name),
21-
backend=self,
22-
astro_path=astro_path,
23-
)
22+
return BaseTemplate(Template(response.text), backend=self)
2423
except TemplateDoesNotExist as exc:
2524
reraise(exc, self)
26-
27-
28-
class Template(BaseTemplate):
29-
def __init__(self, astro_path: str, *args, **kwargs) -> None:
30-
super().__init__(*args, **kwargs)
31-
self.astro_path = astro_path
32-
33-
def render(self, context=None, request=None):
34-
context = {
35-
"ASTRO_PATH": self.astro_path,
36-
"ASTRO_URL_ARGS": urlencode({**context.get("arguments", {})}),
37-
**context.get("arguments", {}),
38-
}
39-
return super().render(context=context, request=request)

backend/custom_admin/urls.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from custom_admin.views import astro_proxy, DjangoAdminGraphQLView
22
from api.schema import schema
3-
from django.contrib.admin.views.decorators import staff_member_required
43
from django.views.decorators.csrf import csrf_exempt
54

65
from django.urls import path
@@ -12,5 +11,5 @@
1211
csrf_exempt(DjangoAdminGraphQLView.as_view(schema=schema)),
1312
name="django-admin-graphql",
1413
),
15-
path("astro/<path:path>", staff_member_required(astro_proxy), name="astro-proxy"),
14+
path("astro/<path:path>", astro_proxy, name="astro-proxy"),
1615
]

0 commit comments

Comments
 (0)