Compare commits

..

18 commits

Author SHA1 Message Date
ea73189b9c
Update matrix domain 2024-09-01 16:45:01 +01:00
0bd43a4bee
Update Django 2024-08-06 14:49:29 +01:00
9788b8e4dd
Replace npm-run-all with npm-run-all2 2024-07-28 21:47:36 +01:00
7d4a9647d4
Use native dark mode for comentario 2024-07-28 21:37:04 +01:00
4cfb0a896e
Update fira-code 2024-07-28 21:12:54 +01:00
09dbbc407b
Update HTMX 2024-07-28 21:09:55 +01:00
040647b506
Update lite-youtube-embed 2024-07-28 21:00:41 +01:00
4134426823
Remove deprecated version key 2024-07-28 20:53:40 +01:00
451c2d4cf9
Update django-tasks 2024-07-28 20:45:12 +01:00
5e34485fec
Update Wagtail to 5.2.6 2024-07-28 20:41:08 +01:00
91de1fcf19
Unpin lxml, and use bs4 extra 2024-07-28 20:38:59 +01:00
009b4926a4
Order talks by date 2024-07-11 11:35:55 +01:00
1822f1c4d5
Use LTS version of Django
This is supported for much longer, and I don't seem to be using any of the 5.0 features
2024-07-10 18:40:42 +01:00
a8fe244ab4
Update Django 2024-07-10 17:36:15 +01:00
df84b28114 Update dependency Pygments to v2.18.0 2024-07-05 21:02:53 +01:00
a25e83a0df
Require approval before opening renovate PRs 2024-07-01 23:11:05 +01:00
46669c9b17
Add replacements and workarounds to renovate 2024-07-01 23:07:16 +01:00
41a04af8dc
Fix pickle errors for metadata 2024-07-01 22:34:58 +01:00
16 changed files with 341 additions and 1140 deletions

View file

@ -1,4 +1,3 @@
version: '3.7'
services: services:
web: web:
build: build:

1349
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -28,19 +28,19 @@
"stylelint-config-standard-scss": "6.1.0" "stylelint-config-standard-scss": "6.1.0"
}, },
"dependencies": { "dependencies": {
"@fontsource/fira-code": "5.0.2", "@fontsource/fira-code": "5.0.18",
"@fortawesome/fontawesome-free": "6.5.2", "@fortawesome/fontawesome-free": "6.5.2",
"@ledge/is-ie-11": "7.0.0", "@ledge/is-ie-11": "7.0.0",
"bulma": "0.9.4", "bulma": "0.9.4",
"elevator.js": "1.0.1", "elevator.js": "1.0.1",
"esbuild": "0.20.2", "esbuild": "0.20.2",
"glightbox": "3.3.0", "glightbox": "3.3.0",
"htmx.org": "1.9.2", "htmx.org": "2.0.1",
"lite-youtube-embed": "0.3.0", "lite-youtube-embed": "0.3.2",
"lodash.clamp": "4.0.3", "lodash.clamp": "4.0.3",
"lodash.debounce": "4.0.8", "lodash.debounce": "4.0.8",
"lodash.throttle": "4.1.1", "lodash.throttle": "4.1.1",
"npm-run-all": "4.1.5", "npm-run-all2": "5.0.0",
"sass": "1.75.0", "sass": "1.75.0",
"shareon": "2.4.0" "shareon": "2.4.0"
} }

View file

@ -1,16 +1,11 @@
{ {
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [ "extends": [
"config:base" "config:base",
"replacements:all",
"workarounds:all"
], ],
"prConcurrentLimit": 0, "prConcurrentLimit": 0,
"packageRules": [
{
"matchUpdateTypes": ["patch"],
"schedule": ["every weekend"],
"enabled": false
}
],
"regexManagers": [ "regexManagers": [
{ {
"fileMatch": ["^Dockerfile$"], "fileMatch": ["^Dockerfile$"],
@ -18,5 +13,6 @@
"depNameTemplate": "just-containers/s6-overlay", "depNameTemplate": "just-containers/s6-overlay",
"datasourceTemplate": "github-releases" "datasourceTemplate": "github-releases"
} }
] ],
"dependencyDashboardApproval": true
} }

View file

