aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2021-10-10 20:00:35 +0100
committerGravatar GitHub <[email protected]>2021-10-10 20:00:35 +0100
commit3f8854ebd7daa35f9e896b95efa3e4ff7d23185d (patch)
tree5842c9d3d1d366cd14794dba70412ddb5ee497fc /pydis_site
parentMerge pull request #603 from python-discord/decrease-batch-size-for-user-list... (diff)
parentUses Nightly To Download Artifacts (diff)
Merge pull request #609 from python-discord/static-previews
Static Previews
Diffstat (limited to 'pydis_site')
-rw-r--r--pydis_site/apps/content/urls.py43
-rw-r--r--pydis_site/apps/events/urls.py35
-rw-r--r--pydis_site/apps/home/urls.py6
-rw-r--r--pydis_site/apps/home/views/home.py26
-rw-r--r--pydis_site/apps/resources/urls.py22
-rw-r--r--pydis_site/settings.py21
-rw-r--r--pydis_site/urls.py11
7 files changed, 138 insertions, 26 deletions
diff --git a/pydis_site/apps/content/urls.py b/pydis_site/apps/content/urls.py
index c11b222a..fe7c2852 100644
--- a/pydis_site/apps/content/urls.py
+++ b/pydis_site/apps/content/urls.py
@@ -1,9 +1,46 @@
-from django.urls import path
+import typing
+from pathlib import Path
+
+from django_distill import distill_path
from . import views
app_name = "content"
+
+
+def __get_all_files(root: Path, folder: typing.Optional[Path] = None) -> list[str]:
+ """Find all folders and markdown files recursively starting from `root`."""
+ if not folder:
+ folder = root
+
+ results = []
+
+ for item in folder.iterdir():
+ name = item.relative_to(root).__str__().replace("\\", "/")
+
+ if item.is_dir():
+ results.append(name)
+ results.extend(__get_all_files(root, item))
+ else:
+ path, extension = name.rsplit(".", maxsplit=1)
+ if extension == "md":
+ results.append(path)
+
+ return results
+
+
+def get_all_pages() -> typing.Iterator[dict[str, str]]:
+ """Yield a dict of all pag categories."""
+ for location in __get_all_files(Path("pydis_site", "apps", "content", "resources")):
+ yield {"location": location}
+
+
urlpatterns = [
- path("", views.PageOrCategoryView.as_view(), name='pages'),
- path("<path:location>/", views.PageOrCategoryView.as_view(), name='page_category'),
+ distill_path("", views.PageOrCategoryView.as_view(), name='pages'),
+ distill_path(
+ "<path:location>/",
+ views.PageOrCategoryView.as_view(),
+ name='page_category',
+ distill_func=get_all_pages
+ ),
]
diff --git a/pydis_site/apps/events/urls.py b/pydis_site/apps/events/urls.py
index 9a65cf1f..7ea65a31 100644
--- a/pydis_site/apps/events/urls.py
+++ b/pydis_site/apps/events/urls.py
@@ -1,9 +1,38 @@
-from django.urls import path
+import typing
+from pathlib import Path
+
+from django_distill import distill_path
from pydis_site.apps.events.views import IndexView, PageView
app_name = "events"
+
+
+def __get_all_files(root: Path, folder: typing.Optional[Path] = None) -> list[str]:
+ """Find all folders and HTML files recursively starting from `root`."""
+ if not folder:
+ folder = root
+
+ results = []
+
+ for sub_folder in folder.iterdir():
+ results.append(
+ sub_folder.relative_to(root).__str__().replace("\\", "/").replace(".html", "")
+ )
+
+ if sub_folder.is_dir():
+ results.extend(__get_all_files(root, sub_folder))
+
+ return results
+
+
+def get_all_events() -> typing.Iterator[dict[str, str]]:
+ """Yield a dict of all event pages."""
+ for file in __get_all_files(Path("pydis_site", "templates", "events", "pages")):
+ yield {"path": file}
+
+
urlpatterns = [
- path("", IndexView.as_view(), name="index"),
- path("<path:path>/", PageView.as_view(), name="page"),
+ distill_path("", IndexView.as_view(), name="index"),
+ distill_path("<path:path>/", PageView.as_view(), name="page", distill_func=get_all_events),
]
diff --git a/pydis_site/apps/home/urls.py b/pydis_site/apps/home/urls.py
index 57abc942..30321ece 100644
--- a/pydis_site/apps/home/urls.py
+++ b/pydis_site/apps/home/urls.py
@@ -1,9 +1,9 @@
-from django.urls import path
+from django_distill import distill_path
from .views import HomeView, timeline
app_name = 'home'
urlpatterns = [
- path('', HomeView.as_view(), name='home'),
- path('timeline/', timeline, name="timeline"),
+ distill_path('', HomeView.as_view(), name='home'),
+ distill_path('timeline/', timeline, name="timeline"),
]
diff --git a/pydis_site/apps/home/views/home.py b/pydis_site/apps/home/views/home.py
index 401c768f..e28a3a00 100644
--- a/pydis_site/apps/home/views/home.py
+++ b/pydis_site/apps/home/views/home.py
@@ -8,6 +8,7 @@ from django.shortcuts import render
from django.utils import timezone
from django.views import View
+from pydis_site import settings
from pydis_site.apps.home.models import RepositoryMetadata
from pydis_site.constants import GITHUB_TOKEN, TIMEOUT_PERIOD
@@ -32,7 +33,10 @@ class HomeView(View):
def __init__(self):
"""Clean up stale RepositoryMetadata."""
- RepositoryMetadata.objects.exclude(repo_name__in=self.repos).delete()
+ self._static_build = settings.env("STATIC_BUILD")
+
+ if not self._static_build:
+ RepositoryMetadata.objects.exclude(repo_name__in=self.repos).delete()
# If no token is defined (for example in local development), then
# it does not make sense to pass the Authorization header. More
@@ -91,10 +95,13 @@ class HomeView(View):
def _get_repo_data(self) -> List[RepositoryMetadata]:
"""Build a list of RepositoryMetadata objects that we can use to populate the front page."""
# First off, load the timestamp of the least recently updated entry.
- last_update = (
- RepositoryMetadata.objects.values_list("last_updated", flat=True)
- .order_by("last_updated").first()
- )
+ if self._static_build:
+ last_update = None
+ else:
+ last_update = (
+ RepositoryMetadata.objects.values_list("last_updated", flat=True)
+ .order_by("last_updated").first()
+ )
# If we did not retrieve any results here, we should import them!
if last_update is None:
@@ -104,7 +111,7 @@ class HomeView(View):
api_repositories = self._get_api_data()
# Create all the repodata records in the database.
- return RepositoryMetadata.objects.bulk_create(
+ data = [
RepositoryMetadata(
repo_name=api_data["full_name"],
description=api_data["description"],
@@ -113,7 +120,12 @@ class HomeView(View):
language=api_data["language"],
)
for api_data in api_repositories.values()
- )
+ ]
+
+ if settings.env("STATIC_BUILD"):
+ return data
+ else:
+ return RepositoryMetadata.objects.bulk_create(data)
# If the data is stale, we should refresh it.
if (timezone.now() - last_update).seconds > self.repository_cache_ttl:
diff --git a/pydis_site/apps/resources/urls.py b/pydis_site/apps/resources/urls.py
index 19142081..10eda132 100644
--- a/pydis_site/apps/resources/urls.py
+++ b/pydis_site/apps/resources/urls.py
@@ -1,9 +1,25 @@
-from django.urls import path
+import typing
+from pathlib import Path
+
+from django_distill import distill_path
from pydis_site.apps.resources import views
app_name = "resources"
+
+
+def get_all_resources() -> typing.Iterator[dict[str, str]]:
+ """Yield a dict of all resource categories."""
+ for category in Path("pydis_site", "apps", "resources", "resources").iterdir():
+ yield {"category": category.name}
+
+
urlpatterns = [
- path("", views.ResourcesView.as_view(), name="index"),
- path("<str:category>/", views.ResourcesListView.as_view(), name="resources")
+ distill_path("", views.ResourcesView.as_view(), name="index"),
+ distill_path(
+ "<str:category>/",
+ views.ResourcesListView.as_view(),
+ name="resources",
+ distill_func=get_all_resources
+ ),
]
diff --git a/pydis_site/settings.py b/pydis_site/settings.py
index d7b87f33..d38c298b 100644
--- a/pydis_site/settings.py
+++ b/pydis_site/settings.py
@@ -25,7 +25,8 @@ from pydis_site.constants import GIT_SHA
env = environ.Env(
DEBUG=(bool, False),
SITE_DSN=(str, ""),
- BUILDING_DOCKER=(bool, False)
+ BUILDING_DOCKER=(bool, False),
+ STATIC_BUILD=(bool, False),
)
sentry_sdk.init(
@@ -65,10 +66,14 @@ else:
SECRET_KEY = env('SECRET_KEY')
# Application definition
-INSTALLED_APPS = [
+NON_STATIC_APPS = [
'pydis_site.apps.api',
- 'pydis_site.apps.home',
'pydis_site.apps.staff',
+] if not env("STATIC_BUILD") else []
+
+INSTALLED_APPS = [
+ *NON_STATIC_APPS,
+ 'pydis_site.apps.home',
'pydis_site.apps.resources',
'pydis_site.apps.content',
'pydis_site.apps.events',
@@ -86,14 +91,20 @@ INSTALLED_APPS = [
'django_simple_bulma',
'rest_framework',
'rest_framework.authtoken',
+
+ 'django_distill',
]
if not env("BUILDING_DOCKER"):
INSTALLED_APPS.append("django_prometheus")
+NON_STATIC_MIDDLEWARE = [
+ 'django_prometheus.middleware.PrometheusBeforeMiddleware',
+] if not env("STATIC_BUILD") else []
+
# Ensure that Prometheus middlewares are first and last here.
MIDDLEWARE = [
- 'django_prometheus.middleware.PrometheusBeforeMiddleware',
+ *NON_STATIC_MIDDLEWARE,
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
@@ -134,7 +145,7 @@ WSGI_APPLICATION = 'pydis_site.wsgi.application'
DATABASES = {
'default': env.db(),
'metricity': env.db('METRICITY_DB_URL'),
-}
+} if not env("STATIC_BUILD") else {}
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
diff --git a/pydis_site/urls.py b/pydis_site/urls.py
index 891dbdcc..51ef4214 100644
--- a/pydis_site/urls.py
+++ b/pydis_site/urls.py
@@ -1,8 +1,9 @@
from django.contrib import admin
from django.urls import include, path
+from pydis_site import settings
-urlpatterns = (
+NON_STATIC_PATTERNS = [
path('admin/', admin.site.urls),
# External API ingress (over the net)
@@ -14,9 +15,15 @@ urlpatterns = (
# from wildcard matching all requests to `pages/...`.
path('', include('pydis_site.apps.redirect.urls')),
path('', include('django_prometheus.urls')),
+
+ path('staff/', include('pydis_site.apps.staff.urls', namespace='staff')),
+] if not settings.env("STATIC_BUILD") else []
+
+
+urlpatterns = (
+ *NON_STATIC_PATTERNS,
path('pages/', include('pydis_site.apps.content.urls', namespace='content')),
path('resources/', include('pydis_site.apps.resources.urls')),
path('events/', include('pydis_site.apps.events.urls', namespace='events')),
- path('staff/', include('pydis_site.apps.staff.urls', namespace='staff')),
path('', include('pydis_site.apps.home.urls', namespace='home')),
)