From 433d030539e12c70ca9e81a32cd9b86218a94a1d Mon Sep 17 00:00:00 2001 From: Jonas Heinrich Date: Fri, 13 Mar 2026 10:31:56 +0100 Subject: [PATCH 1/5] update flake --- flake.lock | 8 ++++---- flake.nix | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 471ca20..e2486de 100644 --- a/flake.lock +++ b/flake.lock @@ -2,16 +2,16 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1758070117, - "narHash": "sha256-uLwwHFCZnT1c3N3biVe/0hCkag2GSrf9+M56+Okf+WY=", + "lastModified": 1773222311, + "narHash": "sha256-BHoB/XpbqoZkVYZCfXJXfkR+GXFqwb/4zbWnOr2cRcU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e9b7f2ff62b35f711568b1f0866243c7c302028d", + "rev": "0590cd39f728e129122770c029970378a79d076a", "type": "github" }, "original": { "id": "nixpkgs", - "ref": "nixos-25.05", + "ref": "nixos-25.11", "type": "indirect" } }, diff --git a/flake.nix b/flake.nix index cfad560..4e34de1 100644 --- a/flake.nix +++ b/flake.nix @@ -1,7 +1,7 @@ { description = "Invoiceplane invoice template development shell"; - inputs.nixpkgs.url = "nixpkgs/nixos-25.05"; + inputs.nixpkgs.url = "nixpkgs/nixos-25.11"; outputs = { self, nixpkgs, ... }@inputs: @@ -77,7 +77,7 @@ }; }; - system.stateVersion = "25.05"; + system.stateVersion = "25.11"; services.getty.autologinUser = "root"; } ) From a5e2fee7a9376817cd2e39cda1fb11f2fe9157d0 Mon Sep 17 00:00:00 2001 From: Jonas Heinrich Date: Fri, 13 Mar 2026 10:32:08 +0100 Subject: [PATCH 2/5] support project urls without trailing slash --- froide_govplan/urls.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/froide_govplan/urls.py b/froide_govplan/urls.py index 12f9d6a..c2655a9 100644 --- a/froide_govplan/urls.py +++ b/froide_govplan/urls.py @@ -31,6 +31,10 @@ urlpatterns = [ GovPlanDetailView.as_view(), name="plan", ), + path( + pgettext_lazy("url part", "/plan/"), + GovPlanDetailView.as_view(), + ), path( pgettext_lazy("url part", "/plan//propose-update/"), GovPlanProposeUpdateView.as_view(), @@ -41,9 +45,17 @@ urlpatterns = [ GovPlanProposeUpdateView.as_view(), name="propose_planupdate", ), + path( + pgettext_lazy("url part", "/vorhaben/"), + GovPlanDetailView.as_view(), + ), path( pgettext_lazy("url part", "//"), GovPlanSectionDetailView.as_view(), name="section", ), + path( + pgettext_lazy("url part", "/"), + GovPlanSectionDetailView.as_view(), + ), ] From 1884ac1d43929040d4e68f0f173f58ffdadc1781 Mon Sep 17 00:00:00 2001 From: Jonas Heinrich Date: Fri, 13 Mar 2026 10:58:31 +0100 Subject: [PATCH 3/5] update downstream module file --- froide-govplan.nix | 96 +++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/froide-govplan.nix b/froide-govplan.nix index 6e4f236..a77d60e 100644 --- a/froide-govplan.nix +++ b/froide-govplan.nix @@ -13,15 +13,13 @@ let pkg = cfg.package.overridePythonAttrs (old: { src = ./.; dependencies = old.dependencies ++ [ cfg.package.python.pkgs.mastodon-py ]; - postInstall = - old.postInstall - + '' - ln -s ${settingsFile} $out/${pkg.python.sitePackages}/froide_govplan/project/extra_settings.py + postInstall = old.postInstall + '' + ln -s ${settingsFile} $out/${pkg.python.sitePackages}/froide_govplan/project/extra_settings.py - rm -r $out/${pkgs.python3.sitePackages}/froide_govplan/templates - ln -sf /var/lib/froide-govplan/templates $out/${pkgs.python3.sitePackages}/froide_govplan/templates - cp -r froide_govplan/static $out/${pkgs.python3.sitePackages}/froide_govplan/ - ''; + rm -r $out/${pkgs.python3.sitePackages}/froide_govplan/templates + ln -sf /var/lib/froide-govplan/templates $out/${pkgs.python3.sitePackages}/froide_govplan/templates + cp -r froide_govplan/static $out/${pkgs.python3.sitePackages}/froide_govplan/ + ''; }); froide-govplan = pkgs.writeShellApplication { @@ -169,9 +167,9 @@ in systemd = { services = { - postgresql.serviceConfig.ExecStartPost = + postgresql-setup.serviceConfig.ExecStartPost = let - sqlFile = pkgs.writeText "immich-pgvectors-setup.sql" '' + sqlFile = pkgs.writeText "froide-govplan-postgis-setup.sql" '' CREATE EXTENSION IF NOT EXISTS postgis; ''; in @@ -190,49 +188,51 @@ in Group = "govplan"; }; after = [ - "postgresql.service" + "postgresql.target" "network.target" "systemd-tmpfiles-setup.service" ]; wantedBy = [ "multi-user.target" ]; - environment = - { - PYTHONPATH = pkg.python.pkgs.makePythonPath (with pkg.python.pkgs; [ + environment = { + PYTHONPATH = pkg.python.pkgs.makePythonPath ( + with pkg.python.pkgs; + [ - bleach - django-admin-sortable2 - django-cms - django-filer - django-mfa3 - django-mptt - django-oauth-toolkit - django-sekizai - django-tinymce - django-treebeard - djangocms-alias - # Downgrade to last working version - (toPythonModule ( - pkgs.froide.overridePythonAttrs (prev: { - nativeBuildInputs = [ pkgs.makeBinaryWrapper ]; - postBuild = ""; - doCheck = false; - pnpmDeps = null; - src = prev.src.override { - rev = "a78a4054f9f37b0a5109a6d8cfbbda742f86a8ca"; - hash = "sha256-gtOssbsVf3nG+pmLPgvh4685vHh2x+jlXiTjU+JhQa8="; - }; - }) - )) - psycopg - mastodon-py - (toPythonModule (pkg)) - ]); - GDAL_LIBRARY_PATH = "${pkgs.gdal}/lib/libgdal.so"; - GEOS_LIBRARY_PATH = "${pkgs.geos}/lib/libgeos_c.so"; - } - // lib.optionalAttrs (cfg.secretKeyFile != null) { - SECRET_KEY_FILE = cfg.secretKeyFile; - }; + bleach + django-admin-sortable2 + django-cms + django-filer + django-mfa3 + django-mptt + django-oauth-toolkit + django-sekizai + django-tinymce + django-treebeard + djangocms-alias + # Downgrade to last working version + (toPythonModule ( + pkgs.froide.overridePythonAttrs (prev: { + nativeBuildInputs = [ pkgs.makeBinaryWrapper ]; + postBuild = ""; + doCheck = false; + pnpmDeps = null; + src = prev.src.override { + rev = "a78a4054f9f37b0a5109a6d8cfbbda742f86a8ca"; + hash = "sha256-gtOssbsVf3nG+pmLPgvh4685vHh2x+jlXiTjU+JhQa8="; + }; + }) + )) + psycopg + mastodon-py + (toPythonModule (pkg)) + ] + ); + GDAL_LIBRARY_PATH = "${pkgs.gdal}/lib/libgdal.so"; + GEOS_LIBRARY_PATH = "${pkgs.geos}/lib/libgeos_c.so"; + } + // lib.optionalAttrs (cfg.secretKeyFile != null) { + SECRET_KEY_FILE = cfg.secretKeyFile; + }; preStart = '' # Auto-migrate on first run or if the package has changed versionFile="${cfg.dataDir}/src-version" From 5843c551b156fe0ce626c2f7afd8ee0b216bdbe9 Mon Sep 17 00:00:00 2001 From: Jonas Heinrich Date: Sat, 14 Mar 2026 11:51:33 +0100 Subject: [PATCH 4/5] disable mastodon integration on debug --- froide_govplan/signals.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/froide_govplan/signals.py b/froide_govplan/signals.py index 550024d..c88dbc1 100644 --- a/froide_govplan/signals.py +++ b/froide_govplan/signals.py @@ -2,17 +2,21 @@ from django.db.models.signals import post_save from django.dispatch import receiver from django.conf import settings from django.db import transaction -from mastodon import Mastodon from .models import GovernmentPlanUpdate, GovernmentPlan import re import html +if not settings.DEBUG: + from mastodon import Mastodon + def strip_html_tags(text): tag_re = re.compile(r'<[^>]+>') plain_text = tag_re.sub('', text) return html.unescape(plain_text) def post_to_mastodon(text): + if settings.DEBUG: + return mastodon = Mastodon( access_token=settings.MASTODON_ACCESS_TOKEN, api_base_url=settings.MASTODON_API_BASE_URL From 375fcbb2c74110b013370a5ba360a319ff9d3bf9 Mon Sep 17 00:00:00 2001 From: Jonas Heinrich Date: Sat, 14 Mar 2026 11:59:28 +0100 Subject: [PATCH 5/5] government plan: remove trailing slash from links --- froide_govplan/urls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/froide_govplan/urls.py b/froide_govplan/urls.py index c2655a9..de63191 100644 --- a/froide_govplan/urls.py +++ b/froide_govplan/urls.py @@ -29,11 +29,11 @@ urlpatterns = [ path( pgettext_lazy("url part", "/plan//"), GovPlanDetailView.as_view(), - name="plan", ), path( pgettext_lazy("url part", "/plan/"), GovPlanDetailView.as_view(), + name="plan", ), path( pgettext_lazy("url part", "/plan//propose-update/"), @@ -52,10 +52,10 @@ urlpatterns = [ path( pgettext_lazy("url part", "//"), GovPlanSectionDetailView.as_view(), - name="section", ), path( pgettext_lazy("url part", "/"), GovPlanSectionDetailView.as_view(), + name="section", ), ]