@ -1,15 +1,14 @@
Django==5.0.4 Django==4.2.15
wagtail==5.2.5 wagtail==5.2.6
django-environ==0.11.2 django-environ==0.11.2
whitenoise[brotli]==6.6.0 whitenoise[brotli]==6.6.0
Pygments==2.17.2 Pygments==2.18.0
beautifulsoup4 beautifulsoup4[lxml]
lxml==5.2.1
requests requests
wagtail-generic-chooser==0.6 wagtail-generic-chooser==0.6
django-redis==5.4.0 django-redis==5.4.0
gunicorn==22.0.0 gunicorn==22.0.0
psycopg==3.2.1 psycopg==3.1.18
djangorestframework djangorestframework
django-htmx==1.17.2 django-htmx==1.17.2
wagtail-metadata==5.0.0 wagtail-metadata==5.0.0
@ -29,7 +28,7 @@ django-proxy==1.2.2
wagtail-lite-youtube-embed==0.1.0 wagtail-lite-youtube-embed==0.1.0
django-minify-html==1.7.1 django-minify-html==1.7.1
metadata-parser==0.12.1 metadata-parser==0.12.1
django-tasks==0.2.0 django-tasks==0.3.0
lightningcss==0.2.0 lightningcss==0.2.0
# DRF OpenAPI dependencies # DRF OpenAPI dependencies

View file

@ -3,6 +3,7 @@ const STORAGE_KEY = "dark-mode";
const htmlTag = document.getElementsByTagName("html")[0]; const htmlTag = document.getElementsByTagName("html")[0];
const darkModeToggle = document.getElementById("dark-mode-toggle"); const darkModeToggle = document.getElementById("dark-mode-toggle");
const comentarioComments = document.getElementsByTagName("comentario-comments");
const matchesDarkMode = window.matchMedia("(prefers-color-scheme: dark)"); const matchesDarkMode = window.matchMedia("(prefers-color-scheme: dark)");
@ -14,6 +15,10 @@ function handleDarkMode(darkMode) {
} else { } else {
htmlTag.classList.remove(DARK_MODE_CLASS); htmlTag.classList.remove(DARK_MODE_CLASS);
} }
for (const commentElement of comentarioComments) {
commentElement.setAttribute("theme", darkMode ? "dark" : "light");
}
} }
if (window.localStorage.getItem(STORAGE_KEY) === null) { if (window.localStorage.getItem(STORAGE_KEY) === null) {

View file

@ -1,46 +0,0 @@
#comments {
margin-top: 2rem;
}
.comentario-text-muted,
.comentario-root,
.comentario-card .comentario-name {
@include dark-mode {
color: $dark-mode-text !important;
}
}
.comentario-add-comment-host,
.comentario-comment-editor textarea,
.comentario-toolbar.comentario-disabled {
background-color: transparent !important;
}
.comentario-add-comment-host:not(.comentario-editor-inserted) {
border: 1px solid color.adjust($white, $alpha: -0.5) !important;
}
.comentario-comment-editor textarea {
background-color: transparent !important;
@include dark-mode {
color: $dark-mode-text !important;
}
}
.comentario-footer a {
color: $link !important;
}
.comentario-btn-link {
color: $link !important;
}
.comentario-card {
@include dark-mode {
border-top: 1px solid color.adjust($white, $alpha: -0.5);
p {
color: $dark-mode-text;
}
}
}

View file

@ -67,5 +67,6 @@ section.content {
} }
#comments { #comments {
margin-top: 2rem;
scroll-margin-top: var(--hero-height); // hero height (ish) scroll-margin-top: var(--hero-height); // hero height (ish)
} }

View file

@ -19,7 +19,6 @@
@import "spotify"; @import "spotify";
@import "404"; @import "404";
@import "password_required"; @import "password_required";
@import "comments";
@import "similar_content"; @import "similar_content";
@import "support_pill"; @import "support_pill";

View file

@ -7,7 +7,7 @@ from django.db.models.functions import Cast, Coalesce
from django.http import HttpRequest, HttpResponse, HttpResponsePermanentRedirect from django.http import HttpRequest, HttpResponse, HttpResponsePermanentRedirect
from django.utils import timezone from django.utils import timezone
from django.utils.functional import cached_property from django.utils.functional import cached_property
from metadata_parser import MetadataParser from metadata_parser import ParsedResult
from modelcluster.fields import ParentalManyToManyField from modelcluster.fields import ParentalManyToManyField
from wagtail.admin.panels import FieldPanel from wagtail.admin.panels import FieldPanel
from wagtail.models import Page, PageQuerySet, Site from wagtail.models import Page, PageQuerySet, Site
@ -239,7 +239,7 @@ class ExternalBlogPostPage(BaseContentPage):
return tags return tags
@cached_property @cached_property
def metadata(self) -> MetadataParser: def metadata(self) -> ParsedResult:
return get_page_metadata(self.external_url) return get_page_metadata(self.external_url)
@cached_property @cached_property

View file

@ -1,3 +1,5 @@
import pickle
from django.test import TestCase from django.test import TestCase
from django.urls import reverse from django.urls import reverse
@ -96,7 +98,9 @@ class ExternalBlogPostPageTestCase(TestCase):
def setUpTestData(cls) -> None: def setUpTestData(cls) -> None:
cls.home_page = HomePage.objects.get() cls.home_page = HomePage.objects.get()
cls.blog_post_list_page = BlogPostListPageFactory(parent=cls.home_page) cls.blog_post_list_page = BlogPostListPageFactory(parent=cls.home_page)
cls.page = ExternalBlogPostPageFactory(parent=cls.blog_post_list_page) cls.page = ExternalBlogPostPageFactory(
parent=cls.blog_post_list_page, external_url="https://example.com"
)
def test_redirects(self) -> None: def test_redirects(self) -> None:
with self.assertNumQueries(10): with self.assertNumQueries(10):
@ -107,3 +111,11 @@ class ExternalBlogPostPageTestCase(TestCase):
status_code=301, status_code=301,
fetch_redirect_response=False, fetch_redirect_response=False,
) )
def test_metadata(self) -> None:
metadata = self.page.metadata
self.assertIsNone(metadata.soup)
# Confirm it can pickle
pickle.dumps(metadata)

View file

@ -11,7 +11,7 @@ from django.http import QueryDict
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.utils.text import slugify from django.utils.text import slugify
from django_cache_decorator import django_cache_decorator from django_cache_decorator import django_cache_decorator
from metadata_parser import MetadataParser from metadata_parser import MetadataParser, ParsedResult
from wagtail.models import Page, Site from wagtail.models import Page, Site
from wagtail.models import get_page_models as get_wagtail_page_models from wagtail.models import get_page_models as get_wagtail_page_models
@ -128,8 +128,13 @@ def get_ai_robots_txt() -> str:
@django_cache_decorator(time=21600) @django_cache_decorator(time=21600)
def get_page_metadata(url: str) -> MetadataParser: def get_page_metadata(url: str) -> ParsedResult:
return MetadataParser(url=url, search_head_only=True) metadata = MetadataParser(url=url, search_head_only=True).parsed_result
# HACK: BeautifulSoup doesn't pickle nicely, and so can't be cached
metadata.soup = None
return metadata
def extend_query_params(url: str, params: dict[str, Any]) -> str: def extend_query_params(url: str, params: dict[str, Any]) -> str:

View file

@ -12,6 +12,14 @@ class TalksListPage(BaseListingPage):
max_count = 1 max_count = 1
subpage_types = ["talks.TalkPage"] subpage_types = ["talks.TalkPage"]
def get_listing_pages(self) -> models.QuerySet:
return (
TalkPage.objects.live()
.public()
.descendant_of(self)
.order_by("-date", "title")
)
class TalkPage(BaseContentPage): class TalkPage(BaseContentPage):
subpage_types: list[Any] = [] subpage_types: list[Any] = []

View file

@ -37,7 +37,7 @@ class TalksListPageTestCase(TestCase):
self.assertEqual(len(response.context["listing_pages"]), 2) self.assertEqual(len(response.context["listing_pages"]), 2)
def test_queries(self) -> None: def test_queries(self) -> None:
with self.assertNumQueries(35): with self.assertNumQueries(34):
self.client.get(self.page.url) self.client.get(self.page.url)
def test_feed_accessible(self) -> None: def test_feed_accessible(self) -> None:

View file

@ -1,5 +1,5 @@
{ {
"m.homeserver": { "m.homeserver": {
"base_url": "https://matrix.jakehoward.tech" "base_url": "https://matrix.theorangeone.net"
} }
} }

View file

@ -1 +1 @@
{"m.server": "matrix.jakehoward.tech:443"} {"m.server": "matrix.theorangeone.net:443"